diff --git a/prs/9277/77123073 b/prs/9277/127814926 similarity index 100% rename from prs/9277/77123073 rename to prs/9277/127814926 diff --git a/prs/9277/ct_logs/all_runs.html b/prs/9277/ct_logs/all_runs.html index 64641184ace44..2a0b3ca59aa05 100644 --- a/prs/9277/ct_logs/all_runs.html +++ b/prs/9277/ct_logs/all_runs.html @@ -107,7 +107,7 @@

All test runs in "ct_logs"

-Thu Jan 09 2025 11:49:27test_server@e52b4f92c4db +Fri Jan 10 2025 19:12:36test_server@30452ec2e0b4 - 1 make_test_dir.system_test @@ -119,7 +119,7 @@

All test runs in "ct_logs"

-Thu Jan 09 2025 11:32:22test_server@3d82f27beab7 +Fri Jan 10 2025 18:55:38test_server@c7ed2a2b61d4 - 1 make_test_dir.ssh_test @@ -136,7 +136,7 @@

All test runs in "ct_logs"



diff --git a/prs/9277/ct_logs/ct_log_cache b/prs/9277/ct_logs/ct_log_cache index c3edb4f2ef115..c055801d81390 100644 Binary files a/prs/9277/ct_logs/ct_log_cache and b/prs/9277/ct_logs/ct_log_cache differ diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/ct_default.css b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/ct_default.css similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/ct_default.css rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/ct_default.css diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/ctlog.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/ctlog.html similarity index 92% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/ctlog.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/ctlog.html index 4a8f7c58aeb4e..71b4f42f9fb94 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/ctlog.html +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/ctlog.html @@ -118,33 +118,33 @@

PRE/POST TEST I/O LOG

PROGRESS LOG

 
-
*** CT 2025-01-09 11:49:27.570 *** Common Test Logger started
+
*** CT 2025-01-10 19:12:36.198 *** Common Test Logger started
 VERBOSITY LEVELS:
 general level            100
 default                  100
 
 
-
*** CT 2025-01-09 11:49:27.574 *** Test Specification file(s)
+
*** CT 2025-01-10 19:12:36.202 *** Test Specification file(s)
 /buildroot/otp/erts/make_test_dir/system_test/system.spec 
 

-
*** CT 2025-01-09 11:49:27.846 *** TEST INFO
+
*** CT 2025-01-10 19:12:36.467 *** TEST INFO
 1 test(s), 109 case(s) in 11 suite(s)
 

-
*** CT 2025-01-09 11:49:27.846 *** TEST INFO
+
*** CT 2025-01-10 19:12:36.467 *** TEST INFO
 Timetrap time multiplier = 1
 Timetrap scaling enabled = false
 

-
*** CT 2025-01-09 11:53:33.969 *** Common Test Logger finished
+
*** CT 2025-01-10 19:17:14.345 *** Common Test Logger finished
 


diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/index.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/index.html similarity index 92% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/index.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/index.html index 0b690867febf4..a56d141055572 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/index.html +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/index.html @@ -3,7 +3,7 @@ -Test Results Thu Jan 09 2025 11:49:27 +Test Results Fri Jan 10 2025 19:12:36 @@ -81,7 +81,7 @@

Test Results

-

Thu Jan 09 2025 11:49:27

+

Fri Jan 10 2025 19:12:36


@@ -103,12 +103,12 @@

Thu Jan 09 2025 11:49:27

-make_test_dir.system_test +make_test_dir.system_test 107 0 2 (2/0) 0 -244.805s +276.561s @@ -118,7 +118,7 @@

Thu Jan 09 2025 11:49:27

0 2 (2/0) 0 -244.805s +276.561s @@ -130,7 +130,7 @@

Thu Jan 09 2025 11:49:27

diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/jquery-latest.js b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/jquery-latest.js similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/jquery-latest.js rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/jquery-latest.js diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/jquery.tablesorter.min.js b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/jquery.tablesorter.min.js similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/jquery.tablesorter.min.js rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/jquery.tablesorter.min.js diff --git a/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/last_name b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/last_name new file mode 100644 index 0000000000000..87809659ce74e --- /dev/null +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/last_name @@ -0,0 +1 @@ +/buildroot/otp/erts/make_test_dir/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36 diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/last_test.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/last_test.html similarity index 87% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/last_test.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/last_test.html index ec614247e4965..fbcc412224fa9 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/last_test.html +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/last_test.html @@ -8,6 +8,6 @@

Last test

-make_test_dir.system_test.logs +make_test_dir.system_test.logs diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/erl_print_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/erl_print_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/erl_print_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/erl_print_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/erlc_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/erlc_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/erlc_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/erlc_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/erlexec_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/erlexec_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/erlexec_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/erlexec_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/ethread_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/ethread_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/ethread_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/ethread_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/install_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/install_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/install_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/install_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/last_link.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/last_link.html similarity index 87% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/last_link.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/last_link.html index 838e9684fcbca..34a2d4ec4d0a9 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/last_link.html +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/last_link.html @@ -8,6 +8,6 @@

Last test

-make_test_dir.system_test.logs +make_test_dir.system_test.logs diff --git a/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/last_name b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/last_name new file mode 100644 index 0000000000000..87809659ce74e --- /dev/null +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/last_name @@ -0,0 +1 @@ +/buildroot/otp/erts/make_test_dir/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36 diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/nt_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/nt_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/nt_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/nt_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/otp_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/otp_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/otp_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/otp_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/parallel_messages_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/parallel_messages_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/parallel_messages_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/parallel_messages_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/cover.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/cover.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/cover.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/cover.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.10309.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.3138.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.10309.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.3138.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.29636.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.3202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.29636.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.3202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.48163.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.387.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.48163.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.387.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.66435.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.4610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.66435.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.4610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.66787.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.5154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.66787.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.5154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.67107.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.67107.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.67491.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.3106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.67491.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.3106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.74530.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.3170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.74530.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.3170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.75202.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.3234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.75202.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.3234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.76034.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.4450.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.76034.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.4450.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.5122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.5122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.17636.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.17636.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ct_framework.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.29380.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.character.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.29380.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.character.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.29668.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.erlang_display.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.29668.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.erlang_display.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.66467.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.float.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.66467.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.float.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.66819.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.integer.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.66819.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.integer.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.67523.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.quote.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.67523.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.quote.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.74562.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.snprintf.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.74562.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.snprintf.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.74850.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.74850.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.75234.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.string.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.75234.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erl_print_suite.string.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.76066.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.arg_overflow.226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.76066.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.arg_overflow.226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.arg_overflow.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ct_framework.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.arg_overflow.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.connect_with_ssh_agent.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_erl.34.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.connect_with_ssh_agent.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_erl.34.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_erl.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_erl.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_mib.130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_mib.130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.request_identities.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_mib.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.request_identities.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_mib.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.sign_request.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_script.98.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.sign_request.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_script.98.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_script.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_agent_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_script.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10052.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_yecc.66.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10052.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_yecc.66.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10178.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_yecc.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10178.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.compile_yecc.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10404.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.deep_cwd.194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10404.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.deep_cwd.194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10499.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.deep_cwd.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10499.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.deep_cwd.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10756.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_group.1410.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10756.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_group.1410.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10786.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_group.2914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10786.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_group.2914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10819.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.10819.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11012.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11012.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11139.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features.2882.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11139.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features.2882.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11300.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11300.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11460.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_all.2050.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11460.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_all.2050.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11842.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_all.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11842.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_all.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11844.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_atom_warnings.1570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11844.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_atom_warnings.1570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11971.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_atom_warnings.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.11971.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_atom_warnings.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12547.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_directives.1538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12547.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_directives.1538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12644.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_directives.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12644.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_directives.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12802.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_disable.1954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12802.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_disable.1954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12900.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_disable.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12900.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_disable.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12995.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_describe.1474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.12995.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_describe.1474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13188.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_describe.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13188.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_describe.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13283.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_unknown.1506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13283.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_unknown.1506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13316.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_unknown.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13316.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_erlc_unknown.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13442.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_include.2594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13442.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_include.2594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13443.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_include.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13443.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_include.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13636.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_load.2274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13636.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_load.2274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13732.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_load.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13732.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_load.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13828.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_macros.1602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13828.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_macros.1602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13890.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_macros.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13890.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_macros.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13891.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_runtime.2370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.13891.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_runtime.2370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14020.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_runtime.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14020.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.features_runtime.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14082.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.good_citizen.162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14082.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.good_citizen.162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1412.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.good_citizen.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1412.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.good_citizen.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14148.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_group.1442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14148.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_group.1442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14211.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_group.2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14211.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_group.2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14276.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14276.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14338.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14338.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14404.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.make_dep_options.258.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14404.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.make_dep_options.258.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14531.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.make_dep_options.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14531.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.make_dep_options.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14564.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14564.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14594.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.unicode_paths.290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14594.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.unicode_paths.290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14724.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.unicode_paths.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14724.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlc_suite.unicode_paths.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14755.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.args_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14755.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.args_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14915.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.args_file_env.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14915.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.args_file_env.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14916.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.argument_separation.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.14916.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.argument_separation.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15044.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.argument_with_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15044.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.argument_with_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15139.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15139.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15172.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.env.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15172.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.env.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15234.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.evil_args_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15234.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.evil_args_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15300.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15300.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15331.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.missing_args_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15331.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.missing_args_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15426.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.otp_7461.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15426.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.otp_7461.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15427.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15427.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15428.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.zdbbl_dist_buf_busy_limit.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15428.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/erlexec_suite.zdbbl_dist_buf_busy_limit.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15556.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.atomic.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15556.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.atomic.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15682.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.broadcast.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15682.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.broadcast.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1571.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.cond_wait.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1571.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.cond_wait.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15716.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.create_join_thread.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15716.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.create_join_thread.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15779.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.detached_thread.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15779.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.detached_thread.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15844.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.dw_atomic_massage.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15844.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.dw_atomic_massage.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15970.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.equal_tids.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15970.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.equal_tids.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15971.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.max_threads.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15971.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.max_threads.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15972.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.mutex.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.15972.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.mutex.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16099.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.rwmutex.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16099.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.rwmutex.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16196.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.rwspinlock.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16196.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.rwspinlock.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16226.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.spinlock.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16226.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.spinlock.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16324.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16324.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16355.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.thread_name.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16355.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.thread_name.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16418.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.try_lock_mutex.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16418.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.try_lock_mutex.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16420.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.tsd.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16420.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/ethread_suite.tsd.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16547.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.'bin white space'.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16547.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.'bin white space'.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16642.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_default.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.16642.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_default.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17122.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_default_dirty.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17122.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_default_dirty.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17187.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_dirname_fail.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17187.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_dirname_fail.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17634.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_no_srcfile.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17634.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_no_srcfile.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17667.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_no_use_dirname_fail.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17667.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_no_use_dirname_fail.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17858.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_not_abs.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17858.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_not_abs.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17955.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_ok_symlink.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.17955.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_ok_symlink.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18115.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_outside_eprfx.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18115.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_outside_eprfx.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18178.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_outside_eprfx_dirty.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18178.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_outside_eprfx_dirty.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1828.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_same_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1828.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_same_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18402.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_unreachable_absolute.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18402.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_unreachable_absolute.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18594.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_unreachable_relative.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.18594.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_unreachable_relative.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19010.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_unreasonable_path.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19010.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.bin_unreasonable_path.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1922.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.1922.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19427.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19427.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19619.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19619.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/install_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19746.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/nt_suite.nt.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19746.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/nt_suite.nt.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19875.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/nt_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19875.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/nt_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19906.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.call_to_deprecated.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.19906.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.call_to_deprecated.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20194.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.call_to_now_0.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20194.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.call_to_now_0.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20450.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.call_to_size_1.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20450.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.call_to_size_1.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20579.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.deprecated_not_in_obsolete.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20579.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.deprecated_not_in_obsolete.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20899.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20899.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20930.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.erl_file_encoding.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.20930.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.erl_file_encoding.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21027.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21027.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21250.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.obsolete_but_not_deprecated.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21250.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.obsolete_but_not_deprecated.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21314.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.runtime_dependencies_functions.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21314.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.runtime_dependencies_functions.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21442.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.runtime_dependencies_modules.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21442.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.runtime_dependencies_modules.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21443.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21443.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21730.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.strong_components.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.21730.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.strong_components.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2180.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.test_runtime_dependencies_versions.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2180.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.test_runtime_dependencies_versions.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22051.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.undefined_functions.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22051.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.undefined_functions.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22242.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.xml_file_encoding.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22242.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/otp_suite.xml_file_encoding.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22371.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/parallel_messages_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22371.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/parallel_messages_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22498.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/parallel_messages_suite.test_message_queue_data_switching.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22498.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/parallel_messages_suite.test_message_queue_data_switching.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22659.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/parallel_messages_suite.test_throughput_benchmark.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22659.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/parallel_messages_suite.test_throughput_benchmark.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22818.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.basic.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.22818.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.basic.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23234.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.defunct.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23234.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.defunct.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23235.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.heavier.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23235.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.heavier.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23490.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.heavy.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23490.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.heavy.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23523.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.sleepy_child.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23523.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.sleepy_child.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23554.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23554.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/run_erl_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.log b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.log similarity index 58% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.log rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.log index 69b3bb8e840da..ef81e56cbab11 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.log +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.log @@ -1,723 +1,723 @@ -=== Suite started at 2025-01-09 11:49:27 +=== Suite started at 2025-01-10 19:12:36 === Starting test, 109 test cases =cases 109 =user otptest -=host e52b4f92c4db -=hosts e52b4f92c4db +=host 30452ec2e0b4 +=hosts 30452ec2e0b4 =emulator_vsn 15.2 =emulator beam =otp_release 27 -=started 2025-01-09 11:49:27 +=started 2025-01-10 19:12:36 =case ct_framework:init_per_suite =logfile ct_framework.init_per_suite.html =group_props [{suite,erl_print_SUITE}] -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok =elapsed 0.000000s =case erl_print_SUITE:erlang_display =logfile erl_print_suite.erlang_display.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok -=elapsed 0.003561s +=elapsed 0.003579s =case erl_print_SUITE:integer =logfile erl_print_suite.integer.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok -=elapsed 0.027947s +=elapsed 0.031940s =case erl_print_SUITE:float =logfile erl_print_suite.float.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok -=elapsed 0.002507s +=elapsed 0.002244s =case erl_print_SUITE:string =logfile erl_print_suite.string.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok -=elapsed 0.002269s +=elapsed 0.001931s =case erl_print_SUITE:character =logfile erl_print_suite.character.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok -=elapsed 0.022344s +=elapsed 0.017980s =case erl_print_SUITE:snprintf =logfile erl_print_suite.snprintf.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok -=elapsed 0.002531s +=elapsed 0.001996s =case erl_print_SUITE:quote =logfile erl_print_suite.quote.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok -=elapsed 0.002575s +=elapsed 0.001997s =case ct_framework:end_per_suite =logfile ct_framework.end_per_suite.html =group_props [{suite,erl_print_SUITE}] -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:36 =result ok =elapsed 0.000000s -=group_time 0.254s +=group_time 0.251s =case erlc_SUITE:init_per_suite =logfile erlc_suite.init_per_suite.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:36 +=ended 2025-01-10 19:12:37 =result ok =elapsed 0.000000s =case erlc_SUITE:init_per_group =logfile erlc_suite.init_per_group.html =group_props [{name,with_server}] -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:28 +=started 2025-01-10 19:12:37 +=ended 2025-01-10 19:12:37 =result ok =elapsed 0.000002s =case erlc_SUITE:compile_erl =logfile erlc_suite.compile_erl.html -=started 2025-01-09 11:49:28 -=ended 2025-01-09 11:49:29 +=started 2025-01-10 19:12:37 +=ended 2025-01-10 19:12:38 =result ok -=elapsed 1.081581s +=elapsed 1.095765s =case erlc_SUITE:compile_yecc =logfile erlc_suite.compile_yecc.html -=started 2025-01-09 11:49:29 -=ended 2025-01-09 11:49:29 +=started 2025-01-10 19:12:38 +=ended 2025-01-10 19:12:38 =result ok -=elapsed 0.422413s +=elapsed 0.426460s =case erlc_SUITE:compile_script =logfile erlc_suite.compile_script.html -=started 2025-01-09 11:49:29 -=ended 2025-01-09 11:49:30 +=started 2025-01-10 19:12:38 +=ended 2025-01-10 19:12:38 =result ok -=elapsed 0.353463s +=elapsed 0.355673s =case erlc_SUITE:compile_mib =logfile erlc_suite.compile_mib.html -=started 2025-01-09 11:49:30 -=ended 2025-01-09 11:49:31 +=started 2025-01-10 19:12:38 +=ended 2025-01-10 19:12:39 =result ok -=elapsed 0.939512s +=elapsed 0.938135s =case erlc_SUITE:good_citizen =logfile erlc_suite.good_citizen.html -=started 2025-01-09 11:49:31 -=ended 2025-01-09 11:49:31 +=started 2025-01-10 19:12:39 +=ended 2025-01-10 19:12:40 =result ok -=elapsed 0.255580s +=elapsed 0.271170s =case erlc_SUITE:deep_cwd =logfile erlc_suite.deep_cwd.html -=started 2025-01-09 11:49:31 -=ended 2025-01-09 11:49:31 +=started 2025-01-10 19:12:40 +=ended 2025-01-10 19:12:40 =result ok -=elapsed 0.261451s +=elapsed 0.277518s =case erlc_SUITE:arg_overflow =logfile erlc_suite.arg_overflow.html -=started 2025-01-09 11:49:31 -=ended 2025-01-09 11:49:32 +=started 2025-01-10 19:12:40 +=ended 2025-01-10 19:12:40 =result ok -=elapsed 0.378077s +=elapsed 0.372386s =case erlc_SUITE:make_dep_options =logfile erlc_suite.make_dep_options.html -=started 2025-01-09 11:49:32 -=ended 2025-01-09 11:49:37 +=started 2025-01-10 19:12:40 +=ended 2025-01-10 19:12:45 =result ok -=elapsed 4.894611s +=elapsed 4.803670s =case erlc_SUITE:unicode_paths =logfile erlc_suite.unicode_paths.html -=started 2025-01-09 11:49:37 -=ended 2025-01-09 11:49:37 +=started 2025-01-10 19:12:45 +=ended 2025-01-10 19:12:46 =result ok -=elapsed 0.269284s +=elapsed 0.274184s =case erlc_SUITE:end_per_group =logfile erlc_suite.end_per_group.html =group_props [{name,with_server}] -=started 2025-01-09 11:49:37 -=ended 2025-01-09 11:49:37 +=started 2025-01-10 19:12:46 +=ended 2025-01-10 19:12:46 =result ok =elapsed 0.000003s -=group_time 9.090s +=group_time 9.050s =case erlc_SUITE:init_per_group =logfile erlc_suite.init_per_group.2.html =group_props [{name,without_server}] -=started 2025-01-09 11:49:37 -=ended 2025-01-09 11:49:37 +=started 2025-01-10 19:12:46 +=ended 2025-01-10 19:12:46 =result ok =elapsed 0.000002s =case erlc_SUITE:compile_erl =logfile erlc_suite.compile_erl.34.html -=started 2025-01-09 11:49:37 -=ended 2025-01-09 11:49:38 +=started 2025-01-10 19:12:46 +=ended 2025-01-10 19:12:47 =result ok -=elapsed 0.997495s +=elapsed 0.975860s =case erlc_SUITE:compile_yecc -=logfile erlc_suite.compile_yecc.3.html -=started 2025-01-09 11:49:38 -=ended 2025-01-09 11:49:38 +=logfile erlc_suite.compile_yecc.66.html +=started 2025-01-10 19:12:47 +=ended 2025-01-10 19:12:47 =result ok -=elapsed 0.322984s +=elapsed 0.327345s =case erlc_SUITE:compile_script -=logfile erlc_suite.compile_script.35.html -=started 2025-01-09 11:49:38 -=ended 2025-01-09 11:49:39 +=logfile erlc_suite.compile_script.98.html +=started 2025-01-10 19:12:47 +=ended 2025-01-10 19:12:47 =result ok -=elapsed 0.277054s +=elapsed 0.277326s =case erlc_SUITE:compile_mib -=logfile erlc_suite.compile_mib.67.html -=started 2025-01-09 11:49:39 -=ended 2025-01-09 11:49:39 +=logfile erlc_suite.compile_mib.130.html +=started 2025-01-10 19:12:47 +=ended 2025-01-10 19:12:48 =result ok -=elapsed 0.720803s +=elapsed 0.733350s =case erlc_SUITE:good_citizen -=logfile erlc_suite.good_citizen.99.html -=started 2025-01-09 11:49:39 -=ended 2025-01-09 11:49:40 +=logfile erlc_suite.good_citizen.162.html +=started 2025-01-10 19:12:48 +=ended 2025-01-10 19:12:48 =result ok -=elapsed 0.240986s +=elapsed 0.237463s =case erlc_SUITE:deep_cwd -=logfile erlc_suite.deep_cwd.131.html -=started 2025-01-09 11:49:40 -=ended 2025-01-09 11:49:40 +=logfile erlc_suite.deep_cwd.194.html +=started 2025-01-10 19:12:48 +=ended 2025-01-10 19:12:49 =result ok -=elapsed 0.238372s +=elapsed 0.239369s =case erlc_SUITE:arg_overflow -=logfile erlc_suite.arg_overflow.163.html -=started 2025-01-09 11:49:40 -=ended 2025-01-09 11:49:40 +=logfile erlc_suite.arg_overflow.226.html +=started 2025-01-10 19:12:49 +=ended 2025-01-10 19:12:49 =result ok -=elapsed 0.324593s +=elapsed 0.328817s =case erlc_SUITE:make_dep_options -=logfile erlc_suite.make_dep_options.195.html -=started 2025-01-09 11:49:40 -=ended 2025-01-09 11:49:45 +=logfile erlc_suite.make_dep_options.258.html +=started 2025-01-10 19:12:49 +=ended 2025-01-10 19:12:53 =result ok -=elapsed 4.223877s +=elapsed 4.321586s =case erlc_SUITE:unicode_paths -=logfile erlc_suite.unicode_paths.227.html -=started 2025-01-09 11:49:45 -=ended 2025-01-09 11:49:45 +=logfile erlc_suite.unicode_paths.290.html +=started 2025-01-10 19:12:53 +=ended 2025-01-10 19:12:54 =result ok -=elapsed 0.241937s +=elapsed 0.238346s =case erlc_SUITE:features_erlc_describe =logfile erlc_suite.features_erlc_describe.html -=started 2025-01-09 11:49:45 -=ended 2025-01-09 11:49:45 +=started 2025-01-10 19:12:54 +=ended 2025-01-10 19:12:54 =result ok -=elapsed 0.417149s +=elapsed 0.412070s =case erlc_SUITE:features_erlc_unknown =logfile erlc_suite.features_erlc_unknown.html -=started 2025-01-09 11:49:45 -=ended 2025-01-09 11:49:49 +=started 2025-01-10 19:12:54 +=ended 2025-01-10 19:12:58 =result ok -=elapsed 3.774676s +=elapsed 3.740006s =case erlc_SUITE:features_directives =logfile erlc_suite.features_directives.html -=started 2025-01-09 11:49:49 -=ended 2025-01-09 11:49:50 +=started 2025-01-10 19:12:58 +=ended 2025-01-10 19:12:59 =result ok -=elapsed 1.216277s +=elapsed 1.210270s =case erlc_SUITE:features_atom_warnings =logfile erlc_suite.features_atom_warnings.html -=started 2025-01-09 11:49:50 -=ended 2025-01-09 11:49:51 +=started 2025-01-10 19:12:59 +=ended 2025-01-10 19:13:00 =result ok -=elapsed 0.736561s +=elapsed 0.729221s =case erlc_SUITE:features_macros =logfile erlc_suite.features_macros.html -=started 2025-01-09 11:49:51 -=ended 2025-01-09 11:49:53 +=started 2025-01-10 19:13:00 +=ended 2025-01-10 19:13:01 =result ok -=elapsed 1.766406s +=elapsed 1.755332s =case erlc_SUITE:features_disable =logfile erlc_suite.features_disable.html -=started 2025-01-09 11:49:53 -=ended 2025-01-09 11:49:53 +=started 2025-01-10 19:13:01 +=ended 2025-01-10 19:13:02 =result ok -=elapsed 0.403126s +=elapsed 0.398919s =case erlc_SUITE:features_all =logfile erlc_suite.features_all.html -=started 2025-01-09 11:49:53 -=ended 2025-01-09 11:49:54 +=started 2025-01-10 19:13:02 +=ended 2025-01-10 19:13:03 =result ok -=elapsed 1.199051s +=elapsed 1.174406s =case erlc_SUITE:features_load =logfile erlc_suite.features_load.html -=started 2025-01-09 11:49:54 -=ended 2025-01-09 11:49:55 +=started 2025-01-10 19:13:03 +=ended 2025-01-10 19:13:03 =result ok -=elapsed 0.160310s +=elapsed 0.157724s =case erlc_SUITE:features_runtime =logfile erlc_suite.features_runtime.html -=started 2025-01-09 11:49:55 -=ended 2025-01-09 11:49:55 +=started 2025-01-10 19:13:03 +=ended 2025-01-10 19:13:04 =result ok -=elapsed 0.470910s +=elapsed 0.459450s =case erlc_SUITE:features_include =logfile erlc_suite.features_include.html -=started 2025-01-09 11:49:55 -=ended 2025-01-09 11:49:58 +=started 2025-01-10 19:13:04 +=ended 2025-01-10 19:13:07 =result ok -=elapsed 2.853043s +=elapsed 2.788858s =case erlc_SUITE:features =logfile erlc_suite.features.html -=started 2025-01-09 11:49:58 -=ended 2025-01-09 11:50:00 +=started 2025-01-10 19:13:07 +=ended 2025-01-10 19:13:09 =result ok -=elapsed 1.964868s +=elapsed 1.937307s =case erlc_SUITE:end_per_group -=logfile erlc_suite.end_per_group.1154.html +=logfile erlc_suite.end_per_group.1410.html =group_props [{name,without_server}] -=started 2025-01-09 11:50:00 -=ended 2025-01-09 11:50:00 +=started 2025-01-10 19:13:09 +=ended 2025-01-10 19:13:09 =result ok -=elapsed 0.000004s -=group_time 23.038s +=elapsed 0.000003s +=group_time 22.929s =case erlc_SUITE:init_per_group -=logfile erlc_suite.init_per_group.1186.html +=logfile erlc_suite.init_per_group.1442.html =group_props [{name,features_with_server}] -=started 2025-01-09 11:50:00 -=ended 2025-01-09 11:50:12 +=started 2025-01-10 19:13:09 +=ended 2025-01-10 19:13:21 =result ok -=elapsed 12.000975s +=elapsed 12.000758s =case erlc_SUITE:features_erlc_describe -=logfile erlc_suite.features_erlc_describe.1218.html -=started 2025-01-09 11:50:12 -=ended 2025-01-09 11:50:13 +=logfile erlc_suite.features_erlc_describe.1474.html +=started 2025-01-10 19:13:21 +=ended 2025-01-10 19:13:21 =result ok -=elapsed 0.540911s +=elapsed 0.544516s =case erlc_SUITE:features_erlc_unknown -=logfile erlc_suite.features_erlc_unknown.1250.html -=started 2025-01-09 11:50:13 -=ended 2025-01-09 11:50:17 +=logfile erlc_suite.features_erlc_unknown.1506.html +=started 2025-01-10 19:13:21 +=ended 2025-01-10 19:13:25 =result ok -=elapsed 4.244392s +=elapsed 4.193666s =case erlc_SUITE:features_directives -=logfile erlc_suite.features_directives.1282.html -=started 2025-01-09 11:50:17 -=ended 2025-01-09 11:50:18 +=logfile erlc_suite.features_directives.1538.html +=started 2025-01-10 19:13:25 +=ended 2025-01-10 19:13:27 =result ok -=elapsed 1.371649s +=elapsed 1.354427s =case erlc_SUITE:features_atom_warnings -=logfile erlc_suite.features_atom_warnings.1314.html -=started 2025-01-09 11:50:18 -=ended 2025-01-09 11:50:19 +=logfile erlc_suite.features_atom_warnings.1570.html +=started 2025-01-10 19:13:27 +=ended 2025-01-10 19:13:28 =result ok -=elapsed 0.840281s +=elapsed 0.779400s =case erlc_SUITE:features_macros -=logfile erlc_suite.features_macros.1346.html -=started 2025-01-09 11:50:19 -=ended 2025-01-09 11:50:21 +=logfile erlc_suite.features_macros.1602.html +=started 2025-01-10 19:13:28 +=ended 2025-01-10 19:13:29 =result ok -=elapsed 1.907695s +=elapsed 1.859077s =case erlc_SUITE:features_disable -=logfile erlc_suite.features_disable.1698.html -=started 2025-01-09 11:50:21 -=ended 2025-01-09 11:50:22 +=logfile erlc_suite.features_disable.1954.html +=started 2025-01-10 19:13:29 +=ended 2025-01-10 19:13:30 =result ok -=elapsed 0.415984s +=elapsed 0.421093s =case erlc_SUITE:features_all -=logfile erlc_suite.features_all.1794.html -=started 2025-01-09 11:50:22 -=ended 2025-01-09 11:50:23 +=logfile erlc_suite.features_all.2050.html +=started 2025-01-10 19:13:30 +=ended 2025-01-10 19:13:31 =result ok -=elapsed 1.277787s +=elapsed 1.259613s =case erlc_SUITE:features_load -=logfile erlc_suite.features_load.2018.html -=started 2025-01-09 11:50:23 -=ended 2025-01-09 11:50:23 +=logfile erlc_suite.features_load.2274.html +=started 2025-01-10 19:13:31 +=ended 2025-01-10 19:13:31 =result ok -=elapsed 0.170424s +=elapsed 0.149377s =case erlc_SUITE:features_runtime -=logfile erlc_suite.features_runtime.2114.html -=started 2025-01-09 11:50:23 -=ended 2025-01-09 11:50:23 +=logfile erlc_suite.features_runtime.2370.html +=started 2025-01-10 19:13:31 +=ended 2025-01-10 19:13:32 =result ok -=elapsed 0.461459s +=elapsed 0.454172s =case erlc_SUITE:features_include -=logfile erlc_suite.features_include.2338.html -=started 2025-01-09 11:50:23 -=ended 2025-01-09 11:50:27 +=logfile erlc_suite.features_include.2594.html +=started 2025-01-10 19:13:32 +=ended 2025-01-10 19:13:35 =result ok -=elapsed 3.157389s +=elapsed 3.087999s =case erlc_SUITE:features -=logfile erlc_suite.features.2626.html -=started 2025-01-09 11:50:27 -=ended 2025-01-09 11:50:29 +=logfile erlc_suite.features.2882.html +=started 2025-01-10 19:13:35 +=ended 2025-01-10 19:13:37 =result ok -=elapsed 2.260154s +=elapsed 2.205672s =case erlc_SUITE:end_per_group -=logfile erlc_suite.end_per_group.2658.html +=logfile erlc_suite.end_per_group.2914.html =group_props [{name,features_with_server}] -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:37 +=ended 2025-01-10 19:13:37 =result ok =elapsed 0.000003s -=group_time 28.932s +=group_time 28.588s =case erlc_SUITE:end_per_suite =logfile erlc_suite.end_per_suite.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:37 +=ended 2025-01-10 19:13:37 =result ok =elapsed 0.000000s -=group_time 61.160s +=group_time 60.666s =case erlexec_SUITE:init_per_suite =logfile erlexec_suite.init_per_suite.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:37 +=ended 2025-01-10 19:13:37 =result ok =elapsed 0.000003s =case erlexec_SUITE:args_file =logfile erlexec_suite.args_file.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:37 +=ended 2025-01-10 19:13:37 =result ok -=elapsed 0.239863s +=elapsed 0.236160s =case erlexec_SUITE:evil_args_file =logfile erlexec_suite.evil_args_file.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:37 +=ended 2025-01-10 19:13:38 =result ok -=elapsed 0.059057s +=elapsed 0.068528s =case erlexec_SUITE:missing_args_file =logfile erlexec_suite.missing_args_file.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:38 +=ended 2025-01-10 19:13:38 =result ok -=elapsed 0.006572s +=elapsed 0.006658s =case erlexec_SUITE:env =logfile erlexec_suite.env.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:38 +=ended 2025-01-10 19:13:38 =result ok -=elapsed 0.006569s +=elapsed 0.006517s =case erlexec_SUITE:args_file_env =logfile erlexec_suite.args_file_env.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:29 +=started 2025-01-10 19:13:38 +=ended 2025-01-10 19:13:38 =result ok -=elapsed 0.007073s +=elapsed 0.006716s =case erlexec_SUITE:otp_7461 =logfile erlexec_suite.otp_7461.html -=started 2025-01-09 11:50:29 -=ended 2025-01-09 11:50:30 +=started 2025-01-10 19:13:38 +=ended 2025-01-10 19:13:38 =result ok -=elapsed 0.182036s +=elapsed 0.178989s =case erlexec_SUITE:argument_separation =logfile erlexec_suite.argument_separation.html -=started 2025-01-09 11:50:30 -=ended 2025-01-09 11:50:31 +=started 2025-01-10 19:13:38 +=ended 2025-01-10 19:13:40 =result ok -=elapsed 1.529595s +=elapsed 2.028626s =case erlexec_SUITE:argument_with_option =logfile erlexec_suite.argument_with_option.html -=started 2025-01-09 11:50:31 -=ended 2025-01-09 11:50:32 +=started 2025-01-10 19:13:40 +=ended 2025-01-10 19:13:40 =result ok -=elapsed 0.444143s +=elapsed 0.439432s =case erlexec_SUITE:zdbbl_dist_buf_busy_limit =logfile erlexec_suite.zdbbl_dist_buf_busy_limit.html -=started 2025-01-09 11:50:32 -=ended 2025-01-09 11:50:33 +=started 2025-01-10 19:13:40 +=ended 2025-01-10 19:13:42 =result ok -=elapsed 1.526221s +=elapsed 1.526478s =case erlexec_SUITE:end_per_suite =logfile erlexec_suite.end_per_suite.html -=started 2025-01-09 11:50:33 -=ended 2025-01-09 11:50:33 +=started 2025-01-10 19:13:42 +=ended 2025-01-10 19:13:42 =result ok =elapsed 0.000004s -=group_time 4.247s +=group_time 4.744s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.2882.html +=logfile ct_framework.init_per_suite.3106.html =group_props [{suite,ethread_SUITE}] -=started 2025-01-09 11:50:33 -=ended 2025-01-09 11:50:33 +=started 2025-01-10 19:13:42 +=ended 2025-01-10 19:13:42 =result ok =elapsed 0.000000s =case ethread_SUITE:create_join_thread =logfile ethread_suite.create_join_thread.html -=started 2025-01-09 11:50:33 -=ended 2025-01-09 11:50:33 +=started 2025-01-10 19:13:42 +=ended 2025-01-10 19:13:42 =result ok -=elapsed 0.005348s +=elapsed 0.005414s =case ethread_SUITE:equal_tids =logfile ethread_suite.equal_tids.html -=started 2025-01-09 11:50:33 -=ended 2025-01-09 11:50:33 +=started 2025-01-10 19:13:42 +=ended 2025-01-10 19:13:42 =result ok -=elapsed 0.050443s +=elapsed 0.048697s =case ethread_SUITE:mutex =logfile ethread_suite.mutex.html -=started 2025-01-09 11:50:33 -=ended 2025-01-09 11:50:36 +=started 2025-01-10 19:13:42 +=ended 2025-01-10 19:13:45 =result ok -=elapsed 3.005590s +=elapsed 3.005388s =case ethread_SUITE:try_lock_mutex =logfile ethread_suite.try_lock_mutex.html -=started 2025-01-09 11:50:36 -=ended 2025-01-09 11:50:36 +=started 2025-01-10 19:13:45 +=ended 2025-01-10 19:13:45 =result ok -=elapsed 0.001990s +=elapsed 0.001916s =case ethread_SUITE:cond_wait =logfile ethread_suite.cond_wait.html -=started 2025-01-09 11:50:36 -=ended 2025-01-09 11:50:44 +=started 2025-01-10 19:13:45 +=ended 2025-01-10 19:13:53 =result ok -=elapsed 8.010675s +=elapsed 8.010451s =case ethread_SUITE:broadcast =logfile ethread_suite.broadcast.html -=started 2025-01-09 11:50:44 -=ended 2025-01-09 11:50:45 +=started 2025-01-10 19:13:53 +=ended 2025-01-10 19:13:53 =result ok -=elapsed 0.049836s +=elapsed 0.049831s =case ethread_SUITE:detached_thread =logfile ethread_suite.detached_thread.html -=started 2025-01-09 11:50:45 -=ended 2025-01-09 11:50:47 +=started 2025-01-10 19:13:53 +=ended 2025-01-10 19:13:55 =result ok -=elapsed 2.127630s +=elapsed 2.112943s =case ethread_SUITE:max_threads =logfile ethread_suite.max_threads.html -=started 2025-01-09 11:50:47 -=ended 2025-01-09 11:50:47 +=started 2025-01-10 19:13:55 +=ended 2025-01-10 19:13:56 =result ok: Max created threads: 466, 466, 466, 466, 466, 466, 466, 466, 466, 466 -=elapsed 0.272547s +=elapsed 0.263178s =case ethread_SUITE:tsd =logfile ethread_suite.tsd.html -=started 2025-01-09 11:50:47 -=ended 2025-01-09 11:50:47 +=started 2025-01-10 19:13:56 +=ended 2025-01-10 19:13:56 =result ok -=elapsed 0.002488s +=elapsed 0.002293s =case ethread_SUITE:spinlock =logfile ethread_suite.spinlock.html -=started 2025-01-09 11:50:47 -=ended 2025-01-09 11:50:50 +=started 2025-01-10 19:13:56 +=ended 2025-01-10 19:13:59 =result ok -=elapsed 3.005320s +=elapsed 3.005257s =case ethread_SUITE:rwspinlock =logfile ethread_suite.rwspinlock.html -=started 2025-01-09 11:50:50 -=ended 2025-01-09 11:50:53 +=started 2025-01-10 19:13:59 +=ended 2025-01-10 19:14:02 =result ok -=elapsed 3.006098s +=elapsed 3.005463s =case ethread_SUITE:rwmutex =logfile ethread_suite.rwmutex.html -=started 2025-01-09 11:50:53 -=ended 2025-01-09 11:50:56 +=started 2025-01-10 19:14:02 +=ended 2025-01-10 19:14:05 =result ok -=elapsed 3.005918s +=elapsed 3.005548s =case ethread_SUITE:atomic =logfile ethread_suite.atomic.html -=started 2025-01-09 11:50:56 -=ended 2025-01-09 11:50:56 +=started 2025-01-10 19:14:05 +=ended 2025-01-10 19:14:05 =result ok -=elapsed 0.014824s +=elapsed 0.016404s =case ethread_SUITE:dw_atomic_massage =logfile ethread_suite.dw_atomic_massage.html -=started 2025-01-09 11:50:56 -=ended 2025-01-09 11:50:59 +=started 2025-01-10 19:14:05 +=ended 2025-01-10 19:14:08 =result ok -=elapsed 2.747700s +=elapsed 2.780753s =case ethread_SUITE:thread_name =logfile ethread_suite.thread_name.html -=started 2025-01-09 11:50:59 -=ended 2025-01-09 11:50:59 +=started 2025-01-10 19:14:08 +=ended 2025-01-10 19:14:08 =result ok -=elapsed 0.002152s +=elapsed 0.002090s =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.2914.html +=logfile ct_framework.end_per_suite.3138.html =group_props [{suite,ethread_SUITE}] -=started 2025-01-09 11:50:59 -=ended 2025-01-09 11:50:59 +=started 2025-01-10 19:14:08 +=ended 2025-01-10 19:14:08 =result ok =elapsed 0.000000s -=group_time 25.692s +=group_time 25.703s =case install_SUITE:init_per_suite =logfile install_suite.init_per_suite.html -=started 2025-01-09 11:50:59 -=ended 2025-01-09 11:50:59 +=started 2025-01-10 19:14:08 +=ended 2025-01-10 19:14:08 =result ok -=elapsed 0.000085s +=elapsed 0.000083s =case install_SUITE:bin_default =logfile install_suite.bin_default.html -=started 2025-01-09 11:50:59 -=ended 2025-01-09 11:50:59 +=started 2025-01-10 19:14:08 +=ended 2025-01-10 19:14:08 =result ok -=elapsed 0.272598s +=elapsed 0.259319s =case install_SUITE:bin_default_dirty =logfile install_suite.bin_default_dirty.html -=started 2025-01-09 11:50:59 -=ended 2025-01-09 11:51:00 +=started 2025-01-10 19:14:08 +=ended 2025-01-10 19:14:08 =result ok -=elapsed 0.319207s +=elapsed 0.308845s =case install_SUITE:bin_outside_eprfx =logfile install_suite.bin_outside_eprfx.html -=started 2025-01-09 11:51:00 -=ended 2025-01-09 11:51:00 +=started 2025-01-10 19:14:08 +=ended 2025-01-10 19:14:09 =result ok -=elapsed 0.282523s +=elapsed 0.265580s =case install_SUITE:bin_outside_eprfx_dirty =logfile install_suite.bin_outside_eprfx_dirty.html -=started 2025-01-09 11:51:00 -=ended 2025-01-09 11:51:00 +=started 2025-01-10 19:14:09 +=ended 2025-01-10 19:14:09 =result ok -=elapsed 0.292469s +=elapsed 0.274173s =case install_SUITE:bin_not_abs =logfile install_suite.bin_not_abs.html -=started 2025-01-09 11:51:00 -=ended 2025-01-09 11:51:00 +=started 2025-01-10 19:14:09 +=ended 2025-01-10 19:14:09 =result ok -=elapsed 0.171966s +=elapsed 0.159368s =case install_SUITE:bin_unreasonable_path =logfile install_suite.bin_unreasonable_path.html -=started 2025-01-09 11:51:00 -=ended 2025-01-09 11:51:01 +=started 2025-01-10 19:14:09 +=ended 2025-01-10 19:14:09 =result ok -=elapsed 0.301619s +=elapsed 0.281702s =case install_SUITE:'bin white space' =logfile install_suite.'bin white space'.html -=started 2025-01-09 11:51:01 -=ended 2025-01-09 11:51:01 +=started 2025-01-10 19:14:09 +=ended 2025-01-10 19:14:10 =result ok -=elapsed 0.275271s +=elapsed 0.256895s =case install_SUITE:bin_no_srcfile =logfile install_suite.bin_no_srcfile.html -=started 2025-01-09 11:51:01 -=ended 2025-01-09 11:51:01 +=started 2025-01-10 19:14:10 +=ended 2025-01-10 19:14:10 =result ok -=elapsed 0.226054s +=elapsed 0.212442s =case install_SUITE:bin_unreachable_absolute =logfile install_suite.bin_unreachable_absolute.html -=started 2025-01-09 11:51:01 -=ended 2025-01-09 11:51:02 +=started 2025-01-10 19:14:10 +=ended 2025-01-10 19:14:10 =result ok -=elapsed 0.282670s +=elapsed 0.266237s =case install_SUITE:bin_unreachable_relative =logfile install_suite.bin_unreachable_relative.html -=started 2025-01-09 11:51:02 -=ended 2025-01-09 11:51:02 +=started 2025-01-10 19:14:10 +=ended 2025-01-10 19:14:10 =result ok -=elapsed 0.278722s +=elapsed 0.262359s =case install_SUITE:bin_same_dir =logfile install_suite.bin_same_dir.html -=started 2025-01-09 11:51:02 -=ended 2025-01-09 11:51:02 +=started 2025-01-10 19:14:10 +=ended 2025-01-10 19:14:11 =result ok -=elapsed 0.211708s +=elapsed 0.202300s =case install_SUITE:bin_ok_symlink =logfile install_suite.bin_ok_symlink.html -=started 2025-01-09 11:51:02 -=ended 2025-01-09 11:51:02 +=started 2025-01-10 19:14:11 +=ended 2025-01-10 19:14:11 =result ok -=elapsed 0.271757s +=elapsed 0.260032s =case install_SUITE:bin_dirname_fail =logfile install_suite.bin_dirname_fail.html -=started 2025-01-09 11:51:03 -=ended 2025-01-09 11:51:03 +=started 2025-01-10 19:14:11 +=ended 2025-01-10 19:14:11 =result ok -=elapsed 0.275573s +=elapsed 0.266951s =case install_SUITE:bin_no_use_dirname_fail =logfile install_suite.bin_no_use_dirname_fail.html -=started 2025-01-09 11:51:03 -=ended 2025-01-09 11:51:03 +=started 2025-01-10 19:14:11 +=ended 2025-01-10 19:14:12 =result ok -=elapsed 0.273089s +=elapsed 0.259726s =case install_SUITE:end_per_suite =logfile install_suite.end_per_suite.html -=started 2025-01-09 11:51:03 -=ended 2025-01-09 11:51:03 +=started 2025-01-10 19:14:12 +=ended 2025-01-10 19:14:12 =result ok =elapsed 0.000000s -=group_time 4.101s +=group_time 3.900s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.2946.html +=logfile ct_framework.init_per_suite.3170.html =group_props [{suite,nt_SUITE}] -=started 2025-01-09 11:51:03 -=ended 2025-01-09 11:51:03 +=started 2025-01-10 19:14:12 +=ended 2025-01-10 19:14:12 =result ok =elapsed 0.000000s =case nt_SUITE:nt =logfile nt_suite.nt.html -=started 2025-01-09 11:51:03 -=ended 2025-01-09 11:51:03 +=started 2025-01-10 19:14:12 +=ended 2025-01-10 19:14:12 =result skipped: "This test case is intended for Win NT only." =elapsed 0.000001s === *** SKIPPED test case 86 of 109 *** =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.2978.html +=logfile ct_framework.end_per_suite.3202.html =group_props [{suite,nt_SUITE}] -=started 2025-01-09 11:51:03 -=ended 2025-01-09 11:51:03 +=started 2025-01-10 19:14:12 +=ended 2025-01-10 19:14:12 =result ok =elapsed 0.000000s -=group_time 0.055s +=group_time 0.054s =case otp_SUITE:init_per_suite =logfile otp_suite.init_per_suite.html -=started 2025-01-09 11:51:03 -=ended 2025-01-09 11:51:06 +=started 2025-01-10 19:14:12 +=ended 2025-01-10 19:14:15 =result ok -=elapsed 2.968913s +=elapsed 2.846023s =case otp_SUITE:undefined_functions =logfile otp_suite.undefined_functions.html -=started 2025-01-09 11:51:06 -=ended 2025-01-09 11:51:08 +=started 2025-01-10 19:14:15 +=ended 2025-01-10 19:14:16 =result ok -=elapsed 1.765459s +=elapsed 1.307638s =case otp_SUITE:deprecated_not_in_obsolete =logfile otp_suite.deprecated_not_in_obsolete.html -=started 2025-01-09 11:51:08 -=ended 2025-01-09 11:51:08 +=started 2025-01-10 19:14:16 +=ended 2025-01-10 19:14:16 =result ok -=elapsed 0.000229s +=elapsed 0.000234s =case otp_SUITE:obsolete_but_not_deprecated =logfile otp_suite.obsolete_but_not_deprecated.html -=started 2025-01-09 11:51:08 -=ended 2025-01-09 11:51:08 +=started 2025-01-10 19:14:16 +=ended 2025-01-10 19:14:16 =result ok -=elapsed 0.008998s +=elapsed 0.007043s =case otp_SUITE:call_to_deprecated =logfile otp_suite.call_to_deprecated.html -=started 2025-01-09 11:51:08 -=ended 2025-01-09 11:51:09 +=started 2025-01-10 19:14:16 +=ended 2025-01-10 19:14:16 =result ok: 47 calls to deprecated functions -=elapsed 0.635032s +=elapsed 0.468232s =case otp_SUITE:call_to_size_1 =logfile otp_suite.call_to_size_1.html -=started 2025-01-09 11:51:09 -=ended 2025-01-09 11:51:09 +=started 2025-01-10 19:14:16 +=ended 2025-01-10 19:14:17 =result ok -=elapsed 0.518943s +=elapsed 0.366947s =case otp_SUITE:call_to_now_0 =logfile otp_suite.call_to_now_0.html -=started 2025-01-09 11:51:09 -=ended 2025-01-09 11:51:10 +=started 2025-01-10 19:14:17 +=ended 2025-01-10 19:14:17 =result ok -=elapsed 0.480950s +=elapsed 0.375979s =case otp_SUITE:strong_components =logfile otp_suite.strong_components.html -=started 2025-01-09 11:51:10 -=ended 2025-01-09 11:51:10 +=started 2025-01-10 19:14:17 +=ended 2025-01-10 19:14:17 =result ok -=elapsed 0.000615s +=elapsed 0.000679s =case otp_SUITE:erl_file_encoding =logfile otp_suite.erl_file_encoding.html -=started 2025-01-09 11:51:10 -=ended 2025-01-09 11:51:10 +=started 2025-01-10 19:14:17 +=ended 2025-01-10 19:14:18 =result ok -=elapsed 0.266202s +=elapsed 0.309864s =case otp_SUITE:xml_file_encoding =logfile otp_suite.xml_file_encoding.html -=started 2025-01-09 11:51:10 -=ended 2025-01-09 11:51:10 +=started 2025-01-10 19:14:18 +=ended 2025-01-10 19:14:18 =result ok -=elapsed 0.042307s +=elapsed 0.076890s =case otp_SUITE:runtime_dependencies_functions =logfile otp_suite.runtime_dependencies_functions.html -=started 2025-01-09 11:51:10 -=ended 2025-01-09 11:51:10 +=started 2025-01-10 19:14:18 +=ended 2025-01-10 19:14:18 =result ok: Ignored applications: [diameter] Ignored failures: [{missing_runtime_dependency, [47,98,117,105,108,100, 114,111,111,116,47,111, @@ -750,11 +750,11 @@ 116,101,114,46,97,112, 112], runtime_tools}] -=elapsed 0.020183s +=elapsed 0.029795s =case otp_SUITE:runtime_dependencies_modules =logfile otp_suite.runtime_dependencies_modules.html -=started 2025-01-09 11:51:10 -=ended 2025-01-09 11:51:11 +=started 2025-01-10 19:14:18 +=ended 2025-01-10 19:14:18 =result ok: Ignored applications: [diameter] Ignored failures: [{missing_runtime_dependency, [47,98,117,105,108,100, 114,111,111,116,47,111, @@ -787,158 +787,158 @@ 116,101,114,46,97,112, 112], runtime_tools}] -=elapsed 0.488081s +=elapsed 0.496953s =case otp_SUITE:test_runtime_dependencies_versions =logfile otp_suite.test_runtime_dependencies_versions.html -=started 2025-01-09 11:51:11 -=ended 2025-01-09 11:51:11 +=started 2025-01-10 19:14:18 +=ended 2025-01-10 19:14:18 =result skipped: "This test case is designed to run in the Erlang/OTP teams test system for daily tests. The test case depends on that app versions have been set correctly by scripts that are executed before creating builds for the daily tests." -=elapsed 0.009977s +=elapsed 0.009436s === *** SKIPPED test case 98 of 109 *** =case otp_SUITE:end_per_suite =logfile otp_suite.end_per_suite.html -=started 2025-01-09 11:51:11 -=ended 2025-01-09 11:51:11 +=started 2025-01-10 19:14:18 +=ended 2025-01-10 19:14:18 =result ok -=elapsed 0.000020s -=group_time 7.512s +=elapsed 0.000018s +=group_time 6.605s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.3010.html +=logfile ct_framework.init_per_suite.3234.html =group_props [{suite,parallel_messages_SUITE}] -=started 2025-01-09 11:51:11 -=ended 2025-01-09 11:51:11 +=started 2025-01-10 19:14:18 +=ended 2025-01-10 19:14:18 =result ok =elapsed 0.000000s =case parallel_messages_SUITE:test_throughput_benchmark =logfile parallel_messages_suite.test_throughput_benchmark.html -=started 2025-01-09 11:51:11 -=ended 2025-01-09 11:51:31 -=result ok: Result visualization -=elapsed 20.263601s +=started 2025-01-10 19:14:18 +=ended 2025-01-10 19:14:39 +=result ok: Result visualization +=elapsed 20.249767s =case parallel_messages_SUITE:test_message_queue_data_switching =logfile parallel_messages_suite.test_message_queue_data_switching.html -=started 2025-01-09 11:51:31 -=ended 2025-01-09 11:51:33 -=result ok: Result visualization -=elapsed 1.871310s +=started 2025-01-10 19:14:39 +=ended 2025-01-10 19:15:14 +=result ok: Result visualization +=elapsed 35.611634s =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.3746.html +=logfile ct_framework.end_per_suite.387.html =group_props [{suite,parallel_messages_SUITE}] -=started 2025-01-09 11:51:33 -=ended 2025-01-09 11:51:33 +=started 2025-01-10 19:15:14 +=ended 2025-01-10 19:15:14 =result ok -=elapsed 0.000000s -=group_time 22.208s +=elapsed 0.000001s +=group_time 55.934s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.3778.html +=logfile ct_framework.init_per_suite.4450.html =group_props [{suite,run_erl_SUITE}] -=started 2025-01-09 11:51:33 -=ended 2025-01-09 11:51:33 +=started 2025-01-10 19:15:14 +=ended 2025-01-10 19:15:14 =result ok =elapsed 0.000000s =case run_erl_SUITE:basic =logfile run_erl_suite.basic.html -=started 2025-01-09 11:51:33 -=ended 2025-01-09 11:51:33 +=started 2025-01-10 19:15:14 +=ended 2025-01-10 19:15:15 =result ok -=elapsed 0.186596s +=elapsed 0.194758s =case run_erl_SUITE:sleepy_child =logfile run_erl_suite.sleepy_child.html -=started 2025-01-09 11:51:33 -=ended 2025-01-09 11:51:34 +=started 2025-01-10 19:15:15 +=ended 2025-01-10 19:15:16 =result ok -=elapsed 1.190244s +=elapsed 1.183670s =case run_erl_SUITE:heavy =logfile run_erl_suite.heavy.html -=started 2025-01-09 11:51:34 -=ended 2025-01-09 11:51:36 +=started 2025-01-10 19:15:16 +=ended 2025-01-10 19:15:17 =result ok -=elapsed 1.223509s +=elapsed 1.212355s =case run_erl_SUITE:heavier =logfile run_erl_suite.heavier.html -=started 2025-01-09 11:51:36 -=ended 2025-01-09 11:51:38 +=started 2025-01-10 19:15:17 +=ended 2025-01-10 19:15:19 =result ok -=elapsed 1.947809s +=elapsed 1.933461s =case run_erl_SUITE:defunct =logfile run_erl_suite.defunct.html -=started 2025-01-09 11:51:38 -=ended 2025-01-09 11:51:43 +=started 2025-01-10 19:15:19 +=ended 2025-01-10 19:15:29 =result ok -=elapsed 5.010494s +=elapsed 10.007508s =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.3970.html +=logfile ct_framework.end_per_suite.4610.html =group_props [{suite,run_erl_SUITE}] -=started 2025-01-09 11:51:43 -=ended 2025-01-09 11:51:43 +=started 2025-01-10 19:15:29 +=ended 2025-01-10 19:15:29 =result ok =elapsed 0.000000s -=group_time 9.706s +=group_time 14.677s =case upgrade_SUITE:init_per_suite =logfile upgrade_suite.init_per_suite.html -=started 2025-01-09 11:51:43 -=ended 2025-01-09 11:51:43 +=started 2025-01-10 19:15:29 +=ended 2025-01-10 19:15:29 =result ok -=elapsed 0.000072s +=elapsed 0.000042s =case upgrade_SUITE:minor =logfile upgrade_suite.minor.html -=started 2025-01-09 11:51:43 -=node_start 'otp-27@e52b4f92c4db' -=node_stop 'otp-27@e52b4f92c4db' -=ended 2025-01-09 11:52:01 +=started 2025-01-10 19:15:29 +=node_start 'otp-27@30452ec2e0b4' +=node_stop 'otp-27@30452ec2e0b4' +=ended 2025-01-10 19:15:47 =result ok -=elapsed 18.310125s +=elapsed 18.119643s =case upgrade_SUITE:major =logfile upgrade_suite.major.html -=started 2025-01-09 11:52:01 -=node_start 'otp-26@e52b4f92c4db' +=started 2025-01-10 19:15:47 +=node_start 'otp-26@30452ec2e0b4' WARNING: Started node reports different system version than current node! Current node version: "27", "Erlang/OTP 27 [erts-15.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]\n" Started node version: "26", "Erlang/OTP 26 [erts-14.2.5.5] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]\n" -=node_stop 'otp-26@e52b4f92c4db' -=ended 2025-01-09 11:52:50 +=node_stop 'otp-26@30452ec2e0b4' +=ended 2025-01-10 19:16:31 =result ok -=elapsed 48.748727s +=elapsed 43.493689s =case upgrade_SUITE:ancient_major =logfile upgrade_suite.ancient_major.html -=started 2025-01-09 11:52:50 -=node_start 'otp-25@e52b4f92c4db' +=started 2025-01-10 19:16:31 +=node_start 'otp-25@30452ec2e0b4' WARNING: Started node reports different system version than current node! Current node version: "27", "Erlang/OTP 27 [erts-15.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]\n" Started node version: "25", "Erlang/OTP 25 [erts-13.2.2.12] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]\n" -=node_stop 'otp-25@e52b4f92c4db' -=ended 2025-01-09 11:53:32 +=node_stop 'otp-25@30452ec2e0b4' +=ended 2025-01-10 19:17:12 =result ok -=elapsed 41.084736s +=elapsed 40.785238s =case upgrade_SUITE:end_per_suite =logfile upgrade_suite.end_per_suite.html -=started 2025-01-09 11:53:32 -=ended 2025-01-09 11:53:32 +=started 2025-01-10 19:17:12 +=ended 2025-01-10 19:17:12 =result ok =elapsed 0.000000s -=group_time 108.981s +=group_time 103.093s =case ct_framework:init_per_suite -=logfile ct_framework.init_per_suite.4514.html +=logfile ct_framework.init_per_suite.5122.html =group_props [{suite,z_SUITE}] -=started 2025-01-09 11:53:32 -=ended 2025-01-09 11:53:32 +=started 2025-01-10 19:17:12 +=ended 2025-01-10 19:17:12 =result ok =elapsed 0.000000s =case z_SUITE:core_files =logfile z_suite.core_files.html -=started 2025-01-09 11:53:32 -=ended 2025-01-09 11:53:32 +=started 2025-01-10 19:17:12 +=ended 2025-01-10 19:17:13 =result ok -=elapsed 0.481892s +=elapsed 0.476726s =case ct_framework:end_per_suite -=logfile ct_framework.end_per_suite.4546.html +=logfile ct_framework.end_per_suite.5154.html =group_props [{suite,z_SUITE}] -=started 2025-01-09 11:53:32 -=ended 2025-01-09 11:53:32 +=started 2025-01-10 19:17:13 +=ended 2025-01-10 19:17:13 =result ok =elapsed 0.000000s -=group_time 0.531s +=group_time 0.525s === TEST COMPLETE, 107 ok, 0 failed, 2 skipped of 109 test cases -=finished 2025-01-09 11:53:32 +=finished 2025-01-10 19:17:13 =failed 0 =successful 107 =user_skipped 2 =auto_skipped 0 -=elapsed_time 244804685 +=elapsed_time 276560528 diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.log.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.log.html similarity index 79% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.log.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.log.html index 371e06fb7af2d..bc11a10263c55 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.log.html +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.log.html @@ -80,9 +80,9 @@

Results for make_test_dir.system_test

-

Test started at 2025-01-09 11:49:27

+

Test started at 2025-01-10 19:12:36

Host info:
-Run by otptest on e52b4f92c4db
Used Erlang v15.2 in "/buildroot/otp/erts/make_test_dir/Erlang ∅⊤℞"

+Run by otptest on 30452ec2e0b4
Used Erlang v15.2 in "/buildroot/otp/erts/make_test_dir/Erlang ∅⊤℞"

  • Full textual log
  • Coverage log
  • @@ -97,120 +97,120 @@

    Test started at 2025-01-09 11:49:27

    common_testinit_per_suite< >0.000000sOk -1erl_print_SUITEerlang_display< >0.003561sOk -2erl_print_SUITEinteger< >0.027947sOk -3erl_print_SUITEfloat< >0.002507sOk -4erl_print_SUITEstring< >0.002269sOk -5erl_print_SUITEcharacter< >0.022344sOk -6erl_print_SUITEsnprintf< >0.002531sOk -7erl_print_SUITEquote< >0.002575sOk +1erl_print_SUITEerlang_display< >0.003579sOk +2erl_print_SUITEinteger< >0.031940sOk +3erl_print_SUITEfloat< >0.002244sOk +4erl_print_SUITEstring< >0.001931sOk +5erl_print_SUITEcharacter< >0.017980sOk +6erl_print_SUITEsnprintf< >0.001996sOk +7erl_print_SUITEquote< >0.001997sOk common_testend_per_suite< >0.000000sOk erlc_SUITEinit_per_suite< >0.000000sOk erlc_SUITEwith_serverinit_per_group< >0.000002sOk -8erlc_SUITEwith_servercompile_erl< >1.081581sOk -9erlc_SUITEwith_servercompile_yecc< >0.422413sOk -10erlc_SUITEwith_servercompile_script< >0.353463sOk -11erlc_SUITEwith_servercompile_mib< >0.939512sOk -12erlc_SUITEwith_servergood_citizen< >0.255580sOk -13erlc_SUITEwith_serverdeep_cwd< >0.261451sOk -14erlc_SUITEwith_serverarg_overflow< >0.378077sOk -15erlc_SUITEwith_servermake_dep_options< >4.894611sOk -16erlc_SUITEwith_serverunicode_paths< >0.269284sOk +8erlc_SUITEwith_servercompile_erl< >1.095765sOk +9erlc_SUITEwith_servercompile_yecc< >0.426460sOk +10erlc_SUITEwith_servercompile_script< >0.355673sOk +11erlc_SUITEwith_servercompile_mib< >0.938135sOk +12erlc_SUITEwith_servergood_citizen< >0.271170sOk +13erlc_SUITEwith_serverdeep_cwd< >0.277518sOk +14erlc_SUITEwith_serverarg_overflow< >0.372386sOk +15erlc_SUITEwith_servermake_dep_options< >4.803670sOk +16erlc_SUITEwith_serverunicode_paths< >0.274184sOk erlc_SUITEwith_serverend_per_group< >0.000003sOk erlc_SUITEwithout_serverinit_per_group< >0.000002sOk -17erlc_SUITEwithout_servercompile_erl< >0.997495sOk -18erlc_SUITEwithout_servercompile_yecc< >0.322984sOk -19erlc_SUITEwithout_servercompile_script< >0.277054sOk -20erlc_SUITEwithout_servercompile_mib< >0.720803sOk -21erlc_SUITEwithout_servergood_citizen< >0.240986sOk -22erlc_SUITEwithout_serverdeep_cwd< >0.238372sOk -23erlc_SUITEwithout_serverarg_overflow< >0.324593sOk -24erlc_SUITEwithout_servermake_dep_options< >4.223877sOk -25erlc_SUITEwithout_serverunicode_paths< >0.241937sOk -26erlc_SUITEwithout_serverfeatures_erlc_describe< >0.417149sOk -27erlc_SUITEwithout_serverfeatures_erlc_unknown< >3.774676sOk -28erlc_SUITEwithout_serverfeatures_directives< >1.216277sOk -29erlc_SUITEwithout_serverfeatures_atom_warnings< >0.736561sOk -30erlc_SUITEwithout_serverfeatures_macros< >1.766406sOk -31erlc_SUITEwithout_serverfeatures_disable< >0.403126sOk -32erlc_SUITEwithout_serverfeatures_all< >1.199051sOk -33erlc_SUITEwithout_serverfeatures_load< >0.160310sOk -34erlc_SUITEwithout_serverfeatures_runtime< >0.470910sOk -35erlc_SUITEwithout_serverfeatures_include< >2.853043sOk -36erlc_SUITEwithout_serverfeatures< >1.964868sOk -erlc_SUITEwithout_serverend_per_group< >0.000004sOk -erlc_SUITEfeatures_with_serverinit_per_group< >12.000975sOk -37erlc_SUITEfeatures_with_serverfeatures_erlc_describe< >0.540911sOk -38erlc_SUITEfeatures_with_serverfeatures_erlc_unknown< >4.244392sOk -39erlc_SUITEfeatures_with_serverfeatures_directives< >1.371649sOk -40erlc_SUITEfeatures_with_serverfeatures_atom_warnings< >0.840281sOk -41erlc_SUITEfeatures_with_serverfeatures_macros< >1.907695sOk -42erlc_SUITEfeatures_with_serverfeatures_disable< >0.415984sOk -43erlc_SUITEfeatures_with_serverfeatures_all< >1.277787sOk -44erlc_SUITEfeatures_with_serverfeatures_load< >0.170424sOk -45erlc_SUITEfeatures_with_serverfeatures_runtime< >0.461459sOk -46erlc_SUITEfeatures_with_serverfeatures_include< >3.157389sOk -47erlc_SUITEfeatures_with_serverfeatures< >2.260154sOk -erlc_SUITEfeatures_with_serverend_per_group< >0.000003sOk +17erlc_SUITEwithout_servercompile_erl< >0.975860sOk +18erlc_SUITEwithout_servercompile_yecc< >0.327345sOk +19erlc_SUITEwithout_servercompile_script< >0.277326sOk +20erlc_SUITEwithout_servercompile_mib< >0.733350sOk +21erlc_SUITEwithout_servergood_citizen< >0.237463sOk +22erlc_SUITEwithout_serverdeep_cwd< >0.239369sOk +23erlc_SUITEwithout_serverarg_overflow< >0.328817sOk +24erlc_SUITEwithout_servermake_dep_options< >4.321586sOk +25erlc_SUITEwithout_serverunicode_paths< >0.238346sOk +26erlc_SUITEwithout_serverfeatures_erlc_describe< >0.412070sOk +27erlc_SUITEwithout_serverfeatures_erlc_unknown< >3.740006sOk +28erlc_SUITEwithout_serverfeatures_directives< >1.210270sOk +29erlc_SUITEwithout_serverfeatures_atom_warnings< >0.729221sOk +30erlc_SUITEwithout_serverfeatures_macros< >1.755332sOk +31erlc_SUITEwithout_serverfeatures_disable< >0.398919sOk +32erlc_SUITEwithout_serverfeatures_all< >1.174406sOk +33erlc_SUITEwithout_serverfeatures_load< >0.157724sOk +34erlc_SUITEwithout_serverfeatures_runtime< >0.459450sOk +35erlc_SUITEwithout_serverfeatures_include< >2.788858sOk +36erlc_SUITEwithout_serverfeatures< >1.937307sOk +erlc_SUITEwithout_serverend_per_group< >0.000003sOk +erlc_SUITEfeatures_with_serverinit_per_group< >12.000758sOk +37erlc_SUITEfeatures_with_serverfeatures_erlc_describe< >0.544516sOk +38erlc_SUITEfeatures_with_serverfeatures_erlc_unknown< >4.193666sOk +39erlc_SUITEfeatures_with_serverfeatures_directives< >1.354427sOk +40erlc_SUITEfeatures_with_serverfeatures_atom_warnings< >0.779400sOk +41erlc_SUITEfeatures_with_serverfeatures_macros< >1.859077sOk +42erlc_SUITEfeatures_with_serverfeatures_disable< >0.421093sOk +43erlc_SUITEfeatures_with_serverfeatures_all< >1.259613sOk +44erlc_SUITEfeatures_with_serverfeatures_load< >0.149377sOk +45erlc_SUITEfeatures_with_serverfeatures_runtime< >0.454172sOk +46erlc_SUITEfeatures_with_serverfeatures_include< >3.087999sOk +47erlc_SUITEfeatures_with_serverfeatures< >2.205672sOk +erlc_SUITEfeatures_with_serverend_per_group< >0.000003sOk erlc_SUITEend_per_suite< >0.000000sOk erlexec_SUITEinit_per_suite< >0.000003sOk -48erlexec_SUITEargs_file< >0.239863sOk -49erlexec_SUITEevil_args_file< >0.059057sOk -50erlexec_SUITEmissing_args_file< >0.006572sOk -51erlexec_SUITEenv< >0.006569sOk -52erlexec_SUITEargs_file_env< >0.007073sOk -53erlexec_SUITEotp_7461< >0.182036sOk -54erlexec_SUITEargument_separation< >1.529595sOk -55erlexec_SUITEargument_with_option< >0.444143sOk -56erlexec_SUITEzdbbl_dist_buf_busy_limit< >1.526221sOk +48erlexec_SUITEargs_file< >0.236160sOk +49erlexec_SUITEevil_args_file< >0.068528sOk +50erlexec_SUITEmissing_args_file< >0.006658sOk +51erlexec_SUITEenv< >0.006517sOk +52erlexec_SUITEargs_file_env< >0.006716sOk +53erlexec_SUITEotp_7461< >0.178989sOk +54erlexec_SUITEargument_separation< >2.028626sOk +55erlexec_SUITEargument_with_option< >0.439432sOk +56erlexec_SUITEzdbbl_dist_buf_busy_limit< >1.526478sOk erlexec_SUITEend_per_suite< >0.000004sOk -common_testinit_per_suite< >0.000000sOk -57ethread_SUITEcreate_join_thread< >0.005348sOk -58ethread_SUITEequal_tids< >0.050443sOk -59ethread_SUITEmutex< >3.005590sOk -60ethread_SUITEtry_lock_mutex< >0.001990sOk -61ethread_SUITEcond_wait< >8.010675sOk -62ethread_SUITEbroadcast< >0.049836sOk -63ethread_SUITEdetached_thread< >2.127630sOk -64ethread_SUITEmax_threads< >0.272547sOkMax created threads: 466, 466, 466, 466, 466, 466, 466, 466, 466, 466 -65ethread_SUITEtsd< >0.002488sOk -66ethread_SUITEspinlock< >3.005320sOk -67ethread_SUITErwspinlock< >3.006098sOk -68ethread_SUITErwmutex< >3.005918sOk -69ethread_SUITEatomic< >0.014824sOk -70ethread_SUITEdw_atomic_massage< >2.747700sOk -71ethread_SUITEthread_name< >0.002152sOk -common_testend_per_suite< >0.000000sOk -install_SUITEinit_per_suite< >0.000085sOk -72install_SUITEbin_default< >0.272598sOk -73install_SUITEbin_default_dirty< >0.319207sOk -74install_SUITEbin_outside_eprfx< >0.282523sOk -75install_SUITEbin_outside_eprfx_dirty< >0.292469sOk -76install_SUITEbin_not_abs< >0.171966sOk -77install_SUITEbin_unreasonable_path< >0.301619sOk -78install_SUITE'bin white space'< >0.275271sOk -79install_SUITEbin_no_srcfile< >0.226054sOk -80install_SUITEbin_unreachable_absolute< >0.282670sOk -81install_SUITEbin_unreachable_relative< >0.278722sOk -82install_SUITEbin_same_dir< >0.211708sOk -83install_SUITEbin_ok_symlink< >0.271757sOk -84install_SUITEbin_dirname_fail< >0.275573sOk -85install_SUITEbin_no_use_dirname_fail< >0.273089sOk +common_testinit_per_suite< >0.000000sOk +57ethread_SUITEcreate_join_thread< >0.005414sOk +58ethread_SUITEequal_tids< >0.048697sOk +59ethread_SUITEmutex< >3.005388sOk +60ethread_SUITEtry_lock_mutex< >0.001916sOk +61ethread_SUITEcond_wait< >8.010451sOk +62ethread_SUITEbroadcast< >0.049831sOk +63ethread_SUITEdetached_thread< >2.112943sOk +64ethread_SUITEmax_threads< >0.263178sOkMax created threads: 466, 466, 466, 466, 466, 466, 466, 466, 466, 466 +65ethread_SUITEtsd< >0.002293sOk +66ethread_SUITEspinlock< >3.005257sOk +67ethread_SUITErwspinlock< >3.005463sOk +68ethread_SUITErwmutex< >3.005548sOk +69ethread_SUITEatomic< >0.016404sOk +70ethread_SUITEdw_atomic_massage< >2.780753sOk +71ethread_SUITEthread_name< >0.002090sOk +common_testend_per_suite< >0.000000sOk +install_SUITEinit_per_suite< >0.000083sOk +72install_SUITEbin_default< >0.259319sOk +73install_SUITEbin_default_dirty< >0.308845sOk +74install_SUITEbin_outside_eprfx< >0.265580sOk +75install_SUITEbin_outside_eprfx_dirty< >0.274173sOk +76install_SUITEbin_not_abs< >0.159368sOk +77install_SUITEbin_unreasonable_path< >0.281702sOk +78install_SUITE'bin white space'< >0.256895sOk +79install_SUITEbin_no_srcfile< >0.212442sOk +80install_SUITEbin_unreachable_absolute< >0.266237sOk +81install_SUITEbin_unreachable_relative< >0.262359sOk +82install_SUITEbin_same_dir< >0.202300sOk +83install_SUITEbin_ok_symlink< >0.260032sOk +84install_SUITEbin_dirname_fail< >0.266951sOk +85install_SUITEbin_no_use_dirname_fail< >0.259726sOk install_SUITEend_per_suite< >0.000000sOk -common_testinit_per_suite< >0.000000sOk +common_testinit_per_suite< >0.000000sOk 86nt_SUITEnt< >0.000001sSKIPPEDThis test case is intended for Win NT only. -common_testend_per_suite< >0.000000sOk -otp_SUITEinit_per_suite< >2.968913sOk -87otp_SUITEundefined_functions< >1.765459sOk -88otp_SUITEdeprecated_not_in_obsolete< >0.000229sOk -89otp_SUITEobsolete_but_not_deprecated< >0.008998sOk -90otp_SUITEcall_to_deprecated< >0.635032sOk47 calls to deprecated functions -91otp_SUITEcall_to_size_1< >0.518943sOk -92otp_SUITEcall_to_now_0< >0.480950sOk -93otp_SUITEstrong_components< >0.000615sOk -94otp_SUITEerl_file_encoding< >0.266202sOk -95otp_SUITExml_file_encoding< >0.042307sOk -96otp_SUITEruntime_dependencies_functions< >0.020183sOkIgnored applications: [diameter] Ignored failures: [{missing_runtime_dependency, +common_testend_per_suite< >0.000000sOk +otp_SUITEinit_per_suite< >2.846023sOk +87otp_SUITEundefined_functions< >1.307638sOk +88otp_SUITEdeprecated_not_in_obsolete< >0.000234sOk +89otp_SUITEobsolete_but_not_deprecated< >0.007043sOk +90otp_SUITEcall_to_deprecated< >0.468232sOk47 calls to deprecated functions +91otp_SUITEcall_to_size_1< >0.366947sOk +92otp_SUITEcall_to_now_0< >0.375979sOk +93otp_SUITEstrong_components< >0.000679sOk +94otp_SUITEerl_file_encoding< >0.309864sOk +95otp_SUITExml_file_encoding< >0.076890sOk +96otp_SUITEruntime_dependencies_functions< >0.029795sOkIgnored applications: [diameter] Ignored failures: [{missing_runtime_dependency, [47,98,117,105,108,100, 114,111,111,116,47,111, 116,112,47,101,114,116, @@ -242,7 +242,7 @@

    Test started at 2025-01-09 11:49:27

    116,101,114,46,97,112, 112], runtime_tools}]
    -97otp_SUITEruntime_dependencies_modules< >0.488081sOkIgnored applications: [diameter] Ignored failures: [{missing_runtime_dependency, +97otp_SUITEruntime_dependencies_modules< >0.496953sOkIgnored applications: [diameter] Ignored failures: [{missing_runtime_dependency, [47,98,117,105,108,100, 114,111,111,116,47,111, 116,112,47,101,114,116, @@ -274,31 +274,31 @@

    Test started at 2025-01-09 11:49:27

    116,101,114,46,97,112, 112], runtime_tools}]
    -98otp_SUITEtest_runtime_dependencies_versions< >0.009977sSKIPPEDThis test case is designed to run in the Erlang/OTP teams test system for dai... -otp_SUITEend_per_suite< >0.000020sOk -common_testinit_per_suite< >0.000000sOk -99parallel_messages_SUITEtest_throughput_benchmark< >20.263601sOkResult visualization -100parallel_messages_SUITEtest_message_queue_data_switching< >1.871310sOkResult visualization -common_testend_per_suite< >0.000000sOk -common_testinit_per_suite< >0.000000sOk -101run_erl_SUITEbasic< >0.186596sOk -102run_erl_SUITEsleepy_child< >1.190244sOk -103run_erl_SUITEheavy< >1.223509sOk -104run_erl_SUITEheavier< >1.947809sOk -105run_erl_SUITEdefunct< >5.010494sOk -common_testend_per_suite< >0.000000sOk -upgrade_SUITEinit_per_suite< >0.000072sOk -106upgrade_SUITEminor< >18.310125sOk -107upgrade_SUITEmajor< >48.748727sOk -108upgrade_SUITEancient_major< >41.084736sOk +98otp_SUITEtest_runtime_dependencies_versions< >0.009436sSKIPPEDThis test case is designed to run in the Erlang/OTP teams test system for dai... +otp_SUITEend_per_suite< >0.000018sOk +common_testinit_per_suite< >0.000000sOk +99parallel_messages_SUITEtest_throughput_benchmark< >20.249767sOkResult visualization +100parallel_messages_SUITEtest_message_queue_data_switching< >35.611634sOkResult visualization +common_testend_per_suite< >0.000001sOk +common_testinit_per_suite< >0.000000sOk +101run_erl_SUITEbasic< >0.194758sOk +102run_erl_SUITEsleepy_child< >1.183670sOk +103run_erl_SUITEheavy< >1.212355sOk +104run_erl_SUITEheavier< >1.933461sOk +105run_erl_SUITEdefunct< >10.007508sOk +common_testend_per_suite< >0.000000sOk +upgrade_SUITEinit_per_suite< >0.000042sOk +106upgrade_SUITEminor< >18.119643sOk +107upgrade_SUITEmajor< >43.493689sOk +108upgrade_SUITEancient_major< >40.785238sOk upgrade_SUITEend_per_suite< >0.000000sOk -common_testinit_per_suite< >0.000000sOk -109z_SUITEcore_files< >0.481892sOk -common_testend_per_suite< >0.000000sOk +common_testinit_per_suite< >0.000000sOk +109z_SUITEcore_files< >0.476726sOk +common_testend_per_suite< >0.000000sOk -TOTAL240.689329s
    Ok107 Ok, 0 Failed, 2 Skipped of 109
    Elapsed Time: 244.805s +TOTAL272.543409s
    Ok107 Ok, 0 Failed, 2 Skipped of 109
    Elapsed Time: 276.561s @@ -309,7 +309,7 @@

    Test started at 2025-01-09 11:49:27

    | Latest test result

    diff --git a/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.summary b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.summary new file mode 100644 index 0000000000000..ebddbe52e7d5b --- /dev/null +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/suite.summary @@ -0,0 +1 @@ +{summary,{107,0,2,0,276560528}}. diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/unexpected_io.log.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/unexpected_io.log.html similarity index 94% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/unexpected_io.log.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/unexpected_io.log.html index c5e8284c5b78e..1b786431061da 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/unexpected_io.log.html +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/unexpected_io.log.html @@ -23,7 +23,7 @@

    Unexpected I/O

    | Latest test result

    diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23906.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.ancient_major.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.23906.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.ancient_major.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24483.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24483.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24610.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24610.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24611.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.major.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24611.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.major.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2468.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.minor.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2468.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.minor.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24930.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.24930.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/upgrade_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25155.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/z_suite.core_files.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25155.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/z_suite.core_files.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25218.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/z_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25218.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run.2025-01-10_19.12.36/z_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run_erl_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run_erl_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run_erl_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/run_erl_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/upgrade_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/upgrade_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/upgrade_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/upgrade_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/z_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/z_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/z_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/make_test_dir.system_test.logs/z_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/misc_io.log.html b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/misc_io.log.html similarity index 94% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/misc_io.log.html rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/misc_io.log.html index 2eaefe824aa94..068c9aa05a605 100644 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/misc_io.log.html +++ b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/misc_io.log.html @@ -30,7 +30,7 @@

    POST-TEST LOG

    | Latest test result

    diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/test.beam b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/test.beam similarity index 60% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/test.beam rename to prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/test.beam index 0fee1f5212a1e..8e77e69c126d7 100644 Binary files a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/test.beam and b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/test.beam differ diff --git a/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/totals.info b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/totals.info new file mode 100644 index 0000000000000..8ab0250e5aa4e Binary files /dev/null and b/prs/9277/ct_logs/ct_run.test_server@30452ec2e0b4.2025-01-10_19.12.36/totals.info differ diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/last_name b/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/last_name deleted file mode 100644 index cfdbc3c81b1e9..0000000000000 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/last_name +++ /dev/null @@ -1 +0,0 @@ -/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23 diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/last_name b/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/last_name deleted file mode 100644 index cfdbc3c81b1e9..0000000000000 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/last_name +++ /dev/null @@ -1 +0,0 @@ -/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23 diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.log b/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.log deleted file mode 100644 index c3048a1bf2186..0000000000000 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.log +++ /dev/null @@ -1,15494 +0,0 @@ -=== Suite started at 2025-01-09 11:32:23 -=== Starting test, 1557 test cases -=cases 1557 -=user otptest -=host 3d82f27beab7 -=hosts 3d82f27beab7 -=emulator_vsn 15.2 -=emulator beam -=otp_release 27 -=started 2025-01-09 11:32:23 -=case ssh_agent_SUITE:init_per_suite -=logfile ssh_agent_suite.init_per_suite.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.008515s -=case ssh_agent_SUITE:request_identities -=logfile ssh_agent_suite.request_identities.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.003296s -=case ssh_agent_SUITE:sign_request -=logfile ssh_agent_suite.sign_request.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.002448s -=case ssh_agent_SUITE:connect_with_ssh_agent -=logfile ssh_agent_suite.connect_with_ssh_agent.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.048711s -=case ssh_agent_SUITE:end_per_suite -=logfile ssh_agent_suite.end_per_suite.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.001135s -=group_time 0.162s -=case ssh_algorithms_SUITE:init_per_suite -=logfile ssh_algorithms_suite.init_per_suite.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.046533s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.html -=group_props [{name,kex}] -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.000008s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.98.html -=group_props [{name,'curve25519-sha256'}] -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.002669s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.004258s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.008235s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.011343s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.html -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:23 -=result ok -=elapsed 0.113516s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.html -=group_props [{name,'curve25519-sha256'}] -=started 2025-01-09 11:32:23 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.000362s -=group_time 0.260s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.226.html -=group_props [{name,'curve25519-sha256@libssh.org'}] -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.001914s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.227.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.004694s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.290.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.005606s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.322.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.006087s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.354.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.111693s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.386.html -=group_props [{name,'curve25519-sha256@libssh.org'}] -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.000450s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.418.html -=group_props [{name,'curve448-sha512'}] -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.001820s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.450.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.005680s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.483.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.006832s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.547.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.007761s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.611.html -=group_props [{name,'curve448-sha512'}] -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.000412s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.643.html -=group_props [{name,'diffie-hellman-group-exchange-sha1'}] -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.002421s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.578.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.040286s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.739.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.040808s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.835.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.041851s -=case ssh_algorithms_SUITE:simple_exec_groups -=logfile ssh_algorithms_suite.simple_exec_groups.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.291521s -=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_large -=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_large.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:24 -=result ok -=elapsed 0.002432s -=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_small -=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_small.html -=started 2025-01-09 11:32:24 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.002528s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.1571.html -=group_props [{name,'diffie-hellman-group-exchange-sha1'}] -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.000353s -=group_time 0.592s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.1314.html -=group_props [{name,'diffie-hellman-group-exchange-sha256'}] -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.002275s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.1603.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.031582s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.1667.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.041461s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.1731.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.042008s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.1827.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.148648s -=case ssh_algorithms_SUITE:simple_exec_groups -=logfile ssh_algorithms_suite.simple_exec_groups.1859.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.305508s -=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_large -=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_large.2403.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.002273s -=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_small -=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_small.356.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.002544s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.452.html -=group_props [{name,'diffie-hellman-group-exchange-sha256'}] -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.000621s -=group_time 0.769s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.2467.html -=group_props [{name,'diffie-hellman-group1-sha1'}] -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.002057s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.2499.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.005384s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.2595.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.006297s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.2659.html -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.006680s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.2723.html -=group_props [{name,'diffie-hellman-group1-sha1'}] -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:25 -=result ok -=elapsed 0.000406s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.548.html -=group_props [{name,'diffie-hellman-group14-sha1'}] -=started 2025-01-09 11:32:25 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.002304s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.580.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.010891s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.612.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.011969s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.1858.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.012933s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.1922.html -=group_props [{name,'diffie-hellman-group14-sha1'}] -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.000364s -=group_time 0.134s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.1954.html -=group_props [{name,'diffie-hellman-group14-sha256'}] -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.001646s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.1986.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.011168s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.2050.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.012013s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.2146.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.012732s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.2210.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.113441s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.2947.html -=group_props [{name,'diffie-hellman-group14-sha256'}] -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.000440s -=group_time 0.269s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.2979.html -=group_props [{name,'diffie-hellman-group16-sha512'}] -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.001957s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.3011.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.044083s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.2338.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.045476s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.2434.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.045959s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.3075.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.133621s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3107.html -=group_props [{name,'diffie-hellman-group16-sha512'}] -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.000527s -=group_time 0.391s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3139.html -=group_props [{name,'diffie-hellman-group18-sha512'}] -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:26 -=result ok -=elapsed 0.002230s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.2530.html -=started 2025-01-09 11:32:26 -=ended 2025-01-09 11:32:27 -=result ok -=elapsed 0.280837s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.2562.html -=started 2025-01-09 11:32:27 -=ended 2025-01-09 11:32:27 -=result ok -=elapsed 0.282299s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.2626.html -=started 2025-01-09 11:32:27 -=ended 2025-01-09 11:32:27 -=result ok -=elapsed 0.282351s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.2690.html -=started 2025-01-09 11:32:27 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.265314s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3331.html -=group_props [{name,'diffie-hellman-group18-sha512'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.000655s -=group_time 1.234s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3363.html -=group_props [{name,'ecdh-sha2-nistp256'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.002463s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.3395.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.005902s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.3459.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.005544s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3555.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.006937s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.2786.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.108601s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.2850.html -=group_props [{name,'ecdh-sha2-nistp256'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.000422s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.2882.html -=group_props [{name,'ecdh-sha2-nistp384'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.001806s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.2914.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.007854s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.3619.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.008861s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3683.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.009011s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.3747.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.112573s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3811.html -=group_props [{name,'ecdh-sha2-nistp384'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.000439s -=group_time 0.258s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3843.html -=group_props [{name,'ecdh-sha2-nistp521'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.002300s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.3875.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.005651s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.3971.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.006762s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3074.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.006984s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.4099.html -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.111015s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4131.html -=group_props [{name,'ecdh-sha2-nistp521'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.000585s -=group_time 0.253s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4163.html -=group_props [{name,kex}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.000001s -=group_time 5.232s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3170.html -=group_props [{name,cipher}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:28 -=result ok -=elapsed 0.000031s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.4195.html -=group_props [{name,'3des-cbc'}] -=started 2025-01-09 11:32:28 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.002273s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.3202.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005047s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.3266.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005893s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3362.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.008578s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3426.html -=group_props [{name,'3des-cbc'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.000646s -=group_time 0.119s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3458.html -=group_props [{name,'AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.002766s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4291.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.004717s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.4387.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005488s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3522.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.006108s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3618.html -=group_props [{name,'AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.000385s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3650.html -=group_props [{name,'AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.002120s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4451.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.004881s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.4483.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005428s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4547.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.006067s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4611.html -=group_props [{name,'AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.000603s -=group_time 0.113s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.4643.html -=group_props [{name,'aes128-cbc'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.001967s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4675.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.004808s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.4739.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005413s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4803.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.006460s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.676.html -=group_props [{name,'aes128-cbc'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.000483s -=group_time 0.113s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.708.html -=group_props [{name,'aes128-ctr'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.002089s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.740.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.004663s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.804.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005749s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.868.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.006830s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.932.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.112480s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.996.html -=group_props [{name,'aes128-ctr'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.000574s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.1028.html -=group_props [{name,'aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.002400s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.1060.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005006s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.1124.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005344s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.1188.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:29 -=result ok -=elapsed 0.005965s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.3906.html -=started 2025-01-09 11:32:29 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.112898s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3938.html -=group_props [{name,'aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.000721s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3970.html -=group_props [{name,'aes192-cbc'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.002076s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4002.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.005556s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5155.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.006952s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.5251.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.007337s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.5347.html -=group_props [{name,'aes192-cbc'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.000516s -=group_time 0.118s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5379.html -=group_props [{name,'aes192-ctr'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.001819s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.5411.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.004434s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.4066.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.005502s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4130.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.006436s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.5539.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.113527s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.5603.html -=group_props [{name,'aes192-ctr'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.000406s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5635.html -=group_props [{name,'aes256-cbc'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.002366s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.5667.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.004718s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5763.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.005644s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4194.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.006575s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4258.html -=group_props [{name,'aes256-cbc'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.000323s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5891.html -=group_props [{name,'aes256-ctr'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.001674s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.5923.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.004709s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5987.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.006079s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6051.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.006656s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.4386.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.112378s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4450.html -=group_props [{name,'aes256-ctr'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.000378s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.4482.html -=group_props [{name,'aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.002276s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6115.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:30 -=result ok -=elapsed 0.004615s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.6211.html -=started 2025-01-09 11:32:30 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.005537s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4514.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.006031s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.4578.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.113075s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6339.html -=group_props [{name,'aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.000349s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.4642.html -=group_props [{name,'chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.002034s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4674.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.004643s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.6403.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.006016s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4802.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.006444s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.4866.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.112013s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6467.html -=group_props [{name,'chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.000435s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6499.html -=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.001785s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6531.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.004523s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.4962.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.005757s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.5026.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.008434s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6659.html -=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.000628s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6691.html -=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.002125s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6723.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.004650s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5122.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.005565s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.5186.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.008420s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.5250.html -=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.000551s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5282.html -=group_props [{name,'D: cipher 3des-cbc + aes128-cbc'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.002523s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.5314.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.004502s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5378.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.005865s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6947.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.008583s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.5442.html -=group_props [{name,'D: cipher 3des-cbc + aes128-cbc'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.000451s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5474.html -=group_props [{name,'D: cipher 3des-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.002433s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.7011.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.004649s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7075.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:31 -=result ok -=elapsed 0.005641s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7139.html -=started 2025-01-09 11:32:31 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008623s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7203.html -=group_props [{name,'D: cipher 3des-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.000362s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5602.html -=group_props [{name,'D: cipher 3des-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.002445s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.7235.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.004819s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5698.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.005939s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.5794.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008759s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7267.html -=group_props [{name,'D: cipher 3des-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.000369s -=group_time 0.118s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7299.html -=group_props [{name,'D: cipher 3des-cbc + aes192-cbc'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.002174s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.5890.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.005069s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7331.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.005701s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7395.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008555s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6050.html -=group_props [{name,'D: cipher 3des-cbc + aes192-cbc'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.000382s -=group_time 0.118s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6082.html -=group_props [{name,'D: cipher 3des-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.002468s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6114.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.004681s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.6178.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.005533s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6274.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008432s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6338.html -=group_props [{name,'D: cipher 3des-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.000424s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6370.html -=group_props [{name,'D: cipher 3des-cbc + aes256-cbc'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.002087s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6402.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.004651s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.6466.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.005838s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6530.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008743s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7651.html -=group_props [{name,'D: cipher 3des-cbc + aes256-cbc'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.000444s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6562.html -=group_props [{name,'D: cipher 3des-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.002113s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6594.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.004889s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7715.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.005531s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7779.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008194s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7843.html -=group_props [{name,'D: cipher 3des-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.000398s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7875.html -=group_props [{name,'D: cipher 3des-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.002541s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6722.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.004823s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7939.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.006245s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8035.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008315s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8131.html -=group_props [{name,'D: cipher 3des-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.000380s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8163.html -=group_props [{name,'D: cipher 3des-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.002250s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8195.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.004915s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8259.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.005882s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8323.html -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:32 -=result ok -=elapsed 0.008354s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6882.html -=group_props [{name,'D: cipher 3des-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:32 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000355s -=group_time 0.118s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6914.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + 3des-cbc'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.002182s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6946.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.004694s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.6978.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005988s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8515.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.006712s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8611.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + 3des-cbc'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000505s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8643.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.002200s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8675.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.004428s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8739.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005696s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8803.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005862s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8867.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000417s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8899.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-cbc'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.002458s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8931.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.004770s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.9027.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.006030s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.9123.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.006423s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9155.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-cbc'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000312s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7170.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-ctr'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.002103s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9187.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.004611s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.9283.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005943s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.9379.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.006350s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9443.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-ctr'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000368s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.9475.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.001846s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9507.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.004600s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7266.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005549s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7330.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005980s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7394.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000331s -=group_time 0.113s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7426.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-cbc'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.002443s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.7458.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.004530s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7522.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005701s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7586.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.006308s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7650.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-cbc'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000314s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7682.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-ctr'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.002428s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.7714.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.004413s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7778.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.005705s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7842.html -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.006154s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7906.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-ctr'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:33 -=result ok -=elapsed 0.000393s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7938.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-cbc'}] -=started 2025-01-09 11:32:33 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002271s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.7970.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.004723s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8066.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006138s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8162.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006638s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9859.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-cbc'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.000518s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8226.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-ctr'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002293s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8258.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.004998s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8354.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006018s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8450.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006757s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8514.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-ctr'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.000342s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.9923.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002309s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8546.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.004943s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8642.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.005825s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8738.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006316s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8770.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.000298s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.10019.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002180s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10051.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.004745s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8802.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.005786s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.10179.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006564s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8866.html -=group_props [{name,'D: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.000603s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8898.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + 3des-cbc'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002275s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10275.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.004660s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10339.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.005586s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.10403.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.007066s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.10499.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + 3des-cbc'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.000331s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.10531.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002817s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10563.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.004682s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10659.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006110s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.10755.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006010s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.10819.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.000344s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.10851.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-cbc'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002025s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10883.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.004641s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10947.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.005937s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.11043.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.006663s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.11139.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-cbc'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.000354s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11171.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-ctr'}] -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:34 -=result ok -=elapsed 0.002406s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11203.html -=started 2025-01-09 11:32:34 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004736s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11299.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006124s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.11363.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006445s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9122.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-ctr'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.000397s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.9154.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.002243s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11427.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004671s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11523.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.005848s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.11619.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006586s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9186.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.000499s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11715.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-cbc'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.002144s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11747.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004836s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11811.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006027s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.11907.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006458s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.11971.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-cbc'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.000459s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12003.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-ctr'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.002494s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.12035.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004594s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.12131.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.005958s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12227.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006219s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9314.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-ctr'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.000334s -=group_time 0.113s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12291.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-cbc'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.002088s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9346.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004571s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.9378.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.005839s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12451.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006534s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.12547.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-cbc'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.000354s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12579.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-ctr'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.002178s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.12611.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004711s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.12707.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.005905s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.9442.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006800s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9538.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-ctr'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.000383s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.9570.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.001990s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9602.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004507s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.9666.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.005958s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.9762.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.006275s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9826.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.000297s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12835.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.002838s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9858.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:35 -=result ok -=elapsed 0.004603s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.9922.html -=started 2025-01-09 11:32:35 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.005908s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12931.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006412s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.12995.html -=group_props [{name,'D: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.000578s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.10018.html -=group_props [{name,'D: cipher aes128-cbc + 3des-cbc'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.002145s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10050.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.004669s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.13059.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.005963s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.13123.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006654s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.10178.html -=group_props [{name,'D: cipher aes128-cbc + 3des-cbc'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.000481s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.10210.html -=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.002205s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13187.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.004697s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10306.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.005858s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.13219.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006431s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13283.html -=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.000572s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13315.html -=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.002416s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10434.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.004905s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10530.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.005350s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.13379.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006566s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13443.html -=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.000650s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13475.html -=group_props [{name,'D: cipher aes128-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.002090s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10626.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.004863s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10690.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006021s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.10722.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006439s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.10786.html -=group_props [{name,'D: cipher aes128-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.000422s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13635.html -=group_props [{name,'D: cipher aes128-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.002743s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13667.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.004897s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.13763.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.005438s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.13827.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006740s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13891.html -=group_props [{name,'D: cipher aes128-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.000425s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13923.html -=group_props [{name,'D: cipher aes128-cbc + aes192-cbc'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.002272s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13955.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.004988s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.13987.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006190s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.1316.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006580s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.1412.html -=group_props [{name,'D: cipher aes128-cbc + aes192-cbc'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.000332s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.1444.html -=group_props [{name,'D: cipher aes128-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.001897s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.1476.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.004887s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.1540.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:36 -=result ok -=elapsed 0.006290s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.14147.html -=started 2025-01-09 11:32:36 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006450s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14211.html -=group_props [{name,'D: cipher aes128-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.000422s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14243.html -=group_props [{name,'D: cipher aes128-cbc + aes256-cbc'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.003290s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14275.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005016s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.14371.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005938s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.14467.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006685s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14531.html -=group_props [{name,'D: cipher aes128-cbc + aes256-cbc'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.000465s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14563.html -=group_props [{name,'D: cipher aes128-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.002102s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14595.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.004895s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.14659.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006212s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.14691.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006902s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14755.html -=group_props [{name,'D: cipher aes128-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.000431s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11010.html -=group_props [{name,'D: cipher aes128-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.002563s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14787.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.004768s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11074.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005565s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.11138.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006529s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14915.html -=group_props [{name,'D: cipher aes128-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.000372s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14947.html -=group_props [{name,'D: cipher aes128-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.002761s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14979.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.004869s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.15043.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005929s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.15075.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006561s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15139.html -=group_props [{name,'D: cipher aes128-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.000440s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11330.html -=group_props [{name,'D: cipher aes128-ctr + 3des-cbc'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.001906s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11362.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005060s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.15203.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005991s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.15267.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006663s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15331.html -=group_props [{name,'D: cipher aes128-ctr + 3des-cbc'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.000338s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11490.html -=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.002721s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15363.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005078s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11586.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005679s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.15395.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006805s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15427.html -=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.000333s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15459.html -=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.002640s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11746.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.004909s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.15555.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.005828s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.11778.html -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:37 -=result ok -=elapsed 0.006760s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.11842.html -=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:37 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.000373s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11874.html -=group_props [{name,'D: cipher aes128-ctr + aes128-cbc'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.001920s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15683.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.004949s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11970.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.005784s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.15747.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.006646s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15779.html -=group_props [{name,'D: cipher aes128-ctr + aes128-cbc'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.000582s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12098.html -=group_props [{name,'D: cipher aes128-ctr + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.003062s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15811.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.004633s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.12162.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.005582s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12226.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.006657s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.15939.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.112486s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15971.html -=group_props [{name,'D: cipher aes128-ctr + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.000461s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16003.html -=group_props [{name,'D: cipher aes128-ctr + aes192-cbc'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.002533s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.12322.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.005187s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.12418.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.007941s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12482.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.008286s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16099.html -=group_props [{name,'D: cipher aes128-ctr + aes192-cbc'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.000367s -=group_time 0.121s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12546.html -=group_props [{name,'D: cipher aes128-ctr + aes192-ctr'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.002096s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.12578.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.004806s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16163.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.007172s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12674.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.008362s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.12738.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.112891s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.12802.html -=group_props [{name,'D: cipher aes128-ctr + aes192-ctr'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.000531s -=group_time 0.255s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12834.html -=group_props [{name,'D: cipher aes128-ctr + aes256-cbc'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.001903s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.12866.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.004672s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16259.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.006157s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.16291.html -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.006761s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16355.html -=group_props [{name,'D: cipher aes128-ctr + aes256-cbc'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:38 -=result ok -=elapsed 0.000389s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13058.html -=group_props [{name,'D: cipher aes128-ctr + aes256-ctr'}] -=started 2025-01-09 11:32:38 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.002543s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13090.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.005145s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.13186.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.006239s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.13282.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.006923s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.13378.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.112355s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13442.html -=group_props [{name,'D: cipher aes128-ctr + aes256-ctr'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.000641s -=group_time 0.255s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13474.html -=group_props [{name,'D: cipher aes128-ctr + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.002504s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13506.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.004791s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.13570.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.005353s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.13634.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.006769s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.16483.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.112441s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16547.html -=group_props [{name,'D: cipher aes128-ctr + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.000689s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13698.html -=group_props [{name,'D: cipher aes128-ctr + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.001775s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16579.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.004775s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16643.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.006504s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.16707.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.006631s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.13826.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.112808s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13890.html -=group_props [{name,'D: cipher aes128-ctr + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.000417s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13922.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + 3des-cbc'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.002282s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16771.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.004767s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16835.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.005943s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.14018.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.006471s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14082.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + 3des-cbc'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.000303s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16931.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:39 -=result ok -=elapsed 0.002816s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16963.html -=started 2025-01-09 11:32:39 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.004572s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.17027.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.005733s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.17123.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006636s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.17187.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.000332s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14178.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.002588s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17219.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.004829s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.14210.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.005760s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.14274.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006261s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14338.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.000405s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.17379.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-cbc'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.002217s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17411.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.005089s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.14434.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006056s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.14530.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006219s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14594.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-cbc'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.000371s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14626.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-ctr'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.001959s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14658.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.004698s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.14722.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006331s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.17539.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006915s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.17635.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.111836s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.17667.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-ctr'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.000655s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.17699.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-cbc'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.002814s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17731.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.004963s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.17827.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.005578s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.14850.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006552s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.17955.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-cbc'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.000338s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14882.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-ctr'}] -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.002292s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17987.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.004726s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.14946.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006080s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.15042.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:40 -=result ok -=elapsed 0.006317s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.15106.html -=started 2025-01-09 11:32:40 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.112198s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.18115.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-ctr'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.000464s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.18147.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-cbc'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.002089s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.18179.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.004943s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.18243.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.005542s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.18307.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.006312s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15234.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-cbc'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.000319s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15266.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-ctr'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.002370s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15298.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.004927s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.18435.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.005711s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.18499.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.006471s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.18563.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.112713s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15426.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-ctr'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.000381s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.18595.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.002749s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15458.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.004714s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.15522.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.006162s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.18659.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.006297s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.18723.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.111477s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15682.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.000424s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15714.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.002222s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.18755.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.004994s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.15778.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.005587s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.15874.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:41 -=result ok -=elapsed 0.006363s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.18851.html -=started 2025-01-09 11:32:41 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.112047s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15970.html -=group_props [{name,'D: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.000338s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16002.html -=group_props [{name,'D: cipher aes192-cbc + 3des-cbc'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.002200s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16034.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.004746s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16098.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006262s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.18915.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006558s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16226.html -=group_props [{name,'D: cipher aes192-cbc + 3des-cbc'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.000505s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.18979.html -=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.001958s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.19011.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.004884s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16290.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.005981s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.16354.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006835s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16418.html -=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.000415s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16450.html -=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.002355s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16482.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.005051s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16514.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.005458s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.16578.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006667s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16642.html -=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.000466s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.19267.html -=group_props [{name,'D: cipher aes192-cbc + aes128-cbc'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.002141s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16674.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.004827s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.19331.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.005788s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.19395.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006881s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.19427.html -=group_props [{name,'D: cipher aes192-cbc + aes128-cbc'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.000334s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16834.html -=group_props [{name,'D: cipher aes192-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.002552s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16866.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.004744s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.16930.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006016s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.17026.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006905s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.17122.html -=group_props [{name,'D: cipher aes192-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.000615s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.17154.html -=group_props [{name,'D: cipher aes192-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.002918s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17186.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.004819s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.19523.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.005959s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.19555.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006602s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.19619.html -=group_props [{name,'D: cipher aes192-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.000668s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.19651.html -=group_props [{name,'D: cipher aes192-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.002326s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17346.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.004965s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.19747.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.005925s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.17378.html -=started 2025-01-09 11:32:42 -=ended 2025-01-09 11:32:42 -=result ok -=elapsed 0.006311s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.19875.html -=group_props [{name,'D: cipher aes192-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.000358s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.19907.html -=group_props [{name,'D: cipher aes192-cbc + aes256-cbc'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.002622s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17442.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.005253s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.17538.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006370s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.19939.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.007142s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.17634.html -=group_props [{name,'D: cipher aes192-cbc + aes256-cbc'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.000639s -=group_time 0.119s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.17666.html -=group_props [{name,'D: cipher aes192-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.002582s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.20035.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.005243s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.17762.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006109s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.20099.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006920s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.17858.html -=group_props [{name,'D: cipher aes192-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.000344s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.17890.html -=group_props [{name,'D: cipher aes192-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.002769s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.17922.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.004716s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.18018.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.005690s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.18114.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006645s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.18178.html -=group_props [{name,'D: cipher aes192-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.000454s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.18210.html -=group_props [{name,'D: cipher aes192-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.002917s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.18242.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.004825s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.20227.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006087s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.20259.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006577s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.18402.html -=group_props [{name,'D: cipher aes192-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.000386s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.18434.html -=group_props [{name,'D: cipher aes192-ctr + 3des-cbc'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.002295s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.18466.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.004818s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.18530.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006114s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.20419.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006375s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.18594.html -=group_props [{name,'D: cipher aes192-ctr + 3des-cbc'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.000706s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.18626.html -=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.002850s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.20483.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.004845s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.18722.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006249s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.18786.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006804s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.20579.html -=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.000555s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.20611.html -=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.002682s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.20643.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.004683s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.18882.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.005851s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.18946.html -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:43 -=result ok -=elapsed 0.006370s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.19010.html -=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:43 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.000379s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.19042.html -=group_props [{name,'D: cipher aes192-ctr + aes128-cbc'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.002655s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.19074.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.005370s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.20771.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.005916s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.20835.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.007013s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.20899.html -=group_props [{name,'D: cipher aes192-ctr + aes128-cbc'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.000400s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.20931.html -=group_props [{name,'D: cipher aes192-ctr + aes128-ctr'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.002099s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.19234.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.004519s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.19298.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.005685s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.19394.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.006538s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.19458.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.113330s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.21027.html -=group_props [{name,'D: cipher aes192-ctr + aes128-ctr'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.000553s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.19522.html -=group_props [{name,'D: cipher aes192-ctr + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.002450s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.19554.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.005031s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.1636.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.005740s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.1700.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.006586s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.1764.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.112073s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.1828.html -=group_props [{name,'D: cipher aes192-ctr + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.000497s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.1860.html -=group_props [{name,'D: cipher aes192-ctr + aes192-cbc'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.002454s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.21155.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.005075s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.21251.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.006308s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.21347.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.007137s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.21443.html -=group_props [{name,'D: cipher aes192-ctr + aes192-cbc'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.000617s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.21475.html -=group_props [{name,'D: cipher aes192-ctr + aes256-cbc'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.002428s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.21507.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.004654s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.19650.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.006093s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.19714.html -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.007079s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.19746.html -=group_props [{name,'D: cipher aes192-ctr + aes256-cbc'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:44 -=result ok -=elapsed 0.000489s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.1892.html -=group_props [{name,'D: cipher aes192-ctr + aes256-ctr'}] -=started 2025-01-09 11:32:44 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.002988s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.1924.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.005081s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.1988.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.006210s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.2084.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.007136s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.2148.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.113382s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.2180.html -=group_props [{name,'D: cipher aes192-ctr + aes256-ctr'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.000512s -=group_time 0.256s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.2212.html -=group_props [{name,'D: cipher aes192-ctr + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.002403s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.21763.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.004646s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.21827.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.006902s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.21891.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.006731s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.21987.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.112372s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.22051.html -=group_props [{name,'D: cipher aes192-ctr + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.000467s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22083.html -=group_props [{name,'D: cipher aes192-ctr + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.002109s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.22115.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.004982s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.22179.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.006001s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.22243.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.006755s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.22307.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.112459s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.22371.html -=group_props [{name,'D: cipher aes192-ctr + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.000438s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22403.html -=group_props [{name,'D: cipher aes256-cbc + 3des-cbc'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.002333s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.22435.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.004794s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.22499.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.005991s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.22595.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.006667s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.22659.html -=group_props [{name,'D: cipher aes256-cbc + 3des-cbc'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.000472s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22691.html -=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:45 -=result ok -=elapsed 0.002272s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.22723.html -=started 2025-01-09 11:32:45 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.004633s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.22787.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005797s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.19874.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.006922s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.19906.html -=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.000601s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22947.html -=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.002410s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.19938.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.004848s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.20034.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005907s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.20130.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.006523s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.20194.html -=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.000400s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.20226.html -=group_props [{name,'D: cipher aes256-cbc + aes128-cbc'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.002230s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.20258.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.004975s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.20322.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005889s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.20386.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.006701s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.20450.html -=group_props [{name,'D: cipher aes256-cbc + aes128-cbc'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.000379s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.20482.html -=group_props [{name,'D: cipher aes256-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.002626s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.20514.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.004757s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.23107.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005592s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.23171.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.006609s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.23235.html -=group_props [{name,'D: cipher aes256-cbc + aes128-ctr'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.000646s -=group_time 0.113s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.20674.html -=group_props [{name,'D: cipher aes256-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.002071s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.20706.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.004720s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.23299.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005943s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.20834.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.006732s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.20930.html -=group_props [{name,'D: cipher aes256-cbc + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.000559s -=group_time 0.113s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.20962.html -=group_props [{name,'D: cipher aes256-cbc + aes192-cbc'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.002197s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.23331.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.004928s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.20994.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005678s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.21058.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.006989s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.23523.html -=group_props [{name,'D: cipher aes256-cbc + aes192-cbc'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.000457s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.23555.html -=group_props [{name,'D: cipher aes256-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.002467s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.21090.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.004957s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.21154.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005885s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.21186.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.006324s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.21250.html -=group_props [{name,'D: cipher aes256-cbc + aes192-ctr'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.000317s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.23715.html -=group_props [{name,'D: cipher aes256-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.002690s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.21282.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:46 -=result ok -=elapsed 0.005122s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.23811.html -=started 2025-01-09 11:32:46 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006269s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.23907.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.007340s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.21314.html -=group_props [{name,'D: cipher aes256-cbc + aes256-ctr'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.000582s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.21346.html -=group_props [{name,'D: cipher aes256-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.002108s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.24003.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.004860s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.24099.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006044s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.21378.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006388s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.21442.html -=group_props [{name,'D: cipher aes256-cbc + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.000381s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.21474.html -=group_props [{name,'D: cipher aes256-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.002605s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.21506.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.004749s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.21570.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006393s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.21666.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006900s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.21730.html -=group_props [{name,'D: cipher aes256-cbc + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.000345s -=group_time 0.118s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.21762.html -=group_props [{name,'D: cipher aes256-ctr + 3des-cbc'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.002782s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.24291.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.004895s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.24355.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.005637s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.24419.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006873s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.24483.html -=group_props [{name,'D: cipher aes256-ctr + 3des-cbc'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.000346s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.21890.html -=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.002552s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.21922.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.004912s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.21986.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.005580s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.22050.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006527s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.24611.html -=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.000309s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22114.html -=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.002321s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.24643.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.004941s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.22146.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.005929s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.22178.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006411s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.22242.html -=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.000381s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22274.html -=group_props [{name,'D: cipher aes256-ctr + aes128-cbc'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.002165s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.22306.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.004950s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.22370.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006130s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.22434.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006380s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.22498.html -=group_props [{name,'D: cipher aes256-ctr + aes128-cbc'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.000399s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22530.html -=group_props [{name,'D: cipher aes256-ctr + aes128-ctr'}] -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.002180s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.22562.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.004841s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.22626.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:47 -=result ok -=elapsed 0.006019s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.22690.html -=started 2025-01-09 11:32:47 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.006434s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.22754.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.111921s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.22818.html -=group_props [{name,'D: cipher aes256-ctr + aes128-ctr'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.000380s -=group_time 0.249s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.22850.html -=group_props [{name,'D: cipher aes256-ctr + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.002325s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.22882.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.004863s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.22946.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.005915s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.23042.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.007023s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.25091.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.111909s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.25155.html -=group_props [{name,'D: cipher aes256-ctr + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.000478s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.25187.html -=group_props [{name,'D: cipher aes256-ctr + aes192-cbc'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.002220s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.25219.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.005051s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.25315.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.006043s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.23138.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.006751s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.23234.html -=group_props [{name,'D: cipher aes256-ctr + aes192-cbc'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.000580s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.23266.html -=group_props [{name,'D: cipher aes256-ctr + aes192-ctr'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.001999s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.23298.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.004717s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.25411.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.005521s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.23394.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.006864s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.25507.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.116355s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.23490.html -=group_props [{name,'D: cipher aes256-ctr + aes192-ctr'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.000336s -=group_time 0.256s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.25539.html -=group_props [{name,'D: cipher aes256-ctr + aes256-cbc'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.002131s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.25571.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.005271s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.25667.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.008497s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.25763.html -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:48 -=result ok -=elapsed 0.006924s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.23554.html -=group_props [{name,'D: cipher aes256-ctr + aes256-cbc'}] -=started 2025-01-09 11:32:48 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.000441s -=group_time 0.119s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.23586.html -=group_props [{name,'D: cipher aes256-ctr + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.002669s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.23618.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.004744s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.25859.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.006241s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.25891.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.006911s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.25955.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.111859s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.25987.html -=group_props [{name,'D: cipher aes256-ctr + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.000409s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.26019.html -=group_props [{name,'D: cipher aes256-ctr + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.002612s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.26051.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.005448s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.26147.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.006405s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.26243.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.006704s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.23842.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.113706s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.23906.html -=group_props [{name,'D: cipher aes256-ctr + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.000404s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.23938.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + 3des-cbc'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.002848s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.23970.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.004906s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.24034.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.005903s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.26371.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.007386s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.26435.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + 3des-cbc'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.000557s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.26467.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.002367s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.26499.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.004883s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.26563.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.006184s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.26659.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.006844s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.26755.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.000506s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.26787.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.002708s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.24162.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.004788s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.24226.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.005681s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.26883.html -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.006756s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.26915.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:49 -=result ok -=elapsed 0.000381s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.26947.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-cbc'}] -=started 2025-01-09 11:32:49 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.002217s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.24354.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.004859s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.24418.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.005961s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.27043.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.006572s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.27107.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-cbc'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.000361s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.27139.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-ctr'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.002577s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.27171.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.005199s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.27235.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.006232s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.27299.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.007088s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.24578.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.112476s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.24610.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-ctr'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.000341s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.24642.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.002760s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.24674.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.005196s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.27427.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.005905s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.27459.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.006042s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.24866.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.111686s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.24930.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.000457s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.24962.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-cbc'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.002634s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.24994.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.004843s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.25058.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.005923s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.25122.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.006670s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.25218.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-cbc'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.000511s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.25250.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-ctr'}] -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.002421s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.27587.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.004707s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.27619.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.006140s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.25410.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:50 -=result ok -=elapsed 0.006823s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.25474.html -=started 2025-01-09 11:32:50 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.111988s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.25538.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-ctr'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.000316s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.25570.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-cbc'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.001978s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.27683.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.005072s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.27747.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.005781s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.27811.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.006724s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.27907.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-cbc'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.000312s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.25666.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-ctr'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.002311s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.27939.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.005075s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.25762.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.005758s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.25826.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.006848s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.28035.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.112735s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.25890.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-ctr'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.000619s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.25922.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.002304s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.25954.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.005037s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.28131.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.005952s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.28195.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.006218s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.28259.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.111935s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.28323.html -=group_props [{name,'D: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.com'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.000455s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.26082.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + 3des-cbc'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.002568s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.28355.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.004959s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.28419.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.006423s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.26178.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.006532s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.28515.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + 3des-cbc'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.000339s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.28547.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.002740s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.26242.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:51 -=result ok -=elapsed 0.005279s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.28611.html -=started 2025-01-09 11:32:51 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.006206s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.28707.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.006610s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.28771.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.000469s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.28803.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.002045s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.28835.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.004870s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.28899.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.005726s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.28963.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.006366s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.29027.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.000422s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.29059.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-cbc'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.002167s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29091.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.005049s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.29155.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.006044s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.29187.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.006755s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.2468.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-cbc'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.000613s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.2500.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-ctr'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.003205s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.2532.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.005429s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.2628.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.005931s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.2692.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.006511s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.2756.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.112490s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.26530.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-ctr'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.000401s -=group_time 0.255s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.26562.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.001695s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.26594.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.004645s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.26658.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.005554s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.26722.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.007147s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.2916.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.112833s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.2980.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.com'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.000417s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3012.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-cbc'}] -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.002556s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.3044.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.005101s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.3140.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:52 -=result ok -=elapsed 0.006148s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3236.html -=started 2025-01-09 11:32:52 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.006747s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3332.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-cbc'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.000614s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3364.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-ctr'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.002239s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.26786.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.005101s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.26882.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.005765s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.26946.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.007072s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.29315.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.113013s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.29379.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-ctr'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.000408s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.29411.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-cbc'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.002179s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29443.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.005225s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.29539.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.006708s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.27042.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.007139s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.27074.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-cbc'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.000519s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.27106.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-ctr'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.002154s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29699.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.004799s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.29763.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.006481s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.29827.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.006744s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.29891.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.113198s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.27234.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-ctr'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.000512s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.29955.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.002486s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29987.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.004938s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.27298.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.005867s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.27330.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.006723s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.27394.html -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:53 -=result ok -=elapsed 0.112615s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.30179.html -=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.com'}] -=started 2025-01-09 11:32:53 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.000426s -=group_time 0.252s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.30211.html -=group_props [{name,cipher}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.000000s -=group_time 25.044s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.30243.html -=group_props [{name,mac}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.000013s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.30275.html -=group_props [{name,'AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.002237s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.30307.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.005040s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.30339.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.005805s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.27522.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.006222s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.27618.html -=group_props [{name,'AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.000336s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.27650.html -=group_props [{name,'AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.001972s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.30403.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.005007s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.30467.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.005615s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.30531.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.006497s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.30595.html -=group_props [{name,'AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.000566s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.27778.html -=group_props [{name,'hmac-sha1'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.002039s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.27810.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.004781s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.30627.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.005669s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.30691.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.006189s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.27970.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.112145s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.30787.html -=group_props [{name,'hmac-sha1'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.000381s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.30819.html -=group_props [{name,'hmac-sha1-96'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.002054s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.28002.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.004747s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.28066.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.006076s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.28130.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.006696s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.28162.html -=group_props [{name,'hmac-sha1-96'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.000327s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.30979.html -=group_props [{name,'hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.002049s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.31011.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.004985s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31075.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.005775s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.31139.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.006461s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.31171.html -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:54 -=result ok -=elapsed 0.111782s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.28322.html -=group_props [{name,'hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:54 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.000328s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.28354.html -=group_props [{name,'hmac-sha2-256'}] -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.001899s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.28386.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.004836s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31267.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.005819s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.28514.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.006331s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.28610.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.112337s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.31299.html -=group_props [{name,'hmac-sha2-256'}] -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.000414s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.31331.html -=group_props [{name,'hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.002190s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.31363.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.004881s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31427.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.005509s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.31491.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.006204s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.28770.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.112398s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.28834.html -=group_props [{name,'hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.000565s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.28866.html -=group_props [{name,'hmac-sha2-512'}] -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.001913s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.28898.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.005024s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31587.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.005965s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.31651.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.006429s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.29026.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.111703s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.31715.html -=group_props [{name,'hmac-sha2-512'}] -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.000277s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.31747.html -=group_props [{name,'hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.001967s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29090.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.005057s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31843.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.006290s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.31939.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:55 -=result ok -=elapsed 0.006364s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.32035.html -=started 2025-01-09 11:32:55 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.111010s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.29122.html -=group_props [{name,'hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.000670s -=group_time 0.248s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.29154.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.002378s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.32099.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.004775s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.29250.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.005959s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.32163.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.006431s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.32227.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.000366s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.29346.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.002247s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29378.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.005065s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.29474.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.005451s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.32291.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.006634s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.32355.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.000319s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.32387.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-96'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.002616s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.32419.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.004741s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.29602.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.006049s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.29666.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.006378s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.29762.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-96'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.000323s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.29794.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.002100s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29826.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.004513s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.3428.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.005600s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3492.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.006419s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.3588.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.000379s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3620.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.001952s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.29922.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.004832s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.29986.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.005523s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.30050.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.006753s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.30082.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.000367s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.3780.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.002243s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.30114.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.005095s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.3876.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.005995s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.3972.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.006339s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4036.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.000417s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.4068.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512'}] -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:56 -=result ok -=elapsed 0.002328s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4100.html -=started 2025-01-09 11:32:56 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.005207s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.30178.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.005768s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.30210.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006425s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4292.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.000561s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.4324.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.002636s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4356.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.004684s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.32547.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006186s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4484.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006368s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4548.html -=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.000510s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.30306.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.002054s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4580.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.004980s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.30402.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.005945s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.30498.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006353s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.30562.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.000325s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.30594.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.002786s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.30626.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.004612s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.30690.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.005586s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4708.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006768s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.4772.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.000425s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.4804.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-96'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.002198s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.4836.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.004756s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.4900.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.005791s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.4964.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006245s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.5028.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-96'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.000326s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5060.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.002288s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.5092.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.004974s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.30914.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.005898s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.30978.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006011s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.31042.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.000661s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.31074.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.002084s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.31106.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.004970s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5284.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006358s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.5380.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.006300s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.5444.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.000391s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.31170.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.002148s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.31202.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:57 -=result ok -=elapsed 0.004790s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31234.html -=started 2025-01-09 11:32:57 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.005391s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.31298.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.006252s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.31362.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.000565s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.31394.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.002084s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.31426.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.004810s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31490.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.005857s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.5668.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.006228s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.5732.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.000325s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.5764.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.002642s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.5796.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.004956s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.5860.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.005811s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.5956.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.006497s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6020.html -=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.000435s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6052.html -=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.002182s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.31650.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.004632s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.6116.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.005943s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6148.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.006680s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.31810.html -=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.000339s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.31842.html -=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.002298s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.31874.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.004869s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.31938.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.006112s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.32002.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.006289s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6308.html -=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.000326s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.32066.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-96'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.002564s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.32098.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.004431s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.32194.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.005809s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6340.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.006152s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6404.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-96'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.000570s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.32290.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.002011s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.32322.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.004485s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.32386.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.005510s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.32450.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:58 -=result ok -=elapsed 0.005946s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.6532.html -=started 2025-01-09 11:32:58 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.112082s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6596.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.000470s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6628.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.001998s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6660.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.005364s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.32546.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.006033s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6724.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.006727s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.6756.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.112545s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.6788.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.000462s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.6820.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.002151s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.6852.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.004983s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.32770.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.005812s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.6948.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.006777s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.32866.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.113090s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.32930.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.000475s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.32962.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.002782s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.32994.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.004991s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.33058.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.005724s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.33154.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.006758s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.7076.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.113579s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7140.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.000716s -=group_time 0.255s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7172.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.002731s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.33218.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.005155s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.33314.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.006400s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.33410.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:32:59 -=result ok -=elapsed 0.006517s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.32643.html -=started 2025-01-09 11:32:59 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.112962s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.32707.html -=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.000385s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.32739.html -=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.002770s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.32771.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.004597s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.32835.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.005995s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.32899.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006333s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.33570.html -=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.000420s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.32963.html -=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.002491s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.33602.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.004835s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.33027.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006195s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.33059.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006315s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.33091.html -=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.000356s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.33123.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.001788s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.33155.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.004968s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.33219.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.005859s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.33315.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006422s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.33411.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.000396s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.33443.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.002067s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.33826.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.004763s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.33507.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.005985s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.33571.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006882s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.33635.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.000304s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.33667.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.002733s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.33699.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.004688s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.33986.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.005813s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.33795.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006413s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.33859.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.000454s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.33891.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.002710s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.33923.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.004945s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.34019.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006073s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.34115.html -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.006757s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.34114.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:00 -=result ok -=elapsed 0.000506s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.34146.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512'}] -=started 2025-01-09 11:33:00 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.002416s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.34178.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.004682s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.34211.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.005741s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.34306.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.006684s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.34275.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.000449s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.34307.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.002230s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.34339.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.005059s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.34403.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.005799s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.34499.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.006036s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.34563.html -=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.000371s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.34595.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.002553s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.34627.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.005060s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.34691.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.005983s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7300.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.006978s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7364.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.000393s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.7396.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.002195s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.7428.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.004956s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7492.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.006083s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7556.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.006498s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7620.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.000394s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.34883.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.002701s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.7652.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.004820s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.7716.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.005783s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.7812.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.006552s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.7908.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.112492s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.7972.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.000445s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8004.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1-96'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.001949s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8036.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.004958s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8132.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.005951s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8196.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.006323s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8260.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1-96'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.000386s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8292.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256'}] -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:01 -=result ok -=elapsed 0.002023s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8324.html -=started 2025-01-09 11:33:01 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.004854s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8388.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.005775s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.34434.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.006562s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.34498.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.112987s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.34562.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256'}] -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.000571s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.35107.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.002452s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.34594.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.004883s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.35171.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.006000s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.35203.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.006362s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.34754.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.112083s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.34786.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.000757s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.34818.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512'}] -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.002336s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.34850.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.004971s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.34946.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.005772s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.35042.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.006626s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.35106.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.112319s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.35170.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512'}] -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.000451s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.35202.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.002576s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8452.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.004610s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8516.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.005876s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.35298.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:02 -=result ok -=elapsed 0.006267s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.35362.html -=started 2025-01-09 11:33:02 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.112953s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.35426.html -=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.000425s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.35458.html -=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.002657s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8612.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.004823s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.35554.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.006000s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8676.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.006684s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8740.html -=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.000429s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.8772.html -=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.002047s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.8804.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.004909s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.8868.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.005850s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.8932.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.006517s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.8996.html -=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.000375s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.9028.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.002469s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9060.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.004841s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.35331.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.005652s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.35395.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.006389s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.35459.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.112572s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.35523.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.000385s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.35555.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-96'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.002256s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.35587.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.005265s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.35651.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.005864s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.35715.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.006395s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.35810.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-96'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.000310s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.35842.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.001784s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.35874.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.004999s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.35938.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.005463s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.36002.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.006559s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.9284.html -=started 2025-01-09 11:33:03 -=ended 2025-01-09 11:33:03 -=result ok -=elapsed 0.112445s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.36130.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.000512s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.36162.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.002789s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.36194.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.005162s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.36290.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.006447s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.36386.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.006119s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.36450.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.111515s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.36514.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.000550s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.36546.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.002299s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.36578.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.004833s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.36642.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.005676s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.35843.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.006169s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.35907.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.111201s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.36738.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.000434s -=group_time 0.250s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.35971.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.002467s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.36770.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.004802s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.36866.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.005895s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.36930.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.006461s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.36994.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.112204s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37058.html -=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.000376s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.36067.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.002287s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.37090.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.004835s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.36131.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.005800s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.36195.html -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.006631s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37218.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:04 -=result ok -=elapsed 0.000393s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.37250.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:04 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.002432s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.37282.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.004836s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.37378.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005722s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.37442.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.006447s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37506.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.000310s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.37538.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.002543s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.37570.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005031s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.37634.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005812s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.36387.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.006191s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.36451.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.112981s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37762.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.000426s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.37794.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.002652s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.36483.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005164s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.36547.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005560s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.36611.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.006497s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37922.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.000416s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.37954.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.002192s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.36675.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005068s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.36739.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.006066s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.36803.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.006332s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.38082.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.112241s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.36899.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.000522s -=group_time 0.251s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.36931.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256'}] -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.002885s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.38114.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005261s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.36963.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.005867s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.37027.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:05 -=result ok -=elapsed 0.006360s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.37091.html -=started 2025-01-09 11:33:05 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.111415s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37123.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.000499s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.37155.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.002958s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.37187.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.005650s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.38370.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.006125s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.37219.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.006455s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.38530.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.111847s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.38594.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.000575s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.38626.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.002548s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.38658.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.005598s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.38722.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.005596s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.37315.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.006582s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.38850.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.112064s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37347.html -=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.000615s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.37379.html -=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.002137s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.37411.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.004758s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.38946.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.006318s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.39042.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.006517s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39106.html -=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.000357s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39138.html -=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.002111s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.39170.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.005388s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.37539.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.006120s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.9412.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.006531s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.37603.html -=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.000340s -=group_time 0.118s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.37635.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1'}] -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.002426s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.37667.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:06 -=result ok -=elapsed 0.005051s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.37731.html -=started 2025-01-09 11:33:06 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.005650s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.37795.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.006531s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.9572.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.112505s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.9604.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.000391s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.9636.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-96'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.002807s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9668.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.005079s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.9732.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.006152s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.37955.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.007291s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.38051.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-96'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.000386s -=group_time 0.118s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.9796.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.002392s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.9828.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.004867s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.39266.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.006102s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.9924.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.007106s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.9988.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.112597s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.10052.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.000375s -=group_time 0.255s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.38083.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.002395s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10084.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.004978s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10180.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.005907s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.10276.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.006267s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.10340.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.112067s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.10404.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.000402s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.10436.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.001947s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10468.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.005126s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.38179.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:07 -=result ok -=elapsed 0.006136s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.38243.html -=started 2025-01-09 11:33:07 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.006442s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.38339.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.113403s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39426.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.000409s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39458.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.002065s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.39490.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.005329s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.39554.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.006184s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.38435.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.006838s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.38467.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.111945s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.38499.html -=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.com'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.000451s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.38531.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.002872s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.38563.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.004801s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.38595.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.006001s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.10596.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.006264s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39810.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCM'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.000391s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39842.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.002233s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.39874.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.004848s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.39938.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.005832s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.40034.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.006265s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40130.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCM'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.000545s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40162.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.002377s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.40194.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.004603s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.40290.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.005857s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.40386.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.006864s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.10724.html -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:08 -=result ok -=elapsed 0.112546s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.10756.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1'}] -=started 2025-01-09 11:33:08 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.000584s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.10788.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.002303s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.10820.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.005005s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.10884.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.005910s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.10948.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.006262s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.11012.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.000365s -=group_time 0.114s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40578.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.002830s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.40610.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.005272s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.40706.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.005811s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.40770.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.006541s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.40834.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.113840s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40898.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.com'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.000409s -=group_time 0.255s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11108.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.002549s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11140.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.004786s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.40962.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.006194s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.41058.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.006652s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.41154.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.111792s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.38627.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.000495s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41218.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.002029s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41250.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.005120s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.41282.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.005895s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.38787.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.005933s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.41346.html -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.111633s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.41410.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:09 -=result ok -=elapsed 0.000518s -=group_time 0.252s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41442.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512'}] -=started 2025-01-09 11:33:09 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.002063s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41474.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.005163s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.41570.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.005862s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.41634.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.006653s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.11268.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.112157s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.11300.html -=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512'}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.000396s -=group_time 0.253s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.41730.html -=group_props [{name,mac}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.000000s -=group_time 16.233s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41762.html -=group_props [{name,compression}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.000014s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41794.html -=group_props [{name,none}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.002185s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41826.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.005592s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.41890.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.005847s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.41922.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.006394s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.41986.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.112588s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.11460.html -=group_props [{name,none}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.000329s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11492.html -=group_props [{name,zlib}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.002311s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11524.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.005163s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11556.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.006304s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.42082.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.007414s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42146.html -=group_props [{name,zlib}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.000401s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42178.html -=group_props [{name,'zlib@openssh.com'}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.002072s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42210.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.004785s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.42274.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.006528s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.42306.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.007033s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.42370.html -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:10 -=result ok -=elapsed 0.112277s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42434.html -=group_props [{name,'zlib@openssh.com'}] -=started 2025-01-09 11:33:10 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.000470s -=group_time 0.253s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42466.html -=group_props [{name,'D: compression none + zlib'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.002370s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42498.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.004818s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11716.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.006375s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.11780.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.006834s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.11844.html -=group_props [{name,'D: compression none + zlib'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.000407s -=group_time 0.116s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.11876.html -=group_props [{name,'D: compression none + zlib@openssh.com'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.002263s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.11908.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.005347s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.11972.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.005689s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12004.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.006919s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.39107.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.112543s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39139.html -=group_props [{name,'D: compression none + zlib@openssh.com'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.000394s -=group_time 0.255s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39171.html -=group_props [{name,'D: compression zlib + none'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.001890s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.39203.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.005113s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.39267.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.005939s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.39331.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.007570s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39363.html -=group_props [{name,'D: compression zlib + none'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.000365s -=group_time 0.115s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39395.html -=group_props [{name,'D: compression zlib + zlib@openssh.com'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.001959s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.39427.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.005433s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.39459.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.006190s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.39491.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.007601s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39523.html -=group_props [{name,'D: compression zlib + zlib@openssh.com'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.000435s -=group_time 0.117s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39555.html -=group_props [{name,'D: compression zlib@openssh.com + none'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.002147s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.39587.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.005034s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.12420.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.005994s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.12484.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.007080s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.12580.html -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.112404s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.12644.html -=group_props [{name,'D: compression zlib@openssh.com + none'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:11 -=result ok -=elapsed 0.000411s -=group_time 0.254s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12676.html -=group_props [{name,'D: compression zlib@openssh.com + zlib'}] -=started 2025-01-09 11:33:11 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.002655s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.39715.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.005381s -=case ssh_algorithms_SUITE:simple_exec -=logfile ssh_algorithms_suite.simple_exec.39747.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.006142s -=case ssh_algorithms_SUITE:simple_sftp -=logfile ssh_algorithms_suite.simple_sftp.39811.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.007110s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39875.html -=group_props [{name,'D: compression zlib@openssh.com + zlib'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000407s -=group_time 0.117s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.39907.html -=group_props [{name,compression}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000001s -=group_time 1.834s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39939.html -=group_props [{name,public_key}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000016s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.39971.html -=group_props [{name,'ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.001358s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.40003.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.004937s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.40099.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 837 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40131.html -=group_props [{name,'ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000001s -=group_time 0.084s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40163.html -=group_props [{name,'ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.001299s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.40195.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.008031s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40259.html -=group_props [{name,'ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40291.html -=group_props [{name,'ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.001500s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.40323.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.006158s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42690.html -=group_props [{name,'ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42722.html -=group_props [{name,'rsa-sha2-256'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.001005s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42754.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.006242s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.42818.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.096993s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.12900.html -=group_props [{name,'rsa-sha2-256'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000000s -=group_time 0.180s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.12932.html -=group_props [{name,'rsa-sha2-512'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.001483s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.12964.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.006157s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.40451.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.100893s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40483.html -=group_props [{name,'rsa-sha2-512'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000000s -=group_time 0.184s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40515.html -=group_props [{name,'ssh-dss'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.001356s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.40547.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.004928s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40611.html -=group_props [{name,'ssh-dss'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40643.html -=group_props [{name,'ssh-ed25519'}] -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.000957s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.40675.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:12 -=result ok -=elapsed 0.004614s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.40739.html -=started 2025-01-09 11:33:12 -=ended 2025-01-09 11:33:13 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 846 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42946.html -=group_props [{name,'ssh-ed25519'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.083s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40771.html -=group_props [{name,'ssh-ed448'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.001281s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42978.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.005985s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40835.html -=group_props [{name,'ssh-ed448'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43042.html -=group_props [{name,'ssh-rsa'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.001303s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43074.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.006061s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43106.html -=group_props [{name,'ssh-rsa'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13060.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.002810s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13092.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.005874s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13188.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13220.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.002001s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13252.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.005049s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13316.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13348.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-256'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.002072s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43138.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.004765s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.43202.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 852 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.40963.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-256'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.082s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.40995.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-512'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.002368s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41027.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.004803s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.41123.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 854 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.41155.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-512'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.087s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41187.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-dss'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.002090s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41219.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.004800s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.41283.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-dss'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43266.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed25519'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.001938s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43298.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.004159s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.43362.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 857 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43394.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed25519'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.083s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43426.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed448'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.002069s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43458.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.004849s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43522.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed448'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41379.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-rsa'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.001865s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41411.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.004749s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43586.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-rsa'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41475.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.001854s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41507.html -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.005921s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.41571.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:13 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43650.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:13 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.002046s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43682.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006581s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43746.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43778.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-256'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.002124s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43810.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006313s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43874.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-256'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000001s -=group_time 0.059s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13444.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-512'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.002166s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13476.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006596s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43906.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-512'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000001s -=group_time 0.059s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13572.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-dss'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001972s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43938.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006141s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.41635.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-dss'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44002.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed25519'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001955s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44034.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006627s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44098.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed25519'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44130.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed448'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.002165s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44162.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006166s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13636.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed448'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44226.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-rsa'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001843s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13668.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006194s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13732.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-rsa'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44290.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001874s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13764.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.005297s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.13828.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.13860.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001966s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13892.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.006576s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44386.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44418.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-256'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001973s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.13956.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.005967s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14020.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-256'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44482.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-512'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001896s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44514.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.005600s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44578.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-512'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41699.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-dss'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.001963s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41731.html -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.005238s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.41795.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-dss'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.41827.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed25519'}] -=started 2025-01-09 11:33:14 -=ended 2025-01-09 11:33:14 -=result ok -=elapsed 0.002078s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.41859.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.005021s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14148.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed25519'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14180.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed448'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.001824s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14212.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.006005s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14276.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed448'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14308.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-rsa'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.002148s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14340.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.006017s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14404.html -=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-rsa'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000001s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14436.html -=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.001818s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14468.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.005527s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.14500.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.097650s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14564.html -=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000000s -=group_time 0.180s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14596.html -=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.001977s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14628.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.007017s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14724.html -=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14756.html -=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.002183s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.14788.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.006168s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42083.html -=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44642.html -=group_props [{name,'D: public_key rsa-sha2-256 + rsa-sha2-512'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.002084s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42115.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.006526s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.42211.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.096892s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42275.html -=group_props [{name,'D: public_key rsa-sha2-256 + rsa-sha2-512'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000000s -=group_time 0.181s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42307.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-dss'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.001946s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42339.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.005573s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44706.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-dss'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42403.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed25519'}] -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.001875s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42435.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:15 -=result ok -=elapsed 0.005421s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.44770.html -=started 2025-01-09 11:33:15 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.096819s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44802.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed25519'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000000s -=group_time 0.178s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44834.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed448'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.002139s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44866.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.005969s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42531.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed448'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000000s -=group_time 0.059s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42563.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-rsa'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.001647s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44930.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.005920s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44994.html -=group_props [{name,'D: public_key rsa-sha2-256 + ssh-rsa'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42627.html -=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.002193s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45026.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.005302s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.45090.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.096681s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45122.html -=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000000s -=group_time 0.180s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.45154.html -=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.002219s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45186.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.007000s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.14916.html -=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.14948.html -=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.002031s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42659.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.006093s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42723.html -=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000001s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42755.html -=group_props [{name,'D: public_key rsa-sha2-512 + rsa-sha2-256'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.002194s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42787.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.006068s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.42851.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.097108s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42883.html -=group_props [{name,'D: public_key rsa-sha2-512 + rsa-sha2-256'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000000s -=group_time 0.181s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.42915.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-dss'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.002048s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.42947.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.005409s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.42979.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-dss'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.45442.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed25519'}] -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.001838s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45474.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:16 -=result ok -=elapsed 0.005482s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.45538.html -=started 2025-01-09 11:33:16 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.096950s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45602.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed25519'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000001s -=group_time 0.178s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.45634.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed448'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.001843s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45666.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.005850s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15044.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed448'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15076.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-rsa'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.002198s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15108.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.006048s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15172.html -=group_props [{name,'D: public_key rsa-sha2-512 + ssh-rsa'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15204.html -=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.001933s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15236.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.005048s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15300.html -=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15332.html -=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.002448s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15364.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.006005s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15428.html -=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000001s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15460.html -=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.001951s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15492.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.005205s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15556.html -=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15588.html -=group_props [{name,'D: public_key ssh-dss + rsa-sha2-256'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.001660s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15620.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.005210s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45858.html -=group_props [{name,'D: public_key ssh-dss + rsa-sha2-256'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43075.html -=group_props [{name,'D: public_key ssh-dss + rsa-sha2-512'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.002169s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43107.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.004831s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43171.html -=group_props [{name,'D: public_key ssh-dss + rsa-sha2-512'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000001s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43203.html -=group_props [{name,'D: public_key ssh-dss + ssh-ed25519'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.002067s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43235.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.004716s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43331.html -=group_props [{name,'D: public_key ssh-dss + ssh-ed25519'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43363.html -=group_props [{name,'D: public_key ssh-dss + ssh-ed448'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.001958s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43395.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.004794s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43459.html -=group_props [{name,'D: public_key ssh-dss + ssh-ed448'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43491.html -=group_props [{name,'D: public_key ssh-dss + ssh-rsa'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.002521s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43523.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.004741s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43587.html -=group_props [{name,'D: public_key ssh-dss + ssh-rsa'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43619.html -=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.002082s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45986.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.004486s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.46050.html -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 907 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43683.html -=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:17 -=result ok -=elapsed 0.000000s -=group_time 0.086s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43715.html -=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:17 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.002284s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43747.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.006440s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43779.html -=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.059s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.43811.html -=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.001806s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.43843.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.005299s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.43907.html -=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.46178.html -=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-256'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.001812s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.46210.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.004899s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.15684.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 911 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15716.html -=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-256'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.085s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15748.html -=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-512'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.001697s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15780.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.004827s -=case ssh_algorithms_SUITE:sshd_simple_exec -=logfile ssh_algorithms_suite.sshd_simple_exec.43971.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, - "enoent"] -=elapsed 0.000000s -=== *** SKIPPED test case 913 of 1557 *** -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44003.html -=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-512'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.083s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44035.html -=group_props [{name,'D: public_key ssh-ed25519 + ssh-dss'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.002233s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44067.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.004281s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44131.html -=group_props [{name,'D: public_key ssh-ed25519 + ssh-dss'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44163.html -=group_props [{name,'D: public_key ssh-ed25519 + ssh-ed448'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.002096s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44195.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.004700s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44259.html -=group_props [{name,'D: public_key ssh-ed25519 + ssh-ed448'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44291.html -=group_props [{name,'D: public_key ssh-ed25519 + ssh-rsa'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.001939s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44323.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.004995s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44387.html -=group_props [{name,'D: public_key ssh-ed25519 + ssh-rsa'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44419.html -=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.002178s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.46402.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.005268s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.46466.html -=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44483.html -=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.001867s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.46498.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.006583s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.46562.html -=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.059s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.46594.html -=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.002279s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.46626.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.005707s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.46690.html -=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44579.html -=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-256'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.002104s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.46722.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.005339s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.46786.html -=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-256'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44643.html -=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-512'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.002025s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.46818.html -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:18 -=result ok -=elapsed 0.005276s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15844.html -=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-512'}] -=started 2025-01-09 11:33:18 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.15876.html -=group_props [{name,'D: public_key ssh-ed448 + ssh-dss'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.002289s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.15908.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.004905s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.15972.html -=group_props [{name,'D: public_key ssh-ed448 + ssh-dss'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44707.html -=group_props [{name,'D: public_key ssh-ed448 + ssh-ed25519'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.002293s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44739.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.005045s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44803.html -=group_props [{name,'D: public_key ssh-ed448 + ssh-ed25519'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44835.html -=group_props [{name,'D: public_key ssh-ed448 + ssh-rsa'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.002038s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44867.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.005281s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.44931.html -=group_props [{name,'D: public_key ssh-ed448 + ssh-rsa'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.44963.html -=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.001642s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.44995.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.005860s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45059.html -=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp256'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.45091.html -=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.001833s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16100.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.006947s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16196.html -=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp384'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16228.html -=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.001889s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.16260.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.006221s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16324.html -=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp521'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16356.html -=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-256'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.001737s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45155.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.005683s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45219.html -=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-256'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.45251.html -=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-512'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.001733s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45283.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.006536s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.16420.html -=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-512'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.058s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.16452.html -=group_props [{name,'D: public_key ssh-rsa + ssh-dss'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.002415s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45315.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.005142s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45379.html -=group_props [{name,'D: public_key ssh-rsa + ssh-dss'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.45411.html -=group_props [{name,'D: public_key ssh-rsa + ssh-ed25519'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.001904s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45443.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.005282s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45507.html -=group_props [{name,'D: public_key ssh-rsa + ssh-ed25519'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.056s -=case ssh_algorithms_SUITE:init_per_group -=logfile ssh_algorithms_suite.init_per_group.45539.html -=group_props [{name,'D: public_key ssh-rsa + ssh-ed448'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.002035s -=case ssh_algorithms_SUITE:simple_connect -=logfile ssh_algorithms_suite.simple_connect.45571.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.005859s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45635.html -=group_props [{name,'D: public_key ssh-rsa + ssh-ed448'}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 0.057s -=case ssh_algorithms_SUITE:end_per_group -=logfile ssh_algorithms_suite.end_per_group.45667.html -=group_props [{name,public_key}] -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.000000s -=group_time 7.764s -=case ssh_algorithms_SUITE:end_per_suite -=logfile ssh_algorithms_suite.end_per_suite.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:19 -=result ok -=elapsed 0.001080s -=group_time 56.310s -=case ssh_basic_SUITE:init_per_suite -=logfile ssh_basic_suite.init_per_suite.html -=started 2025-01-09 11:33:19 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.008189s -=case ssh_basic_SUITE:init_per_group -=logfile ssh_basic_suite.init_per_group.html -=group_props [{name,all_tests},parallel] -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.000000s -=group_time 40.113s -=group_time 16.162s -=group_time 0.057s -=group_time 0.067s -=group_time 0.060s -=case ssh_basic_SUITE:init_per_group -=logfile ssh_basic_suite.init_per_group.45699.html -=group_props [{name,sequential}] -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:app_test -=logfile ssh_basic_suite.app_test.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.011633s -=case ssh_basic_SUITE:appup_test -=logfile ssh_basic_suite.appup_test.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.000593s -=case ssh_basic_SUITE:daemon_already_started -=logfile ssh_basic_suite.daemon_already_started.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.002439s -=case ssh_basic_SUITE:daemon_error_closes_port -=logfile ssh_basic_suite.daemon_error_closes_port.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.001914s -=case ssh_basic_SUITE:double_close -=logfile ssh_basic_suite.double_close.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.005994s -=case ssh_basic_SUITE:daemon_opt_fd -=logfile ssh_basic_suite.daemon_opt_fd.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.005700s -=case ssh_basic_SUITE:multi_daemon_opt_fd -=logfile ssh_basic_suite.multi_daemon_opt_fd.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:20 -=result ok -=elapsed 0.035217s -=case ssh_basic_SUITE:packet_size -=logfile ssh_basic_suite.packet_size.html -=started 2025-01-09 11:33:20 -=ended 2025-01-09 11:33:28 -=result ok -=elapsed 8.019417s -=case ssh_basic_SUITE:ssh_info_print -=logfile ssh_basic_suite.ssh_info_print.html -=started 2025-01-09 11:33:28 -=ended 2025-01-09 11:33:29 -=result ok -=elapsed 1.011037s -=case ssh_basic_SUITE:shell_exit_status -=logfile ssh_basic_suite.shell_exit_status.html -=started 2025-01-09 11:33:29 -=ended 2025-01-09 11:33:59 -=result ok -=elapsed 30.008687s -=case ssh_basic_SUITE:setopts_getopts -=logfile ssh_basic_suite.setopts_getopts.html -=started 2025-01-09 11:33:59 -=ended 2025-01-09 11:33:59 -=result ok -=elapsed 0.007004s -=case ssh_basic_SUITE:known_hosts -=logfile ssh_basic_suite.known_hosts.html -=started 2025-01-09 11:33:59 -=ended 2025-01-09 11:33:59 -=result ok -=elapsed 0.016764s -=case ssh_basic_SUITE:ssh_file_is_host_key -=logfile ssh_basic_suite.ssh_file_is_host_key.html -=started 2025-01-09 11:33:59 -=ended 2025-01-09 11:33:59 -=result ok -=elapsed 0.483054s -=case ssh_basic_SUITE:ssh_file_is_host_key_misc -=logfile ssh_basic_suite.ssh_file_is_host_key_misc.html -=started 2025-01-09 11:33:59 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.127441s -=case ssh_basic_SUITE:ssh_file_is_auth_key -=logfile ssh_basic_suite.ssh_file_is_auth_key.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.000810s -=case ssh_basic_SUITE:end_per_group -=logfile ssh_basic_suite.end_per_group.html -=group_props [{name,sequential}] -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:init_per_group -=logfile ssh_basic_suite.init_per_group.46083.html -=group_props [{name,p_basic},parallel] -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:send -=logfile ssh_basic_suite.send.46147.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.072921s -=case ssh_basic_SUITE:peername_sockname -=logfile ssh_basic_suite.peername_sockname.46179.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.082226s -=case ssh_basic_SUITE:exec -=logfile ssh_basic_suite.exec.46243.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.086966s -=case ssh_basic_SUITE:exec_compressed -=logfile ssh_basic_suite.exec_compressed.47810.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.085005s -=case ssh_basic_SUITE:exec_with_io_out -=logfile ssh_basic_suite.exec_with_io_out.46115.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.088407s -=case ssh_basic_SUITE:exec_with_io_in -=logfile ssh_basic_suite.exec_with_io_in.46211.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.091815s -=case ssh_basic_SUITE:cli -=logfile ssh_basic_suite.cli.46275.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.536008s -=case ssh_basic_SUITE:cli_exit_normal -=logfile ssh_basic_suite.cli_exit_normal.47874.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.542594s -=case ssh_basic_SUITE:cli_exit_status -=logfile ssh_basic_suite.cli_exit_status.47906.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.556099s -=case ssh_basic_SUITE:idle_time_client -=logfile ssh_basic_suite.idle_time_client.47842.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 16.091209s -=case ssh_basic_SUITE:idle_time_server -=logfile ssh_basic_suite.idle_time_server.47938.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 16.090516s -=case ssh_basic_SUITE:max_initial_idle_time -=logfile ssh_basic_suite.max_initial_idle_time.16484.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:08 -=result ok -=elapsed 8.077732s -=case ssh_basic_SUITE:openssh_zlib_basic_test -=logfile ssh_basic_suite.openssh_zlib_basic_test.16516.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.079011s -=case ssh_basic_SUITE:misc_ssh_options -=logfile ssh_basic_suite.misc_ssh_options.16548.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.092394s -=case ssh_basic_SUITE:inet_option -=logfile ssh_basic_suite.inet_option.46307.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.079105s -=case ssh_basic_SUITE:inet6_option -=logfile ssh_basic_suite.inet6_option.46339.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.082188s -=case ssh_basic_SUITE:shell -=logfile ssh_basic_suite.shell.1189.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:01 -=result ok -=elapsed 1.557793s -=case ssh_basic_SUITE:shell_socket -=logfile ssh_basic_suite.shell_socket.16580.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:01 -=result ok -=elapsed 1.559872s -=case ssh_basic_SUITE:shell_ssh_conn -=logfile ssh_basic_suite.shell_ssh_conn.16612.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:01 -=result ok -=elapsed 1.558235s -=case ssh_basic_SUITE:shell_no_unicode -=logfile ssh_basic_suite.shell_no_unicode.16644.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:01 -=result ok -=elapsed 0.997619s -=case ssh_basic_SUITE:shell_unicode_string -=logfile ssh_basic_suite.shell_unicode_string.16676.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:01 -=result ok -=elapsed 0.998561s -=case ssh_basic_SUITE:close -=logfile ssh_basic_suite.close.47970.html -=started 2025-01-09 11:34:00 -=ended 2025-01-09 11:34:00 -=result ok -=elapsed 0.079818s -=case ssh_basic_SUITE:end_per_group -=logfile ssh_basic_suite.end_per_group.48418.html -=group_props [{name,p_basic},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:init_per_group -=logfile ssh_basic_suite.init_per_group.46691.html -=group_props [{name,internal_error},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:internal_error -=logfile ssh_basic_suite.internal_error.46723.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.008964s -=case ssh_basic_SUITE:end_per_group -=logfile ssh_basic_suite.end_per_group.48450.html -=group_props [{name,internal_error},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:init_per_group -=logfile ssh_basic_suite.init_per_group.48482.html -=group_props [{name,login_bad_pwd_no_retry},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:login_bad_pwd_no_retry1 -=logfile ssh_basic_suite.login_bad_pwd_no_retry1.48514.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.016694s -=case ssh_basic_SUITE:login_bad_pwd_no_retry2 -=logfile ssh_basic_suite.login_bad_pwd_no_retry2.48546.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.015909s -=case ssh_basic_SUITE:login_bad_pwd_no_retry3 -=logfile ssh_basic_suite.login_bad_pwd_no_retry3.48578.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.013877s -=case ssh_basic_SUITE:login_bad_pwd_no_retry4 -=logfile ssh_basic_suite.login_bad_pwd_no_retry4.17060.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.015760s -=case ssh_basic_SUITE:login_bad_pwd_no_retry5 -=logfile ssh_basic_suite.login_bad_pwd_no_retry5.48610.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.014632s -=case ssh_basic_SUITE:end_per_group -=logfile ssh_basic_suite.end_per_group.17156.html -=group_props [{name,login_bad_pwd_no_retry},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:init_per_group -=logfile ssh_basic_suite.init_per_group.48770.html -=group_props [{name,key_cb},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.001215s -=case ssh_basic_SUITE:key_callback -=logfile ssh_basic_suite.key_callback.48802.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.009837s -=case ssh_basic_SUITE:key_callback_options -=logfile ssh_basic_suite.key_callback_options.17188.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.010814s -=case ssh_basic_SUITE:end_per_group -=logfile ssh_basic_suite.end_per_group.17220.html -=group_props [{name,key_cb},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000000s -=case ssh_basic_SUITE:end_per_group -=logfile ssh_basic_suite.end_per_group.46819.html -=group_props [{name,all_tests},parallel] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000000s -=group_time 56.606s -=case ssh_basic_SUITE:end_per_suite -=logfile ssh_basic_suite.end_per_suite.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.003233s -=group_time 56.679s -=== -=case ssh_bench_SUITE:all -=started 2025-01-09 11:34:16 -=result skipped: Benchmarks run separately -=== *** Skipping {ssh_bench_SUITE,all} *** -=case ssh_chan_behaviours_SUITE:init_per_suite -=logfile ssh_chan_behaviours_suite.init_per_suite.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000655s -=case ssh_chan_behaviours_SUITE:noexist_subsystem -=logfile ssh_chan_behaviours_suite.noexist_subsystem.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000404s -=case ssh_chan_behaviours_SUITE:undefined_subsystem -=logfile ssh_chan_behaviours_suite.undefined_subsystem.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000950s -=case ssh_chan_behaviours_SUITE:defined_subsystem -=logfile ssh_chan_behaviours_suite.defined_subsystem.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.001432s -=case ssh_chan_behaviours_SUITE:subsystem_client -=logfile ssh_chan_behaviours_suite.subsystem_client.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.001842s -=case ssh_chan_behaviours_SUITE:end_per_suite -=logfile ssh_chan_behaviours_suite.end_per_suite.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.001133s -=group_time 0.192s -=case ssh_collect_labmachine_info_SUITE:init_per_suite -=logfile ssh_collect_labmachine_info_suite.init_per_suite.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result skipped: "No 'collect_host_info' path configured" -=elapsed 0.000266s -=== *** SKIPPED {ssh_collect_labmachine_info_SUITE,init_per_suite} *** -=== -=case ssh_collect_labmachine_info_SUITE:ssh_info_lib -=started 2025-01-09 11:34:16 -=result skipped: No 'collect_host_info' path configured -=== *** Skipping test case #982 {ssh_collect_labmachine_info_SUITE,ssh_info_lib} *** -=== -=case ssh_collect_labmachine_info_SUITE:end_per_suite -=started 2025-01-09 11:34:16 -=result skipped: No 'collect_host_info' path configured -=== *** Skipping {ssh_collect_labmachine_info_SUITE,end_per_suite} *** -=case ssh_connection_SUITE:init_per_suite -=logfile ssh_connection_suite.init_per_suite.html -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:16 -=result ok -=elapsed 0.000242s -=case ssh_connection_SUITE:init_per_group -=logfile ssh_connection_suite.init_per_group.html -=group_props [{name,openssh}] -=started 2025-01-09 11:34:16 -=ended 2025-01-09 11:34:17 -=result ok -=elapsed 0.042001s -=case ssh_connection_SUITE:simple_exec -=logfile ssh_connection_suite.simple_exec.html -=started 2025-01-09 11:34:17 -=ended 2025-01-09 11:34:17 -=result ok -=elapsed 0.092934s -=case ssh_connection_SUITE:simple_exec_more_data -=logfile ssh_connection_suite.simple_exec_more_data.html -=started 2025-01-09 11:34:17 -=ended 2025-01-09 11:34:18 -=result ok -=elapsed 0.094968s -=case ssh_connection_SUITE:simple_exec_sock -=logfile ssh_connection_suite.simple_exec_sock.html -=started 2025-01-09 11:34:18 -=ended 2025-01-09 11:34:18 -=result ok -=elapsed 0.093610s -=case ssh_connection_SUITE:simple_exec_two_socks -=logfile ssh_connection_suite.simple_exec_two_socks.html -=started 2025-01-09 11:34:18 -=ended 2025-01-09 11:34:19 -=result ok -=elapsed 0.098588s -=case ssh_connection_SUITE:small_cat -=logfile ssh_connection_suite.small_cat.html -=started 2025-01-09 11:34:19 -=ended 2025-01-09 11:34:20 -=result ok -=elapsed 0.093344s -=case ssh_connection_SUITE:big_cat -=logfile ssh_connection_suite.big_cat.html -=started 2025-01-09 11:34:20 -=ended 2025-01-09 11:34:21 -=result ok -=elapsed 0.348520s -=case ssh_connection_SUITE:send_after_exit -=logfile ssh_connection_suite.send_after_exit.html -=started 2025-01-09 11:34:21 -=ended 2025-01-09 11:34:21 -=result ok -=elapsed 0.093606s -=case ssh_connection_SUITE:ptty_alloc_default -=logfile ssh_connection_suite.ptty_alloc_default.html -=started 2025-01-09 11:34:21 -=ended 2025-01-09 11:34:22 -=result ok -=elapsed 0.094262s -=case ssh_connection_SUITE:ptty_alloc -=logfile ssh_connection_suite.ptty_alloc.html -=started 2025-01-09 11:34:22 -=ended 2025-01-09 11:34:22 -=result ok -=elapsed 0.091820s -=case ssh_connection_SUITE:ptty_alloc_pixel -=logfile ssh_connection_suite.ptty_alloc_pixel.html -=started 2025-01-09 11:34:22 -=ended 2025-01-09 11:34:23 -=result ok -=elapsed 0.091803s -=case ssh_connection_SUITE:connect_sock_not_passive -=logfile ssh_connection_suite.connect_sock_not_passive.html -=started 2025-01-09 11:34:23 -=ended 2025-01-09 11:34:24 -=result ok -=elapsed 0.000597s -=case ssh_connection_SUITE:daemon_sock_not_passive -=logfile ssh_connection_suite.daemon_sock_not_passive.html -=started 2025-01-09 11:34:24 -=ended 2025-01-09 11:34:24 -=result ok -=elapsed 0.000659s -=case ssh_connection_SUITE:end_per_group -=logfile ssh_connection_suite.end_per_group.html -=group_props [{name,openssh}] -=started 2025-01-09 11:34:24 -=ended 2025-01-09 11:34:24 -=result ok -=elapsed 0.000000s -=group_time 7.576s -=case ssh_connection_SUITE:small_interrupted_send -=logfile ssh_connection_suite.small_interrupted_send.html -=started 2025-01-09 11:34:24 -=ended 2025-01-09 11:34:25 -=result ok -=elapsed 0.139682s -=case ssh_connection_SUITE:interrupted_send -=logfile ssh_connection_suite.interrupted_send.html -=started 2025-01-09 11:34:25 -=ended 2025-01-09 11:34:25 -=result ok -=elapsed 0.169599s -=case ssh_connection_SUITE:exec_erlang_term -=logfile ssh_connection_suite.exec_erlang_term.html -=started 2025-01-09 11:34:25 -=ended 2025-01-09 11:34:26 -=result ok -=elapsed 0.509773s -=case ssh_connection_SUITE:exec_erlang_term_non_default_shell -=logfile ssh_connection_suite.exec_erlang_term_non_default_shell.html -=started 2025-01-09 11:34:26 -=ended 2025-01-09 11:34:27 -=result ok -=elapsed 0.508341s -=case ssh_connection_SUITE:exec_disabled -=logfile ssh_connection_suite.exec_disabled.html -=started 2025-01-09 11:34:27 -=ended 2025-01-09 11:34:29 -=result ok -=elapsed 1.009661s -=case ssh_connection_SUITE:exec_shell_disabled -=logfile ssh_connection_suite.exec_shell_disabled.html -=started 2025-01-09 11:34:29 -=ended 2025-01-09 11:34:30 -=result ok -=elapsed 0.508864s -=case ssh_connection_SUITE:start_shell -=logfile ssh_connection_suite.start_shell.html -=started 2025-01-09 11:34:30 -=ended 2025-01-09 11:34:32 -=result ok -=elapsed 1.009478s -=case ssh_connection_SUITE:new_shell_dumb_term -=logfile ssh_connection_suite.new_shell_dumb_term.html -=started 2025-01-09 11:34:32 -=ended 2025-01-09 11:34:33 -=result ok -=elapsed 0.507762s -=case ssh_connection_SUITE:new_shell_xterm_term -=logfile ssh_connection_suite.new_shell_xterm_term.html -=started 2025-01-09 11:34:33 -=ended 2025-01-09 11:34:34 -=result ok -=elapsed 0.507828s -=case ssh_connection_SUITE:trap_exit_connect -=logfile ssh_connection_suite.trap_exit_connect.html -=started 2025-01-09 11:34:34 -=ended 2025-01-09 11:34:34 -=result ok -=elapsed 0.005777s -=case ssh_connection_SUITE:trap_exit_daemon -=logfile ssh_connection_suite.trap_exit_daemon.html -=started 2025-01-09 11:34:34 -=ended 2025-01-09 11:34:35 -=result ok -=elapsed 0.001168s -=case ssh_connection_SUITE:start_shell_pty -=logfile ssh_connection_suite.start_shell_pty.html -=started 2025-01-09 11:34:35 -=ended 2025-01-09 11:34:36 -=result ok -=elapsed 1.009512s -=case ssh_connection_SUITE:start_shell_exec -=logfile ssh_connection_suite.start_shell_exec.html -=started 2025-01-09 11:34:36 -=ended 2025-01-09 11:34:37 -=result ok -=elapsed 0.508815s -=case ssh_connection_SUITE:start_shell_exec_fun -=logfile ssh_connection_suite.start_shell_exec_fun.html -=started 2025-01-09 11:34:37 -=ended 2025-01-09 11:34:38 -=result ok -=elapsed 0.006672s -=case ssh_connection_SUITE:start_shell_exec_fun2 -=logfile ssh_connection_suite.start_shell_exec_fun2.html -=started 2025-01-09 11:34:38 -=ended 2025-01-09 11:34:38 -=result ok -=elapsed 0.006356s -=case ssh_connection_SUITE:start_shell_exec_fun3 -=logfile ssh_connection_suite.start_shell_exec_fun3.html -=started 2025-01-09 11:34:38 -=ended 2025-01-09 11:34:39 -=result ok -=elapsed 0.006560s -=case ssh_connection_SUITE:start_shell_exec_direct_fun -=logfile ssh_connection_suite.start_shell_exec_direct_fun.html -=started 2025-01-09 11:34:39 -=ended 2025-01-09 11:34:39 -=result ok -=elapsed 0.006364s -=case ssh_connection_SUITE:start_shell_exec_direct_fun2 -=logfile ssh_connection_suite.start_shell_exec_direct_fun2.html -=started 2025-01-09 11:34:39 -=ended 2025-01-09 11:34:40 -=result ok -=elapsed 0.006457s -=case ssh_connection_SUITE:start_shell_exec_direct_fun3 -=logfile ssh_connection_suite.start_shell_exec_direct_fun3.html -=started 2025-01-09 11:34:40 -=ended 2025-01-09 11:34:40 -=result ok -=elapsed 0.006616s -=case ssh_connection_SUITE:start_shell_exec_direct_fun_more_data -=logfile ssh_connection_suite.start_shell_exec_direct_fun_more_data.html -=started 2025-01-09 11:34:40 -=ended 2025-01-09 11:34:41 -=result ok -=elapsed 0.081693s -=case ssh_connection_SUITE:start_shell_exec_direct_fun1_error -=logfile ssh_connection_suite.start_shell_exec_direct_fun1_error.html -=started 2025-01-09 11:34:41 -=ended 2025-01-09 11:34:42 -=result ok -=elapsed 0.006897s -=case ssh_connection_SUITE:start_shell_exec_direct_fun1_error_type -=logfile ssh_connection_suite.start_shell_exec_direct_fun1_error_type.html -=started 2025-01-09 11:34:42 -=ended 2025-01-09 11:34:42 -=result ok -=elapsed 0.006390s -=case ssh_connection_SUITE:start_exec_direct_fun1_read_write -=logfile ssh_connection_suite.start_exec_direct_fun1_read_write.html -=started 2025-01-09 11:34:42 -=ended 2025-01-09 11:34:43 -=result ok -=elapsed 0.008318s -=case ssh_connection_SUITE:start_exec_direct_fun1_read_write_advanced -=logfile ssh_connection_suite.start_exec_direct_fun1_read_write_advanced.html -=started 2025-01-09 11:34:43 -=ended 2025-01-09 11:34:43 -=result ok -=elapsed 0.008652s -=case ssh_connection_SUITE:start_shell_sock_exec_fun -=logfile ssh_connection_suite.start_shell_sock_exec_fun.html -=started 2025-01-09 11:34:43 -=ended 2025-01-09 11:34:44 -=result ok -=elapsed 0.006450s -=case ssh_connection_SUITE:start_shell_sock_daemon_exec -=logfile ssh_connection_suite.start_shell_sock_daemon_exec.html -=started 2025-01-09 11:34:44 -=ended 2025-01-09 11:34:44 -=result ok -=elapsed 0.005831s -=case ssh_connection_SUITE:start_shell_sock_daemon_exec_multi -=logfile ssh_connection_suite.start_shell_sock_daemon_exec_multi.html -=started 2025-01-09 11:34:44 -=ended 2025-01-09 11:34:45 -=result ok -=elapsed 0.024912s -=case ssh_connection_SUITE:encode_decode_pty_opts -=logfile ssh_connection_suite.encode_decode_pty_opts.html -=started 2025-01-09 11:34:45 -=ended 2025-01-09 11:34:45 -=result ok -=elapsed 0.000017s -=case ssh_connection_SUITE:connect_sock_not_tcp -=logfile ssh_connection_suite.connect_sock_not_tcp.html -=started 2025-01-09 11:34:45 -=ended 2025-01-09 11:34:46 -=result ok -=elapsed 0.000225s -=case ssh_connection_SUITE:connect2_invalid_options -=logfile ssh_connection_suite.connect2_invalid_options.html -=started 2025-01-09 11:34:46 -=ended 2025-01-09 11:34:46 -=result ok -=elapsed 0.000002s -=case ssh_connection_SUITE:connect_invalid_port -=logfile ssh_connection_suite.connect_invalid_port.html -=started 2025-01-09 11:34:46 -=ended 2025-01-09 11:34:47 -=result ok -=elapsed 0.001488s -=case ssh_connection_SUITE:connect_invalid_options -=logfile ssh_connection_suite.connect_invalid_options.html -=started 2025-01-09 11:34:47 -=ended 2025-01-09 11:34:47 -=result ok -=elapsed 0.001561s -=case ssh_connection_SUITE:connect_invalid_timeout_0 -=logfile ssh_connection_suite.connect_invalid_timeout_0.html -=started 2025-01-09 11:34:47 -=ended 2025-01-09 11:34:48 -=result ok -=elapsed 0.001535s -=case ssh_connection_SUITE:connect_invalid_timeout_1 -=logfile ssh_connection_suite.connect_invalid_timeout_1.html -=started 2025-01-09 11:34:48 -=ended 2025-01-09 11:34:49 -=result ok -=elapsed 0.001620s -=case ssh_connection_SUITE:connect3_invalid_port -=logfile ssh_connection_suite.connect3_invalid_port.html -=started 2025-01-09 11:34:49 -=ended 2025-01-09 11:34:49 -=result ok -=elapsed 0.000002s -=case ssh_connection_SUITE:connect3_invalid_options -=logfile ssh_connection_suite.connect3_invalid_options.html -=started 2025-01-09 11:34:49 -=ended 2025-01-09 11:34:50 -=result ok -=elapsed 0.000002s -=case ssh_connection_SUITE:connect3_invalid_timeout_0 -=logfile ssh_connection_suite.connect3_invalid_timeout_0.html -=started 2025-01-09 11:34:50 -=ended 2025-01-09 11:34:50 -=result ok -=elapsed 0.000002s -=case ssh_connection_SUITE:connect3_invalid_timeout_1 -=logfile ssh_connection_suite.connect3_invalid_timeout_1.html -=started 2025-01-09 11:34:50 -=ended 2025-01-09 11:34:51 -=result ok -=elapsed 0.000002s -=case ssh_connection_SUITE:connect3_invalid_both -=logfile ssh_connection_suite.connect3_invalid_both.html -=started 2025-01-09 11:34:51 -=ended 2025-01-09 11:34:51 -=result ok -=elapsed 0.000002s -=case ssh_connection_SUITE:connect4_invalid_two_0 -=logfile ssh_connection_suite.connect4_invalid_two_0.html -=started 2025-01-09 11:34:51 -=ended 2025-01-09 11:34:52 -=result ok -=elapsed 0.001335s -=case ssh_connection_SUITE:connect4_invalid_two_1 -=logfile ssh_connection_suite.connect4_invalid_two_1.html -=started 2025-01-09 11:34:52 -=ended 2025-01-09 11:34:52 -=result ok -=elapsed 0.001301s -=case ssh_connection_SUITE:connect4_invalid_two_2 -=logfile ssh_connection_suite.connect4_invalid_two_2.html -=started 2025-01-09 11:34:52 -=ended 2025-01-09 11:34:53 -=result ok -=elapsed 0.001289s -=case ssh_connection_SUITE:connect4_invalid_three -=logfile ssh_connection_suite.connect4_invalid_three.html -=started 2025-01-09 11:34:53 -=ended 2025-01-09 11:34:53 -=result ok -=elapsed 0.001367s -=case ssh_connection_SUITE:connect_timeout -=logfile ssh_connection_suite.connect_timeout.html -=started 2025-01-09 11:34:53 -=ended 2025-01-09 11:34:56 -=result ok -=elapsed 2.000758s -=case ssh_connection_SUITE:daemon_sock_not_tcp -=logfile ssh_connection_suite.daemon_sock_not_tcp.html -=started 2025-01-09 11:34:56 -=ended 2025-01-09 11:34:56 -=result ok -=elapsed 0.000193s -=case ssh_connection_SUITE:gracefull_invalid_version -=logfile ssh_connection_suite.gracefull_invalid_version.html -=started 2025-01-09 11:34:56 -=ended 2025-01-09 11:34:57 -=result ok -=elapsed 0.002741s -=case ssh_connection_SUITE:gracefull_invalid_start -=logfile ssh_connection_suite.gracefull_invalid_start.html -=started 2025-01-09 11:34:57 -=ended 2025-01-09 11:34:57 -=result ok -=elapsed 0.002847s -=case ssh_connection_SUITE:gracefull_invalid_long_start -=logfile ssh_connection_suite.gracefull_invalid_long_start.html -=started 2025-01-09 11:34:57 -=ended 2025-01-09 11:34:58 -=result ok -=elapsed 0.003291s -=case ssh_connection_SUITE:gracefull_invalid_long_start_no_nl -=logfile ssh_connection_suite.gracefull_invalid_long_start_no_nl.html -=started 2025-01-09 11:34:58 -=ended 2025-01-09 11:34:58 -=result ok -=elapsed 0.003077s -=case ssh_connection_SUITE:kex_error -=logfile ssh_connection_suite.kex_error.html -=started 2025-01-09 11:34:58 -=ended 2025-01-09 11:34:59 -=result ok -=elapsed 0.005300s -=case ssh_connection_SUITE:stop_listener -=logfile ssh_connection_suite.stop_listener.html -=started 2025-01-09 11:34:59 -=ended 2025-01-09 11:35:00 -=result ok -=elapsed 0.017007s -=case ssh_connection_SUITE:no_sensitive_leak -=logfile ssh_connection_suite.no_sensitive_leak.html -=started 2025-01-09 11:35:00 -=ended 2025-01-09 11:35:01 -=result ok -=elapsed 0.608178s -=case ssh_connection_SUITE:start_subsystem_on_closed_channel -=logfile ssh_connection_suite.start_subsystem_on_closed_channel.html -=started 2025-01-09 11:35:01 -=ended 2025-01-09 11:35:03 -=result ok -=elapsed 2.007604s -=case ssh_connection_SUITE:max_channels_option -=logfile ssh_connection_suite.max_channels_option.html -=started 2025-01-09 11:35:03 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 1.012464s -=case ssh_connection_SUITE:end_per_suite -=logfile ssh_connection_suite.end_per_suite.html -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 0.000004s -=group_time 48.296s -=case ssh_dbg_SUITE:init_per_suite -=logfile ssh_dbg_suite.init_per_suite.html -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 0.009640s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.html -=group_props [{suite,ssh_dbg_SUITE},{name,dbg}] -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 0.000061s -=case ssh_dbg_SUITE:dbg_basic -=logfile ssh_dbg_suite.dbg_basic.html -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 0.051108s -=case ssh_dbg_SUITE:dbg_alg_terminate -=logfile ssh_dbg_suite.dbg_alg_terminate.html -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 0.014614s -=case ssh_dbg_SUITE:dbg_ssh_messages -=logfile ssh_dbg_suite.dbg_ssh_messages.html -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 0.011911s -=case ssh_dbg_SUITE:dbg_connections -=logfile ssh_dbg_suite.dbg_connections.html -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:05 -=result ok -=elapsed 0.013411s -=case ssh_dbg_SUITE:dbg_channels -=logfile ssh_dbg_suite.dbg_channels.html -=started 2025-01-09 11:35:05 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 1.013206s -=case ssh_dbg_SUITE:dbg_authentication -=logfile ssh_dbg_suite.dbg_authentication.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.022099s -=case ssh_dbg_SUITE:all_dbg -=logfile ssh_dbg_suite.all_dbg.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.027153s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.html -=group_props [{suite,ssh_dbg_SUITE},{name,dbg}] -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000037s -=group_time 1.347s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.17636.html -=group_props [{name,circ_buf},{suite,ssh_dbg_SUITE}] -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000044s -=case ssh_dbg_SUITE:cb_basic -=logfile ssh_dbg_suite.cb_basic.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000007s -=case ssh_dbg_SUITE:cb_print -=logfile ssh_dbg_suite.cb_print.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000450s -=case ssh_dbg_SUITE:cb_macros_print -=logfile ssh_dbg_suite.cb_macros_print.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000340s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.48163.html -=group_props [{name,circ_buf},{suite,ssh_dbg_SUITE}] -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000039s -=group_time 0.094s -=case ssh_dbg_SUITE:end_per_suite -=logfile ssh_dbg_suite.end_per_suite.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.001444s -=group_time 1.542s -=case ssh_engine_SUITE:init_per_suite -=logfile ssh_engine_suite.init_per_suite.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000828s -=case ssh_engine_SUITE:init_per_group -=logfile ssh_engine_suite.init_per_group.html -=group_props [{name,dsa_key}] -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.003463s -=case ssh_engine_SUITE:simple_connect -=logfile ssh_engine_suite.simple_connect.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.015054s -=case ssh_engine_SUITE:end_per_group -=logfile ssh_engine_suite.end_per_group.html -=group_props [{name,dsa_key}] -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.000065s -=group_time 0.066s -=case ssh_engine_SUITE:init_per_group -=logfile ssh_engine_suite.init_per_group.48227.html -=group_props [{name,rsa_key}] -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:06 -=result ok -=elapsed 0.002326s -=case ssh_engine_SUITE:simple_connect -=logfile ssh_engine_suite.simple_connect.48259.html -=started 2025-01-09 11:35:06 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.016272s -=case ssh_engine_SUITE:end_per_group -=logfile ssh_engine_suite.end_per_group.48323.html -=group_props [{name,rsa_key}] -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.000085s -=group_time 0.066s -=case ssh_engine_SUITE:end_per_suite -=logfile ssh_engine_suite.end_per_suite.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.001613s -=group_time 0.220s -=case ssh_options_SUITE:init_per_suite -=logfile ssh_options_suite.init_per_suite.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.000080s -=case ssh_options_SUITE:connectfun_disconnectfun_server -=logfile ssh_options_suite.connectfun_disconnectfun_server.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.005834s -=case ssh_options_SUITE:connectfun_disconnectfun_client -=logfile ssh_options_suite.connectfun_disconnectfun_client.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.005410s -=case ssh_options_SUITE:server_password_option -=logfile ssh_options_suite.server_password_option.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.010386s -=case ssh_options_SUITE:server_userpassword_option -=logfile ssh_options_suite.server_userpassword_option.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.013591s -=case ssh_options_SUITE:server_pwdfun_option -=logfile ssh_options_suite.server_pwdfun_option.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.013508s -=case ssh_options_SUITE:server_pwdfun_4_option -=logfile ssh_options_suite.server_pwdfun_4_option.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.024952s -=case ssh_options_SUITE:server_keyboard_interactive -=logfile ssh_options_suite.server_keyboard_interactive.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.006144s -=case ssh_options_SUITE:server_keyboard_interactive_extra_msg -=logfile ssh_options_suite.server_keyboard_interactive_extra_msg.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.005568s -=case ssh_options_SUITE:auth_method_kb_interactive_data_tuple -=logfile ssh_options_suite.auth_method_kb_interactive_data_tuple.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.010377s -=case ssh_options_SUITE:auth_method_kb_interactive_data_fun3 -=logfile ssh_options_suite.auth_method_kb_interactive_data_fun3.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.010126s -=case ssh_options_SUITE:auth_method_kb_interactive_data_fun4 -=logfile ssh_options_suite.auth_method_kb_interactive_data_fun4.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.010408s -=case ssh_options_SUITE:auth_none -=logfile ssh_options_suite.auth_none.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.005296s -=case ssh_options_SUITE:init_per_group -=logfile ssh_options_suite.init_per_group.html -=group_props [{name,dir_options}] -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.000406s -=case ssh_options_SUITE:user_dir_option -=logfile ssh_options_suite.user_dir_option.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.000198s -=case ssh_options_SUITE:user_dir_fun_option -=logfile ssh_options_suite.user_dir_fun_option.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.016012s -=case ssh_options_SUITE:system_dir_option -=logfile ssh_options_suite.system_dir_option.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.000429s -=case ssh_options_SUITE:end_per_group -=logfile ssh_options_suite.end_per_group.html -=group_props [{name,dir_options}] -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.000000s -=group_time 0.117s -=case ssh_options_SUITE:ssh_connect_timeout -=logfile ssh_options_suite.ssh_connect_timeout.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:07 -=result ok -=elapsed 0.000069s -=case ssh_options_SUITE:ssh_connect_arg4_timeout -=logfile ssh_options_suite.ssh_connect_arg4_timeout.html -=started 2025-01-09 11:35:07 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 1.001266s -=case ssh_options_SUITE:ssh_daemon_minimal_remote_max_packet_size_option -=logfile ssh_options_suite.ssh_daemon_minimal_remote_max_packet_size_option.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.006212s -=case ssh_options_SUITE:ssh_msg_debug_fun_option_client -=logfile ssh_options_suite.ssh_msg_debug_fun_option_client.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.006037s -=case ssh_options_SUITE:ssh_msg_debug_fun_option_server -=logfile ssh_options_suite.ssh_msg_debug_fun_option_server.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.006170s -=case ssh_options_SUITE:disconnectfun_option_server -=logfile ssh_options_suite.disconnectfun_option_server.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.006204s -=case ssh_options_SUITE:disconnectfun_option_client -=logfile ssh_options_suite.disconnectfun_option_client.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.006012s -=case ssh_options_SUITE:unexpectedfun_option_server -=logfile ssh_options_suite.unexpectedfun_option_server.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.005378s -=case ssh_options_SUITE:unexpectedfun_option_client -=logfile ssh_options_suite.unexpectedfun_option_client.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.005638s -=case ssh_options_SUITE:hostkey_fingerprint_check -=logfile ssh_options_suite.hostkey_fingerprint_check.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.007179s -=case ssh_options_SUITE:hostkey_fingerprint_check_md5 -=logfile ssh_options_suite.hostkey_fingerprint_check_md5.html -=started 2025-01-09 11:35:08 -=ended 2025-01-09 11:35:08 -=result ok -=elapsed 0.007519s -=case ssh_options_SUITE:hostkey_fingerprint_check_sha -=logfile ssh_options_suite.hostkey_fingerprint_check_sha.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.006675s -=case ssh_options_SUITE:hostkey_fingerprint_check_sha256 -=logfile ssh_options_suite.hostkey_fingerprint_check_sha256.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.006897s -=case ssh_options_SUITE:hostkey_fingerprint_check_sha384 -=logfile ssh_options_suite.hostkey_fingerprint_check_sha384.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.006620s -=case ssh_options_SUITE:hostkey_fingerprint_check_sha512 -=logfile ssh_options_suite.hostkey_fingerprint_check_sha512.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.006920s -=case ssh_options_SUITE:hostkey_fingerprint_check_list -=logfile ssh_options_suite.hostkey_fingerprint_check_list.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.007189s -=case ssh_options_SUITE:id_string_no_opt_client -=logfile ssh_options_suite.id_string_no_opt_client.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.002208s -=case ssh_options_SUITE:id_string_own_string_client -=logfile ssh_options_suite.id_string_own_string_client.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.002141s -=case ssh_options_SUITE:id_string_own_string_client_trail_space -=logfile ssh_options_suite.id_string_own_string_client_trail_space.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.002064s -=case ssh_options_SUITE:id_string_random_client -=logfile ssh_options_suite.id_string_random_client.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.002177s -=case ssh_options_SUITE:id_string_no_opt_server -=logfile ssh_options_suite.id_string_no_opt_server.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.003080s -=case ssh_options_SUITE:id_string_own_string_server -=logfile ssh_options_suite.id_string_own_string_server.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.002626s -=case ssh_options_SUITE:id_string_own_string_server_trail_space -=logfile ssh_options_suite.id_string_own_string_server_trail_space.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.002716s -=case ssh_options_SUITE:id_string_random_server -=logfile ssh_options_suite.id_string_random_server.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.002899s -=case ssh_options_SUITE:max_log_item_len -=logfile ssh_options_suite.max_log_item_len.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.005746s -=case ssh_options_SUITE:save_accepted_host_option -=logfile ssh_options_suite.save_accepted_host_option.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.009378s -=case ssh_options_SUITE:raw_option -=logfile ssh_options_suite.raw_option.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.000186s -=case ssh_options_SUITE:config_file -=logfile ssh_options_suite.config_file.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:09 -=result ok -=elapsed 0.383049s -=case ssh_options_SUITE:config_file_modify_algorithms_order -=logfile ssh_options_suite.config_file_modify_algorithms_order.html -=started 2025-01-09 11:35:09 -=ended 2025-01-09 11:35:10 -=result ok -=elapsed 0.297020s -=case ssh_options_SUITE:daemon_replace_options_simple -=logfile ssh_options_suite.daemon_replace_options_simple.html -=started 2025-01-09 11:35:10 -=ended 2025-01-09 11:35:10 -=result ok -=elapsed 0.002192s -=case ssh_options_SUITE:daemon_replace_options_algs -=logfile ssh_options_suite.daemon_replace_options_algs.html -=started 2025-01-09 11:35:10 -=ended 2025-01-09 11:35:10 -=result ok -=elapsed 0.002191s -=case ssh_options_SUITE:daemon_replace_options_algs_connect -=logfile ssh_options_suite.daemon_replace_options_algs_connect.html -=started 2025-01-09 11:35:10 -=ended 2025-01-09 11:35:10 -=result ok -=elapsed 0.030035s -=case ssh_options_SUITE:daemon_replace_options_algs_conf_file -=logfile ssh_options_suite.daemon_replace_options_algs_conf_file.html -=started 2025-01-09 11:35:10 -=ended 2025-01-09 11:35:10 -=result ok -=elapsed 0.253687s -=case ssh_options_SUITE:init_per_group -=logfile ssh_options_suite.init_per_group.49411.html -=group_props [{name,hardening_tests}] -=started 2025-01-09 11:35:10 -=ended 2025-01-09 11:35:10 -=result ok -=elapsed 0.009708s -=case ssh_options_SUITE:ssh_connect_nonegtimeout_connected_parallel -=logfile ssh_options_suite.ssh_connect_nonegtimeout_connected_parallel.html -=started 2025-01-09 11:35:10 -=ended 2025-01-09 11:35:16 -=result ok -=elapsed 5.511304s -=case ssh_options_SUITE:ssh_connect_nonegtimeout_connected_sequential -=logfile ssh_options_suite.ssh_connect_nonegtimeout_connected_sequential.html -=started 2025-01-09 11:35:16 -=ended 2025-01-09 11:35:21 -=result ok -=elapsed 5.510036s -=case ssh_options_SUITE:ssh_connect_negtimeout_parallel -=logfile ssh_options_suite.ssh_connect_negtimeout_parallel.html -=started 2025-01-09 11:35:21 -=ended 2025-01-09 11:35:25 -=result ok -=elapsed 4.002820s -=case ssh_options_SUITE:ssh_connect_negtimeout_sequential -=logfile ssh_options_suite.ssh_connect_negtimeout_sequential.html -=started 2025-01-09 11:35:25 -=ended 2025-01-09 11:35:29 -=result ok -=elapsed 4.002858s -=case ssh_options_SUITE:max_sessions_ssh_connect_parallel -=logfile ssh_options_suite.max_sessions_ssh_connect_parallel.html -=started 2025-01-09 11:35:29 -=ended 2025-01-09 11:35:29 -=result ok -=elapsed 0.036410s -=case ssh_options_SUITE:max_sessions_ssh_connect_sequential -=logfile ssh_options_suite.max_sessions_ssh_connect_sequential.html -=started 2025-01-09 11:35:29 -=ended 2025-01-09 11:35:29 -=result ok -=elapsed 0.036343s -=case ssh_options_SUITE:max_sessions_sftp_start_channel_parallel -=logfile ssh_options_suite.max_sessions_sftp_start_channel_parallel.html -=started 2025-01-09 11:35:29 -=ended 2025-01-09 11:35:30 -=result ok -=elapsed 0.138194s -=case ssh_options_SUITE:max_sessions_sftp_start_channel_sequential -=logfile ssh_options_suite.max_sessions_sftp_start_channel_sequential.html -=started 2025-01-09 11:35:30 -=ended 2025-01-09 11:35:30 -=result ok -=elapsed 0.142152s -=case ssh_options_SUITE:max_sessions_drops_tcp_connects -=logfile ssh_options_suite.max_sessions_drops_tcp_connects.html -=started 2025-01-09 11:35:30 -=ended 2025-01-09 11:36:34 -=result ok -=elapsed 64.449975s -=case ssh_options_SUITE:end_per_group -=logfile ssh_options_suite.end_per_group.56867.html -=group_props [{name,hardening_tests}] -=started 2025-01-09 11:36:34 -=ended 2025-01-09 11:36:34 -=result ok -=elapsed 0.000000s -=group_time 84.099s -=case ssh_options_SUITE:end_per_suite -=logfile ssh_options_suite.end_per_suite.html -=started 2025-01-09 11:36:34 -=ended 2025-01-09 11:36:34 -=result ok -=elapsed 0.000010s -=group_time 87.656s -=case ssh_property_test_SUITE:init_per_suite -=logfile ssh_property_test_suite.init_per_suite.html -=started 2025-01-09 11:36:34 -=ended 2025-01-09 11:36:35 -=result ok -=elapsed 0.353937s -=case ssh_property_test_SUITE:init_per_group -=logfile ssh_property_test_suite.init_per_group.html -=group_props [{name,messages}] -=started 2025-01-09 11:36:35 -=ended 2025-01-09 11:36:35 -=result ok -=elapsed 0.000000s -=case ssh_property_test_SUITE:decode -=logfile ssh_property_test_suite.decode.html -=started 2025-01-09 11:36:35 -=ended 2025-01-09 11:36:35 -=result ok -=elapsed 0.021983s -=case ssh_property_test_SUITE:decode_encode -=logfile ssh_property_test_suite.decode_encode.html -=started 2025-01-09 11:36:35 -=ended 2025-01-09 11:36:35 -=result ok -=elapsed 0.018331s -=case ssh_property_test_SUITE:end_per_group -=logfile ssh_property_test_suite.end_per_group.html -=group_props [{name,messages}] -=started 2025-01-09 11:36:35 -=ended 2025-01-09 11:36:35 -=result ok -=elapsed 0.000000s -=group_time 0.109s -=case ssh_property_test_SUITE:client_sends_info_timing -=logfile ssh_property_test_suite.client_sends_info_timing.html -=started 2025-01-09 11:36:35 -=ended 2025-01-09 11:38:36 -=result ok -=elapsed 120.827165s -=case ssh_property_test_SUITE:init_per_group -=logfile ssh_property_test_suite.init_per_group.58658.html -=group_props [{name,client_server}] -=started 2025-01-09 11:38:36 -=ended 2025-01-09 11:38:36 -=result ok -=elapsed 0.000000s -=case ssh_property_test_SUITE:client_server_sequential -=logfile ssh_property_test_suite.client_server_sequential.html -=started 2025-01-09 11:38:36 -=ended 2025-01-09 11:38:37 -=result ok -=elapsed 1.197133s -=case ssh_property_test_SUITE:client_server_parallel -=logfile ssh_property_test_suite.client_server_parallel.html -=started 2025-01-09 11:38:37 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 8.178450s -=case ssh_property_test_SUITE:end_per_group -=logfile ssh_property_test_suite.end_per_group.65603.html -=group_props [{name,client_server}] -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.000000s -=group_time 9.446s -=case ssh_property_test_SUITE:end_per_suite -=logfile ssh_property_test_suite.end_per_suite.html -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.000000s -=group_time 130.842s -=case ssh_protocol_SUITE:init_per_suite -=logfile ssh_protocol_suite.init_per_suite.html -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.015723s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.29380.html -=group_props [{suite,ssh_protocol_SUITE},{name,tool_tests}] -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.000054s -=case ssh_protocol_SUITE:lib_works_as_client -=logfile ssh_protocol_suite.lib_works_as_client.html -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.094441s -=case ssh_protocol_SUITE:lib_works_as_server -=logfile ssh_protocol_suite.lib_works_as_server.html -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.014510s -=case ssh_protocol_SUITE:lib_match -=logfile ssh_protocol_suite.lib_match.html -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.000295s -=case ssh_protocol_SUITE:lib_no_match -=logfile ssh_protocol_suite.lib_no_match.html -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.000092s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.29636.html -=group_props [{suite,ssh_protocol_SUITE},{name,tool_tests}] -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:45 -=result ok -=elapsed 0.000035s -=group_time 0.315s -=case ssh_protocol_SUITE:client_info_line -=logfile ssh_protocol_suite.client_info_line.html -=started 2025-01-09 11:38:45 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 1.008870s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.29668.html -=group_props [{name,kex},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.000043s -=case ssh_protocol_SUITE:no_common_alg_server_disconnects -=logfile ssh_protocol_suite.no_common_alg_server_disconnects.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.002750s -=case ssh_protocol_SUITE:no_common_alg_client_disconnects -=logfile ssh_protocol_suite.no_common_alg_client_disconnects.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.003522s -=case ssh_protocol_SUITE:gex_client_init_option_groups -=logfile ssh_protocol_suite.gex_client_init_option_groups.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.043695s -=case ssh_protocol_SUITE:gex_server_gex_limit -=logfile ssh_protocol_suite.gex_server_gex_limit.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.043072s -=case ssh_protocol_SUITE:gex_client_init_option_groups_moduli_file -=logfile ssh_protocol_suite.gex_client_init_option_groups_moduli_file.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.043675s -=case ssh_protocol_SUITE:gex_client_init_option_groups_file -=logfile ssh_protocol_suite.gex_client_init_option_groups_file.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.047049s -=case ssh_protocol_SUITE:gex_client_old_request_exact -=logfile ssh_protocol_suite.gex_client_old_request_exact.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.043232s -=case ssh_protocol_SUITE:gex_client_old_request_noexact -=logfile ssh_protocol_suite.gex_client_old_request_noexact.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:47 -=result ok -=elapsed 0.043306s -=case ssh_protocol_SUITE:kex_strict_negotiated -=logfile ssh_protocol_suite.kex_strict_negotiated.html -=started 2025-01-09 11:38:47 -=ended 2025-01-09 11:38:48 -=result ok -=elapsed 0.512537s -=case ssh_protocol_SUITE:kex_strict_msg_ignore -=logfile ssh_protocol_suite.kex_strict_msg_ignore.html -=started 2025-01-09 11:38:48 -=ended 2025-01-09 11:38:48 -=result ok -=elapsed 0.655613s -=case ssh_protocol_SUITE:kex_strict_msg_unknown -=logfile ssh_protocol_suite.kex_strict_msg_unknown.html -=started 2025-01-09 11:38:48 -=ended 2025-01-09 11:38:49 -=result ok -=elapsed 0.656345s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.66435.html -=group_props [{name,kex},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:49 -=ended 2025-01-09 11:38:49 -=result ok -=elapsed 0.000030s -=group_time 2.481s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.66467.html -=group_props [{name,service_requests},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:49 -=ended 2025-01-09 11:38:49 -=result ok -=elapsed 0.000036s -=case ssh_protocol_SUITE:bad_service_name -=logfile ssh_protocol_suite.bad_service_name.html -=started 2025-01-09 11:38:49 -=ended 2025-01-09 11:38:49 -=result ok -=elapsed 0.054957s -=case ssh_protocol_SUITE:bad_long_service_name -=logfile ssh_protocol_suite.bad_long_service_name.html -=started 2025-01-09 11:38:49 -=ended 2025-01-09 11:38:49 -=result ok -=elapsed 0.059738s -=case ssh_protocol_SUITE:bad_very_long_service_name -=logfile ssh_protocol_suite.bad_very_long_service_name.html -=started 2025-01-09 11:38:49 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.135262s -=case ssh_protocol_SUITE:empty_service_name -=logfile ssh_protocol_suite.empty_service_name.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.093238s -=case ssh_protocol_SUITE:bad_service_name_then_correct -=logfile ssh_protocol_suite.bad_service_name_then_correct.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.092536s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.66787.html -=group_props [{name,service_requests},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.000054s -=group_time 0.743s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.66819.html -=group_props [{name,authentication},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.000032s -=case ssh_protocol_SUITE:client_handles_keyboard_interactive_0_pwds -=logfile ssh_protocol_suite.client_handles_keyboard_interactive_0_pwds.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.015176s -=case ssh_protocol_SUITE:client_handles_banner_keyboard_interactive -=logfile ssh_protocol_suite.client_handles_banner_keyboard_interactive.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.015164s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.74530.html -=group_props [{name,authentication},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.000033s -=group_time 0.141s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.74562.html -=group_props [{name,packet_size_error},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.000059s -=case ssh_protocol_SUITE:packet_length_too_large -=logfile ssh_protocol_suite.packet_length_too_large.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.054506s -=case ssh_protocol_SUITE:packet_length_too_short -=logfile ssh_protocol_suite.packet_length_too_short.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.093157s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.67107.html -=group_props [{name,packet_size_error},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.000034s -=group_time 0.262s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.74850.html -=group_props [{name,field_size_error},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.000033s -=case ssh_protocol_SUITE:service_name_length_too_large -=logfile ssh_protocol_suite.service_name_length_too_large.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.054592s -=case ssh_protocol_SUITE:service_name_length_too_short -=logfile ssh_protocol_suite.service_name_length_too_short.html -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:50 -=result ok -=elapsed 0.054721s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.75202.html -=group_props [{name,field_size_error},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:50 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.000063s -=group_time 0.226s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.75234.html -=group_props [{name,ext_info},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.000034s -=case ssh_protocol_SUITE:no_ext_info_s1 -=logfile ssh_protocol_suite.no_ext_info_s1.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.055900s -=case ssh_protocol_SUITE:no_ext_info_s2 -=logfile ssh_protocol_suite.no_ext_info_s2.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.056470s -=case ssh_protocol_SUITE:ext_info_s -=logfile ssh_protocol_suite.ext_info_s.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.015863s -=case ssh_protocol_SUITE:ext_info_c -=logfile ssh_protocol_suite.ext_info_c.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.016451s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.76034.html -=group_props [{name,ext_info},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.000033s -=group_time 0.339s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.76066.html -=group_props [{name,preferred_algorithms},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.000031s -=case ssh_protocol_SUITE:preferred_algorithms -=logfile ssh_protocol_suite.preferred_algorithms.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.000345s -=case ssh_protocol_SUITE:modify_append -=logfile ssh_protocol_suite.modify_append.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.004226s -=case ssh_protocol_SUITE:modify_prepend -=logfile ssh_protocol_suite.modify_prepend.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.004494s -=case ssh_protocol_SUITE:modify_rm -=logfile ssh_protocol_suite.modify_rm.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.004497s -=case ssh_protocol_SUITE:modify_combo -=logfile ssh_protocol_suite.modify_combo.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.004356s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.67491.html -=group_props [{name,preferred_algorithms},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.000034s -=group_time 0.264s -=case ct_framework:init_per_group -=logfile ct_framework.init_per_group.67523.html -=group_props [{name,client_close_early},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:38:51 -=result ok -=elapsed 0.000038s -=case ssh_protocol_SUITE:client_close_after_hello -=logfile ssh_protocol_suite.client_close_after_hello.html -=started 2025-01-09 11:38:51 -=ended 2025-01-09 11:39:21 -=result ok -=elapsed 30.203288s -=case ct_framework:end_per_group -=logfile ct_framework.end_per_group.10309.html -=group_props [{name,client_close_early},{suite,ssh_protocol_SUITE}] -=started 2025-01-09 11:39:21 -=ended 2025-01-09 11:39:21 -=result ok -=elapsed 0.000043s -=group_time 30.270s -=case ssh_protocol_SUITE:end_per_suite -=logfile ssh_protocol_suite.end_per_suite.html -=started 2025-01-09 11:39:21 -=ended 2025-01-09 11:39:21 -=result ok -=elapsed 0.002157s -=group_time 36.357s -=case ssh_pubkey_SUITE:init_per_suite -=logfile ssh_pubkey_suite.init_per_suite.html -=started 2025-01-09 11:39:21 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.000471s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.html -=group_props [{name,old_format}] -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.000002s -=case ssh_pubkey_SUITE:check_dsa_disabled -=logfile ssh_pubkey_suite.check_dsa_disabled.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008211s -=case ssh_pubkey_SUITE:check_rsa_sha1_disabled -=logfile ssh_pubkey_suite.check_rsa_sha1_disabled.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.007287s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.009393s -=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.009914s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008958s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.009052s -=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.009096s -=case ssh_pubkey_SUITE:connect_dsa_to_dsa -=logfile ssh_pubkey_suite.connect_dsa_to_dsa.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.007747s -=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.007899s -=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008325s -=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.007695s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008290s -=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008156s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008201s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008433s -=case ssh_pubkey_SUITE:connect_dsa_to_ed448 -=logfile ssh_pubkey_suite.connect_dsa_to_ed448.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008398s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008515s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.009394s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.77474.html -=group_props [{name,passphrase}] -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.000005s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.29988.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.011308s -=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.77538.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008837s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.68291.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008629s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.68355.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008412s -=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.68419.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.009217s -=case ssh_pubkey_SUITE:connect_dsa_to_dsa -=logfile ssh_pubkey_suite.connect_dsa_to_dsa.77698.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.007421s -=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.68515.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.007530s -=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.30020.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008944s -=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.77826.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.008051s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.77890.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:22 -=result ok -=elapsed 0.007921s -=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.68611.html -=started 2025-01-09 11:39:22 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008142s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.68643.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007815s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.30180.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008488s -=case ssh_pubkey_SUITE:connect_dsa_to_ed448 -=logfile ssh_pubkey_suite.connect_dsa_to_ed448.30244.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008015s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.30308.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008085s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.30340.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.009991s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.html -=group_props [{name,passphrase}] -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.000000s -=group_time 0.552s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.30372.html -=group_props [{name,old_format}] -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.000000s -=group_time 1.192s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.30404.html -=group_props [{name,new_format}] -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.000002s -=case ssh_pubkey_SUITE:connect_ed25519_to_dsa -=logfile ssh_pubkey_suite.connect_ed25519_to_dsa.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007605s -=case ssh_pubkey_SUITE:connect_ed25519_to_ecdsa -=logfile ssh_pubkey_suite.connect_ed25519_to_ecdsa.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007646s -=case ssh_pubkey_SUITE:connect_ed25519_to_ed448 -=logfile ssh_pubkey_suite.connect_ed25519_to_ed448.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008844s -=case ssh_pubkey_SUITE:connect_ed25519_to_ed25519 -=logfile ssh_pubkey_suite.connect_ed25519_to_ed25519.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007507s -=case ssh_pubkey_SUITE:connect_ed25519_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.010051s -=case ssh_pubkey_SUITE:connect_ed448_to_dsa -=logfile ssh_pubkey_suite.connect_ed448_to_dsa.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008243s -=case ssh_pubkey_SUITE:connect_ed448_to_ecdsa -=logfile ssh_pubkey_suite.connect_ed448_to_ecdsa.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008223s -=case ssh_pubkey_SUITE:connect_ed448_to_ed25519 -=logfile ssh_pubkey_suite.connect_ed448_to_ed25519.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008181s -=case ssh_pubkey_SUITE:connect_ed448_to_ed448 -=logfile ssh_pubkey_suite.connect_ed448_to_ed448.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.008991s -=case ssh_pubkey_SUITE:connect_ed448_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ed448_to_rsa_sha2.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.010895s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.78370.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.012595s -=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.69027.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.010203s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.69091.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.010654s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.69155.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.010128s -=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.69219.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.010022s -=case ssh_pubkey_SUITE:connect_dsa_to_dsa -=logfile ssh_pubkey_suite.connect_dsa_to_dsa.69283.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007840s -=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.69347.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007090s -=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.78466.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.009572s -=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.69443.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007566s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.69507.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007369s -=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.78594.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007937s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.78690.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:23 -=result ok -=elapsed 0.007397s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.69603.html -=started 2025-01-09 11:39:23 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.011247s -=case ssh_pubkey_SUITE:connect_dsa_to_ed448 -=logfile ssh_pubkey_suite.connect_dsa_to_ed448.78754.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.008418s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.69667.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.008467s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.69699.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.011705s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.69763.html -=group_props [{name,new_format}] -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.000000s -=group_time 0.890s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.69795.html -=group_props [{name,option_space}] -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.000001s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.69827.html -=group_props [{name,new_format}] -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.000002s -=case ssh_pubkey_SUITE:connect_ed25519_to_dsa -=logfile ssh_pubkey_suite.connect_ed25519_to_dsa.69859.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.008372s -=case ssh_pubkey_SUITE:connect_ed25519_to_ecdsa -=logfile ssh_pubkey_suite.connect_ed25519_to_ecdsa.30852.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.007380s -=case ssh_pubkey_SUITE:connect_ed25519_to_ed448 -=logfile ssh_pubkey_suite.connect_ed25519_to_ed448.30884.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.009363s -=case ssh_pubkey_SUITE:connect_ed25519_to_ed25519 -=logfile ssh_pubkey_suite.connect_ed25519_to_ed25519.30948.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.007781s -=case ssh_pubkey_SUITE:connect_ed25519_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.69987.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.010700s -=case ssh_pubkey_SUITE:connect_ed448_to_dsa -=logfile ssh_pubkey_suite.connect_ed448_to_dsa.70051.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.009203s -=case ssh_pubkey_SUITE:connect_ed448_to_ecdsa -=logfile ssh_pubkey_suite.connect_ed448_to_ecdsa.78978.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.007900s -=case ssh_pubkey_SUITE:connect_ed448_to_ed25519 -=logfile ssh_pubkey_suite.connect_ed448_to_ed25519.31076.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.008526s -=case ssh_pubkey_SUITE:connect_ed448_to_ed448 -=logfile ssh_pubkey_suite.connect_ed448_to_ed448.70179.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.009332s -=case ssh_pubkey_SUITE:connect_ed448_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ed448_to_rsa_sha2.70275.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.010847s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.31140.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.013189s -=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.70339.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.010667s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.70371.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.010615s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.79138.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.010926s -=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.31300.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.011078s -=case ssh_pubkey_SUITE:connect_dsa_to_dsa -=logfile ssh_pubkey_suite.connect_dsa_to_dsa.70435.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.008189s -=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.70467.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.007840s -=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 -=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.31428.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.010105s -=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.79298.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.008115s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa -=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.79362.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.008193s -=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.31460.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.007509s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.70659.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.007711s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.79458.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:24 -=result ok -=elapsed 0.010689s -=case ssh_pubkey_SUITE:connect_dsa_to_ed448 -=logfile ssh_pubkey_suite.connect_dsa_to_ed448.70723.html -=started 2025-01-09 11:39:24 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.008336s -=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 -=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.31556.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.008722s -=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 -=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.70787.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.011122s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.79618.html -=group_props [{name,new_format}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000000s -=group_time 0.906s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.79650.html -=group_props [{name,option_space}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000000s -=group_time 0.953s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.79682.html -=group_props [{name,ssh_hostkey_fingerprint}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000000s -=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_md5_implicit -=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_md5_implicit.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000068s -=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_md5 -=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_md5.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000048s -=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha -=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000029s -=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha256 -=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha256.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000037s -=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha384 -=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha384.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000040s -=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha512 -=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha512.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000034s -=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_list -=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_list.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000044s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.79714.html -=group_props [{name,ssh_hostkey_fingerprint}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000000s -=group_time 0.186s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.79746.html -=group_props [{name,ssh_public_key_decode_encode}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000003s -=case ssh_pubkey_SUITE:ssh_rsa_public_key -=logfile ssh_pubkey_suite.ssh_rsa_public_key.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000250s -=case ssh_pubkey_SUITE:ssh_dsa_public_key -=logfile ssh_pubkey_suite.ssh_dsa_public_key.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000226s -=case ssh_pubkey_SUITE:ssh_ecdsa_public_key -=logfile ssh_pubkey_suite.ssh_ecdsa_public_key.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000180s -=case ssh_pubkey_SUITE:ssh_rfc4716_rsa_comment -=logfile ssh_pubkey_suite.ssh_rfc4716_rsa_comment.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000076s -=case ssh_pubkey_SUITE:ssh_rfc4716_dsa_comment -=logfile ssh_pubkey_suite.ssh_rfc4716_dsa_comment.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000114s -=case ssh_pubkey_SUITE:ssh_rfc4716_rsa_subject -=logfile ssh_pubkey_suite.ssh_rfc4716_rsa_subject.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000101s -=case ssh_pubkey_SUITE:ssh_list_public_key -=logfile ssh_pubkey_suite.ssh_list_public_key.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000893s -=case ssh_pubkey_SUITE:ssh_known_hosts -=logfile ssh_pubkey_suite.ssh_known_hosts.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000147s -=case ssh_pubkey_SUITE:ssh_auth_keys -=logfile ssh_pubkey_suite.ssh_auth_keys.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000347s -=case ssh_pubkey_SUITE:ssh_openssh_key_with_comment -=logfile ssh_pubkey_suite.ssh_openssh_key_with_comment.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000077s -=case ssh_pubkey_SUITE:ssh_openssh_key_long_header -=logfile ssh_pubkey_suite.ssh_openssh_key_long_header.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000078s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.79778.html -=group_props [{name,ssh_public_key_decode_encode}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000000s -=group_time 0.287s -=case ssh_pubkey_SUITE:init_per_group -=logfile ssh_pubkey_suite.init_per_group.79810.html -=group_props [{name,pkcs8}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000001s -=case ssh_pubkey_SUITE:ssh_hostkey_pkcs8 -=logfile ssh_pubkey_suite.ssh_hostkey_pkcs8.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.013933s -=case ssh_pubkey_SUITE:end_per_group -=logfile ssh_pubkey_suite.end_per_group.79842.html -=group_props [{name,pkcs8}] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000000s -=group_time 0.061s -=case ssh_pubkey_SUITE:chk_known_hosts -=logfile ssh_pubkey_suite.chk_known_hosts.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.014405s -=case ssh_pubkey_SUITE:end_per_suite -=logfile ssh_pubkey_suite.end_per_suite.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.001698s -=group_time 3.787s -=case ssh_renegotiate_SUITE:init_per_suite -=logfile ssh_renegotiate_suite.init_per_suite.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.011842s -=case ssh_renegotiate_SUITE:init_per_group -=logfile ssh_renegotiate_suite.init_per_group.html -=group_props [{name,renegotiate},parallel] -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:25 -=result ok -=elapsed 0.000000s -=case ssh_renegotiate_SUITE:rekey0 -=logfile ssh_renegotiate_suite.rekey0.79906.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:40:25 -=result ok -=elapsed 60.089823s -=case ssh_renegotiate_SUITE:rekey1 -=logfile ssh_renegotiate_suite.rekey1.79938.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:40:25 -=result ok -=elapsed 60.075187s -=case ssh_renegotiate_SUITE:rekey2 -=logfile ssh_renegotiate_suite.rekey2.31716.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:40:25 -=result ok -=elapsed 60.085808s -=case ssh_renegotiate_SUITE:rekey3 -=logfile ssh_renegotiate_suite.rekey3.31620.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:40:25 -=result ok -=elapsed 60.080838s -=case ssh_renegotiate_SUITE:rekey4 -=logfile ssh_renegotiate_suite.rekey4.31652.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:40:25 -=result ok -=elapsed 60.071362s -=case ssh_renegotiate_SUITE:rekey_limit_client -=logfile ssh_renegotiate_suite.rekey_limit_client.31684.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 360.102161s -=case ssh_renegotiate_SUITE:rekey_limit_daemon -=logfile ssh_renegotiate_suite.rekey_limit_daemon.31748.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 360.101781s -=case ssh_renegotiate_SUITE:rekey_time_limit_client -=logfile ssh_renegotiate_suite.rekey_time_limit_client.31780.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:42:30 -=result ok -=elapsed 185.092377s -=case ssh_renegotiate_SUITE:rekey_time_limit_daemon -=logfile ssh_renegotiate_suite.rekey_time_limit_daemon.31812.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:42:30 -=result ok -=elapsed 185.089591s -=case ssh_renegotiate_SUITE:norekey_limit_client -=logfile ssh_renegotiate_suite.norekey_limit_client.79970.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:41:25 -=result ok -=elapsed 120.089751s -=case ssh_renegotiate_SUITE:norekey_limit_daemon -=logfile ssh_renegotiate_suite.norekey_limit_daemon.71011.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:41:25 -=result ok -=elapsed 120.093638s -=case ssh_renegotiate_SUITE:renegotiate1 -=logfile ssh_renegotiate_suite.renegotiate1.71043.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:28 -=result ok -=elapsed 2.147008s -=case ssh_renegotiate_SUITE:renegotiate2 -=logfile ssh_renegotiate_suite.renegotiate2.80002.html -=started 2025-01-09 11:39:25 -=ended 2025-01-09 11:39:28 -=result ok -=elapsed 2.157011s -=case ssh_renegotiate_SUITE:end_per_group -=logfile ssh_renegotiate_suite.end_per_group.html -=group_props [{name,renegotiate},parallel] -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.000000s -=group_time 360.165s -=case ssh_renegotiate_SUITE:end_per_suite -=logfile ssh_renegotiate_suite.end_per_suite.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.001827s -=group_time 360.238s -=case ssh_sftp_SUITE:init_per_suite -=logfile ssh_sftp_suite.init_per_suite.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.000652s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.html -=group_props [{name,not_unicode}] -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.002125s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.80130.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.001041s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.80162.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.000010s -=case ssh_sftp_SUITE:open_close_file -=logfile ssh_sftp_suite.open_close_file.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.005681s -=case ssh_sftp_SUITE:open_close_dir -=logfile ssh_sftp_suite.open_close_dir.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.000760s -=case ssh_sftp_SUITE:read_file -=logfile ssh_sftp_suite.read_file.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.002743s -=case ssh_sftp_SUITE:read_dir -=logfile ssh_sftp_suite.read_dir.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.001219s -=case ssh_sftp_SUITE:write_file -=logfile ssh_sftp_suite.write_file.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.001284s -=case ssh_sftp_SUITE:write_file_iolist -=logfile ssh_sftp_suite.write_file_iolist.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.007210s -=case ssh_sftp_SUITE:write_big_file -=logfile ssh_sftp_suite.write_big_file.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.046519s -=case ssh_sftp_SUITE:sftp_read_big_file -=logfile ssh_sftp_suite.sftp_read_big_file.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:26 -=result ok -=elapsed 0.048625s -=case ssh_sftp_SUITE:rename_file -=logfile ssh_sftp_suite.rename_file.html -=started 2025-01-09 11:45:26 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.003177s -=case ssh_sftp_SUITE:mk_rm_dir -=logfile ssh_sftp_suite.mk_rm_dir.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.001332s -=case ssh_sftp_SUITE:remove_file -=logfile ssh_sftp_suite.remove_file.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.002475s -=case ssh_sftp_SUITE:links -=logfile ssh_sftp_suite.links.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.000667s -=case ssh_sftp_SUITE:retrieve_attributes -=logfile ssh_sftp_suite.retrieve_attributes.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.000473s -=case ssh_sftp_SUITE:set_attributes -=logfile ssh_sftp_suite.set_attributes.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.001851s -=case ssh_sftp_SUITE:file_owner_access -=logfile ssh_sftp_suite.file_owner_access.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.002874s -=case ssh_sftp_SUITE:async_read -=logfile ssh_sftp_suite.async_read.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.001028s -=case ssh_sftp_SUITE:async_write -=logfile ssh_sftp_suite.async_write.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.000951s -=case ssh_sftp_SUITE:position -=logfile ssh_sftp_suite.position.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.003268s -=case ssh_sftp_SUITE:pos_read -=logfile ssh_sftp_suite.pos_read.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.002341s -=case ssh_sftp_SUITE:pos_write -=logfile ssh_sftp_suite.pos_write.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:27 -=result ok -=elapsed 0.003603s -=case ssh_sftp_SUITE:start_channel_sock -=logfile ssh_sftp_suite.start_channel_sock.html -=started 2025-01-09 11:45:27 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.429213s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.000016s -=group_time 1.893s -=case ssh_sftp_SUITE:version_option -=logfile ssh_sftp_suite.version_option.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.000841s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.81858.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.021974s -=case ssh_sftp_SUITE:create_empty_tar -=logfile ssh_sftp_suite.create_empty_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.005320s -=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.005160s -=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result skipped: "Unicode test" -=elapsed 0.000000s -=== *** SKIPPED test case 1303 of 1557 *** -=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result skipped: "Unicode test" -=elapsed 0.000001s -=== *** SKIPPED test case 1304 of 1557 *** -=case ssh_sftp_SUITE:files_to_tar -=logfile ssh_sftp_suite.files_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.006147s -=case ssh_sftp_SUITE:big_file_to_tar -=logfile ssh_sftp_suite.big_file_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.022185s -=case ssh_sftp_SUITE:files_chunked_to_tar -=logfile ssh_sftp_suite.files_chunked_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.006785s -=case ssh_sftp_SUITE:directory_to_tar -=logfile ssh_sftp_suite.directory_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.006809s -=case ssh_sftp_SUITE:binaries_to_tar -=logfile ssh_sftp_suite.binaries_to_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.005113s -=case ssh_sftp_SUITE:null_crypto_tar -=logfile ssh_sftp_suite.null_crypto_tar.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.037797s -=case ssh_sftp_SUITE:simple_crypto_tar_small -=logfile ssh_sftp_suite.simple_crypto_tar_small.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:28 -=result ok -=elapsed 0.005176s -=case ssh_sftp_SUITE:simple_crypto_tar_big -=logfile ssh_sftp_suite.simple_crypto_tar_big.html -=started 2025-01-09 11:45:28 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.166583s -=case ssh_sftp_SUITE:read_tar -=logfile ssh_sftp_suite.read_tar.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.047022s -=case ssh_sftp_SUITE:read_null_crypto_tar -=logfile ssh_sftp_suite.read_null_crypto_tar.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.046808s -=case ssh_sftp_SUITE:read_crypto_tar -=logfile ssh_sftp_suite.read_crypto_tar.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.076481s -=case ssh_sftp_SUITE:block_size_1_crypto_tar -=logfile ssh_sftp_suite.block_size_1_crypto_tar.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.052866s -=case ssh_sftp_SUITE:block_size_16_crypto_tar -=logfile ssh_sftp_suite.block_size_16_crypto_tar.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.047682s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.72291.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.000027s -=group_time 1.426s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.72323.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.000017s -=group_time 3.438s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.83010.html -=group_props [{name,openssh_server}] -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.095261s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.72387.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.000012s -=case ssh_sftp_SUITE:open_close_file -=logfile ssh_sftp_suite.open_close_file.83042.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.003100s -=case ssh_sftp_SUITE:open_close_dir -=logfile ssh_sftp_suite.open_close_dir.83138.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:29 -=result ok -=elapsed 0.000599s -=case ssh_sftp_SUITE:read_file -=logfile ssh_sftp_suite.read_file.83234.html -=started 2025-01-09 11:45:29 -=ended 2025-01-09 11:45:30 -=result ok -=elapsed 0.002016s -=case ssh_sftp_SUITE:read_dir -=logfile ssh_sftp_suite.read_dir.83330.html -=started 2025-01-09 11:45:30 -=ended 2025-01-09 11:45:30 -=result ok -=elapsed 0.000972s -=case ssh_sftp_SUITE:write_file -=logfile ssh_sftp_suite.write_file.83426.html -=started 2025-01-09 11:45:30 -=ended 2025-01-09 11:45:30 -=result ok -=elapsed 0.000957s -=case ssh_sftp_SUITE:write_file_iolist -=logfile ssh_sftp_suite.write_file_iolist.83522.html -=started 2025-01-09 11:45:30 -=ended 2025-01-09 11:45:30 -=result ok -=elapsed 0.005309s -=case ssh_sftp_SUITE:write_big_file -=logfile ssh_sftp_suite.write_big_file.83618.html -=started 2025-01-09 11:45:30 -=ended 2025-01-09 11:45:30 -=result ok -=elapsed 0.046776s -=case ssh_sftp_SUITE:sftp_read_big_file -=logfile ssh_sftp_suite.sftp_read_big_file.83714.html -=started 2025-01-09 11:45:30 -=ended 2025-01-09 11:45:30 -=result ok -=elapsed 0.050537s -=case ssh_sftp_SUITE:rename_file -=logfile ssh_sftp_suite.rename_file.83810.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:31 -=result ok -=elapsed 0.002106s -=case ssh_sftp_SUITE:mk_rm_dir -=logfile ssh_sftp_suite.mk_rm_dir.83906.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:31 -=result ok -=elapsed 0.000821s -=case ssh_sftp_SUITE:remove_file -=logfile ssh_sftp_suite.remove_file.84002.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:31 -=result ok -=elapsed 0.002172s -=case ssh_sftp_SUITE:links -=logfile ssh_sftp_suite.links.84098.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:31 -=result skipped: "known bug in openssh" -=elapsed 0.000000s -=== *** SKIPPED test case 1329 of 1557 *** -=case ssh_sftp_SUITE:retrieve_attributes -=logfile ssh_sftp_suite.retrieve_attributes.84162.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:31 -=result ok -=elapsed 0.000337s -=case ssh_sftp_SUITE:set_attributes -=logfile ssh_sftp_suite.set_attributes.84258.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:31 -=result ok -=elapsed 0.000787s -=case ssh_sftp_SUITE:file_owner_access -=logfile ssh_sftp_suite.file_owner_access.84354.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:31 -=result ok -=elapsed 0.001906s -=case ssh_sftp_SUITE:async_read -=logfile ssh_sftp_suite.async_read.84450.html -=started 2025-01-09 11:45:31 -=ended 2025-01-09 11:45:32 -=result ok -=elapsed 0.000608s -=case ssh_sftp_SUITE:async_write -=logfile ssh_sftp_suite.async_write.84546.html -=started 2025-01-09 11:45:32 -=ended 2025-01-09 11:45:32 -=result ok -=elapsed 0.000724s -=case ssh_sftp_SUITE:position -=logfile ssh_sftp_suite.position.84642.html -=started 2025-01-09 11:45:32 -=ended 2025-01-09 11:45:32 -=result ok -=elapsed 0.002113s -=case ssh_sftp_SUITE:pos_read -=logfile ssh_sftp_suite.pos_read.84738.html -=started 2025-01-09 11:45:32 -=ended 2025-01-09 11:45:32 -=result ok -=elapsed 0.001714s -=case ssh_sftp_SUITE:pos_write -=logfile ssh_sftp_suite.pos_write.84834.html -=started 2025-01-09 11:45:32 -=ended 2025-01-09 11:45:32 -=result ok -=elapsed 0.002414s -=case ssh_sftp_SUITE:start_channel_sock -=logfile ssh_sftp_suite.start_channel_sock.84930.html -=started 2025-01-09 11:45:32 -=ended 2025-01-09 11:45:33 -=result ok -=elapsed 0.507120s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.85058.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:33 -=result ok -=elapsed 0.000011s -=group_time 3.423s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.85090.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:33 -=result ok -=elapsed 0.039979s -=case ssh_sftp_SUITE:create_empty_tar -=logfile ssh_sftp_suite.create_empty_tar.85154.html -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:33 -=result ok -=elapsed 0.001006s -=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.85250.html -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:33 -=result ok -=elapsed 0.004252s -=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.85346.html -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:33 -=result skipped: "Unicode test" -=elapsed 0.000001s -=== *** SKIPPED test case 1341 of 1557 *** -=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.85442.html -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:33 -=result skipped: "Unicode test" -=elapsed 0.000001s -=== *** SKIPPED test case 1342 of 1557 *** -=case ssh_sftp_SUITE:files_to_tar -=logfile ssh_sftp_suite.files_to_tar.85538.html -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:33 -=result ok -=elapsed 0.005557s -=case ssh_sftp_SUITE:big_file_to_tar -=logfile ssh_sftp_suite.big_file_to_tar.85634.html -=started 2025-01-09 11:45:33 -=ended 2025-01-09 11:45:34 -=result ok -=elapsed 0.022274s -=case ssh_sftp_SUITE:files_chunked_to_tar -=logfile ssh_sftp_suite.files_chunked_to_tar.85730.html -=started 2025-01-09 11:45:34 -=ended 2025-01-09 11:45:34 -=result ok -=elapsed 0.004982s -=case ssh_sftp_SUITE:directory_to_tar -=logfile ssh_sftp_suite.directory_to_tar.85826.html -=started 2025-01-09 11:45:34 -=ended 2025-01-09 11:45:34 -=result ok -=elapsed 0.005518s -=case ssh_sftp_SUITE:binaries_to_tar -=logfile ssh_sftp_suite.binaries_to_tar.85922.html -=started 2025-01-09 11:45:34 -=ended 2025-01-09 11:45:34 -=result ok -=elapsed 0.003802s -=case ssh_sftp_SUITE:null_crypto_tar -=logfile ssh_sftp_suite.null_crypto_tar.86018.html -=started 2025-01-09 11:45:34 -=ended 2025-01-09 11:45:34 -=result ok -=elapsed 0.036807s -=case ssh_sftp_SUITE:simple_crypto_tar_small -=logfile ssh_sftp_suite.simple_crypto_tar_small.86114.html -=started 2025-01-09 11:45:34 -=ended 2025-01-09 11:45:34 -=result ok -=elapsed 0.004303s -=case ssh_sftp_SUITE:simple_crypto_tar_big -=logfile ssh_sftp_suite.simple_crypto_tar_big.86210.html -=started 2025-01-09 11:45:34 -=ended 2025-01-09 11:45:34 -=result ok -=elapsed 0.178173s -=case ssh_sftp_SUITE:read_tar -=logfile ssh_sftp_suite.read_tar.86306.html -=started 2025-01-09 11:45:34 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.045094s -=case ssh_sftp_SUITE:read_null_crypto_tar -=logfile ssh_sftp_suite.read_null_crypto_tar.86402.html -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.055850s -=case ssh_sftp_SUITE:read_crypto_tar -=logfile ssh_sftp_suite.read_crypto_tar.86498.html -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.086277s -=case ssh_sftp_SUITE:block_size_1_crypto_tar -=logfile ssh_sftp_suite.block_size_1_crypto_tar.86594.html -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.048803s -=case ssh_sftp_SUITE:block_size_16_crypto_tar -=logfile ssh_sftp_suite.block_size_16_crypto_tar.86690.html -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.055552s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.86786.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.000012s -=group_time 2.774s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.86818.html -=group_props [{name,openssh_server}] -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.000011s -=group_time 6.363s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.86850.html -=group_props [{name,big_recvpkt_size}] -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:35 -=result ok -=elapsed 0.000000s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.86882.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:45:35 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.001224s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.86914.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.000010s -=case ssh_sftp_SUITE:open_close_file -=logfile ssh_sftp_suite.open_close_file.86946.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.006100s -=case ssh_sftp_SUITE:open_close_dir -=logfile ssh_sftp_suite.open_close_dir.87074.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.000799s -=case ssh_sftp_SUITE:read_file -=logfile ssh_sftp_suite.read_file.87202.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.002756s -=case ssh_sftp_SUITE:read_dir -=logfile ssh_sftp_suite.read_dir.87330.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.001140s -=case ssh_sftp_SUITE:write_file -=logfile ssh_sftp_suite.write_file.87458.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.001326s -=case ssh_sftp_SUITE:write_file_iolist -=logfile ssh_sftp_suite.write_file_iolist.87586.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.006920s -=case ssh_sftp_SUITE:write_big_file -=logfile ssh_sftp_suite.write_big_file.87714.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.045274s -=case ssh_sftp_SUITE:sftp_read_big_file -=logfile ssh_sftp_suite.sftp_read_big_file.87778.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.050441s -=case ssh_sftp_SUITE:rename_file -=logfile ssh_sftp_suite.rename_file.87906.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.002770s -=case ssh_sftp_SUITE:mk_rm_dir -=logfile ssh_sftp_suite.mk_rm_dir.88034.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:36 -=result ok -=elapsed 0.001118s -=case ssh_sftp_SUITE:remove_file -=logfile ssh_sftp_suite.remove_file.88130.html -=started 2025-01-09 11:45:36 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.002486s -=case ssh_sftp_SUITE:links -=logfile ssh_sftp_suite.links.88226.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.000725s -=case ssh_sftp_SUITE:retrieve_attributes -=logfile ssh_sftp_suite.retrieve_attributes.88322.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.000503s -=case ssh_sftp_SUITE:set_attributes -=logfile ssh_sftp_suite.set_attributes.88450.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.002046s -=case ssh_sftp_SUITE:file_owner_access -=logfile ssh_sftp_suite.file_owner_access.72643.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.003455s -=case ssh_sftp_SUITE:async_read -=logfile ssh_sftp_suite.async_read.72771.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.000972s -=case ssh_sftp_SUITE:async_write -=logfile ssh_sftp_suite.async_write.88610.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.000919s -=case ssh_sftp_SUITE:position -=logfile ssh_sftp_suite.position.88738.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.002986s -=case ssh_sftp_SUITE:pos_read -=logfile ssh_sftp_suite.pos_read.88802.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.002685s -=case ssh_sftp_SUITE:pos_write -=logfile ssh_sftp_suite.pos_write.72899.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.003447s -=case ssh_sftp_SUITE:start_channel_sock -=logfile ssh_sftp_suite.start_channel_sock.72995.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.429187s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.73091.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:37 -=result ok -=elapsed 0.000012s -=group_time 1.914s -=case ssh_sftp_SUITE:version_option -=logfile ssh_sftp_suite.version_option.73123.html -=started 2025-01-09 11:45:37 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.000858s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.73219.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.021298s -=case ssh_sftp_SUITE:create_empty_tar -=logfile ssh_sftp_suite.create_empty_tar.89058.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.001550s -=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.89090.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.005486s -=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.73475.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result skipped: "Unicode test" -=elapsed 0.000000s -=== *** SKIPPED test case 1380 of 1557 *** -=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.73539.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result skipped: "Unicode test" -=elapsed 0.000001s -=== *** SKIPPED test case 1381 of 1557 *** -=case ssh_sftp_SUITE:files_to_tar -=logfile ssh_sftp_suite.files_to_tar.73667.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.006095s -=case ssh_sftp_SUITE:big_file_to_tar -=logfile ssh_sftp_suite.big_file_to_tar.73731.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.018657s -=case ssh_sftp_SUITE:files_chunked_to_tar -=logfile ssh_sftp_suite.files_chunked_to_tar.73795.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.005585s -=case ssh_sftp_SUITE:directory_to_tar -=logfile ssh_sftp_suite.directory_to_tar.73923.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.006205s -=case ssh_sftp_SUITE:binaries_to_tar -=logfile ssh_sftp_suite.binaries_to_tar.74019.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.004914s -=case ssh_sftp_SUITE:null_crypto_tar -=logfile ssh_sftp_suite.null_crypto_tar.74115.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.031503s -=case ssh_sftp_SUITE:simple_crypto_tar_small -=logfile ssh_sftp_suite.simple_crypto_tar_small.89442.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.004902s -=case ssh_sftp_SUITE:simple_crypto_tar_big -=logfile ssh_sftp_suite.simple_crypto_tar_big.74243.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:38 -=result ok -=elapsed 0.179031s -=case ssh_sftp_SUITE:read_tar -=logfile ssh_sftp_suite.read_tar.89634.html -=started 2025-01-09 11:45:38 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.046452s -=case ssh_sftp_SUITE:read_null_crypto_tar -=logfile ssh_sftp_suite.read_null_crypto_tar.74275.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.045548s -=case ssh_sftp_SUITE:read_crypto_tar -=logfile ssh_sftp_suite.read_crypto_tar.74371.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.076784s -=case ssh_sftp_SUITE:block_size_1_crypto_tar -=logfile ssh_sftp_suite.block_size_1_crypto_tar.74467.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.052212s -=case ssh_sftp_SUITE:block_size_16_crypto_tar -=logfile ssh_sftp_suite.block_size_16_crypto_tar.74595.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.046122s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.74723.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.000018s -=group_time 1.419s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.74755.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.000010s -=group_time 3.453s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.74787.html -=group_props [{name,openssh_server}] -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.095674s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.74819.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.000035s -=case ssh_sftp_SUITE:open_close_file -=logfile ssh_sftp_suite.open_close_file.74851.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.002823s -=case ssh_sftp_SUITE:open_close_dir -=logfile ssh_sftp_suite.open_close_dir.74947.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.000547s -=case ssh_sftp_SUITE:read_file -=logfile ssh_sftp_suite.read_file.75011.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:39 -=result ok -=elapsed 0.001883s -=case ssh_sftp_SUITE:read_dir -=logfile ssh_sftp_suite.read_dir.75075.html -=started 2025-01-09 11:45:39 -=ended 2025-01-09 11:45:40 -=result ok -=elapsed 0.000926s -=case ssh_sftp_SUITE:write_file -=logfile ssh_sftp_suite.write_file.75171.html -=started 2025-01-09 11:45:40 -=ended 2025-01-09 11:45:40 -=result ok -=elapsed 0.000971s -=case ssh_sftp_SUITE:write_file_iolist -=logfile ssh_sftp_suite.write_file_iolist.75235.html -=started 2025-01-09 11:45:40 -=ended 2025-01-09 11:45:40 -=result ok -=elapsed 0.004840s -=case ssh_sftp_SUITE:write_big_file -=logfile ssh_sftp_suite.write_big_file.75331.html -=started 2025-01-09 11:45:40 -=ended 2025-01-09 11:45:40 -=result ok -=elapsed 0.046016s -=case ssh_sftp_SUITE:sftp_read_big_file -=logfile ssh_sftp_suite.sftp_read_big_file.89922.html -=started 2025-01-09 11:45:40 -=ended 2025-01-09 11:45:40 -=result ok -=elapsed 0.049570s -=case ssh_sftp_SUITE:rename_file -=logfile ssh_sftp_suite.rename_file.90018.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result ok -=elapsed 0.002111s -=case ssh_sftp_SUITE:mk_rm_dir -=logfile ssh_sftp_suite.mk_rm_dir.90114.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result ok -=elapsed 0.000844s -=case ssh_sftp_SUITE:remove_file -=logfile ssh_sftp_suite.remove_file.90210.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result ok -=elapsed 0.002103s -=case ssh_sftp_SUITE:links -=logfile ssh_sftp_suite.links.90306.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result skipped: "known bug in openssh" -=elapsed 0.000000s -=== *** SKIPPED test case 1406 of 1557 *** -=case ssh_sftp_SUITE:retrieve_attributes -=logfile ssh_sftp_suite.retrieve_attributes.90370.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result ok -=elapsed 0.000340s -=case ssh_sftp_SUITE:set_attributes -=logfile ssh_sftp_suite.set_attributes.90466.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result ok -=elapsed 0.000741s -=case ssh_sftp_SUITE:file_owner_access -=logfile ssh_sftp_suite.file_owner_access.90562.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result ok -=elapsed 0.001892s -=case ssh_sftp_SUITE:async_read -=logfile ssh_sftp_suite.async_read.90658.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:41 -=result ok -=elapsed 0.000616s -=case ssh_sftp_SUITE:async_write -=logfile ssh_sftp_suite.async_write.90754.html -=started 2025-01-09 11:45:41 -=ended 2025-01-09 11:45:42 -=result ok -=elapsed 0.000631s -=case ssh_sftp_SUITE:position -=logfile ssh_sftp_suite.position.90850.html -=started 2025-01-09 11:45:42 -=ended 2025-01-09 11:45:42 -=result ok -=elapsed 0.002073s -=case ssh_sftp_SUITE:pos_read -=logfile ssh_sftp_suite.pos_read.90946.html -=started 2025-01-09 11:45:42 -=ended 2025-01-09 11:45:42 -=result ok -=elapsed 0.001752s -=case ssh_sftp_SUITE:pos_write -=logfile ssh_sftp_suite.pos_write.91042.html -=started 2025-01-09 11:45:42 -=ended 2025-01-09 11:45:42 -=result ok -=elapsed 0.002435s -=case ssh_sftp_SUITE:start_channel_sock -=logfile ssh_sftp_suite.start_channel_sock.91138.html -=started 2025-01-09 11:45:42 -=ended 2025-01-09 11:45:43 -=result ok -=elapsed 0.507143s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.91266.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result ok -=elapsed 0.000012s -=group_time 3.436s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.91298.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result ok -=elapsed 0.040296s -=case ssh_sftp_SUITE:create_empty_tar -=logfile ssh_sftp_suite.create_empty_tar.91362.html -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result ok -=elapsed 0.001137s -=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.91458.html -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result ok -=elapsed 0.004163s -=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.91554.html -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result skipped: "Unicode test" -=elapsed 0.000001s -=== *** SKIPPED test case 1418 of 1557 *** -=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.91650.html -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result skipped: "Unicode test" -=elapsed 0.000001s -=== *** SKIPPED test case 1419 of 1557 *** -=case ssh_sftp_SUITE:files_to_tar -=logfile ssh_sftp_suite.files_to_tar.91746.html -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result ok -=elapsed 0.005506s -=case ssh_sftp_SUITE:big_file_to_tar -=logfile ssh_sftp_suite.big_file_to_tar.91842.html -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:43 -=result ok -=elapsed 0.021876s -=case ssh_sftp_SUITE:files_chunked_to_tar -=logfile ssh_sftp_suite.files_chunked_to_tar.91938.html -=started 2025-01-09 11:45:43 -=ended 2025-01-09 11:45:44 -=result ok -=elapsed 0.005054s -=case ssh_sftp_SUITE:directory_to_tar -=logfile ssh_sftp_suite.directory_to_tar.92034.html -=started 2025-01-09 11:45:44 -=ended 2025-01-09 11:45:44 -=result ok -=elapsed 0.005996s -=case ssh_sftp_SUITE:binaries_to_tar -=logfile ssh_sftp_suite.binaries_to_tar.92130.html -=started 2025-01-09 11:45:44 -=ended 2025-01-09 11:45:44 -=result ok -=elapsed 0.003768s -=case ssh_sftp_SUITE:null_crypto_tar -=logfile ssh_sftp_suite.null_crypto_tar.92226.html -=started 2025-01-09 11:45:44 -=ended 2025-01-09 11:45:44 -=result ok -=elapsed 0.038113s -=case ssh_sftp_SUITE:simple_crypto_tar_small -=logfile ssh_sftp_suite.simple_crypto_tar_small.92322.html -=started 2025-01-09 11:45:44 -=ended 2025-01-09 11:45:44 -=result ok -=elapsed 0.004982s -=case ssh_sftp_SUITE:simple_crypto_tar_big -=logfile ssh_sftp_suite.simple_crypto_tar_big.92418.html -=started 2025-01-09 11:45:44 -=ended 2025-01-09 11:45:44 -=result ok -=elapsed 0.185418s -=case ssh_sftp_SUITE:read_tar -=logfile ssh_sftp_suite.read_tar.92514.html -=started 2025-01-09 11:45:44 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.047568s -=case ssh_sftp_SUITE:read_null_crypto_tar -=logfile ssh_sftp_suite.read_null_crypto_tar.92610.html -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.049650s -=case ssh_sftp_SUITE:read_crypto_tar -=logfile ssh_sftp_suite.read_crypto_tar.92706.html -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.089509s -=case ssh_sftp_SUITE:block_size_1_crypto_tar -=logfile ssh_sftp_suite.block_size_1_crypto_tar.92802.html -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.051404s -=case ssh_sftp_SUITE:block_size_16_crypto_tar -=logfile ssh_sftp_suite.block_size_16_crypto_tar.92898.html -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.049986s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.92994.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.000013s -=group_time 2.792s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.93026.html -=group_props [{name,openssh_server}] -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.000011s -=group_time 6.394s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.93058.html -=group_props [{name,big_recvpkt_size}] -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.000010s -=group_time 9.917s -=case ssh_sftp_SUITE:sftp_nonexistent_subsystem -=logfile ssh_sftp_suite.sftp_nonexistent_subsystem.html -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.023081s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.93154.html -=group_props [{name,not_unicode}] -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:45 -=result ok -=elapsed 0.000012s -=group_time 19.865s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.93186.html -=group_props [{name,unicode}] -=started 2025-01-09 11:45:45 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.002592s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.93218.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.001312s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.93250.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.000015s -=case ssh_sftp_SUITE:open_close_file -=logfile ssh_sftp_suite.open_close_file.93282.html -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.005388s -=case ssh_sftp_SUITE:open_close_dir -=logfile ssh_sftp_suite.open_close_dir.93410.html -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.000728s -=case ssh_sftp_SUITE:read_file -=logfile ssh_sftp_suite.read_file.93538.html -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.002362s -=case ssh_sftp_SUITE:read_dir -=logfile ssh_sftp_suite.read_dir.93602.html -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.001388s -=case ssh_sftp_SUITE:write_file -=logfile ssh_sftp_suite.write_file.93730.html -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.001374s -=case ssh_sftp_SUITE:write_file_iolist -=logfile ssh_sftp_suite.write_file_iolist.93858.html -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.006939s -=case ssh_sftp_SUITE:write_big_file -=logfile ssh_sftp_suite.write_big_file.93986.html -=started 2025-01-09 11:45:46 -=ended 2025-01-09 11:45:46 -=result ok -=elapsed 0.047840s -=case ssh_sftp_SUITE:sftp_read_big_file -=logfile ssh_sftp_suite.sftp_read_big_file.94050.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:47 -=result ok -=elapsed 0.053202s -=case ssh_sftp_SUITE:rename_file -=logfile ssh_sftp_suite.rename_file.94178.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:47 -=result ok -=elapsed 0.003573s -=case ssh_sftp_SUITE:mk_rm_dir -=logfile ssh_sftp_suite.mk_rm_dir.94306.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:47 -=result ok -=elapsed 0.001270s -=case ssh_sftp_SUITE:remove_file -=logfile ssh_sftp_suite.remove_file.94434.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:47 -=result ok -=elapsed 0.003138s -=case ssh_sftp_SUITE:links -=logfile ssh_sftp_suite.links.94562.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:47 -=result ok -=elapsed 0.000602s -=case ssh_sftp_SUITE:retrieve_attributes -=logfile ssh_sftp_suite.retrieve_attributes.94658.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:47 -=result ok -=elapsed 0.000437s -=case ssh_sftp_SUITE:set_attributes -=logfile ssh_sftp_suite.set_attributes.75651.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:47 -=result ok -=elapsed 0.002247s -=case ssh_sftp_SUITE:file_owner_access -=logfile ssh_sftp_suite.file_owner_access.75747.html -=started 2025-01-09 11:45:47 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.002922s -=case ssh_sftp_SUITE:async_read -=logfile ssh_sftp_suite.async_read.75843.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.001013s -=case ssh_sftp_SUITE:async_write -=logfile ssh_sftp_suite.async_write.94786.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.000942s -=case ssh_sftp_SUITE:position -=logfile ssh_sftp_suite.position.94914.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.002960s -=case ssh_sftp_SUITE:pos_read -=logfile ssh_sftp_suite.pos_read.95042.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.002281s -=case ssh_sftp_SUITE:pos_write -=logfile ssh_sftp_suite.pos_write.95170.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.003657s -=case ssh_sftp_SUITE:start_channel_sock -=logfile ssh_sftp_suite.start_channel_sock.95298.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.429956s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.95458.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.000022s -=group_time 2.733s -=case ssh_sftp_SUITE:version_option -=logfile ssh_sftp_suite.version_option.95490.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.000729s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.95618.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.021485s -=case ssh_sftp_SUITE:create_empty_tar -=logfile ssh_sftp_suite.create_empty_tar.95682.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.001586s -=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.95810.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:48 -=result ok -=elapsed 0.004970s -=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.95874.html -=started 2025-01-09 11:45:48 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.005289s -=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.96002.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.005725s -=case ssh_sftp_SUITE:files_to_tar -=logfile ssh_sftp_suite.files_to_tar.96098.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.007231s -=case ssh_sftp_SUITE:big_file_to_tar -=logfile ssh_sftp_suite.big_file_to_tar.96130.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.017181s -=case ssh_sftp_SUITE:files_chunked_to_tar -=logfile ssh_sftp_suite.files_chunked_to_tar.76323.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.006496s -=case ssh_sftp_SUITE:directory_to_tar -=logfile ssh_sftp_suite.directory_to_tar.76451.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.006409s -=case ssh_sftp_SUITE:binaries_to_tar -=logfile ssh_sftp_suite.binaries_to_tar.76579.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.004623s -=case ssh_sftp_SUITE:null_crypto_tar -=logfile ssh_sftp_suite.null_crypto_tar.76675.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.031530s -=case ssh_sftp_SUITE:simple_crypto_tar_small -=logfile ssh_sftp_suite.simple_crypto_tar_small.96258.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.005851s -=case ssh_sftp_SUITE:simple_crypto_tar_big -=logfile ssh_sftp_suite.simple_crypto_tar_big.76803.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.172563s -=case ssh_sftp_SUITE:read_tar -=logfile ssh_sftp_suite.read_tar.76899.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.044745s -=case ssh_sftp_SUITE:read_null_crypto_tar -=logfile ssh_sftp_suite.read_null_crypto_tar.32164.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:49 -=result ok -=elapsed 0.046873s -=case ssh_sftp_SUITE:read_crypto_tar -=logfile ssh_sftp_suite.read_crypto_tar.96354.html -=started 2025-01-09 11:45:49 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.075272s -=case ssh_sftp_SUITE:block_size_1_crypto_tar -=logfile ssh_sftp_suite.block_size_1_crypto_tar.96450.html -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.046274s -=case ssh_sftp_SUITE:block_size_16_crypto_tar -=logfile ssh_sftp_suite.block_size_16_crypto_tar.77219.html -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.046040s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.77283.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.000015s -=group_time 1.417s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.77315.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.000010s -=group_time 4.272s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.77347.html -=group_props [{name,openssh_server}] -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.095572s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.96546.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.000039s -=case ssh_sftp_SUITE:open_close_file -=logfile ssh_sftp_suite.open_close_file.77411.html -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.002938s -=case ssh_sftp_SUITE:open_close_dir -=logfile ssh_sftp_suite.open_close_dir.77507.html -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.000567s -=case ssh_sftp_SUITE:read_file -=logfile ssh_sftp_suite.read_file.77603.html -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.001870s -=case ssh_sftp_SUITE:read_dir -=logfile ssh_sftp_suite.read_dir.77699.html -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:50 -=result ok -=elapsed 0.000997s -=case ssh_sftp_SUITE:write_file -=logfile ssh_sftp_suite.write_file.96578.html -=started 2025-01-09 11:45:50 -=ended 2025-01-09 11:45:51 -=result ok -=elapsed 0.000840s -=case ssh_sftp_SUITE:write_file_iolist -=logfile ssh_sftp_suite.write_file_iolist.96674.html -=started 2025-01-09 11:45:51 -=ended 2025-01-09 11:45:51 -=result ok -=elapsed 0.005514s -=case ssh_sftp_SUITE:write_big_file -=logfile ssh_sftp_suite.write_big_file.96770.html -=started 2025-01-09 11:45:51 -=ended 2025-01-09 11:45:51 -=result ok -=elapsed 0.048813s -=case ssh_sftp_SUITE:sftp_read_big_file -=logfile ssh_sftp_suite.sftp_read_big_file.96866.html -=started 2025-01-09 11:45:51 -=ended 2025-01-09 11:45:52 -=result ok -=elapsed 0.053290s -=case ssh_sftp_SUITE:rename_file -=logfile ssh_sftp_suite.rename_file.96962.html -=started 2025-01-09 11:45:52 -=ended 2025-01-09 11:45:52 -=result ok -=elapsed 0.002412s -=case ssh_sftp_SUITE:mk_rm_dir -=logfile ssh_sftp_suite.mk_rm_dir.77795.html -=started 2025-01-09 11:45:52 -=ended 2025-01-09 11:45:52 -=result ok -=elapsed 0.000775s -=case ssh_sftp_SUITE:remove_file -=logfile ssh_sftp_suite.remove_file.77891.html -=started 2025-01-09 11:45:52 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.001934s -=case ssh_sftp_SUITE:links -=logfile ssh_sftp_suite.links.77955.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result skipped: "known bug in openssh" -=elapsed 0.000000s -=== *** SKIPPED test case 1484 of 1557 *** -=case ssh_sftp_SUITE:retrieve_attributes -=logfile ssh_sftp_suite.retrieve_attributes.77987.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.000347s -=case ssh_sftp_SUITE:set_attributes -=logfile ssh_sftp_suite.set_attributes.97186.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.000756s -=case ssh_sftp_SUITE:file_owner_access -=logfile ssh_sftp_suite.file_owner_access.97282.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.001996s -=case ssh_sftp_SUITE:async_read -=logfile ssh_sftp_suite.async_read.97378.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.000601s -=case ssh_sftp_SUITE:async_write -=logfile ssh_sftp_suite.async_write.97474.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.000768s -=case ssh_sftp_SUITE:position -=logfile ssh_sftp_suite.position.97570.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.002029s -=case ssh_sftp_SUITE:pos_read -=logfile ssh_sftp_suite.pos_read.97666.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:53 -=result ok -=elapsed 0.001702s -=case ssh_sftp_SUITE:pos_write -=logfile ssh_sftp_suite.pos_write.97762.html -=started 2025-01-09 11:45:53 -=ended 2025-01-09 11:45:54 -=result ok -=elapsed 0.002320s -=case ssh_sftp_SUITE:start_channel_sock -=logfile ssh_sftp_suite.start_channel_sock.97858.html -=started 2025-01-09 11:45:54 -=ended 2025-01-09 11:45:54 -=result ok -=elapsed 0.508802s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.97986.html -=group_props [{name,write_read_tests}] -=started 2025-01-09 11:45:54 -=ended 2025-01-09 11:45:54 -=result ok -=elapsed 0.000016s -=group_time 4.251s -=case ssh_sftp_SUITE:init_per_group -=logfile ssh_sftp_suite.init_per_group.98018.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:54 -=ended 2025-01-09 11:45:54 -=result ok -=elapsed 0.039421s -=case ssh_sftp_SUITE:create_empty_tar -=logfile ssh_sftp_suite.create_empty_tar.98082.html -=started 2025-01-09 11:45:54 -=ended 2025-01-09 11:45:54 -=result ok -=elapsed 0.001051s -=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.98178.html -=started 2025-01-09 11:45:54 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.004288s -=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar -=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.98274.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.004357s -=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar -=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.98370.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.004681s -=case ssh_sftp_SUITE:files_to_tar -=logfile ssh_sftp_suite.files_to_tar.98466.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.006099s -=case ssh_sftp_SUITE:big_file_to_tar -=logfile ssh_sftp_suite.big_file_to_tar.98562.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.021683s -=case ssh_sftp_SUITE:files_chunked_to_tar -=logfile ssh_sftp_suite.files_chunked_to_tar.98658.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.005189s -=case ssh_sftp_SUITE:directory_to_tar -=logfile ssh_sftp_suite.directory_to_tar.98754.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.005569s -=case ssh_sftp_SUITE:binaries_to_tar -=logfile ssh_sftp_suite.binaries_to_tar.98850.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:55 -=result ok -=elapsed 0.003702s -=case ssh_sftp_SUITE:null_crypto_tar -=logfile ssh_sftp_suite.null_crypto_tar.98946.html -=started 2025-01-09 11:45:55 -=ended 2025-01-09 11:45:56 -=result ok -=elapsed 0.034958s -=case ssh_sftp_SUITE:simple_crypto_tar_small -=logfile ssh_sftp_suite.simple_crypto_tar_small.99042.html -=started 2025-01-09 11:45:56 -=ended 2025-01-09 11:45:56 -=result ok -=elapsed 0.004723s -=case ssh_sftp_SUITE:simple_crypto_tar_big -=logfile ssh_sftp_suite.simple_crypto_tar_big.99138.html -=started 2025-01-09 11:45:56 -=ended 2025-01-09 11:45:56 -=result ok -=elapsed 0.188451s -=case ssh_sftp_SUITE:read_tar -=logfile ssh_sftp_suite.read_tar.99234.html -=started 2025-01-09 11:45:56 -=ended 2025-01-09 11:45:56 -=result ok -=elapsed 0.046249s -=case ssh_sftp_SUITE:read_null_crypto_tar -=logfile ssh_sftp_suite.read_null_crypto_tar.99330.html -=started 2025-01-09 11:45:56 -=ended 2025-01-09 11:45:56 -=result ok -=elapsed 0.048668s -=case ssh_sftp_SUITE:read_crypto_tar -=logfile ssh_sftp_suite.read_crypto_tar.99426.html -=started 2025-01-09 11:45:56 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.082608s -=case ssh_sftp_SUITE:block_size_1_crypto_tar -=logfile ssh_sftp_suite.block_size_1_crypto_tar.99522.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.048826s -=case ssh_sftp_SUITE:block_size_16_crypto_tar -=logfile ssh_sftp_suite.block_size_16_crypto_tar.99618.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.049651s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.99714.html -=group_props [{name,remote_tar}] -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.000015s -=group_time 2.786s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.99746.html -=group_props [{name,openssh_server}] -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.000013s -=group_time 7.206s -=case ssh_sftp_SUITE:sftp_nonexistent_subsystem -=logfile ssh_sftp_suite.sftp_nonexistent_subsystem.99778.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.021947s -=case ssh_sftp_SUITE:end_per_group -=logfile ssh_sftp_suite.end_per_group.99874.html -=group_props [{name,unicode}] -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.000015s -=group_time 11.601s -=case ssh_sftp_SUITE:end_per_suite -=logfile ssh_sftp_suite.end_per_suite.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.004410s -=group_time 31.555s -=case ssh_sftpd_SUITE:init_per_suite -=logfile ssh_sftpd_suite.init_per_suite.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.001526s -=case ssh_sftpd_SUITE:open_close_file -=logfile ssh_sftpd_suite.open_close_file.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.001122s -=case ssh_sftpd_SUITE:open_close_dir -=logfile ssh_sftpd_suite.open_close_dir.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.000732s -=case ssh_sftpd_SUITE:read_file -=logfile ssh_sftpd_suite.read_file.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.000828s -=case ssh_sftpd_SUITE:read_dir -=logfile ssh_sftpd_suite.read_dir.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.027650s -=case ssh_sftpd_SUITE:write_file -=logfile ssh_sftpd_suite.write_file.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.000636s -=case ssh_sftpd_SUITE:rename_file -=logfile ssh_sftpd_suite.rename_file.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.001509s -=case ssh_sftpd_SUITE:mk_rm_dir -=logfile ssh_sftpd_suite.mk_rm_dir.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.001166s -=case ssh_sftpd_SUITE:remove_file -=logfile ssh_sftpd_suite.remove_file.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:57 -=result ok -=elapsed 0.000681s -=case ssh_sftpd_SUITE:real_path -=logfile ssh_sftpd_suite.real_path.html -=started 2025-01-09 11:45:57 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000610s -=case ssh_sftpd_SUITE:retrieve_attributes -=logfile ssh_sftpd_suite.retrieve_attributes.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.001301s -=case ssh_sftpd_SUITE:set_attributes -=logfile ssh_sftpd_suite.set_attributes.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.001394s -=case ssh_sftpd_SUITE:links -=logfile ssh_sftpd_suite.links.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000607s -=case ssh_sftpd_SUITE:ver3_rename -=logfile ssh_sftpd_suite.ver3_rename.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000356s -=case ssh_sftpd_SUITE:ver3_open_flags -=logfile ssh_sftpd_suite.ver3_open_flags.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.001719s -=case ssh_sftpd_SUITE:relpath -=logfile ssh_sftpd_suite.relpath.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000507s -=case ssh_sftpd_SUITE:sshd_read_file -=logfile ssh_sftpd_suite.sshd_read_file.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000686s -=case ssh_sftpd_SUITE:ver6_basic -=logfile ssh_sftpd_suite.ver6_basic.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000267s -=case ssh_sftpd_SUITE:access_outside_root -=logfile ssh_sftpd_suite.access_outside_root.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000822s -=case ssh_sftpd_SUITE:root_with_cwd -=logfile ssh_sftpd_suite.root_with_cwd.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.001480s -=case ssh_sftpd_SUITE:relative_path -=logfile ssh_sftpd_suite.relative_path.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000512s -=case ssh_sftpd_SUITE:open_file_dir_v5 -=logfile ssh_sftpd_suite.open_file_dir_v5.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000509s -=case ssh_sftpd_SUITE:open_file_dir_v6 -=logfile ssh_sftpd_suite.open_file_dir_v6.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000490s -=case ssh_sftpd_SUITE:end_per_suite -=logfile ssh_sftpd_suite.end_per_suite.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.000076s -=group_time 0.809s -=case ssh_sftpd_erlclient_SUITE:init_per_suite -=logfile ssh_sftpd_erlclient_suite.init_per_suite.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.013831s -=case ssh_sftpd_erlclient_SUITE:close_file -=logfile ssh_sftpd_erlclient_suite.close_file.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:45:58 -=result ok -=elapsed 0.001340s -=case ssh_sftpd_erlclient_SUITE:quit -=logfile ssh_sftpd_erlclient_suite.quit.html -=started 2025-01-09 11:45:58 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 5.011375s -=case ssh_sftpd_erlclient_SUITE:file_cb -=logfile ssh_sftpd_erlclient_suite.file_cb.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 0.003778s -=case ssh_sftpd_erlclient_SUITE:root_dir -=logfile ssh_sftpd_erlclient_suite.root_dir.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 0.003208s -=case ssh_sftpd_erlclient_SUITE:list_dir_limited -=logfile ssh_sftpd_erlclient_suite.list_dir_limited.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 0.003402s -=case ssh_sftpd_erlclient_SUITE:ver6_basic -=logfile ssh_sftpd_erlclient_suite.ver6_basic.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 0.000696s -=case ssh_sftpd_erlclient_SUITE:end_per_suite -=logfile ssh_sftpd_erlclient_suite.end_per_suite.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 0.000000s -=group_time 5.284s -=case ssh_sup_SUITE:init_per_suite -=logfile ssh_sup_suite.init_per_suite.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 0.000194s -=case ssh_sup_SUITE:default_tree -=logfile ssh_sup_suite.default_tree.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:03 -=result ok -=elapsed 0.000019s -=case ssh_sup_SUITE:sshc_subtree -=logfile ssh_sup_suite.sshc_subtree.html -=started 2025-01-09 11:46:03 -=ended 2025-01-09 11:46:04 -=result ok -=elapsed 1.012268s -=case ssh_sup_SUITE:sshd_subtree -=logfile ssh_sup_suite.sshd_subtree.html -=started 2025-01-09 11:46:04 -=ended 2025-01-09 11:46:05 -=result ok -=elapsed 0.507950s -=case ssh_sup_SUITE:sshd_subtree_profile -=logfile ssh_sup_suite.sshd_subtree_profile.html -=started 2025-01-09 11:46:05 -=ended 2025-01-09 11:46:05 -=result ok -=elapsed 0.507214s -=case ssh_sup_SUITE:killed_acceptor_restarts -=logfile ssh_sup_suite.killed_acceptor_restarts.html -=started 2025-01-09 11:46:05 -=ended 2025-01-09 11:46:05 -=result ok -=elapsed 0.012317s -=case ssh_sup_SUITE:shell_channel_tree -=logfile ssh_sup_suite.shell_channel_tree.html -=started 2025-01-09 11:46:05 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 5.007245s -=case ssh_sup_SUITE:end_per_suite -=logfile ssh_sup_suite.end_per_suite.html -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.000000s -=group_time 7.236s -=case ssh_to_openssh_SUITE:init_per_suite -=logfile ssh_to_openssh_suite.init_per_suite.html -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.142980s -=case ssh_to_openssh_SUITE:init_per_group -=logfile ssh_to_openssh_suite.init_per_group.html -=group_props [{name,erlang_client}] -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.009386s -=case ssh_to_openssh_SUITE:tunnel_in_erlclient_erlserver -=logfile ssh_to_openssh_suite.tunnel_in_erlclient_erlserver.html -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.010954s -=case ssh_to_openssh_SUITE:tunnel_out_erlclient_erlserver -=logfile ssh_to_openssh_suite.tunnel_out_erlclient_erlserver.html -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.010093s -=case ssh_to_openssh_SUITE:init_per_group -=logfile ssh_to_openssh_suite.init_per_group.79331.html -=group_props [{name,tunnel_distro_server}] -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.144767s -=case ssh_to_openssh_SUITE:tunnel_in_erlclient_openssh_server -=logfile ssh_to_openssh_suite.tunnel_in_erlclient_openssh_server.html -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.133976s -=case ssh_to_openssh_SUITE:tunnel_out_erlclient_openssh_server -=logfile ssh_to_openssh_suite.tunnel_out_erlclient_openssh_server.html -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.135241s -=case ssh_to_openssh_SUITE:end_per_group -=logfile ssh_to_openssh_suite.end_per_group.html -=group_props [{name,tunnel_distro_server}] -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:11 -=result ok -=elapsed 0.000000s -=group_time 0.488s -=case ssh_to_openssh_SUITE:erlang_shell_client_openssh_server -=logfile ssh_to_openssh_suite.erlang_shell_client_openssh_server.html -=started 2025-01-09 11:46:11 -=ended 2025-01-09 11:46:13 -=result ok -=elapsed 1.594797s -=case ssh_to_openssh_SUITE:eclient_oserver_kex_strict -=logfile ssh_to_openssh_suite.eclient_oserver_kex_strict.html -=started 2025-01-09 11:46:13 -=ended 2025-01-09 11:46:16 -=result ok -=elapsed 2.595484s -=case ssh_to_openssh_SUITE:end_per_group -=logfile ssh_to_openssh_suite.end_per_group.101218.html -=group_props [{name,erlang_client}] -=started 2025-01-09 11:46:16 -=ended 2025-01-09 11:46:16 -=result ok -=elapsed 0.000000s -=group_time 4.859s -=case ssh_to_openssh_SUITE:init_per_group -=logfile ssh_to_openssh_suite.init_per_group.101250.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:46:16 -=ended 2025-01-09 11:46:16 -=result ok -=elapsed 0.000000s -=case ssh_to_openssh_SUITE:init_per_group -=logfile ssh_to_openssh_suite.init_per_group.101282.html -=group_props [{name,tunnel_distro_client}] -=started 2025-01-09 11:46:16 -=ended 2025-01-09 11:46:16 -=result ok -=elapsed 0.144375s -=case ssh_to_openssh_SUITE:tunnel_in_non_erlclient_erlserver -=logfile ssh_to_openssh_suite.tunnel_in_non_erlclient_erlserver.html -=started 2025-01-09 11:46:16 -=ended 2025-01-09 11:46:17 -=result ok -=elapsed 1.004932s -=case ssh_to_openssh_SUITE:tunnel_out_non_erlclient_erlserver -=logfile ssh_to_openssh_suite.tunnel_out_non_erlclient_erlserver.html -=started 2025-01-09 11:46:17 -=ended 2025-01-09 11:46:18 -=result ok -=elapsed 1.005405s -=case ssh_to_openssh_SUITE:end_per_group -=logfile ssh_to_openssh_suite.end_per_group.101378.html -=group_props [{name,tunnel_distro_client}] -=started 2025-01-09 11:46:18 -=ended 2025-01-09 11:46:18 -=result ok -=elapsed 0.000000s -=group_time 2.228s -=case ssh_to_openssh_SUITE:erlang_server_openssh_client_renegotiate -=logfile ssh_to_openssh_suite.erlang_server_openssh_client_renegotiate.html -=started 2025-01-09 11:46:18 -=ended 2025-01-09 11:46:19 -=result ok -=elapsed 0.637130s -=case ssh_to_openssh_SUITE:eserver_oclient_kex_strict -=logfile ssh_to_openssh_suite.eserver_oclient_kex_strict.html -=started 2025-01-09 11:46:19 -=ended 2025-01-09 11:46:20 -=result ok -=elapsed 1.116185s -=case ssh_to_openssh_SUITE:exec_with_io_in_sshc -=logfile ssh_to_openssh_suite.exec_with_io_in_sshc.html -=started 2025-01-09 11:46:20 -=ended 2025-01-09 11:46:20 -=result ok -=elapsed 0.564036s -=case ssh_to_openssh_SUITE:exec_direct_with_io_in_sshc -=logfile ssh_to_openssh_suite.exec_direct_with_io_in_sshc.html -=started 2025-01-09 11:46:20 -=ended 2025-01-09 11:46:21 -=result ok -=elapsed 0.602731s -=case ssh_to_openssh_SUITE:end_per_group -=logfile ssh_to_openssh_suite.end_per_group.101506.html -=group_props [{name,erlang_server}] -=started 2025-01-09 11:46:21 -=ended 2025-01-09 11:46:21 -=result ok -=elapsed 0.000000s -=group_time 5.294s -=case ssh_to_openssh_SUITE:end_per_suite -=logfile ssh_to_openssh_suite.end_per_suite.html -=started 2025-01-09 11:46:21 -=ended 2025-01-09 11:46:21 -=result ok -=elapsed 0.000000s -=group_time 10.380s -=== -=case ssh_upgrade_SUITE:all -=started 2025-01-09 11:46:21 -=result skipped: Benchmarks run separately -=== *** Skipping {ssh_upgrade_SUITE,all} *** -=== TEST COMPLETE, 1537 ok, 0 failed, 20 skipped of 1557 test cases - -=finished 2025-01-09 11:46:21 -=failed 0 -=successful 1537 -=user_skipped 20 -=auto_skipped 0 -=elapsed_time 838359611 diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.summary b/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.summary deleted file mode 100644 index 687e4f9241325..0000000000000 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.summary +++ /dev/null @@ -1 +0,0 @@ -{summary,{1537,0,20,0,838359611}}. diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/totals.info b/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/totals.info deleted file mode 100644 index 24fb2f6a256e6..0000000000000 Binary files a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/totals.info and /dev/null differ diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/ct_default.css b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/ct_default.css similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/ct_default.css rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/ct_default.css diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/ctlog.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/ctlog.html similarity index 83% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/ctlog.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/ctlog.html index e19a34dc59096..f3610c1e532c5 100644 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/ctlog.html +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/ctlog.html @@ -119,111 +119,111 @@

    PRE/POST TEST I/O LOG

    PROGRESS LOG

     
    -
    *** CT 2025-01-09 11:32:22.348 *** Common Test Logger started
    +
    *** CT 2025-01-10 18:55:38.508 *** Common Test Logger started
     VERBOSITY LEVELS:
     general level            100
     default                  100
     
     
    -
    *** CT 2025-01-09 11:32:22.351 *** Test Specification file(s)
    +
    *** CT 2025-01-10 18:55:38.512 *** Test Specification file(s)
     /buildroot/otp/lib/ssh/make_test_dir/ssh_test/ssh.spec 
     
    
    -
    *** CT 2025-01-09 11:32:22.961 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.097 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group dbg in ssh_dbg_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.961 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.097 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group circ_buf in ssh_dbg_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group tool_tests in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group packet_size_error in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group field_size_error in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group kex in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group service_requests in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group authentication in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group ext_info in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group preferred_algorithms in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.968 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.104 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group client_close_early in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:22.986 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.125 *** TEST INFO
     1 test(s), 1557 case(s) in 20 suite(s)
     
    
    -
    *** CT 2025-01-09 11:32:22.986 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.125 *** TEST INFO
     Timetrap time multiplier = 1
     Timetrap scaling enabled = false
     
    
    -
    *** CT 2025-01-09 11:32:23.128 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.266 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group dbg in ssh_dbg_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.128 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.266 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group circ_buf in ssh_dbg_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group tool_tests in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group packet_size_error in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group field_size_error in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group kex in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group service_requests in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group authentication in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group ext_info in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group preferred_algorithms in ssh_protocol_SUITE, using default.
     
    
    -
    *** CT 2025-01-09 11:32:23.129 *** TEST INFO
    +
    *** CT 2025-01-10 18:55:39.267 *** TEST INFO
     init_per_group/2 and end_per_group/2 missing for group client_close_early in ssh_protocol_SUITE, using default.
     
    Logging fails! Str: "~p:~p collect_data: received ~p.~nGot in total ~p bytes,  want ~p more", Args: [ssh_connection_SUITE,
    @@ -241,13 +241,13 @@ 

    PROGRESS LOG

    4194304, 4194304]
    -
    *** CT 2025-01-09 11:46:22.753 *** Common Test Logger finished
    +
    *** CT 2025-01-10 19:09:37.745 *** Common Test Logger finished
     


    diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/index.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/index.html similarity index 93% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/index.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/index.html index 2b4ab66b39056..adb5591c509c6 100644 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/index.html +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/index.html @@ -3,7 +3,7 @@ -Test Results Thu Jan 09 2025 11:32:22 +Test Results Fri Jan 10 2025 18:55:38 @@ -81,7 +81,7 @@

    Test Results

    -

    Thu Jan 09 2025 11:32:22

    +

    Fri Jan 10 2025 18:55:38


    @@ -103,12 +103,12 @@

    Thu Jan 09 2025 11:32:22

    -make_test_dir.ssh_test +make_test_dir.ssh_test 1537 0 20 (20/0) 0 -838.360s +837.212s @@ -118,7 +118,7 @@

    Thu Jan 09 2025 11:32:22

    0 20 (20/0) 0 -838.360s +837.212s @@ -130,7 +130,7 @@

    Thu Jan 09 2025 11:32:22

    diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/jquery-latest.js b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/jquery-latest.js similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/jquery-latest.js rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/jquery-latest.js diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/jquery.tablesorter.min.js b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/jquery.tablesorter.min.js similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/jquery.tablesorter.min.js rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/jquery.tablesorter.min.js diff --git a/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/last_name b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/last_name new file mode 100644 index 0000000000000..706ef893695f3 --- /dev/null +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/last_name @@ -0,0 +1 @@ +/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39 diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/last_test.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/last_test.html similarity index 87% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/last_test.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/last_test.html index 70688fc7292f5..8804de7e2d70f 100644 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/last_test.html +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/last_test.html @@ -8,6 +8,6 @@

    Last test

    -make_test_dir.ssh_test.logs +make_test_dir.ssh_test.logs diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/last_link.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/last_link.html similarity index 87% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/last_link.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/last_link.html index 8522f9a2d59c1..d428ee6ed1d8a 100644 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/last_link.html +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/last_link.html @@ -8,6 +8,6 @@

    Last test

    -make_test_dir.ssh_test.logs +make_test_dir.ssh_test.logs diff --git a/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/last_name b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/last_name new file mode 100644 index 0000000000000..706ef893695f3 --- /dev/null +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/last_name @@ -0,0 +1 @@ +/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39 diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/cover.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/cover.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/cover.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/cover.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.27908.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.27908.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25890.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.28132.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25890.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.28132.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.57058.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.25987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.57058.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26435.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.60579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26435.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.60579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.61155.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.61155.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26755.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.61443.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26755.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.61443.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26915.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.61763.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.26915.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.61763.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27074.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.62275.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27074.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.62275.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27107.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.82210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27107.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.82210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.82530.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.82530.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27234.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27234.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27618.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.27940.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27618.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.27940.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27907.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.28164.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.27907.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.28164.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.57026.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.57026.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28322.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.60227.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28322.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.60227.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28323.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.60643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28323.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.60643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.61475.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.61475.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28515.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.61795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28515.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.61795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28771.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.81698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28771.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.81698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28834.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.82242.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.28834.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.82242.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29027.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.82562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29027.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.82562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29122.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29122.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ct_framework.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.connect_with_ssh_agent.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.connect_with_ssh_agent.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.29762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2980.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.request_identities.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.2980.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.request_identities.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30082.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.sign_request.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30082.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.sign_request.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30179.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30179.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_agent_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30211.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10146.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30211.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10146.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10179.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10179.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10212.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10212.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10499.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.30787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10499.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3107.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10628.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3107.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10628.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31299.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31299.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31362.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10723.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31362.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10723.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31715.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10916.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31715.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.10916.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.31810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32227.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32227.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32355.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11236.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32355.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11236.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32707.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11396.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32707.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11396.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32930.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11555.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.32930.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11555.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33091.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11586.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33091.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11586.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3332.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3332.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.11970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12036.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12036.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33635.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12228.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33635.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12228.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33859.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.33859.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12419.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12419.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12706.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12706.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12772.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12772.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34563.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34563.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34786.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12930.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.34786.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.12930.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35170.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13124.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35170.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13124.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35523.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13252.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35523.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13252.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13347.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.35810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13347.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3588.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13444.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3588.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13444.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3618.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13636.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3618.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13636.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13922.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13922.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36738.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13956.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36738.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13956.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36899.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13987.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.36899.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.13987.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14052.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14052.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37123.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14180.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37123.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14180.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37218.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14242.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37218.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14242.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37347.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14307.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37347.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14307.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37506.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37506.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37603.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14500.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37603.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14500.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14628.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14628.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14692.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.37922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14692.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38051.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14723.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38051.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14723.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3811.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3811.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38499.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14820.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38499.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14820.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14916.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.14916.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15043.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15043.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38627.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15044.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.38627.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15044.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39106.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39106.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39139.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15268.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39139.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15268.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39363.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39363.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15364.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.3938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15364.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.1540.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.1540.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39523.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15619.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39523.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15619.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15620.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15620.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39875.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15684.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39875.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15684.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39907.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15812.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.39907.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15812.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15972.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.15972.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16068.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16068.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40259.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40259.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4036.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16131.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4036.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16131.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40483.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16228.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40483.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16228.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16258.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16258.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16323.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16323.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40898.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40898.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40963.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16356.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.40963.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16356.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.164.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.164.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41283.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16420.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41283.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16420.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41410.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.1668.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41410.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.1668.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41571.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41571.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4163.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16803.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4163.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16803.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41635.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16931.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41635.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.16931.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41730.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41730.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41795.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.41795.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42083.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17379.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42083.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17379.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42146.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17603.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42146.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17603.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.17955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42531.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18435.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42531.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18435.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4258.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18882.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4258.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18882.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18883.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.18883.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19075.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19075.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42883.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42883.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4292.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4292.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.19778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42979.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.1987.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.42979.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.1987.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43106.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43106.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43394.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20547.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43394.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20547.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43459.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43459.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20930.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.20930.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43586.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21123.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43586.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21123.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43587.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43587.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43683.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21315.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43683.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21315.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43746.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21603.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43746.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21603.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43779.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43779.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.21634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43906.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22179.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43906.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22179.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43907.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2243.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.43907.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2243.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44003.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44003.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44098.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44098.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22851.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.22851.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44259.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2340.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44259.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2340.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.23651.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.23651.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44387.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.23811.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44387.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.23811.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24291.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24291.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44706.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2435.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44706.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2435.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44802.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44802.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44803.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44803.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44931.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24675.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44931.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24675.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44994.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.44994.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.24866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45059.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25027.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45059.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25027.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45122.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45122.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.452.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25475.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.452.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25475.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25603.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25603.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.25826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4548.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26114.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4548.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26114.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45602.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45602.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45635.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2659.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45635.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2659.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26690.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.26690.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45858.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.45858.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27011.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27011.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46466.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27139.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46466.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27139.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46786.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27619.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.46786.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27619.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4772.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.4772.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.27874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5028.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28355.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5028.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28355.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5347.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28611.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5347.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28611.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5444.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5444.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5603.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5603.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5732.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28994.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.5732.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.28994.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6020.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29059.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6020.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29059.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6050.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6050.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29347.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29347.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6308.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2947.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6308.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2947.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6338.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2948.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6338.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.2948.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.29858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6404.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30051.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6404.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30051.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3011.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3011.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6596.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6596.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30530.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30530.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.676.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30531.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.676.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30531.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6788.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6788.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.30754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31042.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.6882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31042.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7140.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3107.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7140.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3107.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7203.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31075.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7203.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31075.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7267.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31235.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7267.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31235.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7364.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31459.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7364.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31459.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7394.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7394.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7620.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7620.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.31842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7651.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7651.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7843.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7843.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7906.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32451.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7906.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32451.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7972.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.7972.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8260.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8260.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.32866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33027.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33027.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33315.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33315.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8740.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33410.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8740.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33410.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33731.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.33731.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8867.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34147.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8867.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34147.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8996.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.8996.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9122.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34466.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9122.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34466.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34499.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34499.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34819.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.34819.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9314.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3491.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9314.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3491.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9443.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9443.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9604.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9604.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35235.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35235.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9859.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.9859.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.996.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.356.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.996.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.356.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35907.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.35907.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10018.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10018.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10019.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36259.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10019.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36259.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1028.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36483.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1028.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36483.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10436.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10436.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10531.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10531.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10788.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36867.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10788.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.36867.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10851.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37027.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.10851.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37027.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11010.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11010.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11108.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11108.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37155.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37155.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11330.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37283.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11330.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37283.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11490.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37411.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11490.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37411.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11492.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11492.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11715.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37475.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11715.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37475.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37603.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37603.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11876.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37667.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.11876.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37667.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12003.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37763.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12003.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37763.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12098.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12098.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37891.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37891.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.37986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12579.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38147.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12579.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38147.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12676.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12676.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12834.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38275.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12834.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38275.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12932.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38435.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.12932.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38435.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13060.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38595.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13060.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38595.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1314.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1314.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13220.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38787.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13220.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38787.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13315.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38883.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13315.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.38883.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13348.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3907.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13348.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.3907.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13444.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39107.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13444.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39107.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39138.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39138.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13475.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39395.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13475.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39395.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13572.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39523.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13572.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39523.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13635.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39587.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13635.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39587.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13698.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13698.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13860.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39875.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13860.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.39875.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13923.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40163.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.13923.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40163.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40291.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40291.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14180.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40451.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14180.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40451.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14308.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14308.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14436.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40642.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14436.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40642.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1444.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4068.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1444.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4068.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14563.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40707.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14563.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40707.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14596.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40867.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14596.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40867.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.40962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14756.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.41027.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14756.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.41027.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.41218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.41218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14948.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.41954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.14948.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.41954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15076.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.42306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15076.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.42306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15204.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.42562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15204.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.42562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15266.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.42914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15266.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.42914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15332.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.43394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15332.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.43394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15459.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.43682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15459.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.43682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15460.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4388.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15460.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4388.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15588.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.44002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15588.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.44002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15714.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.44546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15714.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.44546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15748.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.45026.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15748.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.45026.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15876.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.45282.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.15876.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.45282.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.45538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.45538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16003.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4580.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16003.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4580.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16228.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.46210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16228.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.46210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16356.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.46434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16356.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.46434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16452.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16452.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16834.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16834.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16931.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.16931.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4771.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4771.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.47938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17666.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48066.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17666.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48066.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17699.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17699.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17890.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.17890.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18147.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18147.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48706.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48706.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48930.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.48930.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1860.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1860.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1892.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1892.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18979.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.18979.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19267.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4995.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19267.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.4995.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.49986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1954.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.1954.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19651.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19651.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19907.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.19907.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5058.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5058.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20482.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20482.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50978.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.50978.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20674.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20674.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20931.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20931.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20962.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.20962.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21346.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21346.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.51906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21475.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5219.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21475.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5219.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21890.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.21890.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22083.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52706.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22083.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.52706.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2212.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5411.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2212.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5411.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22274.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5444.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22274.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5444.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22403.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22403.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5859.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5859.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22691.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5956.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22691.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.5956.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6147.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6147.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6276.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.22947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6276.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23266.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6338.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23266.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6338.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23555.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6403.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23555.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6403.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23586.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6500.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23586.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6500.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23715.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6690.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23715.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6690.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6691.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.23938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6691.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.24642.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6788.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.24642.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.6788.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7138.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7138.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.24962.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7363.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.24962.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7363.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2500.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7490.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2500.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7490.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25187.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7492.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25187.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7492.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7524.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7524.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25539.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7587.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25539.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7587.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25666.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7748.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25666.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7748.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.25922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.7938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26019.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8004.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26019.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8004.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26082.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8163.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26082.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8163.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8356.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8356.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.26947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27106.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8516.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27106.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8516.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27139.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27139.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8708.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.8708.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9092.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.27778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9092.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28354.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28354.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28547.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9123.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28547.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9123.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28803.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9156.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28803.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9156.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9604.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9604.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.963.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.28866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.963.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29059.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29059.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9796.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9796.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29346.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29346.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9891.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.9891.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2979.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.2979.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29794.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29794.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29955.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10050.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.29955.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10050.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3012.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3012.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10211.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10211.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10244.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10244.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10660.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10660.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30819.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10787.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30819.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10787.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30979.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10818.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.30979.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10818.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31074.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10948.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31074.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.10948.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31170.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11042.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31170.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11042.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3139.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11268.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3139.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11268.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31394.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11428.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31394.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11428.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3170.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3170.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.11906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.31842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32066.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12068.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32066.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12068.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32290.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12227.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32290.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12227.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32387.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12260.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32387.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12260.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32739.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32739.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32962.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12420.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32962.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12420.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32963.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.32963.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33123.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12675.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33123.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12675.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33443.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33443.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3363.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12804.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3363.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12804.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3364.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3364.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.12962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33891.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13156.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.33891.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13156.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34146.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13250.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34146.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13250.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34307.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13284.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34307.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13284.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13348.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13348.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13379.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13379.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34818.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13476.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34818.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13476.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34883.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.34883.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35107.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13668.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35107.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13668.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35202.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35202.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.13954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35555.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35555.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14084.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14084.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35971.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14244.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.35971.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14244.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36067.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36067.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14339.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14339.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3620.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14530.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3620.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14530.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14531.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14531.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14532.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14532.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36931.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14724.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.36931.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14724.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14755.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14755.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14852.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14852.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14882.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14882.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14948.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.14948.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37635.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37635.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37794.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15076.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37794.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15076.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3780.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15172.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3780.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15172.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37954.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15235.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.37954.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15235.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.38083.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15300.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.38083.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15300.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3843.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3843.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.38531.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15427.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.38531.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15427.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.38626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15460.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.38626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15460.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15586.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15586.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15651.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15651.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39395.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15716.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39395.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15716.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1572.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1572.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39555.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15844.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39555.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15844.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.3970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.15906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16100.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16100.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39939.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16163.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39939.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16163.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39971.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16260.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.39971.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16260.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40163.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40163.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16611.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16611.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40515.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16834.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40515.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16834.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4068.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16963.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4068.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.16963.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40771.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1700.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40771.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1700.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40995.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.40995.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41187.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41187.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41218.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17410.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41218.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17410.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17411.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17411.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17635.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17635.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41475.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17987.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41475.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.17987.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41699.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18146.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41699.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18146.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18466.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18466.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41794.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41794.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.418.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.418.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41827.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18627.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.41827.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18627.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4195.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4195.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.18914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19107.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19107.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42307.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42307.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42403.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19235.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42403.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19235.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42466.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42466.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42563.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1956.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42563.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.1956.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42627.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.196.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42627.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.196.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19810.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.19810.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42755.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20003.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42755.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20003.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42915.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.42915.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20258.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20258.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43075.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43075.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43203.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43203.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4324.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20867.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4324.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20867.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43266.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43266.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.20962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43363.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.21155.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43363.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.21155.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.21347.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.21347.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43491.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.21635.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43491.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.21635.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43619.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22114.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43619.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22114.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22211.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22211.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43715.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22242.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43715.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22242.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22627.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22627.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43811.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.43811.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.22786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44035.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44035.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23363.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23363.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44163.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23523.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44163.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23523.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.23683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44290.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2372.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44290.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2372.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44418.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24323.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44418.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24323.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44419.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44419.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44482.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44482.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44483.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24707.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44483.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24707.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44579.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24898.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44579.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.24898.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44642.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25059.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44642.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25059.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44707.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25251.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44707.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25251.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4482.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25507.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4482.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25507.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44834.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44834.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.25858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.259.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.259.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44963.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26146.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.44963.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26146.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45091.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45091.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26531.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26531.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45251.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45251.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.26722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27042.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27042.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45539.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27267.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45539.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27267.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45634.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27651.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.45634.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27651.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.46178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.46178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.27906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4642.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28163.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4642.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28163.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28387.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28387.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.46594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.46594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4804.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.4804.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5060.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28706.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5060.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28706.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28867.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.28867.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29026.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29026.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29058.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29058.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.548.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.548.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5602.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29346.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5602.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29346.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5635.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29539.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5635.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29539.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5764.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29731.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5764.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29731.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5891.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2980.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.5891.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.2980.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6052.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6052.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.29890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6082.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30083.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6082.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30083.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6370.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6370.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3042.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3042.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6499.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6499.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30563.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.30563.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6628.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6628.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6691.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31107.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6691.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31107.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6820.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6820.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6914.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31586.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.6914.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31586.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.708.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31747.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.708.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31747.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7170.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7170.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.31874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7172.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32035.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7172.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32035.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7299.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32450.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7299.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32450.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7396.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32483.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7396.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32483.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32675.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.32675.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7682.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33059.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7682.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33059.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7875.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33282.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7875.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33282.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33347.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.7938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33347.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8004.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8004.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8163.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33763.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8163.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33763.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.33826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8292.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8292.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8772.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34531.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8772.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34531.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8898.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34851.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8898.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34851.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8899.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.8899.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.34914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9028.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9028.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3523.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3523.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9475.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9475.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35267.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35267.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9636.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35299.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9636.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35299.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9796.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9796.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.98.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35650.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.98.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35650.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9923.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35939.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.9923.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.35939.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36291.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36291.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10050.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10050.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10051.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36547.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10051.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36547.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10084.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36642.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10084.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36642.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36899.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36899.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10468.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36931.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10468.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.36931.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10563.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37059.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10563.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37059.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1060.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1060.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37187.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37187.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10820.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37315.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10820.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37315.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10883.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3746.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.10883.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3746.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11140.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11140.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11203.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37507.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11203.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37507.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11362.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37699.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11362.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37699.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11427.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11427.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11524.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11524.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11746.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3780.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11746.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3780.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37923.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.37923.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11908.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.11908.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12035.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38179.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12035.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38179.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12322.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12322.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38307.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38307.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12964.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.12964.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13090.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.388.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13090.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.388.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13092.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38915.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13092.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.38915.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13187.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39171.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13187.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39171.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13252.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3939.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13252.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.3939.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13476.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13476.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13506.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39650.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13506.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39650.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39747.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39747.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13668.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39907.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13668.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.39907.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13764.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40035.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13764.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40035.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13892.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13892.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13955.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40258.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13955.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40258.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13956.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40323.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.13956.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40323.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14212.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40483.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14212.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40483.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40611.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40611.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14340.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40739.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14340.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40739.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14468.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40899.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14468.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40899.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40994.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.40994.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14628.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4100.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14628.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4100.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41059.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41059.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1476.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41250.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1476.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41250.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14788.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14788.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14979.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.14979.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15108.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15108.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.41986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15236.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4227.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15236.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4227.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.42594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.42594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15363.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.42946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15363.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.42946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15364.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.43426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15364.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.43426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.43714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.43714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15492.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.44034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15492.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.44034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15620.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15620.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15683.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.44578.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15683.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.44578.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15780.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.44834.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15780.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.44834.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15811.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.45314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15811.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.45314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15908.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.45570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.15908.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.45570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1603.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.45922.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1603.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.45922.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16034.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4612.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16034.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4612.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16100.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.46466.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16100.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.46466.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16260.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16260.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.4674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16482.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.46914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16482.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.46914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16579.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16579.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16674.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16674.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16771.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16771.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16963.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.16963.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.47970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48098.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48098.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17346.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17346.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48450.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48450.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17731.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48578.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17731.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48578.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48834.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48834.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.17987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.48962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18179.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18179.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18242.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49186.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18242.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49186.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18466.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49346.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18466.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49346.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18755.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.18755.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19011.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19011.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19074.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19074.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.49858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19234.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19234.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1924.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1924.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19554.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19554.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50466.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.1986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50466.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.19938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20035.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20035.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20258.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50882.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20258.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.50882.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20483.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20483.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20706.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.20706.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21090.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21090.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51746.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51746.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21506.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21506.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.51938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52066.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52066.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21763.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21763.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.21922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22115.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22115.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5251.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5251.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22435.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22435.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.52514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5346.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5346.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.227.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5443.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.227.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5443.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5476.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5476.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.22882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5988.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.5988.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23618.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6243.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23618.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6243.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6308.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.23970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6308.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24003.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24003.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6435.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6435.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6532.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6532.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24354.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.67.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24354.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.67.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24674.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6723.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24674.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6723.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2499.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6820.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2499.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6820.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24994.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6980.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.24994.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.6980.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.25219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7107.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.25219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7107.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2532.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2532.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.25571.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7619.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.25571.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7619.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.25954.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7746.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.25954.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7746.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26051.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7780.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26051.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7780.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26242.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26242.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.7970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26499.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8036.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26499.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8036.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26786.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.26786.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8388.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8388.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27587.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27587.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27683.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8548.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27683.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8548.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27939.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8675.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.27939.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8675.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8740.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8740.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28355.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28355.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.8802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9124.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9124.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28898.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9155.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.28898.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9155.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29090.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9188.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29090.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9188.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29091.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29091.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2914.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9828.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.2914.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9828.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29443.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9923.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29443.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.9923.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29699.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29699.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10243.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.29987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10243.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3011.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10276.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3011.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10276.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10531.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10531.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30307.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30307.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30403.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10692.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30403.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10692.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3044.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3044.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10819.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.30626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10819.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31011.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10850.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31011.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10850.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31106.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10980.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31106.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.10980.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31202.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11011.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31202.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11011.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31363.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31363.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11300.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11300.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.31874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3202.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11460.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3202.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11460.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32098.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11587.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32098.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11587.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32099.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11650.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32099.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11650.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32322.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11780.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32322.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11780.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32419.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11971.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32419.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.11971.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32771.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32771.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32994.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12100.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.32994.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12100.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12259.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12259.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33218.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12292.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33218.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12292.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33602.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33602.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33699.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33699.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12836.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12836.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33923.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12867.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.33923.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12867.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3395.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12994.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3395.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.12994.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13123.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13123.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13188.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13188.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13282.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13282.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34627.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13380.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34627.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13380.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13411.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.34850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13411.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.35587.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13508.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.35587.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13508.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.35874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.35874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36194.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13699.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36194.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13699.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36483.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13700.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36483.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13700.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36675.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13859.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36675.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13859.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.36770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37090.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13988.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37090.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.13988.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37187.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14051.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37187.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14051.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14116.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14116.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14563.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.37667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14563.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.38114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14596.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.38114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14596.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.38563.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14756.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.38563.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14756.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.38658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14787.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.38658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14787.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3875.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14980.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.3875.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.14980.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39170.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39170.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39203.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39203.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39427.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15108.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39427.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15108.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39490.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15204.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39490.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15204.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39587.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15267.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39587.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15267.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39715.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39715.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15396.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.39874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15396.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40003.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40003.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40194.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15748.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40194.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15748.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40195.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15876.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40195.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15876.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40323.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40323.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40547.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15939.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40547.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.15939.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40610.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16004.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40610.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16004.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40675.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16164.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.40675.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16164.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4100.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4100.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41027.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16292.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41027.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16292.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16388.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16388.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.16866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17123.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17123.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41731.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41731.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1732.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1732.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41859.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.41859.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42115.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17443.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42115.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17443.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17667.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17667.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.17730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42435.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42435.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42498.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18115.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42498.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18115.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42754.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42754.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18499.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18499.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42978.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.42978.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.18946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43074.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43074.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43107.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43107.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19523.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19523.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43235.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19811.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43235.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19811.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.19842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43395.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1988.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43395.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.1988.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20035.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20035.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43523.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43523.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4356.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20291.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4356.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20291.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43682.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2051.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43682.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2051.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20578.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20578.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20611.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20611.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43843.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20899.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43843.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.20899.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.21442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.43938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.21442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44034.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.21795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44034.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.21795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44067.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22146.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44067.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22146.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22243.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22243.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44195.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44195.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44323.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22339.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44323.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22339.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4451.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4451.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22659.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22659.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44739.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22755.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44739.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.22755.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.23106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.23106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44867.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.23395.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44867.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.23395.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44930.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.23522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44930.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.23522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44995.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2404.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.44995.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2404.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.24066.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.24066.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45026.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.24450.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45026.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.24450.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.24739.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.24739.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2499.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2499.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45283.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45283.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45315.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25250.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45315.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25250.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45443.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25283.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45443.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25283.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45571.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45571.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45666.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25635.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45666.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25635.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4580.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4580.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.45986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.25890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26083.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26083.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46402.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46402.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.2626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46498.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26338.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46498.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26338.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26563.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26563.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.26754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4674.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27043.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4674.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27043.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4675.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27427.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4675.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27427.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46818.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.46818.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4836.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.4836.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5092.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27907.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5092.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27907.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5314.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5314.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.27938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28098.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28098.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28419.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28419.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5796.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5796.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.580.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.580.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5890.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28899.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5890.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.28899.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5923.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.5923.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29123.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29123.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6115.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6115.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6402.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29571.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6402.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.29571.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6531.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3012.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6531.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3012.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30242.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30242.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6660.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30243.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6660.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30243.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30595.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30595.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6852.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6852.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30819.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.6946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.30819.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7011.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31267.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7011.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31267.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7235.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7235.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.740.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31491.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.740.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31491.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7428.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7428.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31779.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31779.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7652.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7652.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.31906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7714.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7714.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.7970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8036.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8036.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8195.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32898.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8195.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.32898.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8258.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8258.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8324.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8324.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8452.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8452.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33379.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33379.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8612.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8612.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8675.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8675.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8804.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8804.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8931.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.8931.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.33858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9060.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9060.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9187.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9187.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9346.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34530.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9346.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34530.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34563.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34563.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9602.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34690.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9602.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34690.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9668.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34883.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9668.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.34883.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9828.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35331.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9828.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35331.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9858.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.9858.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3555.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_connect.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3555.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10180.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35587.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10180.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35587.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35971.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.35971.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36323.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36323.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10884.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10884.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.10947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11074.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36898.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11074.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36898.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1124.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36963.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1124.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.36963.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11299.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11299.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11523.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11523.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11556.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37186.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11556.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37186.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11586.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37219.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11586.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37219.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11716.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37347.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11716.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37347.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11811.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11811.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37539.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37539.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11972.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37731.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.11972.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37731.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12418.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12418.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.37955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12420.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3810.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12420.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3810.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12707.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3812.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.12707.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3812.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13059.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38211.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13059.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38211.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38338.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38338.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38339.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38339.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13763.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38499.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13763.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38499.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38627.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.13987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38627.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14371.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38819.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14371.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38819.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38947.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.38947.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.14946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15043.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39299.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15043.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39299.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15203.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39459.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15203.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39459.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1540.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39619.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1540.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39619.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15555.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3971.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15555.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.3971.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39779.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.15778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39779.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16098.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39939.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16098.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.39939.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16163.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40099.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16163.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40099.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16259.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40227.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16259.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40227.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16290.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16290.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1636.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1636.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40771.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40771.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16930.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40931.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.16930.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.40931.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17027.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.41314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17027.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.41314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4132.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4132.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17827.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.420.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.17827.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.420.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18018.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18018.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42338.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42338.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18435.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4259.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18435.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4259.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42978.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.42978.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.43234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.18882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.43234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.43458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.43458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.43746.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.43746.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19523.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4450.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19523.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4450.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.44610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.44610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.44866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.19747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.44866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1988.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.45058.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.1988.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.45058.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20034.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.45954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20034.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.45954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20227.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4644.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20227.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4644.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20322.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.46498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20322.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.46498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2050.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.46946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2050.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.46946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20771.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4706.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20771.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4706.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20994.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47138.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.20994.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47138.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21251.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21251.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21827.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21827.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.47714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.21986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22146.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4803.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22146.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4803.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22179.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22179.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22370.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48258.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22370.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48258.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22499.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22499.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4836.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.4836.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.22946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.23107.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.23107.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.23299.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.23299.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2338.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48994.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2338.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.48994.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.23811.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.23811.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24034.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24034.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24099.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24099.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49666.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49666.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24355.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24355.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.49890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24418.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50050.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.24418.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50050.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50242.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50242.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25315.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5027.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25315.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5027.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.50914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25859.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51138.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.25859.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51138.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26147.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26147.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2628.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.2628.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26563.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26563.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.26882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.51970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27235.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52098.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27235.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52098.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27427.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5220.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27427.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5220.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27619.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27619.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.27747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28066.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28066.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.52610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28419.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5508.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28419.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5508.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5666.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5666.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28899.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.28899.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.5955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.290.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.290.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6020.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6020.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6275.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6275.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6340.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6340.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29539.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6402.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29539.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6402.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29602.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29602.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29763.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6564.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29763.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6564.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.29986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6755.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6755.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6852.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.6852.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30402.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7012.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30402.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7012.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30627.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7651.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30627.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7651.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30914.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7812.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.30914.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.7812.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31075.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31075.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31234.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8068.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31234.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8068.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31267.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31267.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3140.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3140.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31427.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8707.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31427.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8707.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31490.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8772.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31490.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8772.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31587.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8834.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31587.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.8834.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31843.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9187.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31843.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9187.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9220.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.31938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9220.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32194.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9282.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32194.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9282.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9348.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9348.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32547.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32547.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3266.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9860.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3266.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9860.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.32835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.9955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33027.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33027.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_connect.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10051.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10051.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10242.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10242.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33314.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10307.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33314.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10307.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10595.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.33986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10595.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34019.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10788.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34019.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10788.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34211.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10915.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34211.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.10915.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3428.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11075.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3428.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11075.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34403.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11076.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34403.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11076.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3459.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11395.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3459.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11395.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34691.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34691.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.34946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11716.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11716.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11844.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.11844.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35554.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12067.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35554.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12067.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35651.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35651.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12323.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.35938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12323.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12356.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12356.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3619.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3619.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36290.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12900.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36290.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.12900.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36547.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36547.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36642.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13187.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36642.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13187.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36739.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36739.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13443.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13443.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36963.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.36963.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.13730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37539.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14115.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37539.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14115.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37634.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37634.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37731.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14403.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.37731.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14403.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38179.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.1442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38179.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.1442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38370.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14915.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38370.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.14915.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15075.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15075.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15331.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15331.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3876.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3876.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15491.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.38946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15491.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39266.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39266.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39267.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15747.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39267.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.15747.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39459.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39459.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39554.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16003.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39554.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16003.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3971.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16451.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.3971.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16451.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16707.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.39938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.16707.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.40290.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.40290.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4066.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17219.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4066.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17219.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.40706.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.40706.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.40962.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.40962.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.41282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.41282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.17890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.41570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.1796.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.41570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.1796.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.41890.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18211.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.41890.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18211.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.42274.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.42274.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4387.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18690.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4387.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18690.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4483.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18723.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4483.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18723.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4739.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18979.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4739.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.18979.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.483.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19042.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.483.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19042.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4900.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4900.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4962.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.1954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.4962.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.1954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5122.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19587.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5122.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19587.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19650.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19650.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5284.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5284.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19875.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.19875.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5698.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20131.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5698.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20131.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5763.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5763.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5860.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20355.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5860.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20355.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.5987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6116.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20675.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6116.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.20675.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.612.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2084.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.612.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2084.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21026.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21026.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6211.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2115.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6211.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2115.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6403.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21250.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6403.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21250.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6466.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21411.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6466.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21411.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6978.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21699.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.6978.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21699.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7075.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7075.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7266.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7266.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.21890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.739.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22115.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.739.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22115.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7492.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7492.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22883.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22883.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7715.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7715.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.22946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7716.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7716.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7939.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23586.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.7939.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23586.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.804.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.804.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8066.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23810.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8066.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23810.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8132.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23875.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8132.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.23875.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8259.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24067.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8259.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24067.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8354.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8354.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8388.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24419.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8388.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24419.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8516.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8516.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8642.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2468.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8642.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2468.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8739.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8739.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8802.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24994.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8802.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.24994.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8868.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25347.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.8868.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25347.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9027.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9027.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9283.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25666.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9283.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25666.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25699.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25699.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9666.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25891.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9666.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25891.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9732.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9732.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.25954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26179.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.9922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26179.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups.1859.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2658.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups.1859.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2658.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2660.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2660.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.2403.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26627.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.2403.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26627.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26850.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26850.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.356.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26851.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.356.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.26851.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10179.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10179.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10276.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27747.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10276.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27747.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10403.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27971.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10403.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.27971.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10596.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.28002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10596.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.28002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.28227.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.28227.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10755.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.28802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10755.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.28802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10948.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2882.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.10948.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.2882.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11043.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11043.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29187.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29187.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11363.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11363.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11619.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29635.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11619.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29635.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11780.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11780.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.29986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1188.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30147.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1188.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30147.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11907.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30307.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.11907.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30307.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12004.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30338.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12004.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30338.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30691.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30691.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12227.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30818.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12227.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30818.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12451.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30883.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12451.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.30883.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12482.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3108.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12482.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3108.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12484.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12484.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12674.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31555.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12674.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31555.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12931.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.12931.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13123.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13123.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1316.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31843.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1316.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.31843.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32099.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32099.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13634.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32259.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13634.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32259.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13827.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3235.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.13827.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3235.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14018.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14018.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14147.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14147.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14274.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32739.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14274.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32739.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.32962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14691.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33155.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14691.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33155.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3331.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.14850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3331.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33475.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33475.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15075.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15075.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15267.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33603.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15267.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33603.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15395.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15395.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33891.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33891.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.15874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.33954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34146.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34146.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16354.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34211.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16354.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34211.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16707.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34627.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.16707.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34627.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1700.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1700.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17026.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3490.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17026.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3490.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17123.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34947.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17123.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.34947.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1731.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35427.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1731.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35427.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35490.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35490.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17539.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3556.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.17539.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3556.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35619.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35619.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18307.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18307.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18499.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18499.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.35778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1858.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36067.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.1858.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36067.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3619.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3619.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18786.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18786.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18915.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18915.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.18946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.36962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19394.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.37282.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19394.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.37282.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19395.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.37634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19395.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.37634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19555.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3779.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19555.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3779.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19714.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.37890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19714.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.37890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.38082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.38082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19939.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.38402.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.19939.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.38402.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20099.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.387.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20099.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.387.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3876.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.3876.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20259.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.38946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20259.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.38946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.39266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.39266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20419.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.39522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20419.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.39522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20834.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.39778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20834.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.39778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4002.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.20835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4002.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2084.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.40130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2084.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.40130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.40354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.40354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4067.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4067.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21347.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.41378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21347.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.41378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.41570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.41570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2146.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.42114.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2146.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.42114.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21666.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4228.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21666.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4228.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21891.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4258.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.21891.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4258.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22050.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.42754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22050.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.42754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.43074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.43074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.43554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.43554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.44162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.44162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4452.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4452.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.45090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.22690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.45090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.45826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.45826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.46018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.46018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23394.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.46274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23394.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.46274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23907.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.23907.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.46562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.46562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.24419.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4708.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.24419.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4708.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25122.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4770.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25122.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4770.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25410.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4867.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25410.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4867.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25763.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4932.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25763.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.4932.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25891.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5124.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.25891.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5124.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.516.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.516.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5284.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5284.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5315.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5315.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26371.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5410.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26371.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5410.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5539.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5539.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5604.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5604.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26722.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26722.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26883.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5763.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26883.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5763.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2692.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5860.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.2692.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.5860.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.26946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6084.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6084.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27043.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6114.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27043.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6114.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27299.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6372.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27299.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6372.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27330.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6563.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27330.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6563.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27459.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6628.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27459.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6628.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6850.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6850.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27811.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6884.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.27811.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6884.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6947.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.6947.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28195.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7076.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28195.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7076.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28707.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7300.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28707.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7300.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28963.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.28963.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.29187.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7427.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.29187.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7427.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.29666.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7586.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.29666.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7586.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.29827.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.29827.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30050.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30050.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7876.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7876.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30498.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7907.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30498.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.7907.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30531.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8067.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30531.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8067.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30691.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8098.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30691.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8098.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3074.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8164.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3074.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8164.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30978.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.30978.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31139.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8419.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31139.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8419.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8580.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8580.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31491.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8771.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31491.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8771.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31651.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8930.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31651.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8930.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31939.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8932.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.31939.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8932.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8995.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.8995.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32163.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.9538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32163.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.9538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.322.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.9668.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.322.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.9668.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.9956.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.9956.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3236.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3236.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups.2082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups.2082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32899.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.32899.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33059.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.2562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33059.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.2562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_large.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33315.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.1476.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33315.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.1476.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33410.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33410.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_exec_groups_no_match_too_small.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33571.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10052.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33571.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10052.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3362.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10115.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3362.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10115.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33795.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.33795.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34115.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34115.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10403.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10403.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34499.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10852.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.34499.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.10852.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3492.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11139.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3492.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11139.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11140.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11140.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35203.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11491.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35203.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11491.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11620.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11620.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35395.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35395.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3555.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11907.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3555.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11907.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35715.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11908.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35715.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.11908.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35843.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.35843.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12355.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12355.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36195.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12388.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36195.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12388.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36387.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12803.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36387.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12803.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12964.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.12964.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36803.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36803.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3683.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13251.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3683.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13251.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36930.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13346.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.36930.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13346.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37027.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37027.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13507.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13507.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37315.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37315.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37795.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13923.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37795.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.13923.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37955.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.37955.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.38243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14211.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.38243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14211.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.38435.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.38435.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.38787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14978.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.38787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14978.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14979.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.14979.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15139.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15139.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39491.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39491.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3972.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15363.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.3972.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15363.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39811.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.39811.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.40034.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15555.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.40034.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15555.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.40386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15810.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.40386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15810.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.40770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15843.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.40770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.15843.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.41058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16066.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.41058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16066.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16067.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16067.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.41634.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.41634.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.41922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16291.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.41922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16291.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4194.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16355.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4194.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16355.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.42082.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.42082.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.42306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.42306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4484.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4484.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16771.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.16771.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4547.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17315.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4547.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17315.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4708.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17539.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4708.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17539.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4802.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4802.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4803.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17891.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4803.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17891.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4964.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17954.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.4964.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.17954.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5026.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18083.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5026.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18083.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18307.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18307.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5251.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18338.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5251.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18338.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5380.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18563.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5380.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18563.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.547.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.1860.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.547.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.1860.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5668.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5668.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5794.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18819.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5794.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.18819.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5956.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.5956.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6051.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6051.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6148.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.1986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6148.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.1986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6274.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6274.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6340.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19939.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6340.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.19939.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20227.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20227.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6724.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6724.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20451.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20451.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6948.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20770.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.6948.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.20770.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7139.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21475.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7139.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21475.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7300.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7300.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7330.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2179.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7330.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2179.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7395.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7395.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7556.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2180.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7556.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2180.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7586.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21891.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7586.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21891.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7779.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7779.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.21986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7812.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.22499.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7812.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.22499.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.22947.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.7842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.22947.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8035.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23490.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8035.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23490.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23587.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23587.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8196.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23779.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8196.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23779.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8323.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8323.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.835.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23971.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.835.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.23971.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24131.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24131.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8515.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8515.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8676.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24259.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8676.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24259.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.868.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24931.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.868.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.24931.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8738.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8738.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8803.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2532.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8803.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2532.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8932.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25411.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.8932.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25411.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9123.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9123.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9379.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25539.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9379.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25539.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9412.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9412.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.25955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9924.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.9924.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26243.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.simple_sftp.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26243.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.10340.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26691.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.10340.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26691.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.10724.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2690.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.10724.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2690.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.11268.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.11268.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.12580.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26915.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.12580.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.26915.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.12738.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.12738.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.13378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27235.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.13378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27235.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.13826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2724.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.13826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2724.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.14500.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.14500.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.15106.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27363.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.15106.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27363.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.15684.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.15684.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.15939.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27555.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.15939.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27555.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.16483.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.16483.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.17635.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27843.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.17635.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.27843.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.1764.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28066.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.1764.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28066.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.1827.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28067.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.1827.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28067.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.18563.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28291.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.18563.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28291.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.18723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.18723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.18851.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28739.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.18851.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28739.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.19458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2883.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.19458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2883.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2148.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2148.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.28866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.21987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29250.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.21987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29250.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29283.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29283.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.22307.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.22307.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.2946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.22754.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.22754.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.23842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29667.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.23842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29667.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.24578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.24578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.24866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29891.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.24866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.29891.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25091.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25091.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30403.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30403.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25955.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.25955.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30979.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.30979.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.27394.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.27394.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2756.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31331.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2756.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31331.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2786.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31651.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2786.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31651.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.27970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.27970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28035.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31907.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28035.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.31907.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28259.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32066.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28259.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32066.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28610.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28610.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32355.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.28770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32355.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.29026.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.29026.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2916.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32611.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.2916.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32611.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.29315.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.29315.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.29891.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.29891.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.3075.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.3075.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.32835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.31171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3363.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.31171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3363.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.32035.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.32035.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.32643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33667.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.32643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33667.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.32866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.32866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.34498.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.34498.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.33955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.34754.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.34754.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35106.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35106.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35362.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35362.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.354.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34691.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.354.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.34691.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35459.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35459.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35907.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35043.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.35907.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35043.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.36450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35459.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.36450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35459.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.36451.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.36451.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.36994.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.36994.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.37091.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.37091.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.35874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.3747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.3747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38082.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36163.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38082.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36163.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.36802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38530.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38530.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.37378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.38850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.37378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.3906.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.38178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.3906.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.38178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.39107.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3843.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.39107.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3843.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40099.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.39042.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40099.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.39042.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40451.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.39362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40451.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.39362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40739.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3972.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40739.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.3972.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40834.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.39874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.40834.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.39874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4099.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.40162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4099.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.40162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41123.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.40418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41123.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.40418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.40834.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.40834.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41346.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.41122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41346.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.41122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4131.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.41986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4131.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42211.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.41442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42211.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.41442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42370.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.42210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42370.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.42210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42818.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.42434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42818.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.42434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42851.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.42850.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.42851.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.42850.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.43202.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4324.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.43202.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4324.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.43362.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.43362.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4386.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4387.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4386.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4387.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.43971.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.43874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.43971.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.43874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.44770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.44770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.45090.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.45090.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.45538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.45538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44930.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.44930.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.46050.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.451.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.46050.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.451.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.4866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.5539.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.5539.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.6532.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4516.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.6532.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4516.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.6756.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.6756.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.7076.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.7076.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.7908.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.7908.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.45890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.9284.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.9284.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.932.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.46114.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.932.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.46114.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.9572.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.46306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.9572.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.46306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.9988.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.46626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.9988.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.46626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4707.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_algorithms_suite.sshd_simple_exec.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4707.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.app_test.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4772.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.app_test.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4772.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.appup_test.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4834.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.appup_test.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4834.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.cli.46275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4931.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.cli.46275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4931.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.cli_exit_normal.47874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.cli_exit_normal.47874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.4962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.cli_exit_status.47906.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5028.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.cli_exit_status.47906.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5028.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.close.47970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5155.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.close.47970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5155.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.daemon_already_started.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5188.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.daemon_already_started.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5188.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.daemon_error_closes_port.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.daemon_error_closes_port.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.daemon_opt_fd.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5348.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.daemon_opt_fd.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5348.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.double_close.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5379.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.double_close.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5379.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.17156.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.17156.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.17220.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5635.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.17220.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5635.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.46819.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.46819.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.48418.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.48418.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.48450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5892.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.48450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5892.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5923.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.5923.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6083.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6083.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec.46243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.612.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec.46243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.612.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec_compressed.47810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6180.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec_compressed.47810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6180.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec_with_io_in.46211.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec_with_io_in.46211.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec_with_io_out.46115.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6436.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.exec_with_io_out.46115.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6436.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.idle_time_client.47842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6692.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.idle_time_client.47842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6692.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.idle_time_server.47938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6916.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.idle_time_server.47938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6916.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.inet6_option.46339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.inet6_option.46339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.6946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.inet_option.46307.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7011.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.inet_option.46307.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7011.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.45699.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7108.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.45699.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7108.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.46083.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7299.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.46083.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7299.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.46691.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.46691.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.48482.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7491.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.48482.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7491.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.48770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7650.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.48770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7650.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7779.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7779.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7971.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.7971.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.internal_error.46723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8131.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.internal_error.46723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8131.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.key_callback.48802.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.key_callback.48802.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.key_callback_options.17188.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8260.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.key_callback_options.17188.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8260.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.known_hosts.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8451.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.known_hosts.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8451.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry1.48514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8452.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry1.48514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8452.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry2.48546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry2.48546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry3.48578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8644.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry3.48578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8644.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry4.17060.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry4.17060.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.8835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry5.48610.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9026.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.login_bad_pwd_no_retry5.48610.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9026.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.max_initial_idle_time.16484.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9028.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.max_initial_idle_time.16484.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9028.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.misc_ssh_options.16548.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9572.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.misc_ssh_options.16548.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9572.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.multi_daemon_opt_fd.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.multi_daemon_opt_fd.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.openssh_zlib_basic_test.16516.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9732.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.openssh_zlib_basic_test.16516.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.9732.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.packet_size.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.packet_size.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.simple_sftp.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.peername_sockname.46179.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.peername_sockname.46179.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.send.46147.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.100.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.send.46147.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.100.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.setopts_getopts.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10148.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.setopts_getopts.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10148.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell.1189.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell.1189.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_exit_status.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10564.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_exit_status.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10564.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_no_unicode.16644.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10691.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_no_unicode.16644.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.10691.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_socket.16580.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_socket.16580.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_ssh_conn.16612.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11748.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_ssh_conn.16612.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11748.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_unicode_string.16676.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11779.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.shell_unicode_string.16676.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11779.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11972.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.11972.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_file_is_auth_key.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.13604.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_file_is_auth_key.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.13604.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_file_is_host_key.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.13667.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_file_is_host_key.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.13667.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_file_is_host_key_misc.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.13796.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_file_is_host_key_misc.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.13796.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_info_print.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.14275.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_basic_suite.ssh_info_print.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.14275.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.defined_subsystem.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.14659.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.defined_subsystem.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.14659.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.15266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.15266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.16738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.16738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.noexist_subsystem.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.17314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.noexist_subsystem.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.17314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.17634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.17634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.subsystem_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.18371.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.subsystem_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.18371.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.undefined_subsystem.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_chan_behaviours_suite.undefined_subsystem.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_collect_labmachine_info_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.20866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_collect_labmachine_info_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.20866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_collect_labmachine_info_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.21091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_collect_labmachine_info_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.21091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.big_cat.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.21539.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.big_cat.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.21539.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect2_invalid_options.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.21570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect2_invalid_options.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.21570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_both.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2211.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_both.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2211.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_options.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.22403.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_options.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.22403.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_port.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.22563.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_port.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.22563.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_timeout_0.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2276.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_timeout_0.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2276.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_timeout_1.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.23011.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect3_invalid_timeout_1.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.23011.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_three.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2371.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_three.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2371.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_two_0.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.23938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_two_0.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.23938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_two_1.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.24322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_two_1.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.24322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_two_2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.24802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect4_invalid_two_2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.24802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_options.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.25762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_options.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.25762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_port.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_port.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_timeout_0.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_timeout_0.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_timeout_1.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26339.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_invalid_timeout_1.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26339.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_sock_not_passive.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_sock_not_passive.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_sock_not_tcp.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26978.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_sock_not_tcp.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.26978.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_timeout.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.27810.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.connect_timeout.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.27810.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.daemon_sock_not_passive.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28483.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.daemon_sock_not_passive.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28483.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.daemon_sock_not_tcp.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.daemon_sock_not_tcp.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.encode_decode_pty_opts.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.encode_decode_pty_opts.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28803.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28803.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28930.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.28930.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_disabled.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2916.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_disabled.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.2916.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_erlang_term.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.29475.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_erlang_term.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.29475.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_erlang_term_non_default_shell.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.29794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_erlang_term_non_default_shell.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.29794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_shell_disabled.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.29987.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.exec_shell_disabled.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.29987.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_long_start.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_long_start.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_long_start_no_nl.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.30499.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_long_start_no_nl.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.30499.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_start.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.30787.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_start.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.30787.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_version.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.30978.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.gracefull_invalid_version.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.30978.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.31330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.31330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.31395.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.31395.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.interrupted_send.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.33251.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.interrupted_send.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.33251.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.kex_error.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.kex_error.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.max_channels_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.34019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.max_channels_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.34019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.new_shell_dumb_term.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3427.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.new_shell_dumb_term.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3427.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.new_shell_xterm_term.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.34467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.new_shell_xterm_term.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.34467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.no_sensitive_leak.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.34755.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.no_sensitive_leak.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.34755.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.ptty_alloc.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35139.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.ptty_alloc.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35139.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.ptty_alloc_default.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35523.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.ptty_alloc_default.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35523.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.ptty_alloc_pixel.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.ptty_alloc_pixel.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.send_after_exit.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.send_after_exit.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.35970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.36130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.36130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec_more_data.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec_more_data.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.3618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec_sock.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.38658.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec_sock.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.38658.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec_two_socks.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39011.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.simple_exec_two_socks.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39011.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.small_cat.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39075.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.small_cat.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39075.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.small_interrupted_send.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39267.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.small_interrupted_send.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39267.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_exec_direct_fun1_read_write.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39843.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_exec_direct_fun1_read_write.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39843.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_exec_direct_fun1_read_write_advanced.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_exec_direct_fun1_read_write_advanced.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.39970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.40898.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.40898.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.41890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.41890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.42274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.42274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun1_error.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.42498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun1_error.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.42498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun1_error_type.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.42658.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun1_error_type.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.42658.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.43330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.43330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun3.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.44290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun3.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.44290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun_more_data.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.44962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_direct_fun_more_data.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.44962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_fun.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.45698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_fun.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.45698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_fun2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.45762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_fun2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.45762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_fun3.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.46370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_exec_fun3.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.46370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_pty.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.46722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_pty.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.46722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_sock_daemon_exec.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.46850.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_sock_daemon_exec.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.46850.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_sock_daemon_exec_multi.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.47010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_sock_daemon_exec_multi.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.47010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_sock_exec_fun.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.47330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_shell_sock_exec_fun.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.47330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_subsystem_on_closed_channel.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.47778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.start_subsystem_on_closed_channel.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.47778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.stop_listener.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.49282.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.stop_listener.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.49282.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.trap_exit_connect.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.49762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.trap_exit_connect.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.49762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.trap_exit_daemon.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.50146.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_connection_suite.trap_exit_daemon.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.50146.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.all_dbg.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.5026.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.all_dbg.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.5026.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.cb_basic.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.51714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.cb_basic.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.51714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.cb_macros_print.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.5538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.cb_macros_print.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.5538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.cb_print.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.6274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.cb_print.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.6274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_alg_terminate.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.6626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_alg_terminate.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.6626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_authentication.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.6756.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_authentication.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.6756.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_basic.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.9827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_basic.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.9827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_channels.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_channels.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_algorithms_suite.sshd_simple_exec.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_connections.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.app_test.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_connections.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.app_test.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_ssh_messages.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.appup_test.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.dbg_ssh_messages.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.appup_test.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.cli.53730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.cli.53730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.cli_exit_normal.53634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.cli_exit_normal.53634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.cli_exit_status.53794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_dbg_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.cli_exit_status.53794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.end_per_group.48323.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.close.16932.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.end_per_group.48323.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.close.16932.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.daemon_already_started.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.daemon_already_started.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.daemon_error_closes_port.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.daemon_error_closes_port.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.init_per_group.48227.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.daemon_opt_fd.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.init_per_group.48227.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.daemon_opt_fd.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.double_close.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.double_close.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.17284.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.17284.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.simple_connect.48259.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.41795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.simple_connect.48259.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.41795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.simple_connect.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.41987.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.simple_connect.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.41987.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.54722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_engine_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.54722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_method_kb_interactive_data_fun3.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.54754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_method_kb_interactive_data_fun3.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.54754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_method_kb_interactive_data_fun4.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_method_kb_interactive_data_fun4.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_method_kb_interactive_data_tuple.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_method_kb_interactive_data_tuple.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_none.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec.53762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.auth_none.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec.53762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.config_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec_compressed.53666.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.config_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec_compressed.53666.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.config_file_modify_algorithms_order.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec_with_io_in.53698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.config_file_modify_algorithms_order.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec_with_io_in.53698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.connectfun_disconnectfun_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec_with_io_out.53538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.connectfun_disconnectfun_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.exec_with_io_out.53538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.connectfun_disconnectfun_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.idle_time_client.16740.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.connectfun_disconnectfun_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.idle_time_client.16740.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_algs.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.idle_time_server.41315.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_algs.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.idle_time_server.41315.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_algs_conf_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.inet6_option.16836.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_algs_conf_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.inet6_option.16836.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_algs_connect.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.inet_option.16804.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_algs_connect.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.inet_option.16804.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_simple.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.41731.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.daemon_replace_options_simple.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.41731.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.disconnectfun_option_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.41827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.disconnectfun_option_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.41827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.disconnectfun_option_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.42019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.disconnectfun_option_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.42019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.end_per_group.56867.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.52738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.end_per_group.56867.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.52738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.53506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.53506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_list.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.internal_error.41763.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_list.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.internal_error.41763.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_md5.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.key_callback.42051.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_md5.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.key_callback.42051.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.key_callback_options.54626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.key_callback_options.54626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha256.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.known_hosts.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha256.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.known_hosts.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha384.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry1.54370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha384.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry1.54370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha512.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry2.54338.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.hostkey_fingerprint_check_sha512.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry2.54338.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_no_opt_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry3.54402.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_no_opt_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry3.54402.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_no_opt_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry4.41859.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_no_opt_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry4.41859.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry5.54434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.login_bad_pwd_no_retry5.54434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_client_trail_space.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.max_initial_idle_time.53826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_client_trail_space.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.max_initial_idle_time.53826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.misc_ssh_options.16772.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.misc_ssh_options.16772.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_server_trail_space.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.multi_daemon_opt_fd.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_own_string_server_trail_space.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.multi_daemon_opt_fd.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_random_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.openssh_zlib_basic_test.53858.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_random_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.openssh_zlib_basic_test.53858.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_random_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.packet_size.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.id_string_random_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.packet_size.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.init_per_group.49411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.peername_sockname.53602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.init_per_group.49411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.peername_sockname.53602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.send.53570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.send.53570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.setopts_getopts.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.setopts_getopts.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_log_item_len.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell.16868.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_log_item_len.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell.16868.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_drops_tcp_connects.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_exit_status.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_drops_tcp_connects.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_exit_status.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_sftp_start_channel_parallel.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_no_unicode.16900.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_sftp_start_channel_parallel.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_no_unicode.16900.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_sftp_start_channel_sequential.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_socket.5.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_sftp_start_channel_sequential.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_socket.5.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_ssh_connect_parallel.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_ssh_conn.37.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_ssh_connect_parallel.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_ssh_conn.37.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_ssh_connect_sequential.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_unicode_string.16964.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.max_sessions_ssh_connect_sequential.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.shell_unicode_string.16964.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.raw_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.raw_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.save_accepted_host_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_file_is_auth_key.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.save_accepted_host_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_file_is_auth_key.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_keyboard_interactive.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_file_is_host_key.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_keyboard_interactive.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_file_is_host_key.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_keyboard_interactive_extra_msg.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_file_is_host_key_misc.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_keyboard_interactive_extra_msg.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_file_is_host_key_misc.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_password_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_info_print.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_password_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_basic_suite.ssh_info_print.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_pwdfun_4_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.defined_subsystem.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_pwdfun_4_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.defined_subsystem.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_pwdfun_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_pwdfun_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_userpassword_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.server_userpassword_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.noexist_subsystem.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.noexist_subsystem.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_arg4_timeout.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_arg4_timeout.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_negtimeout_parallel.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.subsystem_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_negtimeout_parallel.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.subsystem_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_negtimeout_sequential.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.undefined_subsystem.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_negtimeout_sequential.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_chan_behaviours_suite.undefined_subsystem.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_nonegtimeout_connected_parallel.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_collect_labmachine_info_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_nonegtimeout_connected_parallel.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_collect_labmachine_info_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_nonegtimeout_connected_sequential.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_collect_labmachine_info_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_nonegtimeout_connected_sequential.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_collect_labmachine_info_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_timeout.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.big_cat.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_connect_timeout.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.big_cat.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_daemon_minimal_remote_max_packet_size_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect2_invalid_options.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_daemon_minimal_remote_max_packet_size_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect2_invalid_options.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_msg_debug_fun_option_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_both.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_msg_debug_fun_option_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_both.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_msg_debug_fun_option_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_options.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.ssh_msg_debug_fun_option_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_options.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.system_dir_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_port.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.system_dir_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_port.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.unexpectedfun_option_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_timeout_0.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.unexpectedfun_option_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_timeout_0.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.unexpectedfun_option_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_timeout_1.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.unexpectedfun_option_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect3_invalid_timeout_1.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.user_dir_fun_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_three.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.user_dir_fun_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_three.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.user_dir_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_two_0.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_options_suite.user_dir_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_two_0.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.client_sends_info_timing.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_two_1.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.client_sends_info_timing.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_two_1.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.client_server_parallel.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_two_2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.client_server_parallel.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect4_invalid_two_2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.client_server_sequential.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_options.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.client_server_sequential.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_options.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.decode.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_port.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.decode.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_port.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.decode_encode.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_timeout_0.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.decode_encode.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_timeout_0.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.end_per_group.65603.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_timeout_1.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.end_per_group.65603.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_invalid_timeout_1.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_sock_not_passive.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_sock_not_passive.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_sock_not_tcp.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_sock_not_tcp.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.init_per_group.58658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_timeout.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.init_per_group.58658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.connect_timeout.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.daemon_sock_not_passive.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.daemon_sock_not_passive.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.daemon_sock_not_tcp.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.daemon_sock_not_tcp.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.encode_decode_pty_opts.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_property_test_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.encode_decode_pty_opts.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_long_service_name.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_long_service_name.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_service_name.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_service_name.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_service_name_then_correct.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_disabled.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_service_name_then_correct.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_disabled.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_very_long_service_name.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_erlang_term.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.bad_very_long_service_name.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_erlang_term.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_close_after_hello.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_erlang_term_non_default_shell.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_close_after_hello.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_erlang_term_non_default_shell.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_handles_banner_keyboard_interactive.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_shell_disabled.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_handles_banner_keyboard_interactive.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.exec_shell_disabled.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_handles_keyboard_interactive_0_pwds.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_long_start.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_handles_keyboard_interactive_0_pwds.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_long_start.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_info_line.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_long_start_no_nl.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.client_info_line.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_long_start_no_nl.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.empty_service_name.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_start.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.empty_service_name.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_start.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_version.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.gracefull_invalid_version.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.ext_info_c.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.ext_info_c.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.ext_info_s.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.ext_info_s.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_init_option_groups.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.interrupted_send.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_init_option_groups.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.interrupted_send.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_init_option_groups_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.kex_error.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_init_option_groups_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.kex_error.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_init_option_groups_moduli_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.max_channels_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_init_option_groups_moduli_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.max_channels_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_old_request_exact.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.new_shell_dumb_term.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_old_request_exact.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.new_shell_dumb_term.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_old_request_noexact.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.new_shell_xterm_term.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_client_old_request_noexact.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.new_shell_xterm_term.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_server_gex_limit.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.no_sensitive_leak.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.gex_server_gex_limit.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.no_sensitive_leak.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.ptty_alloc.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.ptty_alloc.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.kex_strict_msg_ignore.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.ptty_alloc_default.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.kex_strict_msg_ignore.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.ptty_alloc_default.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.kex_strict_msg_unknown.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.ptty_alloc_pixel.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.kex_strict_msg_unknown.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.ptty_alloc_pixel.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.kex_strict_negotiated.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.send_after_exit.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.kex_strict_negotiated.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.send_after_exit.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_match.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_match.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_no_match.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec_more_data.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_no_match.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec_more_data.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_works_as_client.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec_sock.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_works_as_client.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec_sock.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_works_as_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec_two_socks.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.lib_works_as_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.simple_exec_two_socks.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_append.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.small_cat.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_append.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.small_cat.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_combo.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.small_interrupted_send.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_combo.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.small_interrupted_send.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_prepend.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_prepend.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_rm.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_exec_direct_fun1_read_write.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.modify_rm.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_exec_direct_fun1_read_write.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_common_alg_client_disconnects.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_exec_direct_fun1_read_write_advanced.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_common_alg_client_disconnects.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_exec_direct_fun1_read_write_advanced.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_common_alg_server_disconnects.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_common_alg_server_disconnects.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_ext_info_s1.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_ext_info_s1.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_ext_info_s2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.no_ext_info_s2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.packet_length_too_large.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun1_error.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.packet_length_too_large.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun1_error.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.packet_length_too_short.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun1_error_type.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.packet_length_too_short.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun1_error_type.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.preferred_algorithms.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.preferred_algorithms.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.service_name_length_too_large.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun3.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.service_name_length_too_large.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun3.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.service_name_length_too_short.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun_more_data.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.service_name_length_too_short.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_direct_fun_more_data.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_fun.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_protocol_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_fun.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.check_dsa_disabled.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_fun2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.check_dsa_disabled.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_fun2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.check_rsa_sha1_disabled.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_fun3.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.check_rsa_sha1_disabled.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_exec_fun3.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.chk_known_hosts.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_pty.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.chk_known_hosts.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_pty.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.69283.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_sock_daemon_exec.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.69283.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_sock_daemon_exec.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.70435.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_sock_daemon_exec_multi.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.70435.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_sock_daemon_exec_multi.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.77698.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_sock_exec_fun.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.77698.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_shell_sock_exec_fun.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_subsystem_on_closed_channel.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_dsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.start_subsystem_on_closed_channel.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.68515.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.stop_listener.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.68515.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.stop_listener.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.69347.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.trap_exit_connect.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.69347.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.trap_exit_connect.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.70467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.trap_exit_daemon.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.70467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_connection_suite.trap_exit_daemon.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.all_dbg.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ecdsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.all_dbg.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.31460.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.cb_basic.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.31460.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.cb_basic.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.68611.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.cb_macros_print.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.68611.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.cb_macros_print.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.78594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.cb_print.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.78594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.cb_print.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_alg_terminate.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed25519.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_alg_terminate.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.30244.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_authentication.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.30244.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_authentication.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.70723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_basic.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.70723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_basic.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.78754.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_channels.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.78754.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_channels.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_connections.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_ed448.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_connections.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.31300.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_ssh_messages.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.31300.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.dbg_ssh_messages.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.68419.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.68419.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.69219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.69219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_dbg_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.69443.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.end_per_group.43235.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.69443.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.end_per_group.43235.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.77826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.77826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.79298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.79298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.init_per_group.17732.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_dsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.init_per_group.17732.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.69507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.69507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.77890.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.77890.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.79362.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.simple_connect.43203.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.79362.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.simple_connect.43203.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.simple_connect.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.simple_connect.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.68643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.68643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_engine_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.70659.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_method_kb_interactive_data_fun3.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.70659.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_method_kb_interactive_data_fun3.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.78690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_method_kb_interactive_data_fun4.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.78690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_method_kb_interactive_data_fun4.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_method_kb_interactive_data_tuple.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed25519.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_method_kb_interactive_data_tuple.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.30308.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_none.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.30308.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.auth_none.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.31556.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.config_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.31556.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.config_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.69667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.config_file_modify_algorithms_order.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.69667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.config_file_modify_algorithms_order.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.connectfun_disconnectfun_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_ed448.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.connectfun_disconnectfun_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.30020.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.connectfun_disconnectfun_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.30020.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.connectfun_disconnectfun_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.31428.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_algs.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.31428.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_algs.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.78466.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_algs_conf_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.78466.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_algs_conf_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_algs_connect.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_algs_connect.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_dsa.69859.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_simple.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_dsa.69859.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.daemon_replace_options_simple.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_dsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.disconnectfun_option_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_dsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.disconnectfun_option_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ecdsa.30852.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.disconnectfun_option_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ecdsa.30852.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.disconnectfun_option_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ecdsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.end_per_group.27140.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ecdsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.end_per_group.27140.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed25519.30948.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed25519.30948.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed25519.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed25519.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed448.30884.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed448.30884.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed448.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_list.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_ed448.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_list.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.69987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_md5.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.69987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_md5.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_dsa.70051.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha256.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_dsa.70051.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha256.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_dsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha384.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_dsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha384.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ecdsa.78978.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha512.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ecdsa.78978.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.hostkey_fingerprint_check_sha512.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ecdsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_no_opt_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ecdsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_no_opt_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed25519.31076.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_no_opt_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed25519.31076.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_no_opt_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed25519.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed25519.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed448.70179.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_client_trail_space.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed448.70179.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_client_trail_space.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed448.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_ed448.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.70275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_server_trail_space.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.70275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_own_string_server_trail_space.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_random_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_random_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.69027.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_random_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.69027.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.id_string_random_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.70339.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.init_per_group.44195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.70339.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.init_per_group.44195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.77538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.77538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.68291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_log_item_len.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.68291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_log_item_len.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.69091.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_drops_tcp_connects.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.69091.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_drops_tcp_connects.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.70371.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_sftp_start_channel_parallel.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.70371.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_sftp_start_channel_parallel.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_sftp_start_channel_sequential.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_sftp_start_channel_sequential.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.68355.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_ssh_connect_parallel.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.68355.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_ssh_connect_parallel.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.69155.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_ssh_connect_sequential.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.69155.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.max_sessions_ssh_connect_sequential.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.79138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.raw_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.79138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.raw_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.save_accepted_host_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.save_accepted_host_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.30180.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_keyboard_interactive.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.30180.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_keyboard_interactive.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.69603.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_keyboard_interactive_extra_msg.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.69603.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_keyboard_interactive_extra_msg.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.79458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_password_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.79458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_password_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_pwdfun_4_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_pwdfun_4_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.30340.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_pwdfun_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.30340.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_pwdfun_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.69699.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_userpassword_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.69699.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.server_userpassword_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.70787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.70787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_arg4_timeout.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_arg4_timeout.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.29988.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_negtimeout_parallel.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.29988.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_negtimeout_parallel.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.31140.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_negtimeout_sequential.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.31140.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_negtimeout_sequential.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.78370.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_nonegtimeout_connected_parallel.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.78370.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_nonegtimeout_connected_parallel.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_nonegtimeout_connected_sequential.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_nonegtimeout_connected_sequential.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.30372.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_timeout.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.30372.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_connect_timeout.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.69763.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_daemon_minimal_remote_max_packet_size_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.69763.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_daemon_minimal_remote_max_packet_size_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79618.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_msg_debug_fun_option_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79618.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_msg_debug_fun_option_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_msg_debug_fun_option_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.ssh_msg_debug_fun_option_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79714.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.system_dir_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79714.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.system_dir_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.unexpectedfun_option_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.unexpectedfun_option_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.unexpectedfun_option_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.79842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.unexpectedfun_option_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.user_dir_fun_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.user_dir_fun_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.user_dir_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_options_suite.user_dir_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.30404.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.client_sends_info_timing.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.30404.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.client_sends_info_timing.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.69795.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.client_server_parallel.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.69795.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.client_server_parallel.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.69827.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.client_server_sequential.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.69827.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.client_server_sequential.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.77474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.decode.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.77474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.decode.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.79682.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.decode_encode.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.79682.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.decode_encode.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.79746.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.end_per_group.60195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.79746.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.end_per_group.60195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.79810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.79810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.init_per_group.52195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.init_per_group.52195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_auth_keys.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_auth_keys.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_dsa_public_key.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_dsa_public_key.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_property_test_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_ecdsa_public_key.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_long_service_name.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_ecdsa_public_key.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_long_service_name.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_list.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_service_name.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_list.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_service_name.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_service_name_then_correct.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_service_name_then_correct.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5_implicit.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_very_long_service_name.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5_implicit.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.bad_very_long_service_name.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_close_after_hello.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_close_after_hello.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha256.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_handles_banner_keyboard_interactive.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha256.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_handles_banner_keyboard_interactive.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha384.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_handles_keyboard_interactive_0_pwds.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha384.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_handles_keyboard_interactive_0_pwds.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha512.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_info_line.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha512.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.client_info_line.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_pkcs8.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.empty_service_name.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_hostkey_pkcs8.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.empty_service_name.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_known_hosts.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_known_hosts.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_list_public_key.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.ext_info_c.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_list_public_key.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.ext_info_c.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_openssh_key_long_header.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.ext_info_s.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_openssh_key_long_header.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.ext_info_s.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_openssh_key_with_comment.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_init_option_groups.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_openssh_key_with_comment.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_init_option_groups.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rfc4716_dsa_comment.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_init_option_groups_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rfc4716_dsa_comment.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_init_option_groups_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rfc4716_rsa_comment.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_init_option_groups_moduli_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rfc4716_rsa_comment.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_init_option_groups_moduli_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rfc4716_rsa_subject.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_old_request_exact.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rfc4716_rsa_subject.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_old_request_exact.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rsa_public_key.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_old_request_noexact.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_pubkey_suite.ssh_rsa_public_key.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_client_old_request_noexact.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_server_gex_limit.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.gex_server_gex_limit.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.kex_strict_msg_ignore.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.kex_strict_msg_ignore.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.kex_strict_msg_unknown.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.kex_strict_msg_unknown.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.norekey_limit_client.79970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.kex_strict_negotiated.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.norekey_limit_client.79970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.kex_strict_negotiated.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.norekey_limit_daemon.71011.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_match.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.norekey_limit_daemon.71011.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_match.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey0.79906.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_no_match.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey0.79906.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_no_match.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey1.79938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_works_as_client.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey1.79938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_works_as_client.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey2.31716.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_works_as_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey2.31716.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.lib_works_as_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey3.31620.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_append.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey3.31620.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_append.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey4.31652.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_combo.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey4.31652.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_combo.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_limit_client.31684.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_prepend.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_limit_client.31684.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_prepend.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_limit_daemon.31748.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_rm.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_limit_daemon.31748.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.modify_rm.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_time_limit_client.31780.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_common_alg_client_disconnects.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_time_limit_client.31780.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_common_alg_client_disconnects.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_time_limit_daemon.31812.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_common_alg_server_disconnects.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.rekey_time_limit_daemon.31812.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_common_alg_server_disconnects.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.renegotiate1.71043.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_ext_info_s1.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.renegotiate1.71043.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_ext_info_s1.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.renegotiate2.80002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_ext_info_s2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.renegotiate2.80002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.no_ext_info_s2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.packet_length_too_large.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_renegotiate_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.packet_length_too_large.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.85250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.packet_length_too_short.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.85250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.packet_length_too_short.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.89090.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.preferred_algorithms.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.89090.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.preferred_algorithms.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.91458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.service_name_length_too_large.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.91458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.service_name_length_too_large.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.95810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.service_name_length_too_short.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.95810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.service_name_length_too_short.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.98178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.98178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_protocol_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.check_dsa_disabled.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.check_dsa_disabled.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.73475.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.check_rsa_sha1_disabled.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.73475.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.check_rsa_sha1_disabled.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.85346.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.chk_known_hosts.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.85346.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.chk_known_hosts.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.91554.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.28324.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.91554.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.28324.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.95874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.28836.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.95874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.28836.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.98274.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.63107.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.98274.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.63107.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_dsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.72771.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.28356.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.72771.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.28356.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.75843.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.63171.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.75843.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.63171.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.84450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.65219.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.84450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.65219.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.90658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.90658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ecdsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.97378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.28996.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.97378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.28996.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.64579.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_read.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.64579.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.84546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.85506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.84546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.85506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.88610.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.88610.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed25519.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.90754.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.63619.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.90754.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.63619.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.94786.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.64803.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.94786.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.64803.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.97474.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.87682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.97474.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.87682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.async_write.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_ed448.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.73731.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.63043.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.73731.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.63043.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.85634.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.86274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.85634.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.86274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.91842.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.87426.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.91842.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.87426.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.96130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.96130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_dsa_to_rsa_sha2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.98562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.28420.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.98562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.28420.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.65283.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.big_file_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.65283.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.74019.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.85410.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.74019.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.85410.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.76579.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.76579.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_dsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.85922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.63363.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.85922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.63363.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.92130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.64483.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.92130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.64483.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.98850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.65347.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.98850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.65347.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.binaries_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ecdsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.74595.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.63459.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.74595.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.63459.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.77219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.64643.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.77219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.64643.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.86690.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.65379.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.86690.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.65379.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.92898.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.92898.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed25519.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.99618.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.63715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.99618.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.63715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.64835.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_16_crypto_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.64835.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.74467.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.65539.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.74467.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.65539.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.86594.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.86594.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_ed448.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.92802.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.63267.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.92802.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.63267.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.96450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.64355.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.96450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.64355.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.99522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.87586.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.99522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.87586.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.block_size_1_crypto_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.85154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_dsa.86658.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.85154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_dsa.86658.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.89058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_dsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.89058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_dsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.91362.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ecdsa.86722.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.91362.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ecdsa.86722.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.95682.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ecdsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.95682.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ecdsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.98082.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed25519.86914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.98082.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed25519.86914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed25519.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.create_empty_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed25519.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.73923.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed448.86818.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.73923.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed448.86818.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.76451.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed448.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.76451.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_ed448.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.85826.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.87010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.85826.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.87010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.92034.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.92034.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.98754.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_dsa.87074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.98754.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_dsa.87074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_dsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.directory_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_dsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.72291.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ecdsa.28516.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.72291.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ecdsa.28516.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.72323.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ecdsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.72323.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ecdsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.73091.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed25519.28580.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.73091.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed25519.28580.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.74723.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed25519.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.74723.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed25519.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.74755.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed448.28644.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.74755.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed448.28644.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.77283.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed448.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.77283.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_ed448.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.77315.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.28676.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.77315.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.28676.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.85058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.85058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_ed448_to_rsa_sha2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.86786.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.62819.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.86786.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.62819.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.86818.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.86114.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.86818.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.86114.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.91266.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.87298.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.91266.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.87298.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.92994.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.92994.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha1_to_dsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.93026.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.62915.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.93026.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.62915.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.93058.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.64195.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.93058.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.64195.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.93154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.65091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.93154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.65091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.95458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.95458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_dsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.97986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.62979.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.97986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.62979.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.99714.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.65155.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.99714.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.65155.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.99746.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.86210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.99746.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.86210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.99874.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.99874.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.63555.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.63555.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.64739.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.64739.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.72643.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.65443.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.72643.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.65443.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.75747.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.75747.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.84354.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.64899.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.84354.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.64899.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.90562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.85634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.90562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.85634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.97282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.87714.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.97282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.87714.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.file_owner_access.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_ed448.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.73795.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.28260.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.73795.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.28260.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.76323.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.28708.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.76323.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.28708.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.85730.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.62755.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.85730.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.62755.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.91938.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.91938.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.98658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.65667.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.98658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.65667.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.85698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_chunked_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.85698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.73667.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.86594.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.73667.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.86594.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.85538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87778.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.85538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87778.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.91746.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87810.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.91746.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87810.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.96098.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87874.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.96098.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87874.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.98466.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.98466.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.87938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.files_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.72387.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.72387.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.73219.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.28452.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.73219.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.28452.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.74787.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.85186.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.74787.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.85186.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.74819.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.85730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.74819.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.85730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.77347.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.86626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.77347.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.86626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.80130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.87842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.80130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.87842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.80162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.87906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.80162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.87906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.81858.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.87970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.81858.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.87970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.83010.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.83010.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.85090.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.85090.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.86850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.86850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.86882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_auth_keys.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.86882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_auth_keys.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.86914.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_dsa_public_key.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.86914.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_dsa_public_key.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.91298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_ecdsa_public_key.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.91298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_ecdsa_public_key.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.93186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_list.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.93186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_list.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.93218.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.93218.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.93250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5_implicit.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.93250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_md5_implicit.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.95618.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.95618.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.96546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha256.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.96546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha256.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.98018.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha384.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.98018.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha384.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha512.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_fingerprint_sha512.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_pkcs8.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_hostkey_pkcs8.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.77955.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_known_hosts.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.77955.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_known_hosts.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.84098.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_list_public_key.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.84098.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_list_public_key.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.88226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_openssh_key_long_header.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.88226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_openssh_key_long_header.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.90306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_openssh_key_with_comment.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.90306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_openssh_key_with_comment.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.94562.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rfc4716_dsa_comment.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.94562.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rfc4716_dsa_comment.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rfc4716_rsa_comment.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.links.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rfc4716_rsa_comment.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.77795.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rfc4716_rsa_subject.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.77795.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rfc4716_rsa_subject.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.83906.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rsa_public_key.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.83906.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_pubkey_suite.ssh_rsa_public_key.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.88034.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.88034.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.90114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.90114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.94306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.94306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.mk_rm_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.74115.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.norekey_limit_client.65763.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.74115.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.norekey_limit_client.65763.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.76675.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.norekey_limit_daemon.65795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.76675.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.norekey_limit_daemon.65795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.86018.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey0.88130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.86018.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey0.88130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.92226.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey1.88194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.92226.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey1.88194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.98946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey2.88162.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.98946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey2.88162.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey3.88226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.null_crypto_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey3.88226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.74947.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey4.88258.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.74947.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey4.88258.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.77507.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_limit_client.88322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.77507.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_limit_client.88322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.83138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_limit_daemon.88290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.83138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_limit_daemon.88290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.87074.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_time_limit_client.88354.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.87074.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_time_limit_client.88354.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.93410.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_time_limit_daemon.65731.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.93410.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.rekey_time_limit_daemon.65731.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.renegotiate1.65827.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.renegotiate1.65827.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.74851.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.renegotiate2.29188.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.74851.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.renegotiate2.29188.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.77411.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.77411.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_renegotiate_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.83042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.103522.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.83042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.103522.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.86946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.106978.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.86946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.106978.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.93282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.92834.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.93282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.92834.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.96610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.open_close_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.96610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.84738.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.99650.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.84738.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.99650.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.88802.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.88802.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.90946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.107074.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.90946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.107074.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.95042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.69059.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.95042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.69059.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.97666.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.71395.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.97666.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.71395.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.92930.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_read.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.92930.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.72899.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.99746.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.72899.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.99746.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.84834.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.84834.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.91042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.102658.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.91042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.102658.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.95170.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.106178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.95170.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.106178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.97762.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.92034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.97762.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.92034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.95810.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.pos_write.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.95810.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.84642.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.98850.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.84642.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.98850.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.88738.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.88738.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_read.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.90850.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.106274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.90850.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.106274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.94914.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.71043.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.94914.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.71043.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.97570.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.92130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.97570.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.92130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.95938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.position.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.95938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.74371.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.98946.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.74371.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.98946.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.86498.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.86498.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.async_write.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.92706.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.100034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.92706.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.100034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.96354.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.107362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.96354.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.107362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.99426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.69187.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.99426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.69187.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.71683.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_crypto_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.71683.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.75075.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.93218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.75075.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.93218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.77699.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.77699.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.big_file_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.83330.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.100322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.83330.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.100322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.87330.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.103906.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.87330.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.103906.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.93602.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.107650.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.93602.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.107650.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.93506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.93506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.75011.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.97218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.75011.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.97218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.77603.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.77603.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.binaries_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.83234.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.101090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.83234.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.101090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.87202.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.104514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.87202.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.104514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.93538.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.108418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.93538.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.108418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.69859.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.69859.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.32164.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.94274.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.32164.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.94274.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.74275.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.74275.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_16_crypto_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.86402.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.100994.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.86402.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.100994.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.92610.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.104386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.92610.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.104386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.99330.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.108322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.99330.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.108322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.69795.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_null_crypto_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.69795.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.76899.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.94178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.76899.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.94178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.86306.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.86306.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.block_size_1_crypto_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.89634.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.103394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.89634.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.103394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.92514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.106882.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.92514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.106882.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.99234.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.92738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.99234.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.92738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.96546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.read_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.96546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.77891.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.99554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.77891.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.99554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.84002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.84002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.create_empty_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.88130.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.100226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.88130.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.100226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.90210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.107554.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.90210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.107554.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.94434.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.71811.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.94434.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.71811.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.93410.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.remove_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.93410.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.83810.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.97090.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.83810.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.97090.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.87906.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.87906.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.directory_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.90018.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101186.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.90018.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101186.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.94178.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101218.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.94178.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101218.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.96962.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101250.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.96962.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101250.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101346.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.rename_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.101346.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.77987.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.104610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.77987.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.104610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.84162.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.104642.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.84162.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.104642.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.88322.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.106786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.88322.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.106786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.90370.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.108514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.90370.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.108514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.94658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.108546.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.94658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.108546.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.108674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.retrieve_attributes.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.108674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.75651.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.67747.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.75651.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.67747.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.84258.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.67779.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.84258.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.67779.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.88450.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.69955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.88450.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.69955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.90466.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.69987.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.90466.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.69987.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.97186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.71299.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.97186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.71299.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.92642.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.set_attributes.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.92642.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_nonexistent_subsystem.99778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.94370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_nonexistent_subsystem.99778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.94370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_nonexistent_subsystem.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.94402.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_nonexistent_subsystem.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.94402.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.83714.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.96386.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.83714.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.96386.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.87778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.99458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.87778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.99458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.89922.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.89922.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.94050.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.94050.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.96866.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.102530.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.96866.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.102530.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.106082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.sftp_read_big_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.106082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.74243.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.68515.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.74243.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.68515.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.76803.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.91938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.76803.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.91938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.86210.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.98754.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.86210.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.98754.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.92418.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.92418.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.file_owner_access.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.99138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.100130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.99138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.100130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.107458.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_big.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.107458.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.86114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.71715.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.86114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.71715.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.89442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.93314.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.89442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.93314.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.92322.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.96994.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.92322.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.96994.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.96258.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.96258.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_chunked_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.99042.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.107266.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.99042.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.107266.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.69123.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.simple_crypto_tar_small.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.69123.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.71587.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.71587.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.72995.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.93122.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.72995.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.93122.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.84930.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.99938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.84930.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.99938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.91138.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.91138.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.files_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.95298.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.101378.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.95298.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.101378.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.97858.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.101410.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.97858.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.101410.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.101442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.start_channel_sock.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.101442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.73539.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.103298.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.73539.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.103298.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.85442.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.104674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.85442.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.104674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.91650.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.104738.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.91650.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.104738.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.96002.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.106818.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.96002.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.106818.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.98370.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.29476.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.98370.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.29476.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.65955.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.65955.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.version_option.73123.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.67811.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.version_option.73123.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.67811.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.version_option.95490.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.67875.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.version_option.95490.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.67875.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.version_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.70019.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.version_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.70019.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.75331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.89698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.75331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.89698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.83618.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.92674.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.83618.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.92674.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.87714.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.94434.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.87714.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.94434.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.93986.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.94466.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.93986.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.94466.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.96770.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.94498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.96770.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.94498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.96482.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_big_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.96482.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.75171.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.97634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.75171.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.97634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.83426.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.99490.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.83426.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.99490.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.87458.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.87458.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.93730.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.93730.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.96578.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.105826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.96578.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.105826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.70915.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.70915.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.75235.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.91682.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.75235.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.91682.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.83522.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.95490.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.83522.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.95490.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.87586.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.98498.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.87586.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.98498.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.93858.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.93858.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.links.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.96674.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.102178.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.96674.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.102178.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.105634.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftp_suite.write_file_iolist.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.105634.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.close_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.91490.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.close_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.91490.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.95234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.95234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.file_cb.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.98306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.file_cb.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.98306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.mk_rm_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.list_dir_limited.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.100418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.list_dir_limited.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.100418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.quit.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.103970.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.quit.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.103970.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.root_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.107746.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.root_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.107746.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.29508.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.29508.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.ver6_basic.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.93602.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_erlclient_suite.ver6_basic.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.93602.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.access_outside_root.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.access_outside_root.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.null_crypto_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.104866.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.104866.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.70275.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.70275.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.links.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.90786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.links.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.90786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.mk_rm_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.94626.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.mk_rm_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.94626.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_close_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.97666.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_close_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.97666.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_close_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_close_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_file_dir_v5.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.101474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_file_dir_v5.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.101474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_file_dir_v6.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.104770.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.open_file_dir_v6.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.104770.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.read_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.70051.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.read_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.70051.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.read_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.90690.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.read_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.90690.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.real_path.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.94530.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.real_path.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.94530.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.relative_path.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.relative_path.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.open_close_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.relpath.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.102978.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.relpath.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.102978.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.remove_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.106466.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.remove_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.106466.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.rename_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.92322.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.rename_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.92322.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.retrieve_attributes.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.96130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.retrieve_attributes.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.96130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.root_with_cwd.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.99138.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.root_with_cwd.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.99138.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.set_attributes.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.set_attributes.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_read.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.106562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.106562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.sshd_read_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.71075.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.sshd_read_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.71075.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.ver3_open_flags.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.92418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.ver3_open_flags.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.92418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.ver3_rename.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.96194.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.ver3_rename.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.96194.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.ver6_basic.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.99234.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.ver6_basic.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.99234.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.write_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sftpd_suite.write_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.pos_write.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.default_tree.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.102850.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.default_tree.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.102850.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.106370.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.106370.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.92226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.92226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.killed_acceptor_restarts.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.96034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.killed_acceptor_restarts.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.96034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.shell_channel_tree.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.99042.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.shell_channel_tree.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.99042.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.position.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.sshc_subtree.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.100898.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.sshc_subtree.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.100898.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.sshd_subtree.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.104290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.sshd_subtree.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.104290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.sshd_subtree_profile.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.108226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_sup_suite.sshd_subtree_profile.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.108226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.eclient_oserver_kex_strict.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.69667.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.eclient_oserver_kex_strict.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.69667.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.101218.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.94082.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.101218.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.94082.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.101378.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.101378.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_crypto_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.101506.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.105058.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.101506.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.105058.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.68163.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.68163.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.70467.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.70467.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.erlang_server_openssh_client_renegotiate.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.90914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.erlang_server_openssh_client_renegotiate.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.90914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.erlang_shell_client_openssh_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.97794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.erlang_shell_client_openssh_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.97794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.eserver_oclient_kex_strict.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.eserver_oclient_kex_strict.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.exec_direct_with_io_in_sshc.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.104962.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.exec_direct_with_io_in_sshc.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.104962.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.exec_with_io_in_sshc.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.68035.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.exec_with_io_in_sshc.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.68035.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.101250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.70339.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.101250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.70339.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.101282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.90882.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.101282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.90882.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.79331.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.97730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.79331.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.97730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.100802.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.100802.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.104226.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.104226.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_in_erlclient_erlserver.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.108130.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_in_erlclient_erlserver.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.108130.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_in_erlclient_openssh_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.93986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_in_erlclient_openssh_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.93986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_in_non_erlclient_erlserver.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.97506.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_in_non_erlclient_erlserver.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.97506.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_out_erlclient_erlserver.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_out_erlclient_erlserver.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_null_crypto_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_out_erlclient_openssh_server.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.100706.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_out_erlclient_openssh_server.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.100706.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_out_non_erlclient_erlserver.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.108034.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/ssh_to_openssh_suite.tunnel_out_non_erlclient_erlserver.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.108034.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.2914.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.72131.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.2914.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.72131.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.2978.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.93890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.2978.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.93890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.3746.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.97474.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.3746.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.97474.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.3970.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.3970.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.read_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.4546.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.105730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.4546.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.105730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.70787.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.70787.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.2882.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.91586.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.2882.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.91586.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.2946.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.95362.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.2946.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.95362.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.3010.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.98402.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.3010.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.98402.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.3778.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.3778.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.remove_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.4514.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.102050.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.4514.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.102050.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.105538.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ct_framework.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.105538.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.character.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.91394.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.character.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.91394.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.erlang_display.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.95106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.erlang_display.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.95106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.float.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.98210.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.float.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.98210.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.integer.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.integer.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.rename_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.quote.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.102306.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.quote.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.102306.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.snprintf.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.105890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.snprintf.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.105890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.91746.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.91746.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.string.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.95618.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erl_print_suite.string.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.95618.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.arg_overflow.163.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.98562.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.arg_overflow.163.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.98562.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.arg_overflow.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.arg_overflow.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.retrieve_attributes.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_erl.34.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.102402.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_erl.34.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.102402.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_erl.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.105986.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_erl.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.105986.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_mib.67.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.68419.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_mib.67.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.68419.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_mib.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.91842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_mib.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.91842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_script.35.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.98658.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_script.35.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.98658.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_script.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_script.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.set_attributes.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_yecc.3.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_nonexistent_subsystem.108578.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_yecc.3.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_nonexistent_subsystem.108578.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_yecc.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_nonexistent_subsystem.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.compile_yecc.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_nonexistent_subsystem.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.deep_cwd.131.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.101922.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.deep_cwd.131.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.101922.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.deep_cwd.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.105442.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.deep_cwd.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.105442.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_group.1154.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.91298.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_group.1154.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.91298.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_group.2658.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.95010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_group.2658.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.95010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.98114.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.98114.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.sftp_read_big_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features.2626.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.100610.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features.2626.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.100610.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.107938.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.107938.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_all.1794.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.29572.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_all.1794.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.29572.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_all.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.72035.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_all.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.72035.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_atom_warnings.1314.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.93794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_atom_warnings.1314.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.93794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_atom_warnings.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_atom_warnings.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_big.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_directives.1282.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.100514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_directives.1282.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.100514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_directives.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.104066.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_directives.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.104066.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_disable.1698.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.107842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_disable.1698.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.107842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_disable.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.29540.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_disable.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.29540.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_describe.1218.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.93698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_describe.1218.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.93698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_describe.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_describe.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.simple_crypto_tar_small.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_unknown.1250.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_unknown.1250.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_unknown.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.103106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_erlc_unknown.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.103106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_include.2338.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.106658.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_include.2338.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.106658.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_include.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.92514.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_include.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.92514.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_load.2018.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.96290.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_load.2018.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.96290.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_load.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.99330.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_load.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.99330.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_macros.1346.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_macros.1346.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.start_channel_sock.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_macros.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.107170.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_macros.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.107170.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_runtime.2114.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.69091.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_runtime.2114.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.69091.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_runtime.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.71491.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.features_runtime.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.71491.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.good_citizen.99.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.93026.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.good_citizen.99.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.93026.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.good_citizen.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.99842.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.good_citizen.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.99842.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_group.1186.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_group.1186.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_group.2.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.version_option.103202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_group.2.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.version_option.103202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_group.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.version_option.96418.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_group.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.version_option.96418.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.version_option.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.version_option.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.make_dep_options.195.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.105346.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.make_dep_options.195.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.105346.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.make_dep_options.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.70691.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.make_dep_options.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.70691.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.91202.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.91202.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.unicode_paths.227.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.94914.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.unicode_paths.227.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.94914.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.unicode_paths.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.98018.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlc_suite.unicode_paths.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.98018.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.args_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.args_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_big_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.args_file_env.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.101698.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.args_file_env.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.101698.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.argument_separation.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.105154.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.argument_separation.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.105154.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.argument_with_option.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.68259.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.argument_with_option.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.68259.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.91010.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.91010.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.env.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.97826.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.env.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.97826.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.evil_args_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.evil_args_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.101762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.101762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.missing_args_file.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.105250.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.missing_args_file.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.105250.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.otp_7461.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.91106.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.otp_7461.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.91106.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.94786.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.94786.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.zdbbl_dist_buf_busy_limit.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.97922.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/erlexec_suite.zdbbl_dist_buf_busy_limit.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.97922.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.atomic.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.atomic.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftp_suite.write_file_iolist.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.broadcast.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.close_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.broadcast.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.close_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.cond_wait.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.cond_wait.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.create_join_thread.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.file_cb.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.create_join_thread.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.file_cb.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.detached_thread.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.detached_thread.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.dw_atomic_massage.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.list_dir_limited.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.dw_atomic_massage.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.list_dir_limited.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.equal_tids.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.quit.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.equal_tids.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.quit.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.max_threads.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.root_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.max_threads.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.root_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.mutex.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.mutex.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.rwmutex.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.ver6_basic.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.rwmutex.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_erlclient_suite.ver6_basic.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.rwspinlock.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.access_outside_root.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.rwspinlock.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.access_outside_root.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.spinlock.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.spinlock.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.thread_name.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.links.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.thread_name.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.links.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.try_lock_mutex.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.mk_rm_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.try_lock_mutex.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.mk_rm_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.tsd.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_close_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/ethread_suite.tsd.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_close_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.'bin white space'.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_close_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.'bin white space'.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_close_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_default.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_file_dir_v5.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_default.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_file_dir_v5.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_default_dirty.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_file_dir_v6.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_default_dirty.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.open_file_dir_v6.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_dirname_fail.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.read_dir.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_dirname_fail.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.read_dir.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_no_srcfile.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.read_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_no_srcfile.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.read_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_no_use_dirname_fail.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.real_path.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_no_use_dirname_fail.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.real_path.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_not_abs.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.relative_path.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_not_abs.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.relative_path.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_ok_symlink.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.relpath.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_ok_symlink.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.relpath.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_outside_eprfx.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.remove_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_outside_eprfx.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.remove_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_outside_eprfx_dirty.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.rename_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_outside_eprfx_dirty.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.rename_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_same_dir.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.retrieve_attributes.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_same_dir.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.retrieve_attributes.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_unreachable_absolute.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.root_with_cwd.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_unreachable_absolute.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.root_with_cwd.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_unreachable_relative.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.set_attributes.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_unreachable_relative.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.set_attributes.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_unreasonable_path.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.bin_unreasonable_path.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.sshd_read_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.sshd_read_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.ver3_open_flags.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.ver3_open_flags.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.ver3_rename.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/install_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.ver3_rename.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/nt_suite.nt.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.ver6_basic.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/nt_suite.nt.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.ver6_basic.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/nt_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.write_file.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/nt_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sftpd_suite.write_file.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.call_to_deprecated.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.default_tree.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.call_to_deprecated.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.default_tree.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.call_to_now_0.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.call_to_now_0.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.call_to_size_1.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.call_to_size_1.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.deprecated_not_in_obsolete.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.killed_acceptor_restarts.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.deprecated_not_in_obsolete.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.killed_acceptor_restarts.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.shell_channel_tree.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.shell_channel_tree.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.erl_file_encoding.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.erl_file_encoding.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.sshc_subtree.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.sshc_subtree.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.obsolete_but_not_deprecated.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.sshd_subtree.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.obsolete_but_not_deprecated.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.sshd_subtree.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.runtime_dependencies_functions.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.sshd_subtree_profile.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.runtime_dependencies_functions.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_sup_suite.sshd_subtree_profile.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.runtime_dependencies_modules.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.eclient_oserver_kex_strict.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.runtime_dependencies_modules.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.eclient_oserver_kex_strict.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.109730.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.109730.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.strong_components.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.109890.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.strong_components.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.109890.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.test_runtime_dependencies_versions.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.110050.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.test_runtime_dependencies_versions.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.110050.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.undefined_functions.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.undefined_functions.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.xml_file_encoding.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/otp_suite.xml_file_encoding.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.end_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/parallel_messages_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.erlang_server_openssh_client_renegotiate.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/parallel_messages_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.erlang_server_openssh_client_renegotiate.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/parallel_messages_suite.test_message_queue_data_switching.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.erlang_shell_client_openssh_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/parallel_messages_suite.test_message_queue_data_switching.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.erlang_shell_client_openssh_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/parallel_messages_suite.test_throughput_benchmark.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.eserver_oclient_kex_strict.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/parallel_messages_suite.test_throughput_benchmark.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.eserver_oclient_kex_strict.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.basic.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.exec_direct_with_io_in_sshc.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.basic.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.exec_direct_with_io_in_sshc.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.defunct.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.exec_with_io_in_sshc.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.defunct.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.exec_with_io_in_sshc.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.heavier.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.109570.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.heavier.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.109570.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.heavy.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.109762.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.heavy.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.109762.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.sleepy_child.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.109794.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.sleepy_child.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.109794.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/run_erl_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_group.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.ancient_major.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_suite.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.ancient_major.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.init_per_suite.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.end_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.end_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.init_per_suite.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_in_erlclient_erlserver.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.init_per_suite.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_in_erlclient_erlserver.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.major.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_in_erlclient_openssh_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.major.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_in_erlclient_openssh_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.minor.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_in_non_erlclient_erlserver.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.minor.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_in_non_erlclient_erlserver.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_out_erlclient_erlserver.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/upgrade_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_out_erlclient_erlserver.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/z_suite.core_files.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_out_erlclient_openssh_server.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/z_suite.core_files.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_out_erlclient_openssh_server.html diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/z_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_out_non_erlclient_erlserver.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/z_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/ssh_to_openssh_suite.tunnel_out_non_erlclient_erlserver.html diff --git a/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.log b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.log new file mode 100644 index 0000000000000..48d154157ea9a --- /dev/null +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.log @@ -0,0 +1,15494 @@ +=== Suite started at 2025-01-10 18:55:39 +=== Starting test, 1557 test cases +=cases 1557 +=user otptest +=host c7ed2a2b61d4 +=hosts c7ed2a2b61d4 +=emulator_vsn 15.2 +=emulator beam +=otp_release 27 +=started 2025-01-10 18:55:39 +=case ssh_agent_SUITE:init_per_suite +=logfile ssh_agent_suite.init_per_suite.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.009193s +=case ssh_agent_SUITE:request_identities +=logfile ssh_agent_suite.request_identities.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.004010s +=case ssh_agent_SUITE:sign_request +=logfile ssh_agent_suite.sign_request.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.002781s +=case ssh_agent_SUITE:connect_with_ssh_agent +=logfile ssh_agent_suite.connect_with_ssh_agent.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.054438s +=case ssh_agent_SUITE:end_per_suite +=logfile ssh_agent_suite.end_per_suite.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.001215s +=group_time 0.172s +=case ssh_algorithms_SUITE:init_per_suite +=logfile ssh_algorithms_suite.init_per_suite.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.048592s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.html +=group_props [{name,kex}] +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.000017s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.67.html +=group_props [{name,'curve25519-sha256'}] +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.002706s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.004890s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:39 +=result ok +=elapsed 0.008834s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.html +=started 2025-01-10 18:55:39 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.011989s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.114949s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.html +=group_props [{name,'curve25519-sha256'}] +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.000414s +=group_time 0.264s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.259.html +=group_props [{name,'curve25519-sha256@libssh.org'}] +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.002622s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.1378.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.004780s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.1442.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.005903s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.36.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.006639s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.100.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.114686s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.164.html +=group_props [{name,'curve25519-sha256@libssh.org'}] +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.000470s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.196.html +=group_props [{name,'curve448-sha512'}] +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.002333s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.1506.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.006352s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.387.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.006665s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.451.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.007730s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.356.html +=group_props [{name,'curve448-sha512'}] +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.000460s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.388.html +=group_props [{name,'diffie-hellman-group-exchange-sha1'}] +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.002006s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.420.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.040660s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.516.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.041758s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.612.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:40 +=result ok +=elapsed 0.042541s +=case ssh_algorithms_SUITE:simple_exec_groups +=logfile ssh_algorithms_suite.simple_exec_groups.html +=started 2025-01-10 18:55:40 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.303431s +=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_large +=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_large.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.002560s +=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_small +=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_small.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.002506s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.963.html +=group_props [{name,'diffie-hellman-group-exchange-sha1'}] +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.000406s +=group_time 0.604s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.1858.html +=group_props [{name,'diffie-hellman-group-exchange-sha256'}] +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.002578s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.1890.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.040987s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.1954.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.041720s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.1986.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.042203s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.2018.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.149634s +=case ssh_algorithms_SUITE:simple_exec_groups +=logfile ssh_algorithms_suite.simple_exec_groups.2082.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.305128s +=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_large +=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_large.2562.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:41 +=result ok +=elapsed 0.002719s +=case ssh_algorithms_SUITE:simple_exec_groups_no_match_too_small +=logfile ssh_algorithms_suite.simple_exec_groups_no_match_too_small.1476.html +=started 2025-01-10 18:55:41 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.003163s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.1540.html +=group_props [{name,'diffie-hellman-group-exchange-sha256'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.000431s +=group_time 0.782s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.1572.html +=group_props [{name,'diffie-hellman-group1-sha1'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.002124s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.2626.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.005327s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.2658.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.006571s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.2690.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.007278s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.1668.html +=group_props [{name,'diffie-hellman-group1-sha1'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.000578s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.1700.html +=group_props [{name,'diffie-hellman-group14-sha1'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.002220s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.1732.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.011308s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.1796.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.012359s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.1860.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.013116s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.1987.html +=group_props [{name,'diffie-hellman-group14-sha1'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.000502s +=group_time 0.134s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.2019.html +=group_props [{name,'diffie-hellman-group14-sha256'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.002402s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.2051.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.011241s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.2115.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.014959s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.2179.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.013161s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.2211.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.117120s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.2243.html +=group_props [{name,'diffie-hellman-group14-sha256'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.000634s +=group_time 0.277s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.1956.html +=group_props [{name,'diffie-hellman-group16-sha512'}] +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.002545s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.1988.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.044954s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.2084.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.045443s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.2180.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:42 +=result ok +=elapsed 0.046531s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.2276.html +=started 2025-01-10 18:55:42 +=ended 2025-01-10 18:55:43 +=result ok +=elapsed 0.136193s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.2340.html +=group_props [{name,'diffie-hellman-group16-sha512'}] +=started 2025-01-10 18:55:43 +=ended 2025-01-10 18:55:43 +=result ok +=elapsed 0.000563s +=group_time 0.398s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.2372.html +=group_props [{name,'diffie-hellman-group18-sha512'}] +=started 2025-01-10 18:55:43 +=ended 2025-01-10 18:55:43 +=result ok +=elapsed 0.002475s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.2404.html +=started 2025-01-10 18:55:43 +=ended 2025-01-10 18:55:43 +=result ok +=elapsed 0.281888s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.2468.html +=started 2025-01-10 18:55:43 +=ended 2025-01-10 18:55:43 +=result ok +=elapsed 0.282523s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.2532.html +=started 2025-01-10 18:55:43 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.283059s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.2371.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.267859s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.2435.html +=group_props [{name,'diffie-hellman-group18-sha512'}] +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.000515s +=group_time 1.238s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.2467.html +=group_props [{name,'ecdh-sha2-nistp256'}] +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.002213s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.2499.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.006098s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.2882.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.005623s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.2946.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.006836s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.3010.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.112153s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.2659.html +=group_props [{name,'ecdh-sha2-nistp256'}] +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.000517s +=group_time 0.252s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3042.html +=group_props [{name,'ecdh-sha2-nistp384'}] +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.002175s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3074.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.008505s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3170.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.009434s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.3266.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.010269s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.3330.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.118375s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3362.html +=group_props [{name,'ecdh-sha2-nistp384'}] +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.000639s +=group_time 0.270s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3394.html +=group_props [{name,'ecdh-sha2-nistp521'}] +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.002257s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3426.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.005988s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3490.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:44 +=result ok +=elapsed 0.006862s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.3554.html +=started 2025-01-10 18:55:44 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.007688s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.3618.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.116228s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3682.html +=group_props [{name,'ecdh-sha2-nistp521'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.000499s +=group_time 0.261s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3714.html +=group_props [{name,kex}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.000001s +=group_time 5.314s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3746.html +=group_props [{name,cipher}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.000020s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3778.html +=group_props [{name,'3des-cbc'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.002353s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3810.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.005208s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.2660.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.006190s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.2724.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.008847s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3842.html +=group_props [{name,'3des-cbc'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.000875s +=group_time 0.121s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3874.html +=group_props [{name,'AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.002171s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3906.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.005173s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4002.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.006266s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.2883.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.006959s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.2947.html +=group_props [{name,'AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.000479s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.4130.html +=group_props [{name,'AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.002363s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4162.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.005120s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4258.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.005987s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4354.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.006427s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3011.html +=group_props [{name,'AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.000477s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.4418.html +=group_props [{name,'aes128-cbc'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.002206s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4450.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.004857s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4546.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.006453s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4610.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.007084s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3107.html +=group_props [{name,'aes128-cbc'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.000590s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.4674.html +=group_props [{name,'aes128-ctr'}] +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.002137s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4706.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.004707s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4770.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.005724s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4834.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:45 +=result ok +=elapsed 0.006816s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.2916.html +=started 2025-01-10 18:55:45 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.118438s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.2948.html +=group_props [{name,'aes128-ctr'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.000473s +=group_time 0.259s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.2980.html +=group_props [{name,'aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.002534s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3012.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.004974s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3108.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.006018s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4962.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.006756s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.5026.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.115361s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5058.html +=group_props [{name,'aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.000554s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5090.html +=group_props [{name,'aes192-cbc'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.002390s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.5122.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.005043s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3235.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.006398s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5218.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.006981s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5314.html +=group_props [{name,'aes192-cbc'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.000480s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5346.html +=group_props [{name,'aes192-ctr'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.002147s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.5378.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.005772s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5410.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.006356s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5474.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.006517s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.5538.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.115981s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5602.html +=group_props [{name,'aes192-ctr'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.000735s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5634.html +=group_props [{name,'aes256-cbc'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.002090s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.5666.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.005148s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5762.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.006355s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5858.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.007220s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5954.html +=group_props [{name,'aes256-cbc'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.000745s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5986.html +=group_props [{name,'aes256-ctr'}] +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.002090s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6018.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:46 +=result ok +=elapsed 0.005037s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6114.html +=started 2025-01-10 18:55:46 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.005963s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.6210.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.006786s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.6274.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.114671s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6338.html +=group_props [{name,'aes256-ctr'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.000407s +=group_time 0.252s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6370.html +=group_props [{name,'aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.002345s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6402.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.004914s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3331.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.006002s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.3363.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.006155s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.6626.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.114611s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6690.html +=group_props [{name,'aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.000663s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6722.html +=group_props [{name,'chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.002171s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6754.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.004889s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6850.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.006521s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.6946.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.006869s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.3427.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.115698s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3491.html +=group_props [{name,'chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.000683s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3523.html +=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.002334s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3555.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.005140s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3619.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.005972s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.3683.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.008927s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7138.html +=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.000405s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.7170.html +=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.002189s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3715.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.004951s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3779.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:47 +=result ok +=elapsed 0.005736s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.3843.html +=started 2025-01-10 18:55:47 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.008591s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.3907.html +=group_props [{name,'D: cipher 3des-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.000765s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3939.html +=group_props [{name,'D: cipher 3des-cbc + aes128-cbc'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.002171s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3971.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.005273s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4067.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.006097s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4131.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.008938s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.4195.html +=group_props [{name,'D: cipher 3des-cbc + aes128-cbc'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.000562s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.4227.html +=group_props [{name,'D: cipher 3des-cbc + aes128-ctr'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.002030s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4259.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.004755s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7330.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.006521s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7426.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.008780s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7490.html +=group_props [{name,'D: cipher 3des-cbc + aes128-ctr'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.000488s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.7522.html +=group_props [{name,'D: cipher 3des-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.001918s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.7554.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.004967s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7586.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.005797s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7650.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.008333s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7714.html +=group_props [{name,'D: cipher 3des-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.000713s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.7746.html +=group_props [{name,'D: cipher 3des-cbc + aes192-cbc'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.002027s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.7778.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.004841s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7842.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.005940s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4387.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.008473s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7938.html +=group_props [{name,'D: cipher 3des-cbc + aes192-cbc'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.000480s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.7970.html +=group_props [{name,'D: cipher 3des-cbc + aes192-ctr'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.002561s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.8002.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.005217s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8098.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.006023s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8194.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.009196s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8290.html +=group_props [{name,'D: cipher 3des-cbc + aes192-ctr'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.000554s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8322.html +=group_props [{name,'D: cipher 3des-cbc + aes256-cbc'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.002393s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.8354.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.004687s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8418.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.005839s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4515.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.008984s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8482.html +=group_props [{name,'D: cipher 3des-cbc + aes256-cbc'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.000404s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8514.html +=group_props [{name,'D: cipher 3des-cbc + aes256-ctr'}] +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.002245s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.8546.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.004870s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4643.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:48 +=result ok +=elapsed 0.005808s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4707.html +=started 2025-01-10 18:55:48 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.008480s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.4771.html +=group_props [{name,'D: cipher 3des-cbc + aes256-ctr'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.000536s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8674.html +=group_props [{name,'D: cipher 3des-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.002326s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4803.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.004936s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4867.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.005713s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4931.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.008343s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.4995.html +=group_props [{name,'D: cipher 3des-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.000722s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8802.html +=group_props [{name,'D: cipher 3des-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.002582s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.8834.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.004952s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8930.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.006157s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.9026.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.008669s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9122.html +=group_props [{name,'D: cipher 3des-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.000421s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9154.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + 3des-cbc'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.002467s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.5027.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.004788s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5091.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.005737s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5155.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.006313s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5219.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + 3des-cbc'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.000442s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5251.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.002172s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9282.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.004673s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5315.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.005597s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5379.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.006808s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5411.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.000381s +=group_time 0.114s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5443.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-cbc'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.002262s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9442.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.007259s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.9538.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.005817s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.9602.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.007072s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9698.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-cbc'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.000555s +=group_time 0.120s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9730.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-ctr'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.002619s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9762.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.004763s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5539.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.006104s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5635.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.006799s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9826.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-ctr'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.000642s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9858.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.002086s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9890.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.004766s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5763.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.005355s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5827.html +=started 2025-01-10 18:55:49 +=ended 2025-01-10 18:55:49 +=result ok +=elapsed 0.006539s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5859.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.000338s +=group_time 0.113s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10050.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-cbc'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.002422s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10082.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.004814s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3556.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006690s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5923.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006663s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10146.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-cbc'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.000585s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10178.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-ctr'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.002103s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.5955.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.004888s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6019.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006405s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.6083.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006758s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6147.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes192-ctr'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.000502s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.3780.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-cbc'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.002878s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.3812.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.004855s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.3876.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006247s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.3972.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.007412s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.4068.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-cbc'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.000549s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.4100.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-ctr'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.002663s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4132.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.004948s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4228.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.005993s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4324.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006802s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.4388.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-ctr'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.000487s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6243.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.002452s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6275.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.004877s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.10242.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.005693s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.10306.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006514s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6403.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.000711s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6435.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.002532s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6467.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.004995s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6563.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006271s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.10370.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006513s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6691.html +=group_props [{name,'D: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.000536s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6723.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + 3des-cbc'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.002525s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6755.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.005131s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.10434.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006230s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.10498.html +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:50 +=result ok +=elapsed 0.006388s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10562.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + 3des-cbc'}] +=started 2025-01-10 18:55:50 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.000408s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10594.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.002165s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10626.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.004707s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6947.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.005413s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7011.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006396s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10722.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.000345s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.7107.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-cbc'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.002611s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10754.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.005286s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7203.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006505s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7299.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006721s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7363.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-cbc'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.000500s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10818.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-ctr'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.002493s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10850.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.004869s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7427.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006378s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7491.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.007061s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7587.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-ctr'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.000459s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.7619.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.002900s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.7651.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.004972s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7715.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.005783s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7779.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006769s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11010.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.000511s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.11042.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-cbc'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.002017s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11074.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.004663s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7907.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006147s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7971.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.007035s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11202.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-cbc'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.000489s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.11234.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-ctr'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.002364s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11266.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.005156s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8067.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006209s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8131.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006490s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8163.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes192-ctr'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.000569s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8195.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-cbc'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.002748s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11426.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.005249s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.11458.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006400s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11522.html +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:51 +=result ok +=elapsed 0.006422s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11586.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-cbc'}] +=started 2025-01-10 18:55:51 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000676s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.11618.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-ctr'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.002165s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11650.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.004815s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4452.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006269s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4516.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006895s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.4580.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-ctr'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000767s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.4612.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.002036s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4644.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.004627s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4708.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.005982s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.4772.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006244s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11874.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000482s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.11906.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.002392s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.4836.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.005272s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.4932.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006213s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5028.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006666s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11970.html +=group_props [{name,'D: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000433s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12002.html +=group_props [{name,'D: cipher aes128-cbc + 3des-cbc'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.002474s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12034.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.005168s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.12130.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006568s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.12226.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006771s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12290.html +=group_props [{name,'D: cipher aes128-cbc + 3des-cbc'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000805s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12322.html +=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.002881s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12354.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.004784s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8419.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006541s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8451.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.007555s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8515.html +=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000419s +=group_time 0.120s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12514.html +=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.002126s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12546.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.004785s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5124.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006561s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5188.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.006661s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12706.html +=group_props [{name,'D: cipher aes128-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000347s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12738.html +=group_props [{name,'D: cipher aes128-cbc + aes128-ctr'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.002267s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.5220.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.004996s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5284.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.005996s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5348.html +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.007223s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5444.html +=group_props [{name,'D: cipher aes128-cbc + aes128-ctr'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:52 +=result ok +=elapsed 0.000575s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5476.html +=group_props [{name,'D: cipher aes128-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:52 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.002758s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.5508.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.005374s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5604.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006069s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8579.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006876s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8643.html +=group_props [{name,'D: cipher aes128-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.000515s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8675.html +=group_props [{name,'D: cipher aes128-cbc + aes192-cbc'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.002433s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.8707.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.004879s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8771.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006218s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8835.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006833s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12930.html +=group_props [{name,'D: cipher aes128-cbc + aes192-cbc'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.000673s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12962.html +=group_props [{name,'D: cipher aes128-cbc + aes192-ctr'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.002264s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12994.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.005121s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.13090.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.005879s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13154.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006628s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13218.html +=group_props [{name,'D: cipher aes128-cbc + aes192-ctr'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.000364s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13250.html +=group_props [{name,'D: cipher aes128-cbc + aes256-cbc'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.002030s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13282.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.004868s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8995.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006068s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13346.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006793s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9123.html +=group_props [{name,'D: cipher aes128-cbc + aes256-cbc'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.000500s +=group_time 0.114s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9155.html +=group_props [{name,'D: cipher aes128-cbc + aes256-ctr'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.002422s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9187.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.004976s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.13442.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006213s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13506.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006814s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13570.html +=group_props [{name,'D: cipher aes128-cbc + aes256-ctr'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.000831s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13602.html +=group_props [{name,'D: cipher aes128-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.002328s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13634.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.005055s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.13730.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006917s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13826.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.007286s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13922.html +=group_props [{name,'D: cipher aes128-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.000521s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13954.html +=group_props [{name,'D: cipher aes128-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.002500s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13986.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.005092s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.14082.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.006298s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.14178.html +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.007127s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14242.html +=group_props [{name,'D: cipher aes128-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:53 +=result ok +=elapsed 0.000626s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14274.html +=group_props [{name,'D: cipher aes128-ctr + 3des-cbc'}] +=started 2025-01-10 18:55:53 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.002546s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14306.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.005253s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.14370.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.006323s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.14434.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.007149s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14498.html +=group_props [{name,'D: cipher aes128-ctr + 3des-cbc'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.000605s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14530.html +=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.002118s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14562.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.004759s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.5860.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.006355s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.5892.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.007030s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.5956.html +=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.000764s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.5988.html +=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.002579s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6020.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.005158s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6084.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.007126s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.6180.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.007860s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6276.html +=group_props [{name,'D: cipher aes128-ctr + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.000788s +=group_time 0.120s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6308.html +=group_props [{name,'D: cipher aes128-ctr + aes128-cbc'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.002270s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6340.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.005152s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6372.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.006140s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.6436.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.006998s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6500.html +=group_props [{name,'D: cipher aes128-ctr + aes128-cbc'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.000531s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6532.html +=group_props [{name,'D: cipher aes128-ctr + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.002004s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6564.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.005355s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6628.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.006356s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.6692.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.007224s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.6756.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.117298s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.6788.html +=group_props [{name,'D: cipher aes128-ctr + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.000921s +=group_time 0.259s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6820.html +=group_props [{name,'D: cipher aes128-ctr + aes192-cbc'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.002378s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.6852.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.005380s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.6884.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.006444s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.6916.html +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.007694s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14786.html +=group_props [{name,'D: cipher aes128-ctr + aes192-cbc'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.000521s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.6980.html +=group_props [{name,'D: cipher aes128-ctr + aes192-ctr'}] +=started 2025-01-10 18:55:54 +=ended 2025-01-10 18:55:54 +=result ok +=elapsed 0.002150s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.7012.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.005301s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7076.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.006405s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.7108.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.007112s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.9827.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.117582s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9891.html +=group_props [{name,'D: cipher aes128-ctr + aes192-ctr'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.000763s +=group_time 0.259s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9923.html +=group_props [{name,'D: cipher aes128-ctr + aes256-cbc'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.002152s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9955.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.005415s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.10051.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.006430s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.10115.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.006738s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10179.html +=group_props [{name,'D: cipher aes128-ctr + aes256-cbc'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.000401s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10211.html +=group_props [{name,'D: cipher aes128-ctr + aes256-ctr'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.002156s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10243.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.005390s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.10307.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.006088s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.10403.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.007046s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.10467.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.116386s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10499.html +=group_props [{name,'D: cipher aes128-ctr + aes256-ctr'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.000508s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14882.html +=group_props [{name,'D: cipher aes128-ctr + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.002820s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10531.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.005296s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.10595.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.006347s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.14978.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.007118s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.10691.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.116013s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10723.html +=group_props [{name,'D: cipher aes128-ctr + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.000481s +=group_time 0.260s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15074.html +=group_props [{name,'D: cipher aes128-ctr + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:55 +=result ok +=elapsed 0.002369s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15106.html +=started 2025-01-10 18:55:55 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005090s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7300.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005719s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.15202.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006798s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.15266.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.115276s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15330.html +=group_props [{name,'D: cipher aes128-ctr + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.000517s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15362.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + 3des-cbc'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.002205s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15394.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.004873s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.15458.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005901s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.15522.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006683s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7492.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + 3des-cbc'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.000422s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15586.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.002893s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15618.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005058s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.15714.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006075s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.15810.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006239s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7524.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.000373s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15906.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.002490s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15938.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.004998s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.16002.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005931s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16066.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006209s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16130.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.000403s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10787.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-cbc'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.002325s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10819.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005283s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.10915.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005596s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16194.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006457s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16258.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-cbc'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.000578s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16290.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-ctr'}] +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.002430s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11011.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.005008s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.11075.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006025s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11139.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:56 +=result ok +=elapsed 0.006839s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.11203.html +=started 2025-01-10 18:55:56 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.115179s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16354.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes128-ctr'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.000384s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16386.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-cbc'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.002520s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16418.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.004837s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.16482.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006064s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16546.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006657s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.7748.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-cbc'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.000611s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.7780.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-ctr'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.002662s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.7812.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.004938s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.7876.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006249s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16674.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006537s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.16738.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.116346s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16802.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes192-ctr'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.000729s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16834.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-cbc'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.002402s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16866.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.004985s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.11395.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006261s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11491.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006694s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11555.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-cbc'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.000747s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16962.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-ctr'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.002785s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11587.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.005353s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.11683.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006365s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11715.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.006642s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.11779.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.116306s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.17090.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-ctr'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.000727s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.17122.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.002789s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.17154.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:57 +=result ok +=elapsed 0.005244s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.17218.html +=started 2025-01-10 18:55:57 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.005986s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11907.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.006490s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.17314.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.117008s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.17378.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.000543s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.17410.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.002619s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.17442.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.005120s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.17506.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.006464s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.17570.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.006848s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.17634.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.117215s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8004.html +=group_props [{name,'D: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.000522s +=group_time 0.259s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8036.html +=group_props [{name,'D: cipher aes192-cbc + 3des-cbc'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.002158s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.8068.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.005522s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8164.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.006503s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8260.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.007298s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8356.html +=group_props [{name,'D: cipher aes192-cbc + 3des-cbc'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.000699s +=group_time 0.120s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8388.html +=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.002187s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11971.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.005407s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.12067.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.006453s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8452.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.007230s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8516.html +=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.000523s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8548.html +=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.002294s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.17730.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.005383s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8580.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.006185s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.8644.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.007053s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.8708.html +=group_props [{name,'D: cipher aes192-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.000652s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.8740.html +=group_props [{name,'D: cipher aes192-cbc + aes128-cbc'}] +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.002233s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.8772.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:58 +=result ok +=elapsed 0.005331s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.17890.html +=started 2025-01-10 18:55:58 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006437s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.17954.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006953s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12195.html +=group_props [{name,'D: cipher aes192-cbc + aes128-cbc'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.000581s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12227.html +=group_props [{name,'D: cipher aes192-cbc + aes128-ctr'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.001964s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12259.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.004886s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.12323.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006138s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.12355.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.007293s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12419.html +=group_props [{name,'D: cipher aes192-cbc + aes128-ctr'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.000492s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.18146.html +=group_props [{name,'D: cipher aes192-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.002216s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.18178.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.004918s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.18274.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006377s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.18338.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.007446s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.18434.html +=group_props [{name,'D: cipher aes192-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.000610s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.18466.html +=group_props [{name,'D: cipher aes192-cbc + aes192-ctr'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.002400s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.18498.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.005062s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.8932.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006875s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.9028.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006951s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9092.html +=group_props [{name,'D: cipher aes192-cbc + aes192-ctr'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.000619s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9124.html +=group_props [{name,'D: cipher aes192-cbc + aes256-cbc'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.002687s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.18594.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.005138s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.18690.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006493s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.18786.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.007360s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.18882.html +=group_props [{name,'D: cipher aes192-cbc + aes256-cbc'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.000695s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.18914.html +=group_props [{name,'D: cipher aes192-cbc + aes256-ctr'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.001935s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.18946.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.005286s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.19042.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006374s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.19106.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.007429s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.19170.html +=group_props [{name,'D: cipher aes192-cbc + aes256-ctr'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.000801s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.19202.html +=group_props [{name,'D: cipher aes192-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.002890s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.19234.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.005433s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.12515.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.005797s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.12579.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006817s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12643.html +=group_props [{name,'D: cipher aes192-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.000761s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12675.html +=group_props [{name,'D: cipher aes192-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.002958s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.19394.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.005245s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.19458.html +=started 2025-01-10 18:55:59 +=ended 2025-01-10 18:55:59 +=result ok +=elapsed 0.006247s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.12803.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.007630s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12835.html +=group_props [{name,'D: cipher aes192-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.000493s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.19554.html +=group_props [{name,'D: cipher aes192-ctr + 3des-cbc'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.002516s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12867.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.005098s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.19650.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.006519s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.19714.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.007247s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.19778.html +=group_props [{name,'D: cipher aes192-ctr + 3des-cbc'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.000598s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.19810.html +=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.002397s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.19842.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.005371s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.19874.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.006371s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.19938.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.007139s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.20002.html +=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.000636s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13091.html +=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.002272s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13123.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.004966s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.13187.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.005880s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13251.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.007182s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13347.html +=group_props [{name,'D: cipher aes192-ctr + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.000529s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13379.html +=group_props [{name,'D: cipher aes192-ctr + aes128-cbc'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.002146s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13411.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.005050s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.13443.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.005870s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13507.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.007061s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.20226.html +=group_props [{name,'D: cipher aes192-ctr + aes128-cbc'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.000460s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.20258.html +=group_props [{name,'D: cipher aes192-ctr + aes128-ctr'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.002863s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.20290.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.005353s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.20354.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.006395s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.20418.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.007190s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.13667.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.116174s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.20514.html +=group_props [{name,'D: cipher aes192-ctr + aes128-ctr'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.000487s +=group_time 0.260s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.20546.html +=group_props [{name,'D: cipher aes192-ctr + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.002316s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.20578.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.005022s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.20674.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:00 +=result ok +=elapsed 0.006144s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.20770.html +=started 2025-01-10 18:56:00 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.007218s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.20866.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.115943s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.20930.html +=group_props [{name,'D: cipher aes192-ctr + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.000600s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.20962.html +=group_props [{name,'D: cipher aes192-ctr + aes192-cbc'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.002854s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13699.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.004951s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.21026.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.006390s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13795.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.006811s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.21154.html +=group_props [{name,'D: cipher aes192-ctr + aes192-cbc'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.000461s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13827.html +=group_props [{name,'D: cipher aes192-ctr + aes256-cbc'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.002344s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13859.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.004986s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.21250.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.005899s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.13923.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.007329s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13987.html +=group_props [{name,'D: cipher aes192-ctr + aes256-cbc'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.000578s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14019.html +=group_props [{name,'D: cipher aes192-ctr + aes256-ctr'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.002314s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14051.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.005105s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.14115.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.006084s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.14211.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.006753s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.14275.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.115008s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14307.html +=group_props [{name,'D: cipher aes192-ctr + aes256-ctr'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.000476s +=group_time 0.253s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14339.html +=group_props [{name,'D: cipher aes192-ctr + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.002843s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.21442.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.005103s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.14403.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.005683s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.21538.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:01 +=result ok +=elapsed 0.007053s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.21570.html +=started 2025-01-10 18:56:01 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.115940s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.21634.html +=group_props [{name,'D: cipher aes192-ctr + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.000470s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14531.html +=group_props [{name,'D: cipher aes192-ctr + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.002191s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14563.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005304s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.21730.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.006113s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.21794.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.006925s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.14659.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.114697s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14723.html +=group_props [{name,'D: cipher aes192-ctr + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.000465s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14755.html +=group_props [{name,'D: cipher aes256-cbc + 3des-cbc'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.002315s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14787.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.004871s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.21890.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.006267s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.21986.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.007656s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.22082.html +=group_props [{name,'D: cipher aes256-cbc + 3des-cbc'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.000412s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.22114.html +=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.002357s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.22146.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005115s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.14915.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005862s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.14979.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.007022s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15043.html +=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.000717s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.22242.html +=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.002520s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.22274.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005439s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.15075.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005933s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.15139.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.007049s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15203.html +=group_props [{name,'D: cipher aes256-cbc + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.000374s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15235.html +=group_props [{name,'D: cipher aes256-cbc + aes128-cbc'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.002331s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15267.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005643s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.15331.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005709s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.15363.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.006714s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.22562.html +=group_props [{name,'D: cipher aes256-cbc + aes128-cbc'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.000364s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15427.html +=group_props [{name,'D: cipher aes256-cbc + aes128-ctr'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.002170s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.22594.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.004921s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.15491.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.005769s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.15555.html +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:02 +=result ok +=elapsed 0.006981s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15619.html +=group_props [{name,'D: cipher aes256-cbc + aes128-ctr'}] +=started 2025-01-10 18:56:02 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.000532s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15651.html +=group_props [{name,'D: cipher aes256-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.002732s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15683.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.004979s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.15747.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006242s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.15843.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.007285s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.22754.html +=group_props [{name,'D: cipher aes256-cbc + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.000771s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.22786.html +=group_props [{name,'D: cipher aes256-cbc + aes192-cbc'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.002290s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15939.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.005056s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.16003.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006366s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16067.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.007173s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16131.html +=group_props [{name,'D: cipher aes256-cbc + aes192-cbc'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.000445s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16163.html +=group_props [{name,'D: cipher aes256-cbc + aes192-ctr'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.001967s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16195.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.004818s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.22946.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006300s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16291.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.007577s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16323.html +=group_props [{name,'D: cipher aes256-cbc + aes192-ctr'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.000480s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.23074.html +=group_props [{name,'D: cipher aes256-cbc + aes256-ctr'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.002665s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.23106.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.005153s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.23202.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006713s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16355.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.007554s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9156.html +=group_props [{name,'D: cipher aes256-cbc + aes256-ctr'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.000551s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9188.html +=group_props [{name,'D: cipher aes256-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.002273s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9220.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.005050s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.16451.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006322s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16515.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006986s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16579.html +=group_props [{name,'D: cipher aes256-cbc + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.000549s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16611.html +=group_props [{name,'D: cipher aes256-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.002298s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16643.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.005255s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.16707.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006080s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.16771.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.007332s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16803.html +=group_props [{name,'D: cipher aes256-cbc + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.000655s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16835.html +=group_props [{name,'D: cipher aes256-ctr + 3des-cbc'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.002620s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9348.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.005406s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.23458.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.006167s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.23490.html +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:03 +=result ok +=elapsed 0.007307s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16931.html +=group_props [{name,'D: cipher aes256-ctr + 3des-cbc'}] +=started 2025-01-10 18:56:03 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.000527s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16963.html +=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.002422s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.23522.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.005059s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.23586.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.006154s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.9572.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.006884s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9604.html +=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.000410s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.17091.html +=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.002923s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.17123.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.004974s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.17219.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.006200s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.17315.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.006731s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.17379.html +=group_props [{name,'D: cipher aes256-ctr + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.000460s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.17411.html +=group_props [{name,'D: cipher aes256-ctr + aes128-cbc'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.002636s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.17443.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.005173s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.23682.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.006303s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.17539.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.007036s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.17603.html +=group_props [{name,'D: cipher aes256-ctr + aes128-cbc'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.000397s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.17635.html +=group_props [{name,'D: cipher aes256-ctr + aes128-ctr'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.002248s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.17667.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.004823s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.23810.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.005870s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.23874.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.007107s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.23938.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.116006s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.24002.html +=group_props [{name,'D: cipher aes256-ctr + aes128-ctr'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.000666s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.24034.html +=group_props [{name,'D: cipher aes256-ctr + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.002605s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.24066.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.005338s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.24162.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.006185s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.24226.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.007192s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.24322.html +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.116466s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.24386.html +=group_props [{name,'D: cipher aes256-ctr + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:04 +=result ok +=elapsed 0.000439s +=group_time 0.261s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.24418.html +=group_props [{name,'D: cipher aes256-ctr + aes192-cbc'}] +=started 2025-01-10 18:56:04 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.002256s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.24450.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.005031s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.9668.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.006344s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.9732.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.006860s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.9796.html +=group_props [{name,'D: cipher aes256-ctr + aes192-cbc'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.000388s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.9828.html +=group_props [{name,'D: cipher aes256-ctr + aes192-ctr'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.001882s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.9860.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.005136s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.9956.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.006261s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.10052.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.007284s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.10148.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.116235s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10212.html +=group_props [{name,'D: cipher aes256-ctr + aes192-ctr'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.000397s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10244.html +=group_props [{name,'D: cipher aes256-ctr + aes256-cbc'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.002158s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10276.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.004869s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.17827.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.006547s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.17891.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.007150s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.17955.html +=group_props [{name,'D: cipher aes256-ctr + aes256-cbc'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.000532s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.17987.html +=group_props [{name,'D: cipher aes256-ctr + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.001999s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.18019.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.004787s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.24674.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.005938s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.18083.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.006791s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.24802.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.115611s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.24866.html +=group_props [{name,'D: cipher aes256-ctr + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.000519s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.24898.html +=group_props [{name,'D: cipher aes256-ctr + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.002307s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.18115.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.005350s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.18211.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.006369s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.18307.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:05 +=result ok +=elapsed 0.007128s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.18371.html +=started 2025-01-10 18:56:05 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.115646s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.18435.html +=group_props [{name,'D: cipher aes256-ctr + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.000529s +=group_time 0.259s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.18467.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + 3des-cbc'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.002481s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.18499.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.005093s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.24994.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006295s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.18563.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006899s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.25122.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + 3des-cbc'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.000344s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.18627.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.002235s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25154.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.004920s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.18723.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006051s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.18819.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006658s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.18883.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.000492s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.25218.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.002989s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25250.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.004845s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.18979.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006075s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.25314.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006774s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.19075.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.000326s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.19107.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-cbc'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.002474s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25378.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.004965s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.25442.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006253s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.25506.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.007186s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.19203.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-cbc'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.000511s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.19235.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-ctr'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.002948s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25602.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.005264s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.25666.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006745s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.25698.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.006823s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.25762.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.116234s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.25826.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-ctr'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.000416s +=group_time 0.260s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.25858.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:06 +=result ok +=elapsed 0.002700s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25890.html +=started 2025-01-10 18:56:06 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.004920s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.25954.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.006001s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.26018.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.006810s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.26082.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.116001s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.26114.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.000303s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.26146.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-cbc'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.002733s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.19523.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.005109s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.19587.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.006103s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.26210.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.006596s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.26274.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-cbc'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.000448s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.26306.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-ctr'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.002030s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.26338.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.005179s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.26370.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.005986s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.26434.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.007426s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.10564.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.115365s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10628.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes192-ctr'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.000440s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10660.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-cbc'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.002891s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10692.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.005015s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.10788.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.006212s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.10852.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.006653s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.10916.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-cbc'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.000346s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.10948.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-ctr'}] +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.002852s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.10980.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.005067s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.11076.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.006018s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11140.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:07 +=result ok +=elapsed 0.007269s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.26626.html +=started 2025-01-10 18:56:07 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.117165s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.26690.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + aes256-ctr'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.000551s +=group_time 0.259s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.26722.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.002800s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.26754.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.005565s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.26850.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006214s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.26914.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006882s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.26978.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.117200s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.27010.html +=group_props [{name,'D: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.com'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.000431s +=group_time 0.259s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.27042.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + 3des-cbc'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.002768s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.19811.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.005362s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.19875.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006661s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.19939.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.007291s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.27170.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + 3des-cbc'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.000929s +=group_time 0.120s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.20003.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.003063s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.20035.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.005491s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.20131.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006534s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.20227.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006995s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.27234.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.000448s +=group_time 0.120s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.27266.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.002353s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.20291.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.004917s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.20355.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006394s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.20451.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006916s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.20547.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.000423s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.20579.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-cbc'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.002452s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.20611.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.005203s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.20675.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.006283s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27362.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.007237s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.20835.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-cbc'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.000554s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.20867.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-ctr'}] +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.002400s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.20899.html +=started 2025-01-10 18:56:08 +=ended 2025-01-10 18:56:08 +=result ok +=elapsed 0.005253s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.27426.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.006275s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27458.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.007277s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.21091.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.115694s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.21123.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-ctr'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.000372s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.21155.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.002124s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.27522.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.004939s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.27618.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.006219s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27714.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.007119s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.27810.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.115653s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.27874.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.com'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.000615s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.27906.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-cbc'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.002197s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.27938.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.005094s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.28002.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.006479s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.28066.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.007200s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.21315.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-cbc'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.000587s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.21347.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-ctr'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.002548s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.28098.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.005037s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.21411.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.006201s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.21475.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.007290s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.21539.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.114313s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.21603.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes192-ctr'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.000835s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.21635.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-cbc'}] +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.002715s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.28226.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:09 +=result ok +=elapsed 0.004923s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.21699.html +=started 2025-01-10 18:56:09 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.005990s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.28322.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006859s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.28386.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-cbc'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.000493s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.28418.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-ctr'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.002497s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.21795.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.005399s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.21827.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.005931s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.21891.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006928s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.28610.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.114304s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.28674.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-ctr'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.000485s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.28706.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.002243s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.28738.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.004791s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.28802.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006067s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.28866.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006564s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.28930.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.114068s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.28962.html +=group_props [{name,'D: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.com'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.000450s +=group_time 0.255s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.28994.html +=group_props [{name,cipher}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.000000s +=group_time 25.427s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.29026.html +=group_props [{name,mac}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.000013s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.29058.html +=group_props [{name,'AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.002334s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.29090.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.004894s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.29154.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006062s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.29250.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006693s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.29314.html +=group_props [{name,'AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.000484s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.29346.html +=group_props [{name,'AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.002269s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.29378.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.005143s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.22115.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006131s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.29538.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.006973s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.22179.html +=group_props [{name,'AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.000627s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.22211.html +=group_props [{name,'hmac-sha1'}] +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:10 +=result ok +=elapsed 0.002055s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.22243.html +=started 2025-01-10 18:56:10 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.005315s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.29634.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.005911s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.29698.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.007272s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.29794.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.114930s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.29858.html +=group_props [{name,'hmac-sha1'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.000507s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.29890.html +=group_props [{name,'hmac-sha1-96'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.002222s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.22339.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.004961s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.29986.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.005641s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.30082.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.006668s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.30178.html +=group_props [{name,'hmac-sha1-96'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.000519s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.30210.html +=group_props [{name,'hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.002138s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.30242.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.005444s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.30338.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.005890s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.30434.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.006444s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.22403.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.115906s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.30530.html +=group_props [{name,'hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.000584s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.30562.html +=group_props [{name,'hmac-sha2-256'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.002202s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.30594.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.005239s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.22467.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.006163s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.22499.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.006738s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.22563.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.114182s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.30754.html +=group_props [{name,'hmac-sha2-256'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.000429s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.22627.html +=group_props [{name,'hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.001907s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.22659.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:11 +=result ok +=elapsed 0.005248s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.30818.html +=started 2025-01-10 18:56:11 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.006246s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.30914.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.006567s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.30978.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.116602s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.31042.html +=group_props [{name,'hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.000381s +=group_time 0.260s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.31074.html +=group_props [{name,'hmac-sha2-512'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.002029s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.22755.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.005066s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.31170.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.005677s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.31234.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.006718s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.31330.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.114728s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.22851.html +=group_props [{name,'hmac-sha2-512'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.000660s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.31362.html +=group_props [{name,'hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.002275s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.31394.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.005284s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.22883.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.005695s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.22947.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.006367s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.23011.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.114928s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.31554.html +=group_props [{name,'hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.000570s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.31586.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.002198s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.31618.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.005690s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.31682.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.006062s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.31778.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.006291s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.31842.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.000374s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.31874.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1'}] +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.002737s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.31906.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:12 +=result ok +=elapsed 0.005319s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32002.html +=started 2025-01-10 18:56:12 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.005912s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.32066.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006233s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.32130.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.000376s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.23203.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-96'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.002340s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.32162.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.004847s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32226.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.005902s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.32322.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006741s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.32418.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-96'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.000329s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.32450.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.002294s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.32482.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.004925s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32546.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.005632s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.32610.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006345s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.32674.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.000431s +=group_time 0.114s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.23363.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.002203s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.23395.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.004961s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32738.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006157s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.32802.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006682s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.32866.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.000458s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.23523.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.002235s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.32898.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.005685s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32962.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006459s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.23587.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.007051s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.23651.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.000465s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.23683.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.002289s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33090.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.004996s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33154.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.005899s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.23779.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006905s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.23811.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.000380s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.33282.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.002382s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33314.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.005282s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.23875.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006168s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.23971.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006737s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.33410.html +=group_props [{name,'D: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.000435s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.33442.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.002187s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33474.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.004846s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33538.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:13 +=result ok +=elapsed 0.006364s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.33634.html +=started 2025-01-10 18:56:13 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006998s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11236.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.000617s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.11268.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.002718s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11300.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.004972s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.24067.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005796s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.24131.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.007173s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.11396.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.000316s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.11428.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-96'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.002690s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11460.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005067s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33698.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005675s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.24259.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006391s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.24291.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-96'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.000464s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.24323.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.002087s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33762.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005089s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.24419.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006022s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.33794.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006317s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.24579.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.000421s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.33826.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.002537s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33858.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005070s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33954.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005916s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.34018.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006480s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.24675.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.000449s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.24707.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.002211s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.24739.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.004976s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.24835.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006059s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.24931.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006733s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.25027.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.000316s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.25059.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.002255s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.34082.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005007s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.34146.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006345s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.34178.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006944s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.34210.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.000442s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.25251.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.002659s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25283.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.005058s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.34274.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:14 +=result ok +=elapsed 0.006210s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.34370.html +=started 2025-01-10 18:56:14 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006823s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.34466.html +=group_props [{name,'D: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.000405s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.34498.html +=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.002149s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.34530.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.005033s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.25347.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006488s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.25411.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006788s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.25475.html +=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.000598s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.25507.html +=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.002350s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.34690.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.005356s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.34786.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006094s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.25539.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006511s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.25603.html +=group_props [{name,'D: mac hmac-sha1 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.000495s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.34914.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-96'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.002723s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25635.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.004970s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.25699.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006431s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.35010.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.007185s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.35074.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-96'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.000526s +=group_time 0.119s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.35106.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.002789s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.25795.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.005068s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.25891.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.005861s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.25955.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006761s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.26019.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.114457s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.35202.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.000505s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.35234.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.002254s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.26083.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.005317s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.26179.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006019s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.26243.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.006678s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.26339.html +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:15 +=result ok +=elapsed 0.114678s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.35330.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256'}] +=started 2025-01-10 18:56:15 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.000462s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.35362.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.002314s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.35394.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.005172s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.35490.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.006194s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.35554.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.006398s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.35618.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.114466s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.26467.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.000439s +=group_time 0.253s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.35650.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.002529s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.35682.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.005292s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.35778.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.005862s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.35874.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.006654s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.35970.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.115127s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.36002.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.000625s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.26531.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.002521s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.26563.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.005201s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.26627.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.005665s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.26691.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.006551s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.36130.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.114903s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.36162.html +=group_props [{name,'D: mac hmac-sha1 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.000364s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36194.html +=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.002286s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.36226.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.005071s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.36290.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.006021s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.36386.html +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.006851s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.36482.html +=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:16 +=result ok +=elapsed 0.000455s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36514.html +=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:16 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.002464s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.36546.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005012s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.26851.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006120s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.26915.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006751s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.27011.html +=group_props [{name,'D: mac hmac-sha1-96 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.000441s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36642.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.002168s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.27043.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005070s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.36738.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005985s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.36802.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006345s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.27139.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.000554s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36866.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.002155s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.36898.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005070s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.36962.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006350s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27203.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006419s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37122.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.000624s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37154.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.002317s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37186.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005318s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.37282.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006166s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.37378.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006787s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37474.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.000372s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37506.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.002337s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37538.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005207s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.37634.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005983s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27235.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006734s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37794.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.000564s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.27267.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.002164s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37826.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005064s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.37890.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.005931s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27363.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006614s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37986.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.000695s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.38018.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.003017s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.27427.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.004991s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.38082.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006205s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.38178.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.006589s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38274.html +=group_props [{name,'D: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.000372s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.38306.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:17 +=result ok +=elapsed 0.002146s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38338.html +=started 2025-01-10 18:56:17 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.005284s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.38402.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006358s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27555.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006738s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.27619.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.000451s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.27651.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.002201s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.27683.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.005164s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.27747.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006220s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.27843.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006208s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38562.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.000352s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.38594.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.002232s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.27907.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.005179s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.27971.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006245s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.28067.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006550s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.38658.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.115108s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38722.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.000378s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.28163.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1-96'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.002368s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38754.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.004986s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.28227.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.005847s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.28291.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006989s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.28355.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha1-96'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.000325s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.28387.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.002172s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.28419.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.005459s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.38946.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006628s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.39042.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.006768s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.28483.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.115709s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.39138.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.000769s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.28515.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:18 +=result ok +=elapsed 0.002022s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39170.html +=started 2025-01-10 18:56:18 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.004902s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.39266.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.006256s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.39362.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.006789s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.28579.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.114934s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.28611.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.000340s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.39458.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.002747s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.28643.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.005079s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.39522.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.005755s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.28739.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.006928s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.28803.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.115141s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.28835.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.000408s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.39650.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.002375s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39682.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.004779s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.39778.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.006275s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.39874.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.006959s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.39970.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.114813s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40034.html +=group_props [{name,'D: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.000380s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.28867.html +=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.002105s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.28899.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.005325s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.40130.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.005986s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.40162.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.006514s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.29059.html +=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.000559s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.29091.html +=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.002110s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.29123.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:19 +=result ok +=elapsed 0.004847s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.29187.html +=started 2025-01-10 18:56:19 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006194s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.29283.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006508s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.29347.html +=group_props [{name,'D: mac hmac-sha2-256 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.000496s +=group_time 0.114s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40258.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.002732s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40290.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.004719s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.40354.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.005836s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.40418.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006744s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.29475.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.115074s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40482.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.000417s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.29539.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-96'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.002072s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.29571.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.005279s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.29635.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006555s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.29667.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006656s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40642.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-96'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.000399s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.29731.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.002470s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40674.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.004931s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.29795.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006211s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.29891.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006729s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.29987.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.115475s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.30051.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.000521s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.30083.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.002532s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40738.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.004948s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.30147.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006199s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.40834.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:20 +=result ok +=elapsed 0.006420s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.40898.html +=started 2025-01-10 18:56:20 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.114173s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40962.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.000441s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40994.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.002347s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.30243.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.004986s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.30307.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.006483s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.30403.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.007362s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.30499.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.115346s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.30531.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.000445s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.30563.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.002105s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.30595.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.005350s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.30691.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.006104s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.41122.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.006379s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.30787.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.114859s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.41218.html +=group_props [{name,'D: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.000461s +=group_time 0.255s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.41250.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.002432s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.30819.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.005059s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.30883.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.005932s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.30979.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.006584s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.31075.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.000430s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.31107.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.002304s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.41314.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.005132s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.41378.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.006063s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.41442.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.006733s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.31235.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.000375s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.41506.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1'}] +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.002572s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.31267.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.005016s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.41570.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:21 +=result ok +=elapsed 0.006155s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.31331.html +=started 2025-01-10 18:56:21 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.006603s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.31395.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.114869s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.31459.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.000737s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.41698.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.002278s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.31491.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.004956s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.31555.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.006214s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.31651.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.006338s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.31715.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.000339s +=group_time 0.115s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.31747.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.002254s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.31779.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.005335s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.31843.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.005706s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.31907.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.006611s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.41890.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.115348s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.41954.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.000692s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.41986.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.002573s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.42018.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.005765s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.42114.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.005846s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.42210.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.006776s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.42274.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.113916s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.42306.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.000420s +=group_time 0.254s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.32035.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512'}] +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.002647s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.42338.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.005169s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32099.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.006015s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.42434.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:22 +=result ok +=elapsed 0.006793s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.42498.html +=started 2025-01-10 18:56:22 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.114741s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.42562.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.000398s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.42594.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.001975s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.42626.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.005091s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32259.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.006197s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.32355.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.006813s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.42658.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.114981s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.32451.html +=group_props [{name,'D: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.000411s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.32483.html +=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.002153s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.32515.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.004948s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.42754.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.006174s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.42850.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.006579s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.42914.html +=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.000404s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.42946.html +=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.002127s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.42978.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.005313s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.43074.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.005845s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.32611.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.006525s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.32643.html +=group_props [{name,'D: mac hmac-sha2-512 + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.000428s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.32675.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.002387s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.43234.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.004913s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.32739.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.006525s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.32835.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.007083s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.43330.html +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.117058s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.43394.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:23 +=result ok +=elapsed 0.000532s +=group_time 0.260s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.43426.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-96'}] +=started 2025-01-10 18:56:23 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.002168s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.43458.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.005389s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.43554.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.006198s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11620.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.006912s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.43682.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-96'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.000374s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.43714.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.002151s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.43746.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.005267s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.11716.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.006310s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.43874.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.007143s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.11748.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.114947s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.44002.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.000445s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.44034.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.002232s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.11780.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.005225s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.11844.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.006159s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.11908.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.006657s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.11972.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.115412s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12036.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.000724s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12068.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.002437s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12100.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.005197s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.44162.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.006242s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.44226.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.007032s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.44290.html +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.114873s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.33027.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:24 +=result ok +=elapsed 0.000589s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.33059.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:24 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.002107s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33091.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.005306s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33155.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.006190s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.44386.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.006832s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.33251.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.115920s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.33315.html +=group_props [{name,'D: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.com'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.000518s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.33347.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.002896s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33379.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.005332s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33475.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.006304s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.44482.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.007191s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.44546.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCM'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.000588s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.44578.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.002095s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.44610.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.005075s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33603.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.006255s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.33667.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.006763s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.33731.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCM'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.000465s +=group_time 0.118s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.33763.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.002247s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.33795.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.005562s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.33891.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.006458s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.33955.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.006971s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.34019.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.118531s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12228.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.000689s +=group_time 0.261s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12260.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.002737s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12292.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.005720s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.12356.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.007198s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.12388.html +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.007137s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.34147.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.000577s +=group_time 0.121s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.44834.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:25 +=ended 2025-01-10 18:56:25 +=result ok +=elapsed 0.002140s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.44866.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.005165s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.34211.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.006152s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.44930.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.007257s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.44962.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.119122s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.45026.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.com'}] +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.000567s +=group_time 0.261s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12420.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256'}] +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.002687s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.45058.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.005347s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.45090.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.006648s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.45122.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.007098s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.34467.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.117812s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.34499.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256'}] +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.000528s +=group_time 0.263s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.34531.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.002350s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.34563.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.005320s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.34627.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.005938s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.34691.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.006687s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.34755.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.116814s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.34819.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.com'}] +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.000500s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.34851.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512'}] +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.002217s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.34883.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.005269s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.34947.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.006312s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.35043.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:26 +=result ok +=elapsed 0.007132s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.35139.html +=started 2025-01-10 18:56:26 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.115415s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.35203.html +=group_props [{name,'D: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512'}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.000436s +=group_time 0.256s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.35235.html +=group_props [{name,mac}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.000001s +=group_time 16.455s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.35267.html +=group_props [{name,compression}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.000015s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.35299.html +=group_props [{name,none}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.001999s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.35331.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.005810s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.35427.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.006920s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.35459.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.006783s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.35523.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.115476s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.45282.html +=group_props [{name,none}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.000338s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.45314.html +=group_props [{name,zlib}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.002369s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.35587.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.005827s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.35619.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.007495s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.45474.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.007932s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.45538.html +=group_props [{name,zlib}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.000488s +=group_time 0.121s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.45570.html +=group_props [{name,'zlib@openssh.com'}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.002375s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.35683.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.005303s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.35715.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.006028s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.45634.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.007173s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.45698.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.114591s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.12772.html +=group_props [{name,'zlib@openssh.com'}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.000513s +=group_time 0.258s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.12804.html +=group_props [{name,'D: compression none + zlib'}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.002490s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.12836.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.005147s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.12900.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.006126s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.12964.html +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:27 +=result ok +=elapsed 0.007300s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.35907.html +=group_props [{name,'D: compression none + zlib'}] +=started 2025-01-10 18:56:27 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.000381s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.35939.html +=group_props [{name,'D: compression none + zlib@openssh.com'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.001972s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.35971.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.005372s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.36067.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.006312s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.36163.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.007220s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.45762.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.115493s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.36259.html +=group_props [{name,'D: compression none + zlib@openssh.com'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.000456s +=group_time 0.257s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36291.html +=group_props [{name,'D: compression zlib + none'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.002413s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.36323.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.005171s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.45826.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.006093s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.45890.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.007410s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.36483.html +=group_props [{name,'D: compression zlib + none'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.000319s +=group_time 0.116s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.45922.html +=group_props [{name,'D: compression zlib + zlib@openssh.com'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.002566s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.45954.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.005415s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.46018.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.006475s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.46114.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.007204s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.46210.html +=group_props [{name,'D: compression zlib + zlib@openssh.com'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.000447s +=group_time 0.117s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36547.html +=group_props [{name,'D: compression zlib@openssh.com + none'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.002749s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.36579.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.005179s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.46274.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.006362s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.46306.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.006827s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.46370.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.115532s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.46434.html +=group_props [{name,'D: compression zlib@openssh.com + none'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.000566s +=group_time 0.256s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.46466.html +=group_props [{name,'D: compression zlib@openssh.com + zlib'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.002998s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.46498.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.005554s +=case ssh_algorithms_SUITE:simple_exec +=logfile ssh_algorithms_suite.simple_exec.46562.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.006550s +=case ssh_algorithms_SUITE:simple_sftp +=logfile ssh_algorithms_suite.simple_sftp.46626.html +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.007830s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.36835.html +=group_props [{name,'D: compression zlib@openssh.com + zlib'}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:28 +=result ok +=elapsed 0.000516s +=group_time 0.120s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.36867.html +=group_props [{name,compression}] +=started 2025-01-10 18:56:28 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000000s +=group_time 1.861s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36899.html +=group_props [{name,public_key}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000025s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.36931.html +=group_props [{name,'ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.001555s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.36963.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.005474s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.46722.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 837 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37027.html +=group_props [{name,'ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000001s +=group_time 0.085s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37059.html +=group_props [{name,'ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.001488s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37091.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.007514s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37155.html +=group_props [{name,'ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37187.html +=group_props [{name,'ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.001145s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37219.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.006722s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37283.html +=group_props [{name,'ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000001s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37315.html +=group_props [{name,'rsa-sha2-256'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.001346s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37347.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.006191s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.46850.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.100987s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37411.html +=group_props [{name,'rsa-sha2-256'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000001s +=group_time 0.184s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.46914.html +=group_props [{name,'rsa-sha2-512'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.001227s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.46946.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.006505s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.47010.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.099589s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.47074.html +=group_props [{name,'rsa-sha2-512'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000000s +=group_time 0.182s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.47106.html +=group_props [{name,'ssh-dss'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.001384s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.47138.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.004744s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.47202.html +=group_props [{name,'ssh-dss'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000000s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.47234.html +=group_props [{name,'ssh-ed25519'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000962s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.47266.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.005129s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.47330.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 846 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13124.html +=group_props [{name,'ssh-ed25519'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000001s +=group_time 0.084s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13156.html +=group_props [{name,'ssh-ed448'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.001399s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13188.html +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.005922s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.47394.html +=group_props [{name,'ssh-ed448'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:29 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.47426.html +=group_props [{name,'ssh-rsa'}] +=started 2025-01-10 18:56:29 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.001458s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.47458.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.006919s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13252.html +=group_props [{name,'ssh-rsa'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13284.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.002945s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.47554.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.006107s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.47618.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000000s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13348.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.002133s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13380.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.005697s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13444.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13476.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-256'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.002016s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13508.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.004917s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.13604.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 852 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13636.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-256'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.083s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.13668.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-512'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.001947s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13700.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.005409s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.13796.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 854 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37475.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + rsa-sha2-512'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.086s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37507.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-dss'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.001968s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37539.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.004362s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37603.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-dss'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.47682.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed25519'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.001881s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.47714.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.004230s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.47778.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 857 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37667.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed25519'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.082s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37699.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed448'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.001636s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37731.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.005000s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37763.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-ed448'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37795.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-rsa'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.002040s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37827.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.004660s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.37891.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp256 + ssh-rsa'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000000s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.37923.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.002180s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.37955.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.006124s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.47938.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.47970.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.001976s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48002.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.006636s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.48066.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48098.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-256'}] +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:30 +=result ok +=elapsed 0.001788s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48130.html +=started 2025-01-10 18:56:30 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.006721s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.48194.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-256'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000000s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48226.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-512'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.001882s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48258.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.006992s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.48290.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + rsa-sha2-512'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48322.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-dss'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.001875s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48354.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.005864s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.13956.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-dss'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48418.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed25519'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.001921s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.13988.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.006164s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14052.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed25519'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14084.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed448'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.001923s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14116.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.006316s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14180.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-ed448'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48450.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-rsa'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.002015s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48482.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.006790s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.48546.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp384 + ssh-rsa'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48578.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.002054s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48610.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.005508s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.48706.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14244.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.001876s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48738.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.006841s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.48802.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48834.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-256'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.001905s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48866.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.005927s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.48930.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-256'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.48962.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-512'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.002039s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.48994.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.006050s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38147.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + rsa-sha2-512'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.38179.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-dss'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.001821s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38211.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.005417s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38275.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-dss'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000000s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.38307.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed25519'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.003068s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38339.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.005565s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38435.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed25519'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.000000s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.38467.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed448'}] +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:31 +=result ok +=elapsed 0.002379s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38499.html +=started 2025-01-10 18:56:31 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.005826s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38595.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-ed448'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000002s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.49090.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-rsa'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.002062s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38627.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.005948s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.49154.html +=group_props [{name,'D: public_key ecdsa-sha2-nistp521 + ssh-rsa'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.49186.html +=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.001866s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.49218.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.005389s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.49282.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.101234s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.49314.html +=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000001s +=group_time 0.185s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.49346.html +=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.001872s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.49378.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.007203s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.49474.html +=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.49506.html +=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.001809s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.49538.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.006272s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.49602.html +=group_props [{name,'D: public_key rsa-sha2-256 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.49634.html +=group_props [{name,'D: public_key rsa-sha2-256 + rsa-sha2-512'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.002017s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.49666.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.006677s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.49762.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.099547s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.49826.html +=group_props [{name,'D: public_key rsa-sha2-256 + rsa-sha2-512'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000001s +=group_time 0.185s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.49858.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-dss'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.001843s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.49890.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.006051s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.49986.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-dss'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.50018.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed25519'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.001977s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.50050.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.005852s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.50146.html +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.100281s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.50178.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed25519'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:32 +=result ok +=elapsed 0.000001s +=group_time 0.185s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.50210.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed448'}] +=started 2025-01-10 18:56:32 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.001918s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.50242.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.006307s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38787.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-ed448'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.50306.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-rsa'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.002247s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38819.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.006011s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.38883.html +=group_props [{name,'D: public_key rsa-sha2-256 + ssh-rsa'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.38915.html +=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.002032s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.38947.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.005461s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.39011.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.099878s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.50434.html +=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.000001s +=group_time 0.183s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.50466.html +=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.001831s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.50498.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.007324s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.50562.html +=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.50594.html +=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.001876s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.50626.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.006387s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.50722.html +=group_props [{name,'D: public_key rsa-sha2-512 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.50754.html +=group_props [{name,'D: public_key rsa-sha2-512 + rsa-sha2-256'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.001951s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.50786.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.006430s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.39075.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.099858s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.39107.html +=group_props [{name,'D: public_key rsa-sha2-512 + rsa-sha2-256'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.000001s +=group_time 0.183s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.50882.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-dss'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.001794s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.50914.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.005423s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.50978.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-dss'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.39171.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed25519'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.001927s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39203.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.005445s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.39267.html +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:33 +=result ok +=elapsed 0.101305s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.51074.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed25519'}] +=started 2025-01-10 18:56:33 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.183s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.51106.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed448'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.001857s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.51138.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.006071s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.51202.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-ed448'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.51234.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-rsa'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002126s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.51266.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.005832s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14500.html +=group_props [{name,'D: public_key rsa-sha2-512 + ssh-rsa'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14532.html +=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.001860s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.51330.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.004589s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.51394.html +=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.51426.html +=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002249s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14596.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.006144s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14628.html +=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.51522.html +=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002079s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.51554.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.005411s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14692.html +=group_props [{name,'D: public_key ssh-dss + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14724.html +=group_props [{name,'D: public_key ssh-dss + rsa-sha2-256'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002064s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14756.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.005346s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14820.html +=group_props [{name,'D: public_key ssh-dss + rsa-sha2-256'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14852.html +=group_props [{name,'D: public_key ssh-dss + rsa-sha2-512'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002282s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39299.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.005351s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.14916.html +=group_props [{name,'D: public_key ssh-dss + rsa-sha2-512'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.14948.html +=group_props [{name,'D: public_key ssh-dss + ssh-ed25519'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002223s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.14980.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.004670s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15044.html +=group_props [{name,'D: public_key ssh-dss + ssh-ed25519'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15076.html +=group_props [{name,'D: public_key ssh-dss + ssh-ed448'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002038s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15108.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.005064s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.39395.html +=group_props [{name,'D: public_key ssh-dss + ssh-ed448'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000000s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15172.html +=group_props [{name,'D: public_key ssh-dss + ssh-rsa'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002031s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15204.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.005161s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15268.html +=group_props [{name,'D: public_key ssh-dss + ssh-rsa'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15300.html +=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002104s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39459.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.004477s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.51714.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 907 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.39523.html +=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.000001s +=group_time 0.087s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.51746.html +=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.002108s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.51778.html +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:34 +=result ok +=elapsed 0.005931s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15364.html +=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:34 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.51842.html +=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.002176s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15396.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.005267s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.39587.html +=group_props [{name,'D: public_key ssh-ed25519 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15460.html +=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-256'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.002186s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39619.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.004955s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.39683.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 911 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.39715.html +=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-256'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.087s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.39747.html +=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-512'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.001755s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39779.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.005122s +=case ssh_algorithms_SUITE:sshd_simple_exec +=logfile ssh_algorithms_suite.sshd_simple_exec.39843.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result skipped: [78,111,32,117,115,101,114,32,107,101,121,58,32, + "enoent"] +=elapsed 0.000000s +=== *** SKIPPED test case 913 of 1557 *** +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.39875.html +=group_props [{name,'D: public_key ssh-ed25519 + rsa-sha2-512'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.085s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.39907.html +=group_props [{name,'D: public_key ssh-ed25519 + ssh-dss'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.002132s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.39939.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.004418s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.51906.html +=group_props [{name,'D: public_key ssh-ed25519 + ssh-dss'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.51938.html +=group_props [{name,'D: public_key ssh-ed25519 + ssh-ed448'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.001890s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.51970.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.004919s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.52034.html +=group_props [{name,'D: public_key ssh-ed25519 + ssh-ed448'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.52066.html +=group_props [{name,'D: public_key ssh-ed25519 + ssh-rsa'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.001834s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.52098.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.005208s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15620.html +=group_props [{name,'D: public_key ssh-ed25519 + ssh-rsa'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.52162.html +=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.001980s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.52194.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.005017s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15684.html +=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.056s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15716.html +=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.001731s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15748.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.006961s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15812.html +=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.15844.html +=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.001905s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.15876.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.006202s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.15972.html +=group_props [{name,'D: public_key ssh-ed448 + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40035.html +=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-256'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.002012s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16004.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.005636s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16068.html +=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-256'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16100.html +=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-512'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.002413s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40099.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.005605s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40163.html +=group_props [{name,'D: public_key ssh-ed448 + rsa-sha2-512'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40195.html +=group_props [{name,'D: public_key ssh-ed448 + ssh-dss'}] +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:35 +=result ok +=elapsed 0.001939s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40227.html +=started 2025-01-10 18:56:35 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.005148s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40291.html +=group_props [{name,'D: public_key ssh-ed448 + ssh-dss'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40323.html +=group_props [{name,'D: public_key ssh-ed448 + ssh-ed25519'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.002171s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16164.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.005135s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16228.html +=group_props [{name,'D: public_key ssh-ed448 + ssh-ed25519'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.16260.html +=group_props [{name,'D: public_key ssh-ed448 + ssh-rsa'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.002078s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16292.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.005531s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16356.html +=group_props [{name,'D: public_key ssh-ed448 + ssh-rsa'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.52290.html +=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.002023s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.16388.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.005539s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.16420.html +=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp256'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000000s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.52386.html +=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.001602s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.52418.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.007150s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.52482.html +=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp384'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.52514.html +=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.002078s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.52546.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.006251s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40451.html +=group_props [{name,'D: public_key ssh-rsa + ecdsa-sha2-nistp521'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40483.html +=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-256'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.001970s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40515.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.006247s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40579.html +=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-256'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40611.html +=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-512'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.001971s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40643.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.006190s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40707.html +=group_props [{name,'D: public_key ssh-rsa + rsa-sha2-512'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40739.html +=group_props [{name,'D: public_key ssh-rsa + ssh-dss'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.002027s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40771.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.005841s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.40867.html +=group_props [{name,'D: public_key ssh-rsa + ssh-dss'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.058s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.40899.html +=group_props [{name,'D: public_key ssh-rsa + ssh-ed25519'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.001936s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.40931.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.005900s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.41027.html +=group_props [{name,'D: public_key ssh-rsa + ssh-ed25519'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000000s +=group_time 0.057s +=case ssh_algorithms_SUITE:init_per_group +=logfile ssh_algorithms_suite.init_per_group.41059.html +=group_props [{name,'D: public_key ssh-rsa + ssh-ed448'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.001915s +=case ssh_algorithms_SUITE:simple_connect +=logfile ssh_algorithms_suite.simple_connect.52610.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.007108s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.52674.html +=group_props [{name,'D: public_key ssh-rsa + ssh-ed448'}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000001s +=group_time 0.059s +=case ssh_algorithms_SUITE:end_per_group +=logfile ssh_algorithms_suite.end_per_group.52706.html +=group_props [{name,public_key}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000000s +=group_time 7.834s +=case ssh_algorithms_SUITE:end_per_suite +=logfile ssh_algorithms_suite.end_per_suite.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.001653s +=group_time 57.100s +=case ssh_basic_SUITE:init_per_suite +=logfile ssh_basic_suite.init_per_suite.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.007259s +=case ssh_basic_SUITE:init_per_group +=logfile ssh_basic_suite.init_per_group.html +=group_props [{name,all_tests},parallel] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000000s +=group_time 40.382s +=group_time 16.162s +=group_time 0.057s +=group_time 0.070s +=group_time 0.060s +=case ssh_basic_SUITE:init_per_group +=logfile ssh_basic_suite.init_per_group.52738.html +=group_props [{name,sequential}] +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:36 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:app_test +=logfile ssh_basic_suite.app_test.html +=started 2025-01-10 18:56:36 +=ended 2025-01-10 18:56:37 +=result ok +=elapsed 0.011407s +=case ssh_basic_SUITE:appup_test +=logfile ssh_basic_suite.appup_test.html +=started 2025-01-10 18:56:37 +=ended 2025-01-10 18:56:37 +=result ok +=elapsed 0.000687s +=case ssh_basic_SUITE:daemon_already_started +=logfile ssh_basic_suite.daemon_already_started.html +=started 2025-01-10 18:56:37 +=ended 2025-01-10 18:56:37 +=result ok +=elapsed 0.002688s +=case ssh_basic_SUITE:daemon_error_closes_port +=logfile ssh_basic_suite.daemon_error_closes_port.html +=started 2025-01-10 18:56:37 +=ended 2025-01-10 18:56:37 +=result ok +=elapsed 0.002134s +=case ssh_basic_SUITE:double_close +=logfile ssh_basic_suite.double_close.html +=started 2025-01-10 18:56:37 +=ended 2025-01-10 18:56:37 +=result ok +=elapsed 0.006809s +=case ssh_basic_SUITE:daemon_opt_fd +=logfile ssh_basic_suite.daemon_opt_fd.html +=started 2025-01-10 18:56:37 +=ended 2025-01-10 18:56:37 +=result ok +=elapsed 0.005972s +=case ssh_basic_SUITE:multi_daemon_opt_fd +=logfile ssh_basic_suite.multi_daemon_opt_fd.html +=started 2025-01-10 18:56:37 +=ended 2025-01-10 18:56:37 +=result ok +=elapsed 0.034891s +=case ssh_basic_SUITE:packet_size +=logfile ssh_basic_suite.packet_size.html +=started 2025-01-10 18:56:37 +=ended 2025-01-10 18:56:45 +=result ok +=elapsed 8.021442s +=case ssh_basic_SUITE:ssh_info_print +=logfile ssh_basic_suite.ssh_info_print.html +=started 2025-01-10 18:56:45 +=ended 2025-01-10 18:56:46 +=result ok +=elapsed 1.012072s +=case ssh_basic_SUITE:shell_exit_status +=logfile ssh_basic_suite.shell_exit_status.html +=started 2025-01-10 18:56:46 +=ended 2025-01-10 18:57:16 +=result ok +=elapsed 30.008322s +=case ssh_basic_SUITE:setopts_getopts +=logfile ssh_basic_suite.setopts_getopts.html +=started 2025-01-10 18:57:16 +=ended 2025-01-10 18:57:16 +=result ok +=elapsed 0.007414s +=case ssh_basic_SUITE:known_hosts +=logfile ssh_basic_suite.known_hosts.html +=started 2025-01-10 18:57:16 +=ended 2025-01-10 18:57:16 +=result ok +=elapsed 0.017740s +=case ssh_basic_SUITE:ssh_file_is_host_key +=logfile ssh_basic_suite.ssh_file_is_host_key.html +=started 2025-01-10 18:57:16 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.826516s +=case ssh_basic_SUITE:ssh_file_is_host_key_misc +=logfile ssh_basic_suite.ssh_file_is_host_key_misc.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.047935s +=case ssh_basic_SUITE:ssh_file_is_auth_key +=logfile ssh_basic_suite.ssh_file_is_auth_key.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.001033s +=case ssh_basic_SUITE:end_per_group +=logfile ssh_basic_suite.end_per_group.html +=group_props [{name,sequential}] +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:init_per_group +=logfile ssh_basic_suite.init_per_group.53506.html +=group_props [{name,p_basic},parallel] +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:send +=logfile ssh_basic_suite.send.53570.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.086902s +=case ssh_basic_SUITE:peername_sockname +=logfile ssh_basic_suite.peername_sockname.53602.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.087350s +=case ssh_basic_SUITE:exec +=logfile ssh_basic_suite.exec.53762.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.086016s +=case ssh_basic_SUITE:exec_compressed +=logfile ssh_basic_suite.exec_compressed.53666.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.084599s +=case ssh_basic_SUITE:exec_with_io_out +=logfile ssh_basic_suite.exec_with_io_out.53538.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.072659s +=case ssh_basic_SUITE:exec_with_io_in +=logfile ssh_basic_suite.exec_with_io_in.53698.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.086935s +=case ssh_basic_SUITE:cli +=logfile ssh_basic_suite.cli.53730.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.539823s +=case ssh_basic_SUITE:cli_exit_normal +=logfile ssh_basic_suite.cli_exit_normal.53634.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.524003s +=case ssh_basic_SUITE:cli_exit_status +=logfile ssh_basic_suite.cli_exit_status.53794.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.542633s +=case ssh_basic_SUITE:idle_time_client +=logfile ssh_basic_suite.idle_time_client.16740.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 16.091239s +=case ssh_basic_SUITE:idle_time_server +=logfile ssh_basic_suite.idle_time_server.41315.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 16.091575s +=case ssh_basic_SUITE:max_initial_idle_time +=logfile ssh_basic_suite.max_initial_idle_time.53826.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:25 +=result ok +=elapsed 8.077808s +=case ssh_basic_SUITE:openssh_zlib_basic_test +=logfile ssh_basic_suite.openssh_zlib_basic_test.53858.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.080620s +=case ssh_basic_SUITE:misc_ssh_options +=logfile ssh_basic_suite.misc_ssh_options.16772.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.092283s +=case ssh_basic_SUITE:inet_option +=logfile ssh_basic_suite.inet_option.16804.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.080067s +=case ssh_basic_SUITE:inet6_option +=logfile ssh_basic_suite.inet6_option.16836.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.078885s +=case ssh_basic_SUITE:shell +=logfile ssh_basic_suite.shell.16868.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:19 +=result ok +=elapsed 1.554778s +=case ssh_basic_SUITE:shell_socket +=logfile ssh_basic_suite.shell_socket.5.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:19 +=result ok +=elapsed 1.555812s +=case ssh_basic_SUITE:shell_ssh_conn +=logfile ssh_basic_suite.shell_ssh_conn.37.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:19 +=result ok +=elapsed 1.553215s +=case ssh_basic_SUITE:shell_no_unicode +=logfile ssh_basic_suite.shell_no_unicode.16900.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:19 +=result ok +=elapsed 0.999835s +=case ssh_basic_SUITE:shell_unicode_string +=logfile ssh_basic_suite.shell_unicode_string.16964.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:19 +=result ok +=elapsed 0.999690s +=case ssh_basic_SUITE:close +=logfile ssh_basic_suite.close.16932.html +=started 2025-01-10 18:57:17 +=ended 2025-01-10 18:57:17 +=result ok +=elapsed 0.079717s +=case ssh_basic_SUITE:end_per_group +=logfile ssh_basic_suite.end_per_group.17284.html +=group_props [{name,p_basic},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:init_per_group +=logfile ssh_basic_suite.init_per_group.41731.html +=group_props [{name,internal_error},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:internal_error +=logfile ssh_basic_suite.internal_error.41763.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.009942s +=case ssh_basic_SUITE:end_per_group +=logfile ssh_basic_suite.end_per_group.41795.html +=group_props [{name,internal_error},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:init_per_group +=logfile ssh_basic_suite.init_per_group.41827.html +=group_props [{name,login_bad_pwd_no_retry},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:login_bad_pwd_no_retry1 +=logfile ssh_basic_suite.login_bad_pwd_no_retry1.54370.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.016905s +=case ssh_basic_SUITE:login_bad_pwd_no_retry2 +=logfile ssh_basic_suite.login_bad_pwd_no_retry2.54338.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.016090s +=case ssh_basic_SUITE:login_bad_pwd_no_retry3 +=logfile ssh_basic_suite.login_bad_pwd_no_retry3.54402.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.017368s +=case ssh_basic_SUITE:login_bad_pwd_no_retry4 +=logfile ssh_basic_suite.login_bad_pwd_no_retry4.41859.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.017698s +=case ssh_basic_SUITE:login_bad_pwd_no_retry5 +=logfile ssh_basic_suite.login_bad_pwd_no_retry5.54434.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.016503s +=case ssh_basic_SUITE:end_per_group +=logfile ssh_basic_suite.end_per_group.41987.html +=group_props [{name,login_bad_pwd_no_retry},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:init_per_group +=logfile ssh_basic_suite.init_per_group.42019.html +=group_props [{name,key_cb},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000908s +=case ssh_basic_SUITE:key_callback +=logfile ssh_basic_suite.key_callback.42051.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.009840s +=case ssh_basic_SUITE:key_callback_options +=logfile ssh_basic_suite.key_callback_options.54626.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.011179s +=case ssh_basic_SUITE:end_per_group +=logfile ssh_basic_suite.end_per_group.54722.html +=group_props [{name,key_cb},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000000s +=case ssh_basic_SUITE:end_per_group +=logfile ssh_basic_suite.end_per_group.54754.html +=group_props [{name,all_tests},parallel] +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000000s +=group_time 56.879s +=case ssh_basic_SUITE:end_per_suite +=logfile ssh_basic_suite.end_per_suite.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.003325s +=group_time 56.951s +=== +=case ssh_bench_SUITE:all +=started 2025-01-10 18:57:33 +=result skipped: Benchmarks run separately +=== *** Skipping {ssh_bench_SUITE,all} *** +=case ssh_chan_behaviours_SUITE:init_per_suite +=logfile ssh_chan_behaviours_suite.init_per_suite.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000237s +=case ssh_chan_behaviours_SUITE:noexist_subsystem +=logfile ssh_chan_behaviours_suite.noexist_subsystem.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000669s +=case ssh_chan_behaviours_SUITE:undefined_subsystem +=logfile ssh_chan_behaviours_suite.undefined_subsystem.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:33 +=result ok +=elapsed 0.000906s +=case ssh_chan_behaviours_SUITE:defined_subsystem +=logfile ssh_chan_behaviours_suite.defined_subsystem.html +=started 2025-01-10 18:57:33 +=ended 2025-01-10 18:57:34 +=result ok +=elapsed 0.001602s +=case ssh_chan_behaviours_SUITE:subsystem_client +=logfile ssh_chan_behaviours_suite.subsystem_client.html +=started 2025-01-10 18:57:34 +=ended 2025-01-10 18:57:34 +=result ok +=elapsed 0.001753s +=case ssh_chan_behaviours_SUITE:end_per_suite +=logfile ssh_chan_behaviours_suite.end_per_suite.html +=started 2025-01-10 18:57:34 +=ended 2025-01-10 18:57:34 +=result ok +=elapsed 0.001318s +=group_time 0.191s +=case ssh_collect_labmachine_info_SUITE:init_per_suite +=logfile ssh_collect_labmachine_info_suite.init_per_suite.html +=started 2025-01-10 18:57:34 +=ended 2025-01-10 18:57:34 +=result skipped: "No 'collect_host_info' path configured" +=elapsed 0.000277s +=== *** SKIPPED {ssh_collect_labmachine_info_SUITE,init_per_suite} *** +=== +=case ssh_collect_labmachine_info_SUITE:ssh_info_lib +=started 2025-01-10 18:57:34 +=result skipped: No 'collect_host_info' path configured +=== *** Skipping test case #982 {ssh_collect_labmachine_info_SUITE,ssh_info_lib} *** +=== +=case ssh_collect_labmachine_info_SUITE:end_per_suite +=started 2025-01-10 18:57:34 +=result skipped: No 'collect_host_info' path configured +=== *** Skipping {ssh_collect_labmachine_info_SUITE,end_per_suite} *** +=case ssh_connection_SUITE:init_per_suite +=logfile ssh_connection_suite.init_per_suite.html +=started 2025-01-10 18:57:34 +=ended 2025-01-10 18:57:34 +=result ok +=elapsed 0.000242s +=case ssh_connection_SUITE:init_per_group +=logfile ssh_connection_suite.init_per_group.html +=group_props [{name,openssh}] +=started 2025-01-10 18:57:34 +=ended 2025-01-10 18:57:34 +=result ok +=elapsed 0.041816s +=case ssh_connection_SUITE:simple_exec +=logfile ssh_connection_suite.simple_exec.html +=started 2025-01-10 18:57:34 +=ended 2025-01-10 18:57:34 +=result ok +=elapsed 0.094706s +=case ssh_connection_SUITE:simple_exec_more_data +=logfile ssh_connection_suite.simple_exec_more_data.html +=started 2025-01-10 18:57:34 +=ended 2025-01-10 18:57:35 +=result ok +=elapsed 0.098418s +=case ssh_connection_SUITE:simple_exec_sock +=logfile ssh_connection_suite.simple_exec_sock.html +=started 2025-01-10 18:57:35 +=ended 2025-01-10 18:57:36 +=result ok +=elapsed 0.096431s +=case ssh_connection_SUITE:simple_exec_two_socks +=logfile ssh_connection_suite.simple_exec_two_socks.html +=started 2025-01-10 18:57:36 +=ended 2025-01-10 18:57:36 +=result ok +=elapsed 0.107513s +=case ssh_connection_SUITE:small_cat +=logfile ssh_connection_suite.small_cat.html +=started 2025-01-10 18:57:36 +=ended 2025-01-10 18:57:37 +=result ok +=elapsed 0.094785s +=case ssh_connection_SUITE:big_cat +=logfile ssh_connection_suite.big_cat.html +=started 2025-01-10 18:57:37 +=ended 2025-01-10 18:57:38 +=result ok +=elapsed 0.342170s +=case ssh_connection_SUITE:send_after_exit +=logfile ssh_connection_suite.send_after_exit.html +=started 2025-01-10 18:57:38 +=ended 2025-01-10 18:57:38 +=result ok +=elapsed 0.094850s +=case ssh_connection_SUITE:ptty_alloc_default +=logfile ssh_connection_suite.ptty_alloc_default.html +=started 2025-01-10 18:57:38 +=ended 2025-01-10 18:57:39 +=result ok +=elapsed 0.096912s +=case ssh_connection_SUITE:ptty_alloc +=logfile ssh_connection_suite.ptty_alloc.html +=started 2025-01-10 18:57:39 +=ended 2025-01-10 18:57:40 +=result ok +=elapsed 0.094099s +=case ssh_connection_SUITE:ptty_alloc_pixel +=logfile ssh_connection_suite.ptty_alloc_pixel.html +=started 2025-01-10 18:57:40 +=ended 2025-01-10 18:57:40 +=result ok +=elapsed 0.093269s +=case ssh_connection_SUITE:connect_sock_not_passive +=logfile ssh_connection_suite.connect_sock_not_passive.html +=started 2025-01-10 18:57:40 +=ended 2025-01-10 18:57:41 +=result ok +=elapsed 0.000628s +=case ssh_connection_SUITE:daemon_sock_not_passive +=logfile ssh_connection_suite.daemon_sock_not_passive.html +=started 2025-01-10 18:57:41 +=ended 2025-01-10 18:57:41 +=result ok +=elapsed 0.000633s +=case ssh_connection_SUITE:end_per_group +=logfile ssh_connection_suite.end_per_group.html +=group_props [{name,openssh}] +=started 2025-01-10 18:57:41 +=ended 2025-01-10 18:57:41 +=result ok +=elapsed 0.000000s +=group_time 7.593s +=case ssh_connection_SUITE:small_interrupted_send +=logfile ssh_connection_suite.small_interrupted_send.html +=started 2025-01-10 18:57:41 +=ended 2025-01-10 18:57:42 +=result ok +=elapsed 0.139577s +=case ssh_connection_SUITE:interrupted_send +=logfile ssh_connection_suite.interrupted_send.html +=started 2025-01-10 18:57:42 +=ended 2025-01-10 18:57:43 +=result ok +=elapsed 0.171013s +=case ssh_connection_SUITE:exec_erlang_term +=logfile ssh_connection_suite.exec_erlang_term.html +=started 2025-01-10 18:57:43 +=ended 2025-01-10 18:57:44 +=result ok +=elapsed 0.509554s +=case ssh_connection_SUITE:exec_erlang_term_non_default_shell +=logfile ssh_connection_suite.exec_erlang_term_non_default_shell.html +=started 2025-01-10 18:57:44 +=ended 2025-01-10 18:57:45 +=result ok +=elapsed 0.507411s +=case ssh_connection_SUITE:exec_disabled +=logfile ssh_connection_suite.exec_disabled.html +=started 2025-01-10 18:57:45 +=ended 2025-01-10 18:57:46 +=result ok +=elapsed 1.010671s +=case ssh_connection_SUITE:exec_shell_disabled +=logfile ssh_connection_suite.exec_shell_disabled.html +=started 2025-01-10 18:57:46 +=ended 2025-01-10 18:57:47 +=result ok +=elapsed 0.508774s +=case ssh_connection_SUITE:start_shell +=logfile ssh_connection_suite.start_shell.html +=started 2025-01-10 18:57:47 +=ended 2025-01-10 18:57:49 +=result ok +=elapsed 1.009040s +=case ssh_connection_SUITE:new_shell_dumb_term +=logfile ssh_connection_suite.new_shell_dumb_term.html +=started 2025-01-10 18:57:49 +=ended 2025-01-10 18:57:50 +=result ok +=elapsed 0.508177s +=case ssh_connection_SUITE:new_shell_xterm_term +=logfile ssh_connection_suite.new_shell_xterm_term.html +=started 2025-01-10 18:57:50 +=ended 2025-01-10 18:57:51 +=result ok +=elapsed 0.508549s +=case ssh_connection_SUITE:trap_exit_connect +=logfile ssh_connection_suite.trap_exit_connect.html +=started 2025-01-10 18:57:51 +=ended 2025-01-10 18:57:51 +=result ok +=elapsed 0.005900s +=case ssh_connection_SUITE:trap_exit_daemon +=logfile ssh_connection_suite.trap_exit_daemon.html +=started 2025-01-10 18:57:51 +=ended 2025-01-10 18:57:52 +=result ok +=elapsed 0.001494s +=case ssh_connection_SUITE:start_shell_pty +=logfile ssh_connection_suite.start_shell_pty.html +=started 2025-01-10 18:57:52 +=ended 2025-01-10 18:57:53 +=result ok +=elapsed 1.009559s +=case ssh_connection_SUITE:start_shell_exec +=logfile ssh_connection_suite.start_shell_exec.html +=started 2025-01-10 18:57:53 +=ended 2025-01-10 18:57:55 +=result ok +=elapsed 0.512553s +=case ssh_connection_SUITE:start_shell_exec_fun +=logfile ssh_connection_suite.start_shell_exec_fun.html +=started 2025-01-10 18:57:55 +=ended 2025-01-10 18:57:55 +=result ok +=elapsed 0.006957s +=case ssh_connection_SUITE:start_shell_exec_fun2 +=logfile ssh_connection_suite.start_shell_exec_fun2.html +=started 2025-01-10 18:57:55 +=ended 2025-01-10 18:57:56 +=result ok +=elapsed 0.007156s +=case ssh_connection_SUITE:start_shell_exec_fun3 +=logfile ssh_connection_suite.start_shell_exec_fun3.html +=started 2025-01-10 18:57:56 +=ended 2025-01-10 18:57:56 +=result ok +=elapsed 0.006669s +=case ssh_connection_SUITE:start_shell_exec_direct_fun +=logfile ssh_connection_suite.start_shell_exec_direct_fun.html +=started 2025-01-10 18:57:56 +=ended 2025-01-10 18:57:57 +=result ok +=elapsed 0.006488s +=case ssh_connection_SUITE:start_shell_exec_direct_fun2 +=logfile ssh_connection_suite.start_shell_exec_direct_fun2.html +=started 2025-01-10 18:57:57 +=ended 2025-01-10 18:57:57 +=result ok +=elapsed 0.006503s +=case ssh_connection_SUITE:start_shell_exec_direct_fun3 +=logfile ssh_connection_suite.start_shell_exec_direct_fun3.html +=started 2025-01-10 18:57:57 +=ended 2025-01-10 18:57:58 +=result ok +=elapsed 0.006437s +=case ssh_connection_SUITE:start_shell_exec_direct_fun_more_data +=logfile ssh_connection_suite.start_shell_exec_direct_fun_more_data.html +=started 2025-01-10 18:57:58 +=ended 2025-01-10 18:57:58 +=result ok +=elapsed 0.082519s +=case ssh_connection_SUITE:start_shell_exec_direct_fun1_error +=logfile ssh_connection_suite.start_shell_exec_direct_fun1_error.html +=started 2025-01-10 18:57:58 +=ended 2025-01-10 18:57:59 +=result ok +=elapsed 0.007004s +=case ssh_connection_SUITE:start_shell_exec_direct_fun1_error_type +=logfile ssh_connection_suite.start_shell_exec_direct_fun1_error_type.html +=started 2025-01-10 18:57:59 +=ended 2025-01-10 18:57:59 +=result ok +=elapsed 0.006307s +=case ssh_connection_SUITE:start_exec_direct_fun1_read_write +=logfile ssh_connection_suite.start_exec_direct_fun1_read_write.html +=started 2025-01-10 18:57:59 +=ended 2025-01-10 18:58:00 +=result ok +=elapsed 0.008390s +=case ssh_connection_SUITE:start_exec_direct_fun1_read_write_advanced +=logfile ssh_connection_suite.start_exec_direct_fun1_read_write_advanced.html +=started 2025-01-10 18:58:00 +=ended 2025-01-10 18:58:00 +=result ok +=elapsed 0.008793s +=case ssh_connection_SUITE:start_shell_sock_exec_fun +=logfile ssh_connection_suite.start_shell_sock_exec_fun.html +=started 2025-01-10 18:58:00 +=ended 2025-01-10 18:58:01 +=result ok +=elapsed 0.006278s +=case ssh_connection_SUITE:start_shell_sock_daemon_exec +=logfile ssh_connection_suite.start_shell_sock_daemon_exec.html +=started 2025-01-10 18:58:01 +=ended 2025-01-10 18:58:02 +=result ok +=elapsed 0.005748s +=case ssh_connection_SUITE:start_shell_sock_daemon_exec_multi +=logfile ssh_connection_suite.start_shell_sock_daemon_exec_multi.html +=started 2025-01-10 18:58:02 +=ended 2025-01-10 18:58:02 +=result ok +=elapsed 0.024789s +=case ssh_connection_SUITE:encode_decode_pty_opts +=logfile ssh_connection_suite.encode_decode_pty_opts.html +=started 2025-01-10 18:58:02 +=ended 2025-01-10 18:58:03 +=result ok +=elapsed 0.000018s +=case ssh_connection_SUITE:connect_sock_not_tcp +=logfile ssh_connection_suite.connect_sock_not_tcp.html +=started 2025-01-10 18:58:03 +=ended 2025-01-10 18:58:03 +=result ok +=elapsed 0.000194s +=case ssh_connection_SUITE:connect2_invalid_options +=logfile ssh_connection_suite.connect2_invalid_options.html +=started 2025-01-10 18:58:03 +=ended 2025-01-10 18:58:04 +=result ok +=elapsed 0.000001s +=case ssh_connection_SUITE:connect_invalid_port +=logfile ssh_connection_suite.connect_invalid_port.html +=started 2025-01-10 18:58:04 +=ended 2025-01-10 18:58:04 +=result ok +=elapsed 0.001173s +=case ssh_connection_SUITE:connect_invalid_options +=logfile ssh_connection_suite.connect_invalid_options.html +=started 2025-01-10 18:58:04 +=ended 2025-01-10 18:58:05 +=result ok +=elapsed 0.001292s +=case ssh_connection_SUITE:connect_invalid_timeout_0 +=logfile ssh_connection_suite.connect_invalid_timeout_0.html +=started 2025-01-10 18:58:05 +=ended 2025-01-10 18:58:05 +=result ok +=elapsed 0.001300s +=case ssh_connection_SUITE:connect_invalid_timeout_1 +=logfile ssh_connection_suite.connect_invalid_timeout_1.html +=started 2025-01-10 18:58:05 +=ended 2025-01-10 18:58:06 +=result ok +=elapsed 0.001307s +=case ssh_connection_SUITE:connect3_invalid_port +=logfile ssh_connection_suite.connect3_invalid_port.html +=started 2025-01-10 18:58:06 +=ended 2025-01-10 18:58:06 +=result ok +=elapsed 0.000002s +=case ssh_connection_SUITE:connect3_invalid_options +=logfile ssh_connection_suite.connect3_invalid_options.html +=started 2025-01-10 18:58:06 +=ended 2025-01-10 18:58:07 +=result ok +=elapsed 0.000002s +=case ssh_connection_SUITE:connect3_invalid_timeout_0 +=logfile ssh_connection_suite.connect3_invalid_timeout_0.html +=started 2025-01-10 18:58:07 +=ended 2025-01-10 18:58:07 +=result ok +=elapsed 0.000002s +=case ssh_connection_SUITE:connect3_invalid_timeout_1 +=logfile ssh_connection_suite.connect3_invalid_timeout_1.html +=started 2025-01-10 18:58:07 +=ended 2025-01-10 18:58:08 +=result ok +=elapsed 0.000003s +=case ssh_connection_SUITE:connect3_invalid_both +=logfile ssh_connection_suite.connect3_invalid_both.html +=started 2025-01-10 18:58:08 +=ended 2025-01-10 18:58:08 +=result ok +=elapsed 0.000002s +=case ssh_connection_SUITE:connect4_invalid_two_0 +=logfile ssh_connection_suite.connect4_invalid_two_0.html +=started 2025-01-10 18:58:08 +=ended 2025-01-10 18:58:09 +=result ok +=elapsed 0.001313s +=case ssh_connection_SUITE:connect4_invalid_two_1 +=logfile ssh_connection_suite.connect4_invalid_two_1.html +=started 2025-01-10 18:58:09 +=ended 2025-01-10 18:58:09 +=result ok +=elapsed 0.001265s +=case ssh_connection_SUITE:connect4_invalid_two_2 +=logfile ssh_connection_suite.connect4_invalid_two_2.html +=started 2025-01-10 18:58:09 +=ended 2025-01-10 18:58:10 +=result ok +=elapsed 0.001303s +=case ssh_connection_SUITE:connect4_invalid_three +=logfile ssh_connection_suite.connect4_invalid_three.html +=started 2025-01-10 18:58:10 +=ended 2025-01-10 18:58:11 +=result ok +=elapsed 0.001312s +=case ssh_connection_SUITE:connect_timeout +=logfile ssh_connection_suite.connect_timeout.html +=started 2025-01-10 18:58:11 +=ended 2025-01-10 18:58:13 +=result ok +=elapsed 2.001340s +=case ssh_connection_SUITE:daemon_sock_not_tcp +=logfile ssh_connection_suite.daemon_sock_not_tcp.html +=started 2025-01-10 18:58:13 +=ended 2025-01-10 18:58:14 +=result ok +=elapsed 0.000237s +=case ssh_connection_SUITE:gracefull_invalid_version +=logfile ssh_connection_suite.gracefull_invalid_version.html +=started 2025-01-10 18:58:14 +=ended 2025-01-10 18:58:14 +=result ok +=elapsed 0.002792s +=case ssh_connection_SUITE:gracefull_invalid_start +=logfile ssh_connection_suite.gracefull_invalid_start.html +=started 2025-01-10 18:58:14 +=ended 2025-01-10 18:58:15 +=result ok +=elapsed 0.002981s +=case ssh_connection_SUITE:gracefull_invalid_long_start +=logfile ssh_connection_suite.gracefull_invalid_long_start.html +=started 2025-01-10 18:58:15 +=ended 2025-01-10 18:58:15 +=result ok +=elapsed 0.002940s +=case ssh_connection_SUITE:gracefull_invalid_long_start_no_nl +=logfile ssh_connection_suite.gracefull_invalid_long_start_no_nl.html +=started 2025-01-10 18:58:15 +=ended 2025-01-10 18:58:16 +=result ok +=elapsed 0.003231s +=case ssh_connection_SUITE:kex_error +=logfile ssh_connection_suite.kex_error.html +=started 2025-01-10 18:58:16 +=ended 2025-01-10 18:58:16 +=result ok +=elapsed 0.004930s +=case ssh_connection_SUITE:stop_listener +=logfile ssh_connection_suite.stop_listener.html +=started 2025-01-10 18:58:16 +=ended 2025-01-10 18:58:17 +=result ok +=elapsed 0.016256s +=case ssh_connection_SUITE:no_sensitive_leak +=logfile ssh_connection_suite.no_sensitive_leak.html +=started 2025-01-10 18:58:17 +=ended 2025-01-10 18:58:18 +=result ok +=elapsed 0.607675s +=case ssh_connection_SUITE:start_subsystem_on_closed_channel +=logfile ssh_connection_suite.start_subsystem_on_closed_channel.html +=started 2025-01-10 18:58:18 +=ended 2025-01-10 18:58:20 +=result ok +=elapsed 2.007515s +=case ssh_connection_SUITE:max_channels_option +=logfile ssh_connection_suite.max_channels_option.html +=started 2025-01-10 18:58:20 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 1.012869s +=case ssh_connection_SUITE:end_per_suite +=logfile ssh_connection_suite.end_per_suite.html +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 0.000008s +=group_time 48.345s +=case ssh_dbg_SUITE:init_per_suite +=logfile ssh_dbg_suite.init_per_suite.html +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 0.009059s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.html +=group_props [{suite,ssh_dbg_SUITE},{name,dbg}] +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 0.000041s +=case ssh_dbg_SUITE:dbg_basic +=logfile ssh_dbg_suite.dbg_basic.html +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 0.051176s +=case ssh_dbg_SUITE:dbg_alg_terminate +=logfile ssh_dbg_suite.dbg_alg_terminate.html +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 0.014382s +=case ssh_dbg_SUITE:dbg_ssh_messages +=logfile ssh_dbg_suite.dbg_ssh_messages.html +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 0.011561s +=case ssh_dbg_SUITE:dbg_connections +=logfile ssh_dbg_suite.dbg_connections.html +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:22 +=result ok +=elapsed 0.013602s +=case ssh_dbg_SUITE:dbg_channels +=logfile ssh_dbg_suite.dbg_channels.html +=started 2025-01-10 18:58:22 +=ended 2025-01-10 18:58:23 +=result ok +=elapsed 1.012781s +=case ssh_dbg_SUITE:dbg_authentication +=logfile ssh_dbg_suite.dbg_authentication.html +=started 2025-01-10 18:58:23 +=ended 2025-01-10 18:58:23 +=result ok +=elapsed 0.021160s +=case ssh_dbg_SUITE:all_dbg +=logfile ssh_dbg_suite.all_dbg.html +=started 2025-01-10 18:58:23 +=ended 2025-01-10 18:58:23 +=result ok +=elapsed 0.025790s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.html +=group_props [{suite,ssh_dbg_SUITE},{name,dbg}] +=started 2025-01-10 18:58:23 +=ended 2025-01-10 18:58:23 +=result ok +=elapsed 0.000037s +=group_time 1.343s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.57026.html +=group_props [{name,circ_buf},{suite,ssh_dbg_SUITE}] +=started 2025-01-10 18:58:23 +=ended 2025-01-10 18:58:23 +=result ok +=elapsed 0.000061s +=case ssh_dbg_SUITE:cb_basic +=logfile ssh_dbg_suite.cb_basic.html +=started 2025-01-10 18:58:23 +=ended 2025-01-10 18:58:23 +=result ok +=elapsed 0.000008s +=case ssh_dbg_SUITE:cb_print +=logfile ssh_dbg_suite.cb_print.html +=started 2025-01-10 18:58:23 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000386s +=case ssh_dbg_SUITE:cb_macros_print +=logfile ssh_dbg_suite.cb_macros_print.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000288s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.57058.html +=group_props [{name,circ_buf},{suite,ssh_dbg_SUITE}] +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000045s +=group_time 0.093s +=case ssh_dbg_SUITE:end_per_suite +=logfile ssh_dbg_suite.end_per_suite.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.001365s +=group_time 1.537s +=case ssh_engine_SUITE:init_per_suite +=logfile ssh_engine_suite.init_per_suite.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000803s +=case ssh_engine_SUITE:init_per_group +=logfile ssh_engine_suite.init_per_group.html +=group_props [{name,dsa_key}] +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.003461s +=case ssh_engine_SUITE:simple_connect +=logfile ssh_engine_suite.simple_connect.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.015261s +=case ssh_engine_SUITE:end_per_group +=logfile ssh_engine_suite.end_per_group.html +=group_props [{name,dsa_key}] +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000054s +=group_time 0.066s +=case ssh_engine_SUITE:init_per_group +=logfile ssh_engine_suite.init_per_group.17732.html +=group_props [{name,rsa_key}] +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.002259s +=case ssh_engine_SUITE:simple_connect +=logfile ssh_engine_suite.simple_connect.43203.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.016948s +=case ssh_engine_SUITE:end_per_group +=logfile ssh_engine_suite.end_per_group.43235.html +=group_props [{name,rsa_key}] +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000099s +=group_time 0.066s +=case ssh_engine_SUITE:end_per_suite +=logfile ssh_engine_suite.end_per_suite.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.001411s +=group_time 0.216s +=case ssh_options_SUITE:init_per_suite +=logfile ssh_options_suite.init_per_suite.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000089s +=case ssh_options_SUITE:connectfun_disconnectfun_server +=logfile ssh_options_suite.connectfun_disconnectfun_server.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.006076s +=case ssh_options_SUITE:connectfun_disconnectfun_client +=logfile ssh_options_suite.connectfun_disconnectfun_client.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.005477s +=case ssh_options_SUITE:server_password_option +=logfile ssh_options_suite.server_password_option.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.009547s +=case ssh_options_SUITE:server_userpassword_option +=logfile ssh_options_suite.server_userpassword_option.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.013525s +=case ssh_options_SUITE:server_pwdfun_option +=logfile ssh_options_suite.server_pwdfun_option.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.013702s +=case ssh_options_SUITE:server_pwdfun_4_option +=logfile ssh_options_suite.server_pwdfun_4_option.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.025437s +=case ssh_options_SUITE:server_keyboard_interactive +=logfile ssh_options_suite.server_keyboard_interactive.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.006662s +=case ssh_options_SUITE:server_keyboard_interactive_extra_msg +=logfile ssh_options_suite.server_keyboard_interactive_extra_msg.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.006067s +=case ssh_options_SUITE:auth_method_kb_interactive_data_tuple +=logfile ssh_options_suite.auth_method_kb_interactive_data_tuple.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.009933s +=case ssh_options_SUITE:auth_method_kb_interactive_data_fun3 +=logfile ssh_options_suite.auth_method_kb_interactive_data_fun3.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.011248s +=case ssh_options_SUITE:auth_method_kb_interactive_data_fun4 +=logfile ssh_options_suite.auth_method_kb_interactive_data_fun4.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.010072s +=case ssh_options_SUITE:auth_none +=logfile ssh_options_suite.auth_none.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.005533s +=case ssh_options_SUITE:init_per_group +=logfile ssh_options_suite.init_per_group.html +=group_props [{name,dir_options}] +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000334s +=case ssh_options_SUITE:user_dir_option +=logfile ssh_options_suite.user_dir_option.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000183s +=case ssh_options_SUITE:user_dir_fun_option +=logfile ssh_options_suite.user_dir_fun_option.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.014803s +=case ssh_options_SUITE:system_dir_option +=logfile ssh_options_suite.system_dir_option.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000351s +=case ssh_options_SUITE:end_per_group +=logfile ssh_options_suite.end_per_group.html +=group_props [{name,dir_options}] +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000000s +=group_time 0.112s +=case ssh_options_SUITE:ssh_connect_timeout +=logfile ssh_options_suite.ssh_connect_timeout.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:24 +=result ok +=elapsed 0.000077s +=case ssh_options_SUITE:ssh_connect_arg4_timeout +=logfile ssh_options_suite.ssh_connect_arg4_timeout.html +=started 2025-01-10 18:58:24 +=ended 2025-01-10 18:58:25 +=result ok +=elapsed 1.001323s +=case ssh_options_SUITE:ssh_daemon_minimal_remote_max_packet_size_option +=logfile ssh_options_suite.ssh_daemon_minimal_remote_max_packet_size_option.html +=started 2025-01-10 18:58:25 +=ended 2025-01-10 18:58:25 +=result ok +=elapsed 0.006850s +=case ssh_options_SUITE:ssh_msg_debug_fun_option_client +=logfile ssh_options_suite.ssh_msg_debug_fun_option_client.html +=started 2025-01-10 18:58:25 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.005928s +=case ssh_options_SUITE:ssh_msg_debug_fun_option_server +=logfile ssh_options_suite.ssh_msg_debug_fun_option_server.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.005980s +=case ssh_options_SUITE:disconnectfun_option_server +=logfile ssh_options_suite.disconnectfun_option_server.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.006176s +=case ssh_options_SUITE:disconnectfun_option_client +=logfile ssh_options_suite.disconnectfun_option_client.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.005913s +=case ssh_options_SUITE:unexpectedfun_option_server +=logfile ssh_options_suite.unexpectedfun_option_server.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.005543s +=case ssh_options_SUITE:unexpectedfun_option_client +=logfile ssh_options_suite.unexpectedfun_option_client.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.005567s +=case ssh_options_SUITE:hostkey_fingerprint_check +=logfile ssh_options_suite.hostkey_fingerprint_check.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.007340s +=case ssh_options_SUITE:hostkey_fingerprint_check_md5 +=logfile ssh_options_suite.hostkey_fingerprint_check_md5.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.007209s +=case ssh_options_SUITE:hostkey_fingerprint_check_sha +=logfile ssh_options_suite.hostkey_fingerprint_check_sha.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.007068s +=case ssh_options_SUITE:hostkey_fingerprint_check_sha256 +=logfile ssh_options_suite.hostkey_fingerprint_check_sha256.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.006714s +=case ssh_options_SUITE:hostkey_fingerprint_check_sha384 +=logfile ssh_options_suite.hostkey_fingerprint_check_sha384.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.006343s +=case ssh_options_SUITE:hostkey_fingerprint_check_sha512 +=logfile ssh_options_suite.hostkey_fingerprint_check_sha512.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.006861s +=case ssh_options_SUITE:hostkey_fingerprint_check_list +=logfile ssh_options_suite.hostkey_fingerprint_check_list.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.008278s +=case ssh_options_SUITE:id_string_no_opt_client +=logfile ssh_options_suite.id_string_no_opt_client.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.001872s +=case ssh_options_SUITE:id_string_own_string_client +=logfile ssh_options_suite.id_string_own_string_client.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.001892s +=case ssh_options_SUITE:id_string_own_string_client_trail_space +=logfile ssh_options_suite.id_string_own_string_client_trail_space.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.001665s +=case ssh_options_SUITE:id_string_random_client +=logfile ssh_options_suite.id_string_random_client.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.001666s +=case ssh_options_SUITE:id_string_no_opt_server +=logfile ssh_options_suite.id_string_no_opt_server.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.002941s +=case ssh_options_SUITE:id_string_own_string_server +=logfile ssh_options_suite.id_string_own_string_server.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.002523s +=case ssh_options_SUITE:id_string_own_string_server_trail_space +=logfile ssh_options_suite.id_string_own_string_server_trail_space.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.002672s +=case ssh_options_SUITE:id_string_random_server +=logfile ssh_options_suite.id_string_random_server.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.002713s +=case ssh_options_SUITE:max_log_item_len +=logfile ssh_options_suite.max_log_item_len.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.005802s +=case ssh_options_SUITE:save_accepted_host_option +=logfile ssh_options_suite.save_accepted_host_option.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.009696s +=case ssh_options_SUITE:raw_option +=logfile ssh_options_suite.raw_option.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:26 +=result ok +=elapsed 0.000124s +=case ssh_options_SUITE:config_file +=logfile ssh_options_suite.config_file.html +=started 2025-01-10 18:58:26 +=ended 2025-01-10 18:58:27 +=result ok +=elapsed 0.396023s +=case ssh_options_SUITE:config_file_modify_algorithms_order +=logfile ssh_options_suite.config_file_modify_algorithms_order.html +=started 2025-01-10 18:58:27 +=ended 2025-01-10 18:58:27 +=result ok +=elapsed 0.314074s +=case ssh_options_SUITE:daemon_replace_options_simple +=logfile ssh_options_suite.daemon_replace_options_simple.html +=started 2025-01-10 18:58:27 +=ended 2025-01-10 18:58:27 +=result ok +=elapsed 0.002639s +=case ssh_options_SUITE:daemon_replace_options_algs +=logfile ssh_options_suite.daemon_replace_options_algs.html +=started 2025-01-10 18:58:27 +=ended 2025-01-10 18:58:27 +=result ok +=elapsed 0.002260s +=case ssh_options_SUITE:daemon_replace_options_algs_connect +=logfile ssh_options_suite.daemon_replace_options_algs_connect.html +=started 2025-01-10 18:58:27 +=ended 2025-01-10 18:58:27 +=result ok +=elapsed 0.032511s +=case ssh_options_SUITE:daemon_replace_options_algs_conf_file +=logfile ssh_options_suite.daemon_replace_options_algs_conf_file.html +=started 2025-01-10 18:58:27 +=ended 2025-01-10 18:58:27 +=result ok +=elapsed 0.291500s +=case ssh_options_SUITE:init_per_group +=logfile ssh_options_suite.init_per_group.44195.html +=group_props [{name,hardening_tests}] +=started 2025-01-10 18:58:27 +=ended 2025-01-10 18:58:27 +=result ok +=elapsed 0.010508s +=case ssh_options_SUITE:ssh_connect_nonegtimeout_connected_parallel +=logfile ssh_options_suite.ssh_connect_nonegtimeout_connected_parallel.html +=started 2025-01-10 18:58:27 +=ended 2025-01-10 18:58:33 +=result ok +=elapsed 5.511989s +=case ssh_options_SUITE:ssh_connect_nonegtimeout_connected_sequential +=logfile ssh_options_suite.ssh_connect_nonegtimeout_connected_sequential.html +=started 2025-01-10 18:58:33 +=ended 2025-01-10 18:58:39 +=result ok +=elapsed 5.511822s +=case ssh_options_SUITE:ssh_connect_negtimeout_parallel +=logfile ssh_options_suite.ssh_connect_negtimeout_parallel.html +=started 2025-01-10 18:58:39 +=ended 2025-01-10 18:58:43 +=result ok +=elapsed 4.002629s +=case ssh_options_SUITE:ssh_connect_negtimeout_sequential +=logfile ssh_options_suite.ssh_connect_negtimeout_sequential.html +=started 2025-01-10 18:58:43 +=ended 2025-01-10 18:58:47 +=result ok +=elapsed 4.003170s +=case ssh_options_SUITE:max_sessions_ssh_connect_parallel +=logfile ssh_options_suite.max_sessions_ssh_connect_parallel.html +=started 2025-01-10 18:58:47 +=ended 2025-01-10 18:58:47 +=result ok +=elapsed 0.036715s +=case ssh_options_SUITE:max_sessions_ssh_connect_sequential +=logfile ssh_options_suite.max_sessions_ssh_connect_sequential.html +=started 2025-01-10 18:58:47 +=ended 2025-01-10 18:58:47 +=result ok +=elapsed 0.036746s +=case ssh_options_SUITE:max_sessions_sftp_start_channel_parallel +=logfile ssh_options_suite.max_sessions_sftp_start_channel_parallel.html +=started 2025-01-10 18:58:47 +=ended 2025-01-10 18:58:47 +=result ok +=elapsed 0.140248s +=case ssh_options_SUITE:max_sessions_sftp_start_channel_sequential +=logfile ssh_options_suite.max_sessions_sftp_start_channel_sequential.html +=started 2025-01-10 18:58:47 +=ended 2025-01-10 18:58:47 +=result ok +=elapsed 0.139463s +=case ssh_options_SUITE:max_sessions_drops_tcp_connects +=logfile ssh_options_suite.max_sessions_drops_tcp_connects.html +=started 2025-01-10 18:58:47 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 65.499672s +=case ssh_options_SUITE:end_per_group +=logfile ssh_options_suite.end_per_group.27140.html +=group_props [{name,hardening_tests}] +=started 2025-01-10 18:59:53 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 0.000000s +=group_time 85.154s +=case ssh_options_SUITE:end_per_suite +=logfile ssh_options_suite.end_per_suite.html +=started 2025-01-10 18:59:53 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 0.000005s +=group_time 88.776s +=case ssh_property_test_SUITE:init_per_suite +=logfile ssh_property_test_suite.init_per_suite.html +=started 2025-01-10 18:59:53 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 0.360488s +=case ssh_property_test_SUITE:init_per_group +=logfile ssh_property_test_suite.init_per_group.html +=group_props [{name,messages}] +=started 2025-01-10 18:59:53 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 0.000000s +=case ssh_property_test_SUITE:decode +=logfile ssh_property_test_suite.decode.html +=started 2025-01-10 18:59:53 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 0.025420s +=case ssh_property_test_SUITE:decode_encode +=logfile ssh_property_test_suite.decode_encode.html +=started 2025-01-10 18:59:53 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 0.021341s +=case ssh_property_test_SUITE:end_per_group +=logfile ssh_property_test_suite.end_per_group.html +=group_props [{name,messages}] +=started 2025-01-10 18:59:53 +=ended 2025-01-10 18:59:53 +=result ok +=elapsed 0.000000s +=group_time 0.115s +=case ssh_property_test_SUITE:client_sends_info_timing +=logfile ssh_property_test_suite.client_sends_info_timing.html +=started 2025-01-10 18:59:53 +=ended 2025-01-10 19:01:53 +=result ok +=elapsed 119.863862s +=case ssh_property_test_SUITE:init_per_group +=logfile ssh_property_test_suite.init_per_group.52195.html +=group_props [{name,client_server}] +=started 2025-01-10 19:01:53 +=ended 2025-01-10 19:01:53 +=result ok +=elapsed 0.000000s +=case ssh_property_test_SUITE:client_server_sequential +=logfile ssh_property_test_suite.client_server_sequential.html +=started 2025-01-10 19:01:53 +=ended 2025-01-10 19:01:54 +=result ok +=elapsed 1.303733s +=case ssh_property_test_SUITE:client_server_parallel +=logfile ssh_property_test_suite.client_server_parallel.html +=started 2025-01-10 19:01:54 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 4.674783s +=case ssh_property_test_SUITE:end_per_group +=logfile ssh_property_test_suite.end_per_group.60195.html +=group_props [{name,client_server}] +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.000000s +=group_time 6.049s +=case ssh_property_test_SUITE:end_per_suite +=logfile ssh_property_test_suite.end_per_suite.html +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.000000s +=group_time 126.495s +=case ssh_protocol_SUITE:init_per_suite +=logfile ssh_protocol_suite.init_per_suite.html +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.012597s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.60227.html +=group_props [{suite,ssh_protocol_SUITE},{name,tool_tests}] +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.000034s +=case ssh_protocol_SUITE:lib_works_as_client +=logfile ssh_protocol_suite.lib_works_as_client.html +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.094407s +=case ssh_protocol_SUITE:lib_works_as_server +=logfile ssh_protocol_suite.lib_works_as_server.html +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.014316s +=case ssh_protocol_SUITE:lib_match +=logfile ssh_protocol_suite.lib_match.html +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.000333s +=case ssh_protocol_SUITE:lib_no_match +=logfile ssh_protocol_suite.lib_no_match.html +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:01:59 +=result ok +=elapsed 0.000118s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.60579.html +=group_props [{suite,ssh_protocol_SUITE},{name,tool_tests}] +=started 2025-01-10 19:01:59 +=ended 2025-01-10 19:02:00 +=result ok +=elapsed 0.000051s +=group_time 0.308s +=case ssh_protocol_SUITE:client_info_line +=logfile ssh_protocol_suite.client_info_line.html +=started 2025-01-10 19:02:00 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 1.007670s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.60643.html +=group_props [{name,kex},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.000062s +=case ssh_protocol_SUITE:no_common_alg_server_disconnects +=logfile ssh_protocol_suite.no_common_alg_server_disconnects.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.003161s +=case ssh_protocol_SUITE:no_common_alg_client_disconnects +=logfile ssh_protocol_suite.no_common_alg_client_disconnects.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.003573s +=case ssh_protocol_SUITE:gex_client_init_option_groups +=logfile ssh_protocol_suite.gex_client_init_option_groups.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.043959s +=case ssh_protocol_SUITE:gex_server_gex_limit +=logfile ssh_protocol_suite.gex_server_gex_limit.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.043461s +=case ssh_protocol_SUITE:gex_client_init_option_groups_moduli_file +=logfile ssh_protocol_suite.gex_client_init_option_groups_moduli_file.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.044941s +=case ssh_protocol_SUITE:gex_client_init_option_groups_file +=logfile ssh_protocol_suite.gex_client_init_option_groups_file.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.046554s +=case ssh_protocol_SUITE:gex_client_old_request_exact +=logfile ssh_protocol_suite.gex_client_old_request_exact.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.043943s +=case ssh_protocol_SUITE:gex_client_old_request_noexact +=logfile ssh_protocol_suite.gex_client_old_request_noexact.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:01 +=result ok +=elapsed 0.043478s +=case ssh_protocol_SUITE:kex_strict_negotiated +=logfile ssh_protocol_suite.kex_strict_negotiated.html +=started 2025-01-10 19:02:01 +=ended 2025-01-10 19:02:02 +=result ok +=elapsed 0.513507s +=case ssh_protocol_SUITE:kex_strict_msg_ignore +=logfile ssh_protocol_suite.kex_strict_msg_ignore.html +=started 2025-01-10 19:02:02 +=ended 2025-01-10 19:02:02 +=result ok +=elapsed 0.655339s +=case ssh_protocol_SUITE:kex_strict_msg_unknown +=logfile ssh_protocol_suite.kex_strict_msg_unknown.html +=started 2025-01-10 19:02:02 +=ended 2025-01-10 19:02:03 +=result ok +=elapsed 0.655065s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.61155.html +=group_props [{name,kex},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:03 +=ended 2025-01-10 19:02:03 +=result ok +=elapsed 0.000029s +=group_time 2.481s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.81698.html +=group_props [{name,service_requests},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:03 +=ended 2025-01-10 19:02:03 +=result ok +=elapsed 0.000032s +=case ssh_protocol_SUITE:bad_service_name +=logfile ssh_protocol_suite.bad_service_name.html +=started 2025-01-10 19:02:03 +=ended 2025-01-10 19:02:03 +=result ok +=elapsed 0.054347s +=case ssh_protocol_SUITE:bad_long_service_name +=logfile ssh_protocol_suite.bad_long_service_name.html +=started 2025-01-10 19:02:03 +=ended 2025-01-10 19:02:03 +=result ok +=elapsed 0.095979s +=case ssh_protocol_SUITE:bad_very_long_service_name +=logfile ssh_protocol_suite.bad_very_long_service_name.html +=started 2025-01-10 19:02:03 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.133881s +=case ssh_protocol_SUITE:empty_service_name +=logfile ssh_protocol_suite.empty_service_name.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.093047s +=case ssh_protocol_SUITE:bad_service_name_then_correct +=logfile ssh_protocol_suite.bad_service_name_then_correct.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.092643s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.82210.html +=group_props [{name,service_requests},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.000035s +=group_time 0.785s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.82242.html +=group_props [{name,authentication},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.000031s +=case ssh_protocol_SUITE:client_handles_keyboard_interactive_0_pwds +=logfile ssh_protocol_suite.client_handles_keyboard_interactive_0_pwds.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.015421s +=case ssh_protocol_SUITE:client_handles_banner_keyboard_interactive +=logfile ssh_protocol_suite.client_handles_banner_keyboard_interactive.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.015522s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.82530.html +=group_props [{name,authentication},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.000036s +=group_time 0.142s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.82562.html +=group_props [{name,packet_size_error},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.000036s +=case ssh_protocol_SUITE:packet_length_too_large +=logfile ssh_protocol_suite.packet_length_too_large.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.093074s +=case ssh_protocol_SUITE:packet_length_too_short +=logfile ssh_protocol_suite.packet_length_too_short.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.092735s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.27908.html +=group_props [{name,packet_size_error},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.000060s +=group_time 0.301s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.27940.html +=group_props [{name,field_size_error},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.000047s +=case ssh_protocol_SUITE:service_name_length_too_large +=logfile ssh_protocol_suite.service_name_length_too_large.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:04 +=result ok +=elapsed 0.054938s +=case ssh_protocol_SUITE:service_name_length_too_short +=logfile ssh_protocol_suite.service_name_length_too_short.html +=started 2025-01-10 19:02:04 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.092845s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.28132.html +=group_props [{name,field_size_error},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.000050s +=group_time 0.265s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.28164.html +=group_props [{name,ext_info},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.000043s +=case ssh_protocol_SUITE:no_ext_info_s1 +=logfile ssh_protocol_suite.no_ext_info_s1.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.094107s +=case ssh_protocol_SUITE:no_ext_info_s2 +=logfile ssh_protocol_suite.no_ext_info_s2.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.056956s +=case ssh_protocol_SUITE:ext_info_s +=logfile ssh_protocol_suite.ext_info_s.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.015581s +=case ssh_protocol_SUITE:ext_info_c +=logfile ssh_protocol_suite.ext_info_c.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.016285s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.61443.html +=group_props [{name,ext_info},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.000049s +=group_time 0.380s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.61475.html +=group_props [{name,preferred_algorithms},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.000034s +=case ssh_protocol_SUITE:preferred_algorithms +=logfile ssh_protocol_suite.preferred_algorithms.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.000355s +=case ssh_protocol_SUITE:modify_append +=logfile ssh_protocol_suite.modify_append.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.004171s +=case ssh_protocol_SUITE:modify_prepend +=logfile ssh_protocol_suite.modify_prepend.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.004150s +=case ssh_protocol_SUITE:modify_rm +=logfile ssh_protocol_suite.modify_rm.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.004341s +=case ssh_protocol_SUITE:modify_combo +=logfile ssh_protocol_suite.modify_combo.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.004424s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.61763.html +=group_props [{name,preferred_algorithms},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.000038s +=group_time 0.265s +=case ct_framework:init_per_group +=logfile ct_framework.init_per_group.61795.html +=group_props [{name,client_close_early},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:05 +=result ok +=elapsed 0.000035s +=case ssh_protocol_SUITE:client_close_after_hello +=logfile ssh_protocol_suite.client_close_after_hello.html +=started 2025-01-10 19:02:05 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 30.221634s +=case ct_framework:end_per_group +=logfile ct_framework.end_per_group.62275.html +=group_props [{name,client_close_early},{suite,ssh_protocol_SUITE}] +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.000042s +=group_time 30.288s +=case ssh_protocol_SUITE:end_per_suite +=logfile ssh_protocol_suite.end_per_suite.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.001527s +=group_time 36.528s +=case ssh_pubkey_SUITE:init_per_suite +=logfile ssh_pubkey_suite.init_per_suite.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.000518s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.html +=group_props [{name,old_format}] +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.000002s +=case ssh_pubkey_SUITE:check_dsa_disabled +=logfile ssh_pubkey_suite.check_dsa_disabled.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.008464s +=case ssh_pubkey_SUITE:check_rsa_sha1_disabled +=logfile ssh_pubkey_suite.check_rsa_sha1_disabled.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.007894s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009561s +=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009215s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009376s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.008599s +=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009382s +=case ssh_pubkey_SUITE:connect_dsa_to_dsa +=logfile ssh_pubkey_suite.connect_dsa_to_dsa.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.007624s +=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.007767s +=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009095s +=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.007547s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.008225s +=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.008529s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.007770s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009549s +=case ssh_pubkey_SUITE:connect_dsa_to_ed448 +=logfile ssh_pubkey_suite.connect_dsa_to_ed448.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.008292s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.008244s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009588s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.85186.html +=group_props [{name,passphrase}] +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.000007s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.62755.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.011527s +=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.62819.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009115s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.62915.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.009834s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.62979.html +=started 2025-01-10 19:02:36 +=ended 2025-01-10 19:02:36 +=result ok +=elapsed 0.008850s +=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.63043.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.009305s +=case ssh_pubkey_SUITE:connect_dsa_to_dsa +=logfile ssh_pubkey_suite.connect_dsa_to_dsa.63107.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008024s +=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.63171.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008045s +=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.63267.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008995s +=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.85410.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008061s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.63363.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.007982s +=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.85506.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008242s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.63459.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.007981s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.63555.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008981s +=case ssh_pubkey_SUITE:connect_dsa_to_ed448 +=logfile ssh_pubkey_suite.connect_dsa_to_ed448.63619.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.009050s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.63715.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008553s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.85634.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.010235s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.html +=group_props [{name,passphrase}] +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.000000s +=group_time 0.559s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.85698.html +=group_props [{name,old_format}] +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.000000s +=group_time 1.200s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.85730.html +=group_props [{name,new_format}] +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.000002s +=case ssh_pubkey_SUITE:connect_ed25519_to_dsa +=logfile ssh_pubkey_suite.connect_ed25519_to_dsa.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008767s +=case ssh_pubkey_SUITE:connect_ed25519_to_ecdsa +=logfile ssh_pubkey_suite.connect_ed25519_to_ecdsa.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.007228s +=case ssh_pubkey_SUITE:connect_ed25519_to_ed448 +=logfile ssh_pubkey_suite.connect_ed25519_to_ed448.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008972s +=case ssh_pubkey_SUITE:connect_ed25519_to_ed25519 +=logfile ssh_pubkey_suite.connect_ed25519_to_ed25519.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008854s +=case ssh_pubkey_SUITE:connect_ed25519_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.010435s +=case ssh_pubkey_SUITE:connect_ed448_to_dsa +=logfile ssh_pubkey_suite.connect_ed448_to_dsa.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008444s +=case ssh_pubkey_SUITE:connect_ed448_to_ecdsa +=logfile ssh_pubkey_suite.connect_ed448_to_ecdsa.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008727s +=case ssh_pubkey_SUITE:connect_ed448_to_ed25519 +=logfile ssh_pubkey_suite.connect_ed448_to_ed25519.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008593s +=case ssh_pubkey_SUITE:connect_ed448_to_ed448 +=logfile ssh_pubkey_suite.connect_ed448_to_ed448.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.008662s +=case ssh_pubkey_SUITE:connect_ed448_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ed448_to_rsa_sha2.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.010971s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.28260.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.012807s +=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.86114.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.010394s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.64195.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.010071s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.86210.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.009637s +=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.86274.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:37 +=result ok +=elapsed 0.010518s +=case ssh_pubkey_SUITE:connect_dsa_to_dsa +=logfile ssh_pubkey_suite.connect_dsa_to_dsa.28324.html +=started 2025-01-10 19:02:37 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008400s +=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.28356.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.007473s +=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.64355.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.010797s +=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.28420.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008287s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.64483.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.007701s +=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.64579.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.007901s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.64643.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008527s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.64739.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.009832s +=case ssh_pubkey_SUITE:connect_dsa_to_ed448 +=logfile ssh_pubkey_suite.connect_dsa_to_ed448.64803.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008463s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.64835.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008470s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.64899.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.011810s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.86594.html +=group_props [{name,new_format}] +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.000000s +=group_time 0.895s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.86626.html +=group_props [{name,option_space}] +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.000001s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.28452.html +=group_props [{name,new_format}] +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.000002s +=case ssh_pubkey_SUITE:connect_ed25519_to_dsa +=logfile ssh_pubkey_suite.connect_ed25519_to_dsa.86658.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008550s +=case ssh_pubkey_SUITE:connect_ed25519_to_ecdsa +=logfile ssh_pubkey_suite.connect_ed25519_to_ecdsa.86722.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.010246s +=case ssh_pubkey_SUITE:connect_ed25519_to_ed448 +=logfile ssh_pubkey_suite.connect_ed25519_to_ed448.86818.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.009002s +=case ssh_pubkey_SUITE:connect_ed25519_to_ed25519 +=logfile ssh_pubkey_suite.connect_ed25519_to_ed25519.86914.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.009362s +=case ssh_pubkey_SUITE:connect_ed25519_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ed25519_to_rsa_sha2.87010.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.013560s +=case ssh_pubkey_SUITE:connect_ed448_to_dsa +=logfile ssh_pubkey_suite.connect_ed448_to_dsa.87074.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.010044s +=case ssh_pubkey_SUITE:connect_ed448_to_ecdsa +=logfile ssh_pubkey_suite.connect_ed448_to_ecdsa.28516.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008513s +=case ssh_pubkey_SUITE:connect_ed448_to_ed25519 +=logfile ssh_pubkey_suite.connect_ed448_to_ed25519.28580.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.008706s +=case ssh_pubkey_SUITE:connect_ed448_to_ed448 +=logfile ssh_pubkey_suite.connect_ed448_to_ed448.28644.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.009054s +=case ssh_pubkey_SUITE:connect_ed448_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ed448_to_rsa_sha2.28676.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.011640s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_rsa_sha2.28708.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.013725s +=case ssh_pubkey_SUITE:connect_rsa_sha1_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha1_to_dsa.87298.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.010663s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_dsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_dsa.65091.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.011115s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ecdsa +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ecdsa.65155.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.010834s +=case ssh_pubkey_SUITE:connect_dsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_dsa_to_rsa_sha2.87426.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.010689s +=case ssh_pubkey_SUITE:connect_dsa_to_dsa +=logfile ssh_pubkey_suite.connect_dsa_to_dsa.28836.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:38 +=result ok +=elapsed 0.007931s +=case ssh_pubkey_SUITE:connect_dsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_dsa_to_ecdsa.65219.html +=started 2025-01-10 19:02:38 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.008345s +=case ssh_pubkey_SUITE:connect_ecdsa_to_rsa_sha2 +=logfile ssh_pubkey_suite.connect_ecdsa_to_rsa_sha2.87586.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.010027s +=case ssh_pubkey_SUITE:connect_ecdsa_to_dsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_dsa.65283.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.007977s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ecdsa +=logfile ssh_pubkey_suite.connect_ecdsa_to_ecdsa.65347.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.007859s +=case ssh_pubkey_SUITE:connect_dsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_dsa_to_ed25519.28996.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.008556s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed25519 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed25519.65379.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.007841s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed25519 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed25519.65443.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.010366s +=case ssh_pubkey_SUITE:connect_dsa_to_ed448 +=logfile ssh_pubkey_suite.connect_dsa_to_ed448.87682.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.008493s +=case ssh_pubkey_SUITE:connect_ecdsa_to_ed448 +=logfile ssh_pubkey_suite.connect_ecdsa_to_ed448.65539.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.008920s +=case ssh_pubkey_SUITE:connect_rsa_sha2_to_ed448 +=logfile ssh_pubkey_suite.connect_rsa_sha2_to_ed448.87714.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.012233s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.87778.html +=group_props [{name,new_format}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000000s +=group_time 0.920s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.87810.html +=group_props [{name,option_space}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000000s +=group_time 0.966s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.87842.html +=group_props [{name,ssh_hostkey_fingerprint}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000000s +=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_md5_implicit +=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_md5_implicit.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000094s +=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_md5 +=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_md5.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000048s +=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha +=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000037s +=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha256 +=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha256.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000037s +=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha384 +=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha384.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000053s +=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_sha512 +=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_sha512.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000056s +=case ssh_pubkey_SUITE:ssh_hostkey_fingerprint_list +=logfile ssh_pubkey_suite.ssh_hostkey_fingerprint_list.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000084s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.87874.html +=group_props [{name,ssh_hostkey_fingerprint}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000000s +=group_time 0.187s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.87906.html +=group_props [{name,ssh_public_key_decode_encode}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000003s +=case ssh_pubkey_SUITE:ssh_rsa_public_key +=logfile ssh_pubkey_suite.ssh_rsa_public_key.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000276s +=case ssh_pubkey_SUITE:ssh_dsa_public_key +=logfile ssh_pubkey_suite.ssh_dsa_public_key.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000263s +=case ssh_pubkey_SUITE:ssh_ecdsa_public_key +=logfile ssh_pubkey_suite.ssh_ecdsa_public_key.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000197s +=case ssh_pubkey_SUITE:ssh_rfc4716_rsa_comment +=logfile ssh_pubkey_suite.ssh_rfc4716_rsa_comment.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000092s +=case ssh_pubkey_SUITE:ssh_rfc4716_dsa_comment +=logfile ssh_pubkey_suite.ssh_rfc4716_dsa_comment.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000140s +=case ssh_pubkey_SUITE:ssh_rfc4716_rsa_subject +=logfile ssh_pubkey_suite.ssh_rfc4716_rsa_subject.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000106s +=case ssh_pubkey_SUITE:ssh_list_public_key +=logfile ssh_pubkey_suite.ssh_list_public_key.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.001129s +=case ssh_pubkey_SUITE:ssh_known_hosts +=logfile ssh_pubkey_suite.ssh_known_hosts.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000170s +=case ssh_pubkey_SUITE:ssh_auth_keys +=logfile ssh_pubkey_suite.ssh_auth_keys.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000233s +=case ssh_pubkey_SUITE:ssh_openssh_key_with_comment +=logfile ssh_pubkey_suite.ssh_openssh_key_with_comment.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000056s +=case ssh_pubkey_SUITE:ssh_openssh_key_long_header +=logfile ssh_pubkey_suite.ssh_openssh_key_long_header.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000073s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.87938.html +=group_props [{name,ssh_public_key_decode_encode}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000000s +=group_time 0.285s +=case ssh_pubkey_SUITE:init_per_group +=logfile ssh_pubkey_suite.init_per_group.87970.html +=group_props [{name,pkcs8}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000002s +=case ssh_pubkey_SUITE:ssh_hostkey_pkcs8 +=logfile ssh_pubkey_suite.ssh_hostkey_pkcs8.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.013531s +=case ssh_pubkey_SUITE:end_per_group +=logfile ssh_pubkey_suite.end_per_group.65667.html +=group_props [{name,pkcs8}] +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.000000s +=group_time 0.060s +=case ssh_pubkey_SUITE:chk_known_hosts +=logfile ssh_pubkey_suite.chk_known_hosts.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:39 +=result ok +=elapsed 0.013458s +=case ssh_pubkey_SUITE:end_per_suite +=logfile ssh_pubkey_suite.end_per_suite.html +=started 2025-01-10 19:02:39 +=ended 2025-01-10 19:02:40 +=result ok +=elapsed 0.001597s +=group_time 3.807s +=case ssh_renegotiate_SUITE:init_per_suite +=logfile ssh_renegotiate_suite.init_per_suite.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:02:40 +=result ok +=elapsed 0.011874s +=case ssh_renegotiate_SUITE:init_per_group +=logfile ssh_renegotiate_suite.init_per_group.html +=group_props [{name,renegotiate},parallel] +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:02:40 +=result ok +=elapsed 0.000000s +=case ssh_renegotiate_SUITE:rekey0 +=logfile ssh_renegotiate_suite.rekey0.88130.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:03:40 +=result ok +=elapsed 60.092782s +=case ssh_renegotiate_SUITE:rekey1 +=logfile ssh_renegotiate_suite.rekey1.88194.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:03:40 +=result ok +=elapsed 60.073484s +=case ssh_renegotiate_SUITE:rekey2 +=logfile ssh_renegotiate_suite.rekey2.88162.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:03:40 +=result ok +=elapsed 60.082504s +=case ssh_renegotiate_SUITE:rekey3 +=logfile ssh_renegotiate_suite.rekey3.88226.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:03:40 +=result ok +=elapsed 60.076909s +=case ssh_renegotiate_SUITE:rekey4 +=logfile ssh_renegotiate_suite.rekey4.88258.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:03:40 +=result ok +=elapsed 60.085074s +=case ssh_renegotiate_SUITE:rekey_limit_client +=logfile ssh_renegotiate_suite.rekey_limit_client.88322.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 360.099307s +=case ssh_renegotiate_SUITE:rekey_limit_daemon +=logfile ssh_renegotiate_suite.rekey_limit_daemon.88290.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 360.100099s +=case ssh_renegotiate_SUITE:rekey_time_limit_client +=logfile ssh_renegotiate_suite.rekey_time_limit_client.88354.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:05:45 +=result ok +=elapsed 185.089707s +=case ssh_renegotiate_SUITE:rekey_time_limit_daemon +=logfile ssh_renegotiate_suite.rekey_time_limit_daemon.65731.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:05:45 +=result ok +=elapsed 185.089042s +=case ssh_renegotiate_SUITE:norekey_limit_client +=logfile ssh_renegotiate_suite.norekey_limit_client.65763.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:04:40 +=result ok +=elapsed 120.091493s +=case ssh_renegotiate_SUITE:norekey_limit_daemon +=logfile ssh_renegotiate_suite.norekey_limit_daemon.65795.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:04:40 +=result ok +=elapsed 120.092524s +=case ssh_renegotiate_SUITE:renegotiate1 +=logfile ssh_renegotiate_suite.renegotiate1.65827.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:02:42 +=result ok +=elapsed 2.144901s +=case ssh_renegotiate_SUITE:renegotiate2 +=logfile ssh_renegotiate_suite.renegotiate2.29188.html +=started 2025-01-10 19:02:40 +=ended 2025-01-10 19:02:42 +=result ok +=elapsed 2.152993s +=case ssh_renegotiate_SUITE:end_per_group +=logfile ssh_renegotiate_suite.end_per_group.html +=group_props [{name,renegotiate},parallel] +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.000000s +=group_time 360.163s +=case ssh_renegotiate_SUITE:end_per_suite +=logfile ssh_renegotiate_suite.end_per_suite.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.001796s +=group_time 360.234s +=case ssh_sftp_SUITE:init_per_suite +=logfile ssh_sftp_suite.init_per_suite.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.000545s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.html +=group_props [{name,not_unicode}] +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.001909s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.29476.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.001404s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.65955.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.000020s +=case ssh_sftp_SUITE:open_close_file +=logfile ssh_sftp_suite.open_close_file.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.005532s +=case ssh_sftp_SUITE:open_close_dir +=logfile ssh_sftp_suite.open_close_dir.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.000850s +=case ssh_sftp_SUITE:read_file +=logfile ssh_sftp_suite.read_file.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.002833s +=case ssh_sftp_SUITE:read_dir +=logfile ssh_sftp_suite.read_dir.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.001408s +=case ssh_sftp_SUITE:write_file +=logfile ssh_sftp_suite.write_file.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.001319s +=case ssh_sftp_SUITE:write_file_iolist +=logfile ssh_sftp_suite.write_file_iolist.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.007705s +=case ssh_sftp_SUITE:write_big_file +=logfile ssh_sftp_suite.write_big_file.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:40 +=result ok +=elapsed 0.045563s +=case ssh_sftp_SUITE:sftp_read_big_file +=logfile ssh_sftp_suite.sftp_read_big_file.html +=started 2025-01-10 19:08:40 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.046843s +=case ssh_sftp_SUITE:rename_file +=logfile ssh_sftp_suite.rename_file.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.002785s +=case ssh_sftp_SUITE:mk_rm_dir +=logfile ssh_sftp_suite.mk_rm_dir.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.001335s +=case ssh_sftp_SUITE:remove_file +=logfile ssh_sftp_suite.remove_file.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.002566s +=case ssh_sftp_SUITE:links +=logfile ssh_sftp_suite.links.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.000716s +=case ssh_sftp_SUITE:retrieve_attributes +=logfile ssh_sftp_suite.retrieve_attributes.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.000441s +=case ssh_sftp_SUITE:set_attributes +=logfile ssh_sftp_suite.set_attributes.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.002424s +=case ssh_sftp_SUITE:file_owner_access +=logfile ssh_sftp_suite.file_owner_access.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.003560s +=case ssh_sftp_SUITE:async_read +=logfile ssh_sftp_suite.async_read.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.000938s +=case ssh_sftp_SUITE:async_write +=logfile ssh_sftp_suite.async_write.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.000955s +=case ssh_sftp_SUITE:position +=logfile ssh_sftp_suite.position.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.003300s +=case ssh_sftp_SUITE:pos_read +=logfile ssh_sftp_suite.pos_read.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.002212s +=case ssh_sftp_SUITE:pos_write +=logfile ssh_sftp_suite.pos_write.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:41 +=result ok +=elapsed 0.003391s +=case ssh_sftp_SUITE:start_channel_sock +=logfile ssh_sftp_suite.start_channel_sock.html +=started 2025-01-10 19:08:41 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.429594s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.000015s +=group_time 1.912s +=case ssh_sftp_SUITE:version_option +=logfile ssh_sftp_suite.version_option.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.000781s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.89698.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.021591s +=case ssh_sftp_SUITE:create_empty_tar +=logfile ssh_sftp_suite.create_empty_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.005012s +=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.005842s +=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1303 of 1557 *** +=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1304 of 1557 *** +=case ssh_sftp_SUITE:files_to_tar +=logfile ssh_sftp_suite.files_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.006455s +=case ssh_sftp_SUITE:big_file_to_tar +=logfile ssh_sftp_suite.big_file_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.018359s +=case ssh_sftp_SUITE:files_chunked_to_tar +=logfile ssh_sftp_suite.files_chunked_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.005708s +=case ssh_sftp_SUITE:directory_to_tar +=logfile ssh_sftp_suite.directory_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.006797s +=case ssh_sftp_SUITE:binaries_to_tar +=logfile ssh_sftp_suite.binaries_to_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.005399s +=case ssh_sftp_SUITE:null_crypto_tar +=logfile ssh_sftp_suite.null_crypto_tar.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:42 +=result ok +=elapsed 0.030271s +=case ssh_sftp_SUITE:simple_crypto_tar_small +=logfile ssh_sftp_suite.simple_crypto_tar_small.html +=started 2025-01-10 19:08:42 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.006040s +=case ssh_sftp_SUITE:simple_crypto_tar_big +=logfile ssh_sftp_suite.simple_crypto_tar_big.html +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.178819s +=case ssh_sftp_SUITE:read_tar +=logfile ssh_sftp_suite.read_tar.html +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.043649s +=case ssh_sftp_SUITE:read_null_crypto_tar +=logfile ssh_sftp_suite.read_null_crypto_tar.html +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.047431s +=case ssh_sftp_SUITE:read_crypto_tar +=logfile ssh_sftp_suite.read_crypto_tar.html +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.085543s +=case ssh_sftp_SUITE:block_size_1_crypto_tar +=logfile ssh_sftp_suite.block_size_1_crypto_tar.html +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.045809s +=case ssh_sftp_SUITE:block_size_16_crypto_tar +=logfile ssh_sftp_suite.block_size_16_crypto_tar.html +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.044908s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.67747.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.000014s +=group_time 1.427s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.67779.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.000012s +=group_time 3.461s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.67811.html +=group_props [{name,openssh_server}] +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.096121s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.67875.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:43 +=result ok +=elapsed 0.000017s +=case ssh_sftp_SUITE:open_close_file +=logfile ssh_sftp_suite.open_close_file.90690.html +=started 2025-01-10 19:08:43 +=ended 2025-01-10 19:08:44 +=result ok +=elapsed 0.002786s +=case ssh_sftp_SUITE:open_close_dir +=logfile ssh_sftp_suite.open_close_dir.90786.html +=started 2025-01-10 19:08:44 +=ended 2025-01-10 19:08:44 +=result ok +=elapsed 0.000518s +=case ssh_sftp_SUITE:read_file +=logfile ssh_sftp_suite.read_file.90882.html +=started 2025-01-10 19:08:44 +=ended 2025-01-10 19:08:44 +=result ok +=elapsed 0.001941s +=case ssh_sftp_SUITE:read_dir +=logfile ssh_sftp_suite.read_dir.90914.html +=started 2025-01-10 19:08:44 +=ended 2025-01-10 19:08:44 +=result ok +=elapsed 0.000967s +=case ssh_sftp_SUITE:write_file +=logfile ssh_sftp_suite.write_file.91010.html +=started 2025-01-10 19:08:44 +=ended 2025-01-10 19:08:44 +=result ok +=elapsed 0.000940s +=case ssh_sftp_SUITE:write_file_iolist +=logfile ssh_sftp_suite.write_file_iolist.91106.html +=started 2025-01-10 19:08:44 +=ended 2025-01-10 19:08:44 +=result ok +=elapsed 0.005023s +=case ssh_sftp_SUITE:write_big_file +=logfile ssh_sftp_suite.write_big_file.91202.html +=started 2025-01-10 19:08:44 +=ended 2025-01-10 19:08:44 +=result ok +=elapsed 0.045946s +=case ssh_sftp_SUITE:sftp_read_big_file +=logfile ssh_sftp_suite.sftp_read_big_file.91298.html +=started 2025-01-10 19:08:45 +=ended 2025-01-10 19:08:45 +=result ok +=elapsed 0.048550s +=case ssh_sftp_SUITE:rename_file +=logfile ssh_sftp_suite.rename_file.91394.html +=started 2025-01-10 19:08:45 +=ended 2025-01-10 19:08:45 +=result ok +=elapsed 0.002196s +=case ssh_sftp_SUITE:mk_rm_dir +=logfile ssh_sftp_suite.mk_rm_dir.91490.html +=started 2025-01-10 19:08:45 +=ended 2025-01-10 19:08:45 +=result ok +=elapsed 0.000835s +=case ssh_sftp_SUITE:remove_file +=logfile ssh_sftp_suite.remove_file.91586.html +=started 2025-01-10 19:08:45 +=ended 2025-01-10 19:08:45 +=result ok +=elapsed 0.002122s +=case ssh_sftp_SUITE:links +=logfile ssh_sftp_suite.links.91682.html +=started 2025-01-10 19:08:45 +=ended 2025-01-10 19:08:45 +=result skipped: "known bug in openssh" +=elapsed 0.000000s +=== *** SKIPPED test case 1329 of 1557 *** +=case ssh_sftp_SUITE:retrieve_attributes +=logfile ssh_sftp_suite.retrieve_attributes.91746.html +=started 2025-01-10 19:08:45 +=ended 2025-01-10 19:08:45 +=result ok +=elapsed 0.000422s +=case ssh_sftp_SUITE:set_attributes +=logfile ssh_sftp_suite.set_attributes.91842.html +=started 2025-01-10 19:08:45 +=ended 2025-01-10 19:08:46 +=result ok +=elapsed 0.000776s +=case ssh_sftp_SUITE:file_owner_access +=logfile ssh_sftp_suite.file_owner_access.91938.html +=started 2025-01-10 19:08:46 +=ended 2025-01-10 19:08:46 +=result ok +=elapsed 0.002228s +=case ssh_sftp_SUITE:async_read +=logfile ssh_sftp_suite.async_read.92034.html +=started 2025-01-10 19:08:46 +=ended 2025-01-10 19:08:46 +=result ok +=elapsed 0.000623s +=case ssh_sftp_SUITE:async_write +=logfile ssh_sftp_suite.async_write.92130.html +=started 2025-01-10 19:08:46 +=ended 2025-01-10 19:08:46 +=result ok +=elapsed 0.000707s +=case ssh_sftp_SUITE:position +=logfile ssh_sftp_suite.position.92226.html +=started 2025-01-10 19:08:46 +=ended 2025-01-10 19:08:46 +=result ok +=elapsed 0.002093s +=case ssh_sftp_SUITE:pos_read +=logfile ssh_sftp_suite.pos_read.92322.html +=started 2025-01-10 19:08:46 +=ended 2025-01-10 19:08:46 +=result ok +=elapsed 0.001768s +=case ssh_sftp_SUITE:pos_write +=logfile ssh_sftp_suite.pos_write.92418.html +=started 2025-01-10 19:08:46 +=ended 2025-01-10 19:08:46 +=result ok +=elapsed 0.002510s +=case ssh_sftp_SUITE:start_channel_sock +=logfile ssh_sftp_suite.start_channel_sock.92514.html +=started 2025-01-10 19:08:46 +=ended 2025-01-10 19:08:47 +=result ok +=elapsed 0.509729s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.92642.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:47 +=ended 2025-01-10 19:08:47 +=result ok +=elapsed 0.000012s +=group_time 3.435s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.92674.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:08:47 +=ended 2025-01-10 19:08:47 +=result ok +=elapsed 0.040814s +=case ssh_sftp_SUITE:create_empty_tar +=logfile ssh_sftp_suite.create_empty_tar.92738.html +=started 2025-01-10 19:08:47 +=ended 2025-01-10 19:08:47 +=result ok +=elapsed 0.001065s +=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.92834.html +=started 2025-01-10 19:08:47 +=ended 2025-01-10 19:08:47 +=result ok +=elapsed 0.004438s +=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.92930.html +=started 2025-01-10 19:08:47 +=ended 2025-01-10 19:08:47 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1341 of 1557 *** +=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.93026.html +=started 2025-01-10 19:08:47 +=ended 2025-01-10 19:08:47 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1342 of 1557 *** +=case ssh_sftp_SUITE:files_to_tar +=logfile ssh_sftp_suite.files_to_tar.93122.html +=started 2025-01-10 19:08:47 +=ended 2025-01-10 19:08:48 +=result ok +=elapsed 0.005515s +=case ssh_sftp_SUITE:big_file_to_tar +=logfile ssh_sftp_suite.big_file_to_tar.93218.html +=started 2025-01-10 19:08:48 +=ended 2025-01-10 19:08:48 +=result ok +=elapsed 0.021893s +=case ssh_sftp_SUITE:files_chunked_to_tar +=logfile ssh_sftp_suite.files_chunked_to_tar.93314.html +=started 2025-01-10 19:08:48 +=ended 2025-01-10 19:08:48 +=result ok +=elapsed 0.005069s +=case ssh_sftp_SUITE:directory_to_tar +=logfile ssh_sftp_suite.directory_to_tar.93410.html +=started 2025-01-10 19:08:48 +=ended 2025-01-10 19:08:48 +=result ok +=elapsed 0.005744s +=case ssh_sftp_SUITE:binaries_to_tar +=logfile ssh_sftp_suite.binaries_to_tar.93506.html +=started 2025-01-10 19:08:48 +=ended 2025-01-10 19:08:48 +=result ok +=elapsed 0.003806s +=case ssh_sftp_SUITE:null_crypto_tar +=logfile ssh_sftp_suite.null_crypto_tar.93602.html +=started 2025-01-10 19:08:48 +=ended 2025-01-10 19:08:48 +=result ok +=elapsed 0.038657s +=case ssh_sftp_SUITE:simple_crypto_tar_small +=logfile ssh_sftp_suite.simple_crypto_tar_small.93698.html +=started 2025-01-10 19:08:48 +=ended 2025-01-10 19:08:48 +=result ok +=elapsed 0.004272s +=case ssh_sftp_SUITE:simple_crypto_tar_big +=logfile ssh_sftp_suite.simple_crypto_tar_big.93794.html +=started 2025-01-10 19:08:48 +=ended 2025-01-10 19:08:49 +=result ok +=elapsed 0.181212s +=case ssh_sftp_SUITE:read_tar +=logfile ssh_sftp_suite.read_tar.93890.html +=started 2025-01-10 19:08:49 +=ended 2025-01-10 19:08:49 +=result ok +=elapsed 0.047941s +=case ssh_sftp_SUITE:read_null_crypto_tar +=logfile ssh_sftp_suite.read_null_crypto_tar.93986.html +=started 2025-01-10 19:08:49 +=ended 2025-01-10 19:08:49 +=result ok +=elapsed 0.052272s +=case ssh_sftp_SUITE:read_crypto_tar +=logfile ssh_sftp_suite.read_crypto_tar.94082.html +=started 2025-01-10 19:08:49 +=ended 2025-01-10 19:08:49 +=result ok +=elapsed 0.085587s +=case ssh_sftp_SUITE:block_size_1_crypto_tar +=logfile ssh_sftp_suite.block_size_1_crypto_tar.94178.html +=started 2025-01-10 19:08:49 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.049174s +=case ssh_sftp_SUITE:block_size_16_crypto_tar +=logfile ssh_sftp_suite.block_size_16_crypto_tar.94274.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.055327s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.94370.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.000015s +=group_time 2.808s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.94402.html +=group_props [{name,openssh_server}] +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.000012s +=group_time 6.410s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.94434.html +=group_props [{name,big_recvpkt_size}] +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.000000s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.94466.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.001131s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.94498.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.000010s +=case ssh_sftp_SUITE:open_close_file +=logfile ssh_sftp_suite.open_close_file.94530.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.005887s +=case ssh_sftp_SUITE:open_close_dir +=logfile ssh_sftp_suite.open_close_dir.94626.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.000684s +=case ssh_sftp_SUITE:read_file +=logfile ssh_sftp_suite.read_file.68035.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.002266s +=case ssh_sftp_SUITE:read_dir +=logfile ssh_sftp_suite.read_dir.68163.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.001387s +=case ssh_sftp_SUITE:write_file +=logfile ssh_sftp_suite.write_file.68259.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.001279s +=case ssh_sftp_SUITE:write_file_iolist +=logfile ssh_sftp_suite.write_file_iolist.94786.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.007207s +=case ssh_sftp_SUITE:write_big_file +=logfile ssh_sftp_suite.write_big_file.94914.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.046276s +=case ssh_sftp_SUITE:sftp_read_big_file +=logfile ssh_sftp_suite.sftp_read_big_file.95010.html +=started 2025-01-10 19:08:50 +=ended 2025-01-10 19:08:50 +=result ok +=elapsed 0.048312s +=case ssh_sftp_SUITE:rename_file +=logfile ssh_sftp_suite.rename_file.95106.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.003138s +=case ssh_sftp_SUITE:mk_rm_dir +=logfile ssh_sftp_suite.mk_rm_dir.95234.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.001284s +=case ssh_sftp_SUITE:remove_file +=logfile ssh_sftp_suite.remove_file.95362.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.003306s +=case ssh_sftp_SUITE:links +=logfile ssh_sftp_suite.links.95490.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.000620s +=case ssh_sftp_SUITE:retrieve_attributes +=logfile ssh_sftp_suite.retrieve_attributes.95618.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.000444s +=case ssh_sftp_SUITE:set_attributes +=logfile ssh_sftp_suite.set_attributes.68419.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.002162s +=case ssh_sftp_SUITE:file_owner_access +=logfile ssh_sftp_suite.file_owner_access.68515.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.003498s +=case ssh_sftp_SUITE:async_read +=logfile ssh_sftp_suite.async_read.95810.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.001046s +=case ssh_sftp_SUITE:async_write +=logfile ssh_sftp_suite.async_write.95938.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.001042s +=case ssh_sftp_SUITE:position +=logfile ssh_sftp_suite.position.96034.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.003251s +=case ssh_sftp_SUITE:pos_read +=logfile ssh_sftp_suite.pos_read.96130.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.002509s +=case ssh_sftp_SUITE:pos_write +=logfile ssh_sftp_suite.pos_write.96194.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:51 +=result ok +=elapsed 0.003346s +=case ssh_sftp_SUITE:start_channel_sock +=logfile ssh_sftp_suite.start_channel_sock.96290.html +=started 2025-01-10 19:08:51 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.430085s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.96386.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.000022s +=group_time 1.901s +=case ssh_sftp_SUITE:version_option +=logfile ssh_sftp_suite.version_option.96418.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.000833s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.96482.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.021225s +=case ssh_sftp_SUITE:create_empty_tar +=logfile ssh_sftp_suite.create_empty_tar.96546.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.001635s +=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.96610.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.005236s +=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.69059.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1380 of 1557 *** +=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.69091.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1381 of 1557 *** +=case ssh_sftp_SUITE:files_to_tar +=logfile ssh_sftp_suite.files_to_tar.69123.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.007557s +=case ssh_sftp_SUITE:big_file_to_tar +=logfile ssh_sftp_suite.big_file_to_tar.69187.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.017772s +=case ssh_sftp_SUITE:files_chunked_to_tar +=logfile ssh_sftp_suite.files_chunked_to_tar.96994.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.005761s +=case ssh_sftp_SUITE:directory_to_tar +=logfile ssh_sftp_suite.directory_to_tar.97090.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.006881s +=case ssh_sftp_SUITE:binaries_to_tar +=logfile ssh_sftp_suite.binaries_to_tar.97218.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.004565s +=case ssh_sftp_SUITE:null_crypto_tar +=logfile ssh_sftp_suite.null_crypto_tar.29508.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.029787s +=case ssh_sftp_SUITE:simple_crypto_tar_small +=logfile ssh_sftp_suite.simple_crypto_tar_small.29540.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:52 +=result ok +=elapsed 0.006020s +=case ssh_sftp_SUITE:simple_crypto_tar_big +=logfile ssh_sftp_suite.simple_crypto_tar_big.29572.html +=started 2025-01-10 19:08:52 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.168962s +=case ssh_sftp_SUITE:read_tar +=logfile ssh_sftp_suite.read_tar.97474.html +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.044231s +=case ssh_sftp_SUITE:read_null_crypto_tar +=logfile ssh_sftp_suite.read_null_crypto_tar.97506.html +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.046272s +=case ssh_sftp_SUITE:read_crypto_tar +=logfile ssh_sftp_suite.read_crypto_tar.69667.html +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.074310s +=case ssh_sftp_SUITE:block_size_1_crypto_tar +=logfile ssh_sftp_suite.block_size_1_crypto_tar.69795.html +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.041844s +=case ssh_sftp_SUITE:block_size_16_crypto_tar +=logfile ssh_sftp_suite.block_size_16_crypto_tar.69859.html +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.041879s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.69955.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.000014s +=group_time 1.389s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.69987.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.000017s +=group_time 3.409s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.70019.html +=group_props [{name,openssh_server}] +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.095552s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.97634.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.000031s +=case ssh_sftp_SUITE:open_close_file +=logfile ssh_sftp_suite.open_close_file.70051.html +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:53 +=result ok +=elapsed 0.003065s +=case ssh_sftp_SUITE:open_close_dir +=logfile ssh_sftp_suite.open_close_dir.97666.html +=started 2025-01-10 19:08:53 +=ended 2025-01-10 19:08:54 +=result ok +=elapsed 0.000502s +=case ssh_sftp_SUITE:read_file +=logfile ssh_sftp_suite.read_file.97730.html +=started 2025-01-10 19:08:54 +=ended 2025-01-10 19:08:54 +=result ok +=elapsed 0.001855s +=case ssh_sftp_SUITE:read_dir +=logfile ssh_sftp_suite.read_dir.97794.html +=started 2025-01-10 19:08:54 +=ended 2025-01-10 19:08:54 +=result ok +=elapsed 0.000909s +=case ssh_sftp_SUITE:write_file +=logfile ssh_sftp_suite.write_file.97826.html +=started 2025-01-10 19:08:54 +=ended 2025-01-10 19:08:54 +=result ok +=elapsed 0.000906s +=case ssh_sftp_SUITE:write_file_iolist +=logfile ssh_sftp_suite.write_file_iolist.97922.html +=started 2025-01-10 19:08:54 +=ended 2025-01-10 19:08:54 +=result ok +=elapsed 0.005012s +=case ssh_sftp_SUITE:write_big_file +=logfile ssh_sftp_suite.write_big_file.98018.html +=started 2025-01-10 19:08:54 +=ended 2025-01-10 19:08:54 +=result ok +=elapsed 0.043454s +=case ssh_sftp_SUITE:sftp_read_big_file +=logfile ssh_sftp_suite.sftp_read_big_file.98114.html +=started 2025-01-10 19:08:54 +=ended 2025-01-10 19:08:55 +=result ok +=elapsed 0.054754s +=case ssh_sftp_SUITE:rename_file +=logfile ssh_sftp_suite.rename_file.98210.html +=started 2025-01-10 19:08:55 +=ended 2025-01-10 19:08:55 +=result ok +=elapsed 0.002034s +=case ssh_sftp_SUITE:mk_rm_dir +=logfile ssh_sftp_suite.mk_rm_dir.98306.html +=started 2025-01-10 19:08:55 +=ended 2025-01-10 19:08:55 +=result ok +=elapsed 0.000913s +=case ssh_sftp_SUITE:remove_file +=logfile ssh_sftp_suite.remove_file.98402.html +=started 2025-01-10 19:08:55 +=ended 2025-01-10 19:08:55 +=result ok +=elapsed 0.002285s +=case ssh_sftp_SUITE:links +=logfile ssh_sftp_suite.links.98498.html +=started 2025-01-10 19:08:55 +=ended 2025-01-10 19:08:55 +=result skipped: "known bug in openssh" +=elapsed 0.000000s +=== *** SKIPPED test case 1406 of 1557 *** +=case ssh_sftp_SUITE:retrieve_attributes +=logfile ssh_sftp_suite.retrieve_attributes.98562.html +=started 2025-01-10 19:08:55 +=ended 2025-01-10 19:08:55 +=result ok +=elapsed 0.000371s +=case ssh_sftp_SUITE:set_attributes +=logfile ssh_sftp_suite.set_attributes.98658.html +=started 2025-01-10 19:08:55 +=ended 2025-01-10 19:08:55 +=result ok +=elapsed 0.000795s +=case ssh_sftp_SUITE:file_owner_access +=logfile ssh_sftp_suite.file_owner_access.98754.html +=started 2025-01-10 19:08:55 +=ended 2025-01-10 19:08:56 +=result ok +=elapsed 0.001957s +=case ssh_sftp_SUITE:async_read +=logfile ssh_sftp_suite.async_read.98850.html +=started 2025-01-10 19:08:56 +=ended 2025-01-10 19:08:56 +=result ok +=elapsed 0.000629s +=case ssh_sftp_SUITE:async_write +=logfile ssh_sftp_suite.async_write.98946.html +=started 2025-01-10 19:08:56 +=ended 2025-01-10 19:08:56 +=result ok +=elapsed 0.000678s +=case ssh_sftp_SUITE:position +=logfile ssh_sftp_suite.position.99042.html +=started 2025-01-10 19:08:56 +=ended 2025-01-10 19:08:56 +=result ok +=elapsed 0.002239s +=case ssh_sftp_SUITE:pos_read +=logfile ssh_sftp_suite.pos_read.99138.html +=started 2025-01-10 19:08:56 +=ended 2025-01-10 19:08:56 +=result ok +=elapsed 0.001925s +=case ssh_sftp_SUITE:pos_write +=logfile ssh_sftp_suite.pos_write.99234.html +=started 2025-01-10 19:08:56 +=ended 2025-01-10 19:08:56 +=result ok +=elapsed 0.002509s +=case ssh_sftp_SUITE:start_channel_sock +=logfile ssh_sftp_suite.start_channel_sock.99330.html +=started 2025-01-10 19:08:56 +=ended 2025-01-10 19:08:57 +=result ok +=elapsed 0.508787s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.99458.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:08:57 +=ended 2025-01-10 19:08:57 +=result ok +=elapsed 0.000014s +=group_time 3.465s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.99490.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:08:57 +=ended 2025-01-10 19:08:57 +=result ok +=elapsed 0.040706s +=case ssh_sftp_SUITE:create_empty_tar +=logfile ssh_sftp_suite.create_empty_tar.99554.html +=started 2025-01-10 19:08:57 +=ended 2025-01-10 19:08:57 +=result ok +=elapsed 0.000965s +=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.99650.html +=started 2025-01-10 19:08:57 +=ended 2025-01-10 19:08:57 +=result ok +=elapsed 0.004448s +=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.99746.html +=started 2025-01-10 19:08:57 +=ended 2025-01-10 19:08:57 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1418 of 1557 *** +=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.99842.html +=started 2025-01-10 19:08:57 +=ended 2025-01-10 19:08:57 +=result skipped: "Unicode test" +=elapsed 0.000001s +=== *** SKIPPED test case 1419 of 1557 *** +=case ssh_sftp_SUITE:files_to_tar +=logfile ssh_sftp_suite.files_to_tar.99938.html +=started 2025-01-10 19:08:57 +=ended 2025-01-10 19:08:58 +=result ok +=elapsed 0.005595s +=case ssh_sftp_SUITE:big_file_to_tar +=logfile ssh_sftp_suite.big_file_to_tar.100034.html +=started 2025-01-10 19:08:58 +=ended 2025-01-10 19:08:58 +=result ok +=elapsed 0.022689s +=case ssh_sftp_SUITE:files_chunked_to_tar +=logfile ssh_sftp_suite.files_chunked_to_tar.100130.html +=started 2025-01-10 19:08:58 +=ended 2025-01-10 19:08:58 +=result ok +=elapsed 0.005139s +=case ssh_sftp_SUITE:directory_to_tar +=logfile ssh_sftp_suite.directory_to_tar.100226.html +=started 2025-01-10 19:08:58 +=ended 2025-01-10 19:08:58 +=result ok +=elapsed 0.006061s +=case ssh_sftp_SUITE:binaries_to_tar +=logfile ssh_sftp_suite.binaries_to_tar.100322.html +=started 2025-01-10 19:08:58 +=ended 2025-01-10 19:08:58 +=result ok +=elapsed 0.003643s +=case ssh_sftp_SUITE:null_crypto_tar +=logfile ssh_sftp_suite.null_crypto_tar.100418.html +=started 2025-01-10 19:08:58 +=ended 2025-01-10 19:08:58 +=result ok +=elapsed 0.036672s +=case ssh_sftp_SUITE:simple_crypto_tar_small +=logfile ssh_sftp_suite.simple_crypto_tar_small.100514.html +=started 2025-01-10 19:08:58 +=ended 2025-01-10 19:08:58 +=result ok +=elapsed 0.004964s +=case ssh_sftp_SUITE:simple_crypto_tar_big +=logfile ssh_sftp_suite.simple_crypto_tar_big.100610.html +=started 2025-01-10 19:08:58 +=ended 2025-01-10 19:08:59 +=result ok +=elapsed 0.177762s +=case ssh_sftp_SUITE:read_tar +=logfile ssh_sftp_suite.read_tar.100706.html +=started 2025-01-10 19:08:59 +=ended 2025-01-10 19:08:59 +=result ok +=elapsed 0.047908s +=case ssh_sftp_SUITE:read_null_crypto_tar +=logfile ssh_sftp_suite.read_null_crypto_tar.100802.html +=started 2025-01-10 19:08:59 +=ended 2025-01-10 19:08:59 +=result ok +=elapsed 0.055667s +=case ssh_sftp_SUITE:read_crypto_tar +=logfile ssh_sftp_suite.read_crypto_tar.100898.html +=started 2025-01-10 19:08:59 +=ended 2025-01-10 19:08:59 +=result ok +=elapsed 0.086664s +=case ssh_sftp_SUITE:block_size_1_crypto_tar +=logfile ssh_sftp_suite.block_size_1_crypto_tar.100994.html +=started 2025-01-10 19:08:59 +=ended 2025-01-10 19:08:59 +=result ok +=elapsed 0.049536s +=case ssh_sftp_SUITE:block_size_16_crypto_tar +=logfile ssh_sftp_suite.block_size_16_crypto_tar.101090.html +=started 2025-01-10 19:08:59 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.050646s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.101186.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.000017s +=group_time 2.808s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.101218.html +=group_props [{name,openssh_server}] +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.000015s +=group_time 6.439s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.101250.html +=group_props [{name,big_recvpkt_size}] +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.000015s +=group_time 9.920s +=case ssh_sftp_SUITE:sftp_nonexistent_subsystem +=logfile ssh_sftp_suite.sftp_nonexistent_subsystem.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.022273s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.101346.html +=group_props [{name,not_unicode}] +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.000013s +=group_time 19.938s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.101378.html +=group_props [{name,unicode}] +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.002137s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.101410.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.001338s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.101442.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.000019s +=case ssh_sftp_SUITE:open_close_file +=logfile ssh_sftp_suite.open_close_file.101474.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.005882s +=case ssh_sftp_SUITE:open_close_dir +=logfile ssh_sftp_suite.open_close_dir.70275.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.000793s +=case ssh_sftp_SUITE:read_file +=logfile ssh_sftp_suite.read_file.70339.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.002428s +=case ssh_sftp_SUITE:read_dir +=logfile ssh_sftp_suite.read_dir.70467.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.001606s +=case ssh_sftp_SUITE:write_file +=logfile ssh_sftp_suite.write_file.101698.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.001450s +=case ssh_sftp_SUITE:write_file_iolist +=logfile ssh_sftp_suite.write_file_iolist.101762.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.007607s +=case ssh_sftp_SUITE:write_big_file +=logfile ssh_sftp_suite.write_big_file.70691.html +=started 2025-01-10 19:09:00 +=ended 2025-01-10 19:09:00 +=result ok +=elapsed 0.048782s +=case ssh_sftp_SUITE:sftp_read_big_file +=logfile ssh_sftp_suite.sftp_read_big_file.101922.html +=started 2025-01-10 19:09:01 +=ended 2025-01-10 19:09:01 +=result ok +=elapsed 0.053174s +=case ssh_sftp_SUITE:rename_file +=logfile ssh_sftp_suite.rename_file.102050.html +=started 2025-01-10 19:09:01 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.003639s +=case ssh_sftp_SUITE:mk_rm_dir +=logfile ssh_sftp_suite.mk_rm_dir.102178.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.001169s +=case ssh_sftp_SUITE:remove_file +=logfile ssh_sftp_suite.remove_file.70787.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.003294s +=case ssh_sftp_SUITE:links +=logfile ssh_sftp_suite.links.70915.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.000591s +=case ssh_sftp_SUITE:retrieve_attributes +=logfile ssh_sftp_suite.retrieve_attributes.102306.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.000489s +=case ssh_sftp_SUITE:set_attributes +=logfile ssh_sftp_suite.set_attributes.102402.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.001931s +=case ssh_sftp_SUITE:file_owner_access +=logfile ssh_sftp_suite.file_owner_access.102530.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.003540s +=case ssh_sftp_SUITE:async_read +=logfile ssh_sftp_suite.async_read.102658.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.000960s +=case ssh_sftp_SUITE:async_write +=logfile ssh_sftp_suite.async_write.71043.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.001030s +=case ssh_sftp_SUITE:position +=logfile ssh_sftp_suite.position.102850.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.002472s +=case ssh_sftp_SUITE:pos_read +=logfile ssh_sftp_suite.pos_read.102978.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.002685s +=case ssh_sftp_SUITE:pos_write +=logfile ssh_sftp_suite.pos_write.71075.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:02 +=result ok +=elapsed 0.003665s +=case ssh_sftp_SUITE:start_channel_sock +=logfile ssh_sftp_suite.start_channel_sock.103106.html +=started 2025-01-10 19:09:02 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.429678s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.71299.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.000026s +=group_time 2.757s +=case ssh_sftp_SUITE:version_option +=logfile ssh_sftp_suite.version_option.103202.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.000873s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.103298.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.022485s +=case ssh_sftp_SUITE:create_empty_tar +=logfile ssh_sftp_suite.create_empty_tar.103394.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.001462s +=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.103522.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.005677s +=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.71395.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.005869s +=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.71491.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.006259s +=case ssh_sftp_SUITE:files_to_tar +=logfile ssh_sftp_suite.files_to_tar.71587.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.007324s +=case ssh_sftp_SUITE:big_file_to_tar +=logfile ssh_sftp_suite.big_file_to_tar.71683.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.018074s +=case ssh_sftp_SUITE:files_chunked_to_tar +=logfile ssh_sftp_suite.files_chunked_to_tar.71715.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.006632s +=case ssh_sftp_SUITE:directory_to_tar +=logfile ssh_sftp_suite.directory_to_tar.71811.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.006050s +=case ssh_sftp_SUITE:binaries_to_tar +=logfile ssh_sftp_suite.binaries_to_tar.103906.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.005359s +=case ssh_sftp_SUITE:null_crypto_tar +=logfile ssh_sftp_suite.null_crypto_tar.103970.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.036979s +=case ssh_sftp_SUITE:simple_crypto_tar_small +=logfile ssh_sftp_suite.simple_crypto_tar_small.104066.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:03 +=result ok +=elapsed 0.006710s +=case ssh_sftp_SUITE:simple_crypto_tar_big +=logfile ssh_sftp_suite.simple_crypto_tar_big.72035.html +=started 2025-01-10 19:09:03 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.171546s +=case ssh_sftp_SUITE:read_tar +=logfile ssh_sftp_suite.read_tar.72131.html +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.046859s +=case ssh_sftp_SUITE:read_null_crypto_tar +=logfile ssh_sftp_suite.read_null_crypto_tar.104226.html +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.047480s +=case ssh_sftp_SUITE:read_crypto_tar +=logfile ssh_sftp_suite.read_crypto_tar.104290.html +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.073247s +=case ssh_sftp_SUITE:block_size_1_crypto_tar +=logfile ssh_sftp_suite.block_size_1_crypto_tar.104386.html +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.046341s +=case ssh_sftp_SUITE:block_size_16_crypto_tar +=logfile ssh_sftp_suite.block_size_16_crypto_tar.104514.html +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.049850s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.104610.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.000015s +=group_time 1.442s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.104642.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.000013s +=group_time 4.323s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.104674.html +=group_props [{name,openssh_server}] +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.099750s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.104738.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.000024s +=case ssh_sftp_SUITE:open_close_file +=logfile ssh_sftp_suite.open_close_file.104770.html +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:04 +=result ok +=elapsed 0.003532s +=case ssh_sftp_SUITE:open_close_dir +=logfile ssh_sftp_suite.open_close_dir.104866.html +=started 2025-01-10 19:09:04 +=ended 2025-01-10 19:09:05 +=result ok +=elapsed 0.000651s +=case ssh_sftp_SUITE:read_file +=logfile ssh_sftp_suite.read_file.104962.html +=started 2025-01-10 19:09:05 +=ended 2025-01-10 19:09:05 +=result ok +=elapsed 0.002013s +=case ssh_sftp_SUITE:read_dir +=logfile ssh_sftp_suite.read_dir.105058.html +=started 2025-01-10 19:09:05 +=ended 2025-01-10 19:09:05 +=result ok +=elapsed 0.001035s +=case ssh_sftp_SUITE:write_file +=logfile ssh_sftp_suite.write_file.105154.html +=started 2025-01-10 19:09:05 +=ended 2025-01-10 19:09:05 +=result ok +=elapsed 0.000989s +=case ssh_sftp_SUITE:write_file_iolist +=logfile ssh_sftp_suite.write_file_iolist.105250.html +=started 2025-01-10 19:09:05 +=ended 2025-01-10 19:09:05 +=result ok +=elapsed 0.005553s +=case ssh_sftp_SUITE:write_big_file +=logfile ssh_sftp_suite.write_big_file.105346.html +=started 2025-01-10 19:09:05 +=ended 2025-01-10 19:09:05 +=result ok +=elapsed 0.050295s +=case ssh_sftp_SUITE:sftp_read_big_file +=logfile ssh_sftp_suite.sftp_read_big_file.105442.html +=started 2025-01-10 19:09:06 +=ended 2025-01-10 19:09:06 +=result ok +=elapsed 0.053476s +=case ssh_sftp_SUITE:rename_file +=logfile ssh_sftp_suite.rename_file.105538.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result ok +=elapsed 0.002526s +=case ssh_sftp_SUITE:mk_rm_dir +=logfile ssh_sftp_suite.mk_rm_dir.105634.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result ok +=elapsed 0.000849s +=case ssh_sftp_SUITE:remove_file +=logfile ssh_sftp_suite.remove_file.105730.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result ok +=elapsed 0.002152s +=case ssh_sftp_SUITE:links +=logfile ssh_sftp_suite.links.105826.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result skipped: "known bug in openssh" +=elapsed 0.000000s +=== *** SKIPPED test case 1484 of 1557 *** +=case ssh_sftp_SUITE:retrieve_attributes +=logfile ssh_sftp_suite.retrieve_attributes.105890.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result ok +=elapsed 0.000367s +=case ssh_sftp_SUITE:set_attributes +=logfile ssh_sftp_suite.set_attributes.105986.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result ok +=elapsed 0.000881s +=case ssh_sftp_SUITE:file_owner_access +=logfile ssh_sftp_suite.file_owner_access.106082.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result ok +=elapsed 0.001949s +=case ssh_sftp_SUITE:async_read +=logfile ssh_sftp_suite.async_read.106178.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:07 +=result ok +=elapsed 0.000672s +=case ssh_sftp_SUITE:async_write +=logfile ssh_sftp_suite.async_write.106274.html +=started 2025-01-10 19:09:07 +=ended 2025-01-10 19:09:08 +=result ok +=elapsed 0.000740s +=case ssh_sftp_SUITE:position +=logfile ssh_sftp_suite.position.106370.html +=started 2025-01-10 19:09:08 +=ended 2025-01-10 19:09:08 +=result ok +=elapsed 0.002210s +=case ssh_sftp_SUITE:pos_read +=logfile ssh_sftp_suite.pos_read.106466.html +=started 2025-01-10 19:09:08 +=ended 2025-01-10 19:09:08 +=result ok +=elapsed 0.001717s +=case ssh_sftp_SUITE:pos_write +=logfile ssh_sftp_suite.pos_write.106562.html +=started 2025-01-10 19:09:08 +=ended 2025-01-10 19:09:08 +=result ok +=elapsed 0.002457s +=case ssh_sftp_SUITE:start_channel_sock +=logfile ssh_sftp_suite.start_channel_sock.106658.html +=started 2025-01-10 19:09:08 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.509790s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.106786.html +=group_props [{name,write_read_tests}] +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.000012s +=group_time 4.354s +=case ssh_sftp_SUITE:init_per_group +=logfile ssh_sftp_suite.init_per_group.106818.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.041334s +=case ssh_sftp_SUITE:create_empty_tar +=logfile ssh_sftp_suite.create_empty_tar.106882.html +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.001037s +=case ssh_sftp_SUITE:ascii_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_ascii_contents_to_tar.106978.html +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.004361s +=case ssh_sftp_SUITE:ascii_filename_unicode_contents_to_tar +=logfile ssh_sftp_suite.ascii_filename_unicode_contents_to_tar.107074.html +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.004394s +=case ssh_sftp_SUITE:unicode_filename_ascii_contents_to_tar +=logfile ssh_sftp_suite.unicode_filename_ascii_contents_to_tar.107170.html +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.004720s +=case ssh_sftp_SUITE:files_to_tar +=logfile ssh_sftp_suite.files_to_tar.107266.html +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:09 +=result ok +=elapsed 0.006137s +=case ssh_sftp_SUITE:big_file_to_tar +=logfile ssh_sftp_suite.big_file_to_tar.107362.html +=started 2025-01-10 19:09:09 +=ended 2025-01-10 19:09:10 +=result ok +=elapsed 0.022471s +=case ssh_sftp_SUITE:files_chunked_to_tar +=logfile ssh_sftp_suite.files_chunked_to_tar.107458.html +=started 2025-01-10 19:09:10 +=ended 2025-01-10 19:09:10 +=result ok +=elapsed 0.005445s +=case ssh_sftp_SUITE:directory_to_tar +=logfile ssh_sftp_suite.directory_to_tar.107554.html +=started 2025-01-10 19:09:10 +=ended 2025-01-10 19:09:10 +=result ok +=elapsed 0.006377s +=case ssh_sftp_SUITE:binaries_to_tar +=logfile ssh_sftp_suite.binaries_to_tar.107650.html +=started 2025-01-10 19:09:10 +=ended 2025-01-10 19:09:10 +=result ok +=elapsed 0.003993s +=case ssh_sftp_SUITE:null_crypto_tar +=logfile ssh_sftp_suite.null_crypto_tar.107746.html +=started 2025-01-10 19:09:10 +=ended 2025-01-10 19:09:10 +=result ok +=elapsed 0.037154s +=case ssh_sftp_SUITE:simple_crypto_tar_small +=logfile ssh_sftp_suite.simple_crypto_tar_small.107842.html +=started 2025-01-10 19:09:10 +=ended 2025-01-10 19:09:10 +=result ok +=elapsed 0.005308s +=case ssh_sftp_SUITE:simple_crypto_tar_big +=logfile ssh_sftp_suite.simple_crypto_tar_big.107938.html +=started 2025-01-10 19:09:10 +=ended 2025-01-10 19:09:11 +=result ok +=elapsed 0.181573s +=case ssh_sftp_SUITE:read_tar +=logfile ssh_sftp_suite.read_tar.108034.html +=started 2025-01-10 19:09:11 +=ended 2025-01-10 19:09:11 +=result ok +=elapsed 0.046907s +=case ssh_sftp_SUITE:read_null_crypto_tar +=logfile ssh_sftp_suite.read_null_crypto_tar.108130.html +=started 2025-01-10 19:09:11 +=ended 2025-01-10 19:09:11 +=result ok +=elapsed 0.049617s +=case ssh_sftp_SUITE:read_crypto_tar +=logfile ssh_sftp_suite.read_crypto_tar.108226.html +=started 2025-01-10 19:09:11 +=ended 2025-01-10 19:09:11 +=result ok +=elapsed 0.083095s +=case ssh_sftp_SUITE:block_size_1_crypto_tar +=logfile ssh_sftp_suite.block_size_1_crypto_tar.108322.html +=started 2025-01-10 19:09:11 +=ended 2025-01-10 19:09:11 +=result ok +=elapsed 0.047930s +=case ssh_sftp_SUITE:block_size_16_crypto_tar +=logfile ssh_sftp_suite.block_size_16_crypto_tar.108418.html +=started 2025-01-10 19:09:11 +=ended 2025-01-10 19:09:11 +=result ok +=elapsed 0.048842s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.108514.html +=group_props [{name,remote_tar}] +=started 2025-01-10 19:09:11 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000015s +=group_time 2.828s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.108546.html +=group_props [{name,openssh_server}] +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000013s +=group_time 7.357s +=case ssh_sftp_SUITE:sftp_nonexistent_subsystem +=logfile ssh_sftp_suite.sftp_nonexistent_subsystem.108578.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.022525s +=case ssh_sftp_SUITE:end_per_group +=logfile ssh_sftp_suite.end_per_group.108674.html +=group_props [{name,unicode}] +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000012s +=group_time 11.802s +=case ssh_sftp_SUITE:end_per_suite +=logfile ssh_sftp_suite.end_per_suite.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.004177s +=group_time 31.833s +=case ssh_sftpd_SUITE:init_per_suite +=logfile ssh_sftpd_suite.init_per_suite.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001230s +=case ssh_sftpd_SUITE:open_close_file +=logfile ssh_sftpd_suite.open_close_file.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001129s +=case ssh_sftpd_SUITE:open_close_dir +=logfile ssh_sftpd_suite.open_close_dir.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000701s +=case ssh_sftpd_SUITE:read_file +=logfile ssh_sftpd_suite.read_file.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000576s +=case ssh_sftpd_SUITE:read_dir +=logfile ssh_sftpd_suite.read_dir.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.021479s +=case ssh_sftpd_SUITE:write_file +=logfile ssh_sftpd_suite.write_file.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000679s +=case ssh_sftpd_SUITE:rename_file +=logfile ssh_sftpd_suite.rename_file.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001377s +=case ssh_sftpd_SUITE:mk_rm_dir +=logfile ssh_sftpd_suite.mk_rm_dir.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001184s +=case ssh_sftpd_SUITE:remove_file +=logfile ssh_sftpd_suite.remove_file.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000550s +=case ssh_sftpd_SUITE:real_path +=logfile ssh_sftpd_suite.real_path.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000549s +=case ssh_sftpd_SUITE:retrieve_attributes +=logfile ssh_sftpd_suite.retrieve_attributes.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001424s +=case ssh_sftpd_SUITE:set_attributes +=logfile ssh_sftpd_suite.set_attributes.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001385s +=case ssh_sftpd_SUITE:links +=logfile ssh_sftpd_suite.links.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000710s +=case ssh_sftpd_SUITE:ver3_rename +=logfile ssh_sftpd_suite.ver3_rename.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000378s +=case ssh_sftpd_SUITE:ver3_open_flags +=logfile ssh_sftpd_suite.ver3_open_flags.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001650s +=case ssh_sftpd_SUITE:relpath +=logfile ssh_sftpd_suite.relpath.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000405s +=case ssh_sftpd_SUITE:sshd_read_file +=logfile ssh_sftpd_suite.sshd_read_file.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000605s +=case ssh_sftpd_SUITE:ver6_basic +=logfile ssh_sftpd_suite.ver6_basic.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000276s +=case ssh_sftpd_SUITE:access_outside_root +=logfile ssh_sftpd_suite.access_outside_root.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000919s +=case ssh_sftpd_SUITE:root_with_cwd +=logfile ssh_sftpd_suite.root_with_cwd.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.001254s +=case ssh_sftpd_SUITE:relative_path +=logfile ssh_sftpd_suite.relative_path.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000475s +=case ssh_sftpd_SUITE:open_file_dir_v5 +=logfile ssh_sftpd_suite.open_file_dir_v5.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000492s +=case ssh_sftpd_SUITE:open_file_dir_v6 +=logfile ssh_sftpd_suite.open_file_dir_v6.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000398s +=case ssh_sftpd_SUITE:end_per_suite +=logfile ssh_sftpd_suite.end_per_suite.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:12 +=result ok +=elapsed 0.000034s +=group_time 0.793s +=case ssh_sftpd_erlclient_SUITE:init_per_suite +=logfile ssh_sftpd_erlclient_suite.init_per_suite.html +=started 2025-01-10 19:09:12 +=ended 2025-01-10 19:09:13 +=result ok +=elapsed 0.015366s +=case ssh_sftpd_erlclient_SUITE:close_file +=logfile ssh_sftpd_erlclient_suite.close_file.html +=started 2025-01-10 19:09:13 +=ended 2025-01-10 19:09:13 +=result ok +=elapsed 0.001640s +=case ssh_sftpd_erlclient_SUITE:quit +=logfile ssh_sftpd_erlclient_suite.quit.html +=started 2025-01-10 19:09:13 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 5.010947s +=case ssh_sftpd_erlclient_SUITE:file_cb +=logfile ssh_sftpd_erlclient_suite.file_cb.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 0.003826s +=case ssh_sftpd_erlclient_SUITE:root_dir +=logfile ssh_sftpd_erlclient_suite.root_dir.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 0.002993s +=case ssh_sftpd_erlclient_SUITE:list_dir_limited +=logfile ssh_sftpd_erlclient_suite.list_dir_limited.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 0.003210s +=case ssh_sftpd_erlclient_SUITE:ver6_basic +=logfile ssh_sftpd_erlclient_suite.ver6_basic.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 0.000671s +=case ssh_sftpd_erlclient_SUITE:end_per_suite +=logfile ssh_sftpd_erlclient_suite.end_per_suite.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 0.000000s +=group_time 5.284s +=case ssh_sup_SUITE:init_per_suite +=logfile ssh_sup_suite.init_per_suite.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 0.000135s +=case ssh_sup_SUITE:default_tree +=logfile ssh_sup_suite.default_tree.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:18 +=result ok +=elapsed 0.000019s +=case ssh_sup_SUITE:sshc_subtree +=logfile ssh_sup_suite.sshc_subtree.html +=started 2025-01-10 19:09:18 +=ended 2025-01-10 19:09:19 +=result ok +=elapsed 1.512045s +=case ssh_sup_SUITE:sshd_subtree +=logfile ssh_sup_suite.sshd_subtree.html +=started 2025-01-10 19:09:19 +=ended 2025-01-10 19:09:20 +=result ok +=elapsed 0.508019s +=case ssh_sup_SUITE:sshd_subtree_profile +=logfile ssh_sup_suite.sshd_subtree_profile.html +=started 2025-01-10 19:09:20 +=ended 2025-01-10 19:09:20 +=result ok +=elapsed 0.506971s +=case ssh_sup_SUITE:killed_acceptor_restarts +=logfile ssh_sup_suite.killed_acceptor_restarts.html +=started 2025-01-10 19:09:20 +=ended 2025-01-10 19:09:20 +=result ok +=elapsed 0.011915s +=case ssh_sup_SUITE:shell_channel_tree +=logfile ssh_sup_suite.shell_channel_tree.html +=started 2025-01-10 19:09:20 +=ended 2025-01-10 19:09:25 +=result ok +=elapsed 5.007367s +=case ssh_sup_SUITE:end_per_suite +=logfile ssh_sup_suite.end_per_suite.html +=started 2025-01-10 19:09:25 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.000000s +=group_time 7.735s +=case ssh_to_openssh_SUITE:init_per_suite +=logfile ssh_to_openssh_suite.init_per_suite.html +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.144079s +=case ssh_to_openssh_SUITE:init_per_group +=logfile ssh_to_openssh_suite.init_per_group.html +=group_props [{name,erlang_client}] +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.009212s +=case ssh_to_openssh_SUITE:tunnel_in_erlclient_erlserver +=logfile ssh_to_openssh_suite.tunnel_in_erlclient_erlserver.html +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.010936s +=case ssh_to_openssh_SUITE:tunnel_out_erlclient_erlserver +=logfile ssh_to_openssh_suite.tunnel_out_erlclient_erlserver.html +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.010184s +=case ssh_to_openssh_SUITE:init_per_group +=logfile ssh_to_openssh_suite.init_per_group.109570.html +=group_props [{name,tunnel_distro_server}] +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.145867s +=case ssh_to_openssh_SUITE:tunnel_in_erlclient_openssh_server +=logfile ssh_to_openssh_suite.tunnel_in_erlclient_openssh_server.html +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.134982s +=case ssh_to_openssh_SUITE:tunnel_out_erlclient_openssh_server +=logfile ssh_to_openssh_suite.tunnel_out_erlclient_openssh_server.html +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.135629s +=case ssh_to_openssh_SUITE:end_per_group +=logfile ssh_to_openssh_suite.end_per_group.html +=group_props [{name,tunnel_distro_server}] +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:26 +=result ok +=elapsed 0.000000s +=group_time 0.494s +=case ssh_to_openssh_SUITE:erlang_shell_client_openssh_server +=logfile ssh_to_openssh_suite.erlang_shell_client_openssh_server.html +=started 2025-01-10 19:09:26 +=ended 2025-01-10 19:09:28 +=result ok +=elapsed 1.594083s +=case ssh_to_openssh_SUITE:eclient_oserver_kex_strict +=logfile ssh_to_openssh_suite.eclient_oserver_kex_strict.html +=started 2025-01-10 19:09:28 +=ended 2025-01-10 19:09:31 +=result ok +=elapsed 2.595479s +=case ssh_to_openssh_SUITE:end_per_group +=logfile ssh_to_openssh_suite.end_per_group.109730.html +=group_props [{name,erlang_client}] +=started 2025-01-10 19:09:31 +=ended 2025-01-10 19:09:31 +=result ok +=elapsed 0.000000s +=group_time 4.863s +=case ssh_to_openssh_SUITE:init_per_group +=logfile ssh_to_openssh_suite.init_per_group.109762.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:09:31 +=ended 2025-01-10 19:09:31 +=result ok +=elapsed 0.000000s +=case ssh_to_openssh_SUITE:init_per_group +=logfile ssh_to_openssh_suite.init_per_group.109794.html +=group_props [{name,tunnel_distro_client}] +=started 2025-01-10 19:09:31 +=ended 2025-01-10 19:09:31 +=result ok +=elapsed 0.146390s +=case ssh_to_openssh_SUITE:tunnel_in_non_erlclient_erlserver +=logfile ssh_to_openssh_suite.tunnel_in_non_erlclient_erlserver.html +=started 2025-01-10 19:09:31 +=ended 2025-01-10 19:09:32 +=result ok +=elapsed 1.005521s +=case ssh_to_openssh_SUITE:tunnel_out_non_erlclient_erlserver +=logfile ssh_to_openssh_suite.tunnel_out_non_erlclient_erlserver.html +=started 2025-01-10 19:09:32 +=ended 2025-01-10 19:09:33 +=result ok +=elapsed 1.005608s +=case ssh_to_openssh_SUITE:end_per_group +=logfile ssh_to_openssh_suite.end_per_group.109890.html +=group_props [{name,tunnel_distro_client}] +=started 2025-01-10 19:09:33 +=ended 2025-01-10 19:09:33 +=result ok +=elapsed 0.000000s +=group_time 2.233s +=case ssh_to_openssh_SUITE:erlang_server_openssh_client_renegotiate +=logfile ssh_to_openssh_suite.erlang_server_openssh_client_renegotiate.html +=started 2025-01-10 19:09:33 +=ended 2025-01-10 19:09:34 +=result ok +=elapsed 0.636650s +=case ssh_to_openssh_SUITE:eserver_oclient_kex_strict +=logfile ssh_to_openssh_suite.eserver_oclient_kex_strict.html +=started 2025-01-10 19:09:34 +=ended 2025-01-10 19:09:35 +=result ok +=elapsed 1.116325s +=case ssh_to_openssh_SUITE:exec_with_io_in_sshc +=logfile ssh_to_openssh_suite.exec_with_io_in_sshc.html +=started 2025-01-10 19:09:35 +=ended 2025-01-10 19:09:35 +=result ok +=elapsed 0.564022s +=case ssh_to_openssh_SUITE:exec_direct_with_io_in_sshc +=logfile ssh_to_openssh_suite.exec_direct_with_io_in_sshc.html +=started 2025-01-10 19:09:35 +=ended 2025-01-10 19:09:36 +=result ok +=elapsed 0.602829s +=case ssh_to_openssh_SUITE:end_per_group +=logfile ssh_to_openssh_suite.end_per_group.110050.html +=group_props [{name,erlang_server}] +=started 2025-01-10 19:09:36 +=ended 2025-01-10 19:09:36 +=result ok +=elapsed 0.000000s +=group_time 5.298s +=case ssh_to_openssh_SUITE:end_per_suite +=logfile ssh_to_openssh_suite.end_per_suite.html +=started 2025-01-10 19:09:36 +=ended 2025-01-10 19:09:36 +=result ok +=elapsed 0.000000s +=group_time 10.390s +=== +=case ssh_upgrade_SUITE:all +=started 2025-01-10 19:09:36 +=result skipped: Benchmarks run separately +=== *** Skipping {ssh_upgrade_SUITE,all} *** +=== TEST COMPLETE, 1537 ok, 0 failed, 20 skipped of 1557 test cases + +=finished 2025-01-10 19:09:36 +=failed 0 +=successful 1537 +=user_skipped 20 +=auto_skipped 0 +=elapsed_time 837212073 diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.log.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.log.html similarity index 59% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.log.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.log.html index 4b7e27f8c49c1..841410b682e28 100644 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/suite.log.html +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.log.html @@ -80,9 +80,9 @@

    Results for make_test_dir.ssh_test

    -

    Test started at 2025-01-09 11:32:23

    +

    Test started at 2025-01-10 18:55:39

    Host info:
    -Run by otptest on 3d82f27beab7
    Used Erlang v15.2 in "/buildroot/otp/Erlang ∅⊤℞"

    +Run by otptest on c7ed2a2b61d4
    Used Erlang v15.2 in "/buildroot/otp/Erlang ∅⊤℞"

    • Full textual log
    • Coverage log
    • @@ -96,2389 +96,2389 @@

      Test started at 2025-01-09 11:32:23

      NumModuleGroupCaseLogTimeResultComment -ssh_agent_SUITEinit_per_suite< >0.008515sOkFIPS mode not supported by Erlang/OTP -1ssh_agent_SUITErequest_identities< >0.003296sOk -2ssh_agent_SUITEsign_request< >0.002448sOk -3ssh_agent_SUITEconnect_with_ssh_agent< >0.048711sOk -ssh_agent_SUITEend_per_suite< >0.001135sOk -ssh_algorithms_SUITEinit_per_suite< >0.046533sOkFIPS mode not supported by Erlang/OTP -ssh_algorithms_SUITEkexinit_per_group< >0.000008sOk==== kex ==== -ssh_algorithms_SUITEcurve25519-sha256init_per_group< >0.002669sOk -4ssh_algorithms_SUITEcurve25519-sha256simple_connect< >0.004258sOk -5ssh_algorithms_SUITEcurve25519-sha256simple_exec< >0.008235sOk -6ssh_algorithms_SUITEcurve25519-sha256simple_sftp< >0.011343sOk -7ssh_algorithms_SUITEcurve25519-sha256sshd_simple_exec< >0.113516sOk -ssh_algorithms_SUITEcurve25519-sha256end_per_group< >0.000362sOk -ssh_algorithms_SUITEcurve25519-sha256@libssh.orginit_per_group< >0.001914sOk -8ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsimple_connect< >0.004694sOk -9ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsimple_exec< >0.005606sOk -10ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsimple_sftp< >0.006087sOk -11ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsshd_simple_exec< >0.111693sOk -ssh_algorithms_SUITEcurve25519-sha256@libssh.orgend_per_group< >0.000450sOk -ssh_algorithms_SUITEcurve448-sha512init_per_group< >0.001820sOk -12ssh_algorithms_SUITEcurve448-sha512simple_connect< >0.005680sOk -13ssh_algorithms_SUITEcurve448-sha512simple_exec< >0.006832sOk -14ssh_algorithms_SUITEcurve448-sha512simple_sftp< >0.007761sOk -ssh_algorithms_SUITEcurve448-sha512end_per_group< >0.000412sOk -ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1init_per_group< >0.002421sOk -15ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_connect< >0.040286sOk -16ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec< >0.040808sOk -17ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_sftp< >0.041851sOk -18ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec_groups< >0.291521sOk[1023,1193,1363,1535,1705,1875,2047,2388,2729,3071,3412,3753,4095,4777,5459, +ssh_agent_SUITEinit_per_suite< >0.009193sOkFIPS mode not supported by Erlang/OTP +1ssh_agent_SUITErequest_identities< >0.004010sOk +2ssh_agent_SUITEsign_request< >0.002781sOk +3ssh_agent_SUITEconnect_with_ssh_agent< >0.054438sOk +ssh_agent_SUITEend_per_suite< >0.001215sOk +ssh_algorithms_SUITEinit_per_suite< >0.048592sOkFIPS mode not supported by Erlang/OTP +ssh_algorithms_SUITEkexinit_per_group< >0.000017sOk==== kex ==== +ssh_algorithms_SUITEcurve25519-sha256init_per_group< >0.002706sOk +4ssh_algorithms_SUITEcurve25519-sha256simple_connect< >0.004890sOk +5ssh_algorithms_SUITEcurve25519-sha256simple_exec< >0.008834sOk +6ssh_algorithms_SUITEcurve25519-sha256simple_sftp< >0.011989sOk +7ssh_algorithms_SUITEcurve25519-sha256sshd_simple_exec< >0.114949sOk +ssh_algorithms_SUITEcurve25519-sha256end_per_group< >0.000414sOk +ssh_algorithms_SUITEcurve25519-sha256@libssh.orginit_per_group< >0.002622sOk +8ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsimple_connect< >0.004780sOk +9ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsimple_exec< >0.005903sOk +10ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsimple_sftp< >0.006639sOk +11ssh_algorithms_SUITEcurve25519-sha256@libssh.orgsshd_simple_exec< >0.114686sOk +ssh_algorithms_SUITEcurve25519-sha256@libssh.orgend_per_group< >0.000470sOk +ssh_algorithms_SUITEcurve448-sha512init_per_group< >0.002333sOk +12ssh_algorithms_SUITEcurve448-sha512simple_connect< >0.006352sOk +13ssh_algorithms_SUITEcurve448-sha512simple_exec< >0.006665sOk +14ssh_algorithms_SUITEcurve448-sha512simple_sftp< >0.007730sOk +ssh_algorithms_SUITEcurve448-sha512end_per_group< >0.000460sOk +ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1init_per_group< >0.002006sOk +15ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_connect< >0.040660sOk +16ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec< >0.041758sOk +17ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_sftp< >0.042541sOk +18ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec_groups< >0.303431sOk[1023,1193,1363,1535,1705,1875,2047,2388,2729,3071,3412,3753,4095,4777,5459, 6143,6825,7507,8191] -19ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec_groups_no_match_too_large< >0.002432sOk -20ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec_groups_no_match_too_small< >0.002528sOk -ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1end_per_group< >0.000353sOk -ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256init_per_group< >0.002275sOk -21ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_connect< >0.031582sOk -22ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec< >0.041461sOk -23ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_sftp< >0.042008sOk -24ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256sshd_simple_exec< >0.148648sOk -25ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec_groups< >0.305508sOk[1023,1193,1363,1535,1705,1875,2047,2388,2729,3071,3412,3753,4095,4777,5459, +19ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec_groups_no_match_too_large< >0.002560sOk +20ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1simple_exec_groups_no_match_too_small< >0.002506sOk +ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha1end_per_group< >0.000406sOk +ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256init_per_group< >0.002578sOk +21ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_connect< >0.040987sOk +22ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec< >0.041720sOk +23ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_sftp< >0.042203sOk +24ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256sshd_simple_exec< >0.149634sOk +25ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec_groups< >0.305128sOk[1023,1193,1363,1535,1705,1875,2047,2388,2729,3071,3412,3753,4095,4777,5459, 6143,6825,7507,8191] -26ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec_groups_no_match_too_large< >0.002273sOk -27ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec_groups_no_match_too_small< >0.002544sOk -ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256end_per_group< >0.000621sOk -ssh_algorithms_SUITEdiffie-hellman-group1-sha1init_per_group< >0.002057sOk -28ssh_algorithms_SUITEdiffie-hellman-group1-sha1simple_connect< >0.005384sOk -29ssh_algorithms_SUITEdiffie-hellman-group1-sha1simple_exec< >0.006297sOk -30ssh_algorithms_SUITEdiffie-hellman-group1-sha1simple_sftp< >0.006680sOk -ssh_algorithms_SUITEdiffie-hellman-group1-sha1end_per_group< >0.000406sOk -ssh_algorithms_SUITEdiffie-hellman-group14-sha1init_per_group< >0.002304sOk -31ssh_algorithms_SUITEdiffie-hellman-group14-sha1simple_connect< >0.010891sOk -32ssh_algorithms_SUITEdiffie-hellman-group14-sha1simple_exec< >0.011969sOk -33ssh_algorithms_SUITEdiffie-hellman-group14-sha1simple_sftp< >0.012933sOk -ssh_algorithms_SUITEdiffie-hellman-group14-sha1end_per_group< >0.000364sOk -ssh_algorithms_SUITEdiffie-hellman-group14-sha256init_per_group< >0.001646sOk -34ssh_algorithms_SUITEdiffie-hellman-group14-sha256simple_connect< >0.011168sOk -35ssh_algorithms_SUITEdiffie-hellman-group14-sha256simple_exec< >0.012013sOk -36ssh_algorithms_SUITEdiffie-hellman-group14-sha256simple_sftp< >0.012732sOk -37ssh_algorithms_SUITEdiffie-hellman-group14-sha256sshd_simple_exec< >0.113441sOk -ssh_algorithms_SUITEdiffie-hellman-group14-sha256end_per_group< >0.000440sOk -ssh_algorithms_SUITEdiffie-hellman-group16-sha512init_per_group< >0.001957sOk -38ssh_algorithms_SUITEdiffie-hellman-group16-sha512simple_connect< >0.044083sOk -39ssh_algorithms_SUITEdiffie-hellman-group16-sha512simple_exec< >0.045476sOk -40ssh_algorithms_SUITEdiffie-hellman-group16-sha512simple_sftp< >0.045959sOk -41ssh_algorithms_SUITEdiffie-hellman-group16-sha512sshd_simple_exec< >0.133621sOk -ssh_algorithms_SUITEdiffie-hellman-group16-sha512end_per_group< >0.000527sOk -ssh_algorithms_SUITEdiffie-hellman-group18-sha512init_per_group< >0.002230sOk -42ssh_algorithms_SUITEdiffie-hellman-group18-sha512simple_connect< >0.280837sOk -43ssh_algorithms_SUITEdiffie-hellman-group18-sha512simple_exec< >0.282299sOk -44ssh_algorithms_SUITEdiffie-hellman-group18-sha512simple_sftp< >0.282351sOk -45ssh_algorithms_SUITEdiffie-hellman-group18-sha512sshd_simple_exec< >0.265314sOk -ssh_algorithms_SUITEdiffie-hellman-group18-sha512end_per_group< >0.000655sOk -ssh_algorithms_SUITEecdh-sha2-nistp256init_per_group< >0.002463sOk -46ssh_algorithms_SUITEecdh-sha2-nistp256simple_connect< >0.005902sOk -47ssh_algorithms_SUITEecdh-sha2-nistp256simple_exec< >0.005544sOk -48ssh_algorithms_SUITEecdh-sha2-nistp256simple_sftp< >0.006937sOk -49ssh_algorithms_SUITEecdh-sha2-nistp256sshd_simple_exec< >0.108601sOk -ssh_algorithms_SUITEecdh-sha2-nistp256end_per_group< >0.000422sOk -ssh_algorithms_SUITEecdh-sha2-nistp384init_per_group< >0.001806sOk -50ssh_algorithms_SUITEecdh-sha2-nistp384simple_connect< >0.007854sOk -51ssh_algorithms_SUITEecdh-sha2-nistp384simple_exec< >0.008861sOk -52ssh_algorithms_SUITEecdh-sha2-nistp384simple_sftp< >0.009011sOk -53ssh_algorithms_SUITEecdh-sha2-nistp384sshd_simple_exec< >0.112573sOk -ssh_algorithms_SUITEecdh-sha2-nistp384end_per_group< >0.000439sOk -ssh_algorithms_SUITEecdh-sha2-nistp521init_per_group< >0.002300sOk -54ssh_algorithms_SUITEecdh-sha2-nistp521simple_connect< >0.005651sOk -55ssh_algorithms_SUITEecdh-sha2-nistp521simple_exec< >0.006762sOk -56ssh_algorithms_SUITEecdh-sha2-nistp521simple_sftp< >0.006984sOk -57ssh_algorithms_SUITEecdh-sha2-nistp521sshd_simple_exec< >0.111015sOk -ssh_algorithms_SUITEecdh-sha2-nistp521end_per_group< >0.000585sOk -ssh_algorithms_SUITEkexend_per_group< >0.000001sOk -ssh_algorithms_SUITEcipherinit_per_group< >0.000031sOk==== cipher ==== -ssh_algorithms_SUITE3des-cbcinit_per_group< >0.002273sOk -58ssh_algorithms_SUITE3des-cbcsimple_connect< >0.005047sOk -59ssh_algorithms_SUITE3des-cbcsimple_exec< >0.005893sOk -60ssh_algorithms_SUITE3des-cbcsimple_sftp< >0.008578sOk -ssh_algorithms_SUITE3des-cbcend_per_group< >0.000646sOk -ssh_algorithms_SUITEAEAD_AES_128_GCMinit_per_group< >0.002766sOk -61ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_connect< >0.004717sOk -62ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_exec< >0.005488sOk -63ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_sftp< >0.006108sOk -ssh_algorithms_SUITEAEAD_AES_128_GCMend_per_group< >0.000385sOk -ssh_algorithms_SUITEAEAD_AES_256_GCMinit_per_group< >0.002120sOk -64ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_connect< >0.004881sOk -65ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_exec< >0.005428sOk -66ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_sftp< >0.006067sOk -ssh_algorithms_SUITEAEAD_AES_256_GCMend_per_group< >0.000603sOk -ssh_algorithms_SUITEaes128-cbcinit_per_group< >0.001967sOk -67ssh_algorithms_SUITEaes128-cbcsimple_connect< >0.004808sOk -68ssh_algorithms_SUITEaes128-cbcsimple_exec< >0.005413sOk -69ssh_algorithms_SUITEaes128-cbcsimple_sftp< >0.006460sOk -ssh_algorithms_SUITEaes128-cbcend_per_group< >0.000483sOk -ssh_algorithms_SUITEaes128-ctrinit_per_group< >0.002089sOk -70ssh_algorithms_SUITEaes128-ctrsimple_connect< >0.004663sOk -71ssh_algorithms_SUITEaes128-ctrsimple_exec< >0.005749sOk -72ssh_algorithms_SUITEaes128-ctrsimple_sftp< >0.006830sOk -73ssh_algorithms_SUITEaes128-ctrsshd_simple_exec< >0.112480sOk -ssh_algorithms_SUITEaes128-ctrend_per_group< >0.000574sOk -ssh_algorithms_SUITEaes128-gcm@openssh.cominit_per_group< >0.002400sOk -74ssh_algorithms_SUITEaes128-gcm@openssh.comsimple_connect< >0.005006sOk -75ssh_algorithms_SUITEaes128-gcm@openssh.comsimple_exec< >0.005344sOk -76ssh_algorithms_SUITEaes128-gcm@openssh.comsimple_sftp< >0.005965sOk -77ssh_algorithms_SUITEaes128-gcm@openssh.comsshd_simple_exec< >0.112898sOk -ssh_algorithms_SUITEaes128-gcm@openssh.comend_per_group< >0.000721sOk -ssh_algorithms_SUITEaes192-cbcinit_per_group< >0.002076sOk -78ssh_algorithms_SUITEaes192-cbcsimple_connect< >0.005556sOk -79ssh_algorithms_SUITEaes192-cbcsimple_exec< >0.006952sOk -80ssh_algorithms_SUITEaes192-cbcsimple_sftp< >0.007337sOk -ssh_algorithms_SUITEaes192-cbcend_per_group< >0.000516sOk -ssh_algorithms_SUITEaes192-ctrinit_per_group< >0.001819sOk -81ssh_algorithms_SUITEaes192-ctrsimple_connect< >0.004434sOk -82ssh_algorithms_SUITEaes192-ctrsimple_exec< >0.005502sOk -83ssh_algorithms_SUITEaes192-ctrsimple_sftp< >0.006436sOk -84ssh_algorithms_SUITEaes192-ctrsshd_simple_exec< >0.113527sOk -ssh_algorithms_SUITEaes192-ctrend_per_group< >0.000406sOk -ssh_algorithms_SUITEaes256-cbcinit_per_group< >0.002366sOk -85ssh_algorithms_SUITEaes256-cbcsimple_connect< >0.004718sOk -86ssh_algorithms_SUITEaes256-cbcsimple_exec< >0.005644sOk -87ssh_algorithms_SUITEaes256-cbcsimple_sftp< >0.006575sOk -ssh_algorithms_SUITEaes256-cbcend_per_group< >0.000323sOk -ssh_algorithms_SUITEaes256-ctrinit_per_group< >0.001674sOk -88ssh_algorithms_SUITEaes256-ctrsimple_connect< >0.004709sOk -89ssh_algorithms_SUITEaes256-ctrsimple_exec< >0.006079sOk -90ssh_algorithms_SUITEaes256-ctrsimple_sftp< >0.006656sOk -91ssh_algorithms_SUITEaes256-ctrsshd_simple_exec< >0.112378sOk -ssh_algorithms_SUITEaes256-ctrend_per_group< >0.000378sOk -ssh_algorithms_SUITEaes256-gcm@openssh.cominit_per_group< >0.002276sOk -92ssh_algorithms_SUITEaes256-gcm@openssh.comsimple_connect< >0.004615sOk -93ssh_algorithms_SUITEaes256-gcm@openssh.comsimple_exec< >0.005537sOk -94ssh_algorithms_SUITEaes256-gcm@openssh.comsimple_sftp< >0.006031sOk -95ssh_algorithms_SUITEaes256-gcm@openssh.comsshd_simple_exec< >0.113075sOk -ssh_algorithms_SUITEaes256-gcm@openssh.comend_per_group< >0.000349sOk -ssh_algorithms_SUITEchacha20-poly1305@openssh.cominit_per_group< >0.002034sOk -96ssh_algorithms_SUITEchacha20-poly1305@openssh.comsimple_connect< >0.004643sOk -97ssh_algorithms_SUITEchacha20-poly1305@openssh.comsimple_exec< >0.006016sOk -98ssh_algorithms_SUITEchacha20-poly1305@openssh.comsimple_sftp< >0.006444sOk -99ssh_algorithms_SUITEchacha20-poly1305@openssh.comsshd_simple_exec< >0.112013sOk -ssh_algorithms_SUITEchacha20-poly1305@openssh.comend_per_group< >0.000435sOk -ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMinit_per_group< >0.001785sOk -100ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMsimple_connect< >0.004523sOk -101ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMsimple_exec< >0.005757sOk -102ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMsimple_sftp< >0.008434sOk -ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMend_per_group< >0.000628sOk -ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMinit_per_group< >0.002125sOk -103ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMsimple_connect< >0.004650sOk -104ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMsimple_exec< >0.005565sOk -105ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMsimple_sftp< >0.008420sOk -ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMend_per_group< >0.000551sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcinit_per_group< >0.002523sOk -106ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcsimple_connect< >0.004502sOk -107ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcsimple_exec< >0.005865sOk -108ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcsimple_sftp< >0.008583sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcend_per_group< >0.000451sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrinit_per_group< >0.002433sOk -109ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrsimple_connect< >0.004649sOk -110ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrsimple_exec< >0.005641sOk -111ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrsimple_sftp< >0.008623sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrend_per_group< >0.000362sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.cominit_per_group< >0.002445sOk -112ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comsimple_connect< >0.004819sOk -113ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comsimple_exec< >0.005939sOk -114ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comsimple_sftp< >0.008759sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comend_per_group< >0.000369sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcinit_per_group< >0.002174sOk -115ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcsimple_connect< >0.005069sOk -116ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcsimple_exec< >0.005701sOk -117ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcsimple_sftp< >0.008555sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcend_per_group< >0.000382sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrinit_per_group< >0.002468sOk -118ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrsimple_connect< >0.004681sOk -119ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrsimple_exec< >0.005533sOk -120ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrsimple_sftp< >0.008432sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrend_per_group< >0.000424sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcinit_per_group< >0.002087sOk -121ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcsimple_connect< >0.004651sOk -122ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcsimple_exec< >0.005838sOk -123ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcsimple_sftp< >0.008743sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcend_per_group< >0.000444sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrinit_per_group< >0.002113sOk -124ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrsimple_connect< >0.004889sOk -125ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrsimple_exec< >0.005531sOk -126ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrsimple_sftp< >0.008194sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrend_per_group< >0.000398sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.cominit_per_group< >0.002541sOk -127ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comsimple_connect< >0.004823sOk -128ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comsimple_exec< >0.006245sOk -129ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comsimple_sftp< >0.008315sOk -ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comend_per_group< >0.000380sOk -ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002250sOk -130ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.004915sOk -131ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.005882sOk -132ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.008354sOk -ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000355sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcinit_per_group< >0.002182sOk -133ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcsimple_connect< >0.004694sOk -134ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcsimple_exec< >0.005988sOk -135ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcsimple_sftp< >0.006712sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcend_per_group< >0.000505sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMinit_per_group< >0.002200sOk -136ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_connect< >0.004428sOk -137ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_exec< >0.005696sOk -138ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_sftp< >0.005862sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMend_per_group< >0.000417sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcinit_per_group< >0.002458sOk -139ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcsimple_connect< >0.004770sOk -140ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcsimple_exec< >0.006030sOk -141ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcsimple_sftp< >0.006423sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcend_per_group< >0.000312sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrinit_per_group< >0.002103sOk -142ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrsimple_connect< >0.004611sOk -143ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrsimple_exec< >0.005943sOk -144ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrsimple_sftp< >0.006350sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrend_per_group< >0.000368sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.cominit_per_group< >0.001846sOk -145ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comsimple_connect< >0.004600sOk -146ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comsimple_exec< >0.005549sOk -147ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comsimple_sftp< >0.005980sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comend_per_group< >0.000331sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcinit_per_group< >0.002443sOk -148ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcsimple_connect< >0.004530sOk -149ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcsimple_exec< >0.005701sOk -150ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcsimple_sftp< >0.006308sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcend_per_group< >0.000314sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrinit_per_group< >0.002428sOk -151ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrsimple_connect< >0.004413sOk -152ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrsimple_exec< >0.005705sOk -153ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrsimple_sftp< >0.006154sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrend_per_group< >0.000393sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcinit_per_group< >0.002271sOk -154ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcsimple_connect< >0.004723sOk -155ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcsimple_exec< >0.006138sOk -156ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcsimple_sftp< >0.006638sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcend_per_group< >0.000518sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrinit_per_group< >0.002293sOk -157ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrsimple_connect< >0.004998sOk -158ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrsimple_exec< >0.006018sOk -159ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrsimple_sftp< >0.006757sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrend_per_group< >0.000342sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.cominit_per_group< >0.002309sOk -160ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comsimple_connect< >0.004943sOk -161ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comsimple_exec< >0.005825sOk -162ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comsimple_sftp< >0.006316sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comend_per_group< >0.000298sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.cominit_per_group< >0.002180sOk -163ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comsimple_connect< >0.004745sOk -164ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comsimple_exec< >0.005786sOk -165ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comsimple_sftp< >0.006564sOk -ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comend_per_group< >0.000603sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcinit_per_group< >0.002275sOk -166ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcsimple_connect< >0.004660sOk -167ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcsimple_exec< >0.005586sOk -168ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcsimple_sftp< >0.007066sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcend_per_group< >0.000331sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMinit_per_group< >0.002817sOk -169ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_connect< >0.004682sOk -170ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_exec< >0.006110sOk -171ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_sftp< >0.006010sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMend_per_group< >0.000344sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcinit_per_group< >0.002025sOk -172ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcsimple_connect< >0.004641sOk -173ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcsimple_exec< >0.005937sOk -174ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcsimple_sftp< >0.006663sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcend_per_group< >0.000354sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrinit_per_group< >0.002406sOk -175ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrsimple_connect< >0.004736sOk -176ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrsimple_exec< >0.006124sOk -177ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrsimple_sftp< >0.006445sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrend_per_group< >0.000397sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.cominit_per_group< >0.002243sOk -178ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comsimple_connect< >0.004671sOk -179ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comsimple_exec< >0.005848sOk -180ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comsimple_sftp< >0.006586sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comend_per_group< >0.000499sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcinit_per_group< >0.002144sOk -181ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcsimple_connect< >0.004836sOk -182ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcsimple_exec< >0.006027sOk -183ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcsimple_sftp< >0.006458sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcend_per_group< >0.000459sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrinit_per_group< >0.002494sOk -184ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrsimple_connect< >0.004594sOk -185ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrsimple_exec< >0.005958sOk -186ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrsimple_sftp< >0.006219sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrend_per_group< >0.000334sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcinit_per_group< >0.002088sOk -187ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcsimple_connect< >0.004571sOk -188ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcsimple_exec< >0.005839sOk -189ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcsimple_sftp< >0.006534sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcend_per_group< >0.000354sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrinit_per_group< >0.002178sOk -190ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrsimple_connect< >0.004711sOk -191ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrsimple_exec< >0.005905sOk -192ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrsimple_sftp< >0.006800sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrend_per_group< >0.000383sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.cominit_per_group< >0.001990sOk -193ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comsimple_connect< >0.004507sOk -194ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comsimple_exec< >0.005958sOk -195ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comsimple_sftp< >0.006275sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comend_per_group< >0.000297sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.cominit_per_group< >0.002838sOk -196ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comsimple_connect< >0.004603sOk -197ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comsimple_exec< >0.005908sOk -198ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comsimple_sftp< >0.006412sOk -ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comend_per_group< >0.000578sOk -ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcinit_per_group< >0.002145sOk -199ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcsimple_connect< >0.004669sOk -200ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcsimple_exec< >0.005963sOk -201ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcsimple_sftp< >0.006654sOk -ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcend_per_group< >0.000481sOk -ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMinit_per_group< >0.002205sOk -202ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMsimple_connect< >0.004697sOk -203ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMsimple_exec< >0.005858sOk -204ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMsimple_sftp< >0.006431sOk -ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMend_per_group< >0.000572sOk -ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMinit_per_group< >0.002416sOk -205ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMsimple_connect< >0.004905sOk -206ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMsimple_exec< >0.005350sOk -207ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMsimple_sftp< >0.006566sOk -ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMend_per_group< >0.000650sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrinit_per_group< >0.002090sOk -208ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrsimple_connect< >0.004863sOk -209ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrsimple_exec< >0.006021sOk -210ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrsimple_sftp< >0.006439sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrend_per_group< >0.000422sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.cominit_per_group< >0.002743sOk -211ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comsimple_connect< >0.004897sOk -212ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comsimple_exec< >0.005438sOk -213ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comsimple_sftp< >0.006740sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comend_per_group< >0.000425sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcinit_per_group< >0.002272sOk -214ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcsimple_connect< >0.004988sOk -215ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcsimple_exec< >0.006190sOk -216ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcsimple_sftp< >0.006580sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcend_per_group< >0.000332sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrinit_per_group< >0.001897sOk -217ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrsimple_connect< >0.004887sOk -218ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrsimple_exec< >0.006290sOk -219ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrsimple_sftp< >0.006450sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrend_per_group< >0.000422sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcinit_per_group< >0.003290sOk -220ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcsimple_connect< >0.005016sOk -221ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcsimple_exec< >0.005938sOk -222ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcsimple_sftp< >0.006685sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcend_per_group< >0.000465sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrinit_per_group< >0.002102sOk -223ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrsimple_connect< >0.004895sOk -224ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrsimple_exec< >0.006212sOk -225ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrsimple_sftp< >0.006902sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrend_per_group< >0.000431sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.cominit_per_group< >0.002563sOk -226ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comsimple_connect< >0.004768sOk -227ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comsimple_exec< >0.005565sOk -228ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comsimple_sftp< >0.006529sOk -ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comend_per_group< >0.000372sOk -ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002761sOk -229ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.004869sOk -230ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.005929sOk -231ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.006561sOk -ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000440sOk -ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcinit_per_group< >0.001906sOk -232ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcsimple_connect< >0.005060sOk -233ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcsimple_exec< >0.005991sOk -234ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcsimple_sftp< >0.006663sOk -ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcend_per_group< >0.000338sOk -ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMinit_per_group< >0.002721sOk -235ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMsimple_connect< >0.005078sOk -236ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMsimple_exec< >0.005679sOk -237ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMsimple_sftp< >0.006805sOk -ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMend_per_group< >0.000333sOk -ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMinit_per_group< >0.002640sOk -238ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMsimple_connect< >0.004909sOk -239ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMsimple_exec< >0.005828sOk -240ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMsimple_sftp< >0.006760sOk -ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMend_per_group< >0.000373sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcinit_per_group< >0.001920sOk -241ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcsimple_connect< >0.004949sOk -242ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcsimple_exec< >0.005784sOk -243ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcsimple_sftp< >0.006646sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcend_per_group< >0.000582sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.cominit_per_group< >0.003062sOk -244ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsimple_connect< >0.004633sOk -245ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsimple_exec< >0.005582sOk -246ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsimple_sftp< >0.006657sOk -247ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsshd_simple_exec< >0.112486sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comend_per_group< >0.000461sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcinit_per_group< >0.002533sOk -248ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcsimple_connect< >0.005187sOk -249ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcsimple_exec< >0.007941sOk -250ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcsimple_sftp< >0.008286sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcend_per_group< >0.000367sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrinit_per_group< >0.002096sOk -251ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsimple_connect< >0.004806sOk -252ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsimple_exec< >0.007172sOk -253ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsimple_sftp< >0.008362sOk -254ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsshd_simple_exec< >0.112891sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrend_per_group< >0.000531sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcinit_per_group< >0.001903sOk -255ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcsimple_connect< >0.004672sOk -256ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcsimple_exec< >0.006157sOk -257ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcsimple_sftp< >0.006761sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcend_per_group< >0.000389sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrinit_per_group< >0.002543sOk -258ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsimple_connect< >0.005145sOk -259ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsimple_exec< >0.006239sOk -260ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsimple_sftp< >0.006923sOk -261ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsshd_simple_exec< >0.112355sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrend_per_group< >0.000641sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.cominit_per_group< >0.002504sOk -262ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsimple_connect< >0.004791sOk -263ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsimple_exec< >0.005353sOk -264ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsimple_sftp< >0.006769sOk -265ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsshd_simple_exec< >0.112441sOk -ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comend_per_group< >0.000689sOk -ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.cominit_per_group< >0.001775sOk -266ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsimple_connect< >0.004775sOk -267ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsimple_exec< >0.006504sOk -268ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsimple_sftp< >0.006631sOk -269ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsshd_simple_exec< >0.112808sOk -ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comend_per_group< >0.000417sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcinit_per_group< >0.002282sOk -270ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcsimple_connect< >0.004767sOk -271ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcsimple_exec< >0.005943sOk -272ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcsimple_sftp< >0.006471sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcend_per_group< >0.000303sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002816sOk -273ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.004572sOk -274ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.005733sOk -275ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006636sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000332sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002588sOk -276ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004829sOk -277ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.005760sOk -278ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006261sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000405sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcinit_per_group< >0.002217sOk -279ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcsimple_connect< >0.005089sOk -280ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcsimple_exec< >0.006056sOk -281ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcsimple_sftp< >0.006219sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcend_per_group< >0.000371sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrinit_per_group< >0.001959sOk -282ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsimple_connect< >0.004698sOk -283ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsimple_exec< >0.006331sOk -284ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsimple_sftp< >0.006915sOk -285ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsshd_simple_exec< >0.111836sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrend_per_group< >0.000655sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcinit_per_group< >0.002814sOk -286ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcsimple_connect< >0.004963sOk -287ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcsimple_exec< >0.005578sOk -288ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcsimple_sftp< >0.006552sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcend_per_group< >0.000338sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrinit_per_group< >0.002292sOk -289ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsimple_connect< >0.004726sOk -290ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsimple_exec< >0.006080sOk -291ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsimple_sftp< >0.006317sOk -292ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsshd_simple_exec< >0.112198sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrend_per_group< >0.000464sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcinit_per_group< >0.002089sOk -293ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcsimple_connect< >0.004943sOk -294ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcsimple_exec< >0.005542sOk -295ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcsimple_sftp< >0.006312sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcend_per_group< >0.000319sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrinit_per_group< >0.002370sOk -296ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsimple_connect< >0.004927sOk -297ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsimple_exec< >0.005711sOk -298ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsimple_sftp< >0.006471sOk -299ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsshd_simple_exec< >0.112713sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrend_per_group< >0.000381sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.cominit_per_group< >0.002749sOk -300ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsimple_connect< >0.004714sOk -301ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsimple_exec< >0.006162sOk -302ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsimple_sftp< >0.006297sOk -303ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsshd_simple_exec< >0.111477sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comend_per_group< >0.000424sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.cominit_per_group< >0.002222sOk -304ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_connect< >0.004994sOk -305ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_exec< >0.005587sOk -306ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_sftp< >0.006363sOk -307ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsshd_simple_exec< >0.112047sOk -ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comend_per_group< >0.000338sOk -ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcinit_per_group< >0.002200sOk -308ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcsimple_connect< >0.004746sOk -309ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcsimple_exec< >0.006262sOk -310ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcsimple_sftp< >0.006558sOk -ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcend_per_group< >0.000505sOk -ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMinit_per_group< >0.001958sOk -311ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMsimple_connect< >0.004884sOk -312ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMsimple_exec< >0.005981sOk -313ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMsimple_sftp< >0.006835sOk -ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMend_per_group< >0.000415sOk -ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMinit_per_group< >0.002355sOk -314ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMsimple_connect< >0.005051sOk -315ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMsimple_exec< >0.005458sOk -316ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMsimple_sftp< >0.006667sOk -ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMend_per_group< >0.000466sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcinit_per_group< >0.002141sOk -317ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcsimple_connect< >0.004827sOk -318ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcsimple_exec< >0.005788sOk -319ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcsimple_sftp< >0.006881sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcend_per_group< >0.000334sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrinit_per_group< >0.002552sOk -320ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrsimple_connect< >0.004744sOk -321ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrsimple_exec< >0.006016sOk -322ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrsimple_sftp< >0.006905sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrend_per_group< >0.000615sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.cominit_per_group< >0.002918sOk -323ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comsimple_connect< >0.004819sOk -324ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comsimple_exec< >0.005959sOk -325ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comsimple_sftp< >0.006602sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comend_per_group< >0.000668sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrinit_per_group< >0.002326sOk -326ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrsimple_connect< >0.004965sOk -327ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrsimple_exec< >0.005925sOk -328ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrsimple_sftp< >0.006311sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrend_per_group< >0.000358sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcinit_per_group< >0.002622sOk -329ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcsimple_connect< >0.005253sOk -330ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcsimple_exec< >0.006370sOk -331ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcsimple_sftp< >0.007142sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcend_per_group< >0.000639sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrinit_per_group< >0.002582sOk -332ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrsimple_connect< >0.005243sOk -333ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrsimple_exec< >0.006109sOk -334ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrsimple_sftp< >0.006920sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrend_per_group< >0.000344sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.cominit_per_group< >0.002769sOk -335ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comsimple_connect< >0.004716sOk -336ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comsimple_exec< >0.005690sOk -337ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comsimple_sftp< >0.006645sOk -ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comend_per_group< >0.000454sOk -ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002917sOk -338ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.004825sOk -339ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.006087sOk -340ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.006577sOk -ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000386sOk -ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcinit_per_group< >0.002295sOk -341ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcsimple_connect< >0.004818sOk -342ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcsimple_exec< >0.006114sOk -343ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcsimple_sftp< >0.006375sOk -ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcend_per_group< >0.000706sOk -ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMinit_per_group< >0.002850sOk -344ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMsimple_connect< >0.004845sOk -345ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMsimple_exec< >0.006249sOk -346ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMsimple_sftp< >0.006804sOk -ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMend_per_group< >0.000555sOk -ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMinit_per_group< >0.002682sOk -347ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMsimple_connect< >0.004683sOk -348ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMsimple_exec< >0.005851sOk -349ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMsimple_sftp< >0.006370sOk -ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMend_per_group< >0.000379sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcinit_per_group< >0.002655sOk -350ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcsimple_connect< >0.005370sOk -351ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcsimple_exec< >0.005916sOk -352ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcsimple_sftp< >0.007013sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcend_per_group< >0.000400sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrinit_per_group< >0.002099sOk -353ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsimple_connect< >0.004519sOk -354ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsimple_exec< >0.005685sOk -355ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsimple_sftp< >0.006538sOk -356ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsshd_simple_exec< >0.113330sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrend_per_group< >0.000553sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.cominit_per_group< >0.002450sOk -357ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsimple_connect< >0.005031sOk -358ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsimple_exec< >0.005740sOk -359ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsimple_sftp< >0.006586sOk -360ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsshd_simple_exec< >0.112073sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comend_per_group< >0.000497sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcinit_per_group< >0.002454sOk -361ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcsimple_connect< >0.005075sOk -362ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcsimple_exec< >0.006308sOk -363ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcsimple_sftp< >0.007137sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcend_per_group< >0.000617sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcinit_per_group< >0.002428sOk -364ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcsimple_connect< >0.004654sOk -365ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcsimple_exec< >0.006093sOk -366ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcsimple_sftp< >0.007079sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcend_per_group< >0.000489sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrinit_per_group< >0.002988sOk -367ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsimple_connect< >0.005081sOk -368ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsimple_exec< >0.006210sOk -369ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsimple_sftp< >0.007136sOk -370ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsshd_simple_exec< >0.113382sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrend_per_group< >0.000512sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.cominit_per_group< >0.002403sOk -371ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsimple_connect< >0.004646sOk -372ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsimple_exec< >0.006902sOk -373ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsimple_sftp< >0.006731sOk -374ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsshd_simple_exec< >0.112372sOk -ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comend_per_group< >0.000467sOk -ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.cominit_per_group< >0.002109sOk -375ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsimple_connect< >0.004982sOk -376ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsimple_exec< >0.006001sOk -377ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsimple_sftp< >0.006755sOk -378ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsshd_simple_exec< >0.112459sOk -ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comend_per_group< >0.000438sOk -ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcinit_per_group< >0.002333sOk -379ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcsimple_connect< >0.004794sOk -380ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcsimple_exec< >0.005991sOk -381ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcsimple_sftp< >0.006667sOk -ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcend_per_group< >0.000472sOk -ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMinit_per_group< >0.002272sOk -382ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMsimple_connect< >0.004633sOk -383ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMsimple_exec< >0.005797sOk -384ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMsimple_sftp< >0.006922sOk -ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMend_per_group< >0.000601sOk -ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMinit_per_group< >0.002410sOk -385ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMsimple_connect< >0.004848sOk -386ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMsimple_exec< >0.005907sOk -387ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMsimple_sftp< >0.006523sOk -ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMend_per_group< >0.000400sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcinit_per_group< >0.002230sOk -388ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcsimple_connect< >0.004975sOk -389ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcsimple_exec< >0.005889sOk -390ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcsimple_sftp< >0.006701sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcend_per_group< >0.000379sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrinit_per_group< >0.002626sOk -391ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrsimple_connect< >0.004757sOk -392ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrsimple_exec< >0.005592sOk -393ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrsimple_sftp< >0.006609sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrend_per_group< >0.000646sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.cominit_per_group< >0.002071sOk -394ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comsimple_connect< >0.004720sOk -395ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comsimple_exec< >0.005943sOk -396ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comsimple_sftp< >0.006732sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comend_per_group< >0.000559sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcinit_per_group< >0.002197sOk -397ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcsimple_connect< >0.004928sOk -398ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcsimple_exec< >0.005678sOk -399ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcsimple_sftp< >0.006989sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcend_per_group< >0.000457sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrinit_per_group< >0.002467sOk -400ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrsimple_connect< >0.004957sOk -401ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrsimple_exec< >0.005885sOk -402ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrsimple_sftp< >0.006324sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrend_per_group< >0.000317sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrinit_per_group< >0.002690sOk -403ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrsimple_connect< >0.005122sOk -404ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrsimple_exec< >0.006269sOk -405ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrsimple_sftp< >0.007340sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrend_per_group< >0.000582sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.cominit_per_group< >0.002108sOk -406ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comsimple_connect< >0.004860sOk -407ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comsimple_exec< >0.006044sOk -408ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comsimple_sftp< >0.006388sOk -ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comend_per_group< >0.000381sOk -ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002605sOk -409ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.004749sOk -410ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.006393sOk -411ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.006900sOk -ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000345sOk -ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcinit_per_group< >0.002782sOk -412ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcsimple_connect< >0.004895sOk -413ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcsimple_exec< >0.005637sOk -414ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcsimple_sftp< >0.006873sOk -ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcend_per_group< >0.000346sOk -ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMinit_per_group< >0.002552sOk -415ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMsimple_connect< >0.004912sOk -416ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMsimple_exec< >0.005580sOk -417ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMsimple_sftp< >0.006527sOk -ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMend_per_group< >0.000309sOk -ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMinit_per_group< >0.002321sOk -418ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMsimple_connect< >0.004941sOk -419ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMsimple_exec< >0.005929sOk -420ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMsimple_sftp< >0.006411sOk -ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMend_per_group< >0.000381sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcinit_per_group< >0.002165sOk -421ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcsimple_connect< >0.004950sOk -422ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcsimple_exec< >0.006130sOk -423ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcsimple_sftp< >0.006380sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcend_per_group< >0.000399sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrinit_per_group< >0.002180sOk -424ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsimple_connect< >0.004841sOk -425ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsimple_exec< >0.006019sOk -426ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsimple_sftp< >0.006434sOk -427ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsshd_simple_exec< >0.111921sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrend_per_group< >0.000380sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.cominit_per_group< >0.002325sOk -428ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsimple_connect< >0.004863sOk -429ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsimple_exec< >0.005915sOk -430ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsimple_sftp< >0.007023sOk -431ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsshd_simple_exec< >0.111909sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comend_per_group< >0.000478sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcinit_per_group< >0.002220sOk -432ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcsimple_connect< >0.005051sOk -433ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcsimple_exec< >0.006043sOk -434ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcsimple_sftp< >0.006751sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcend_per_group< >0.000580sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrinit_per_group< >0.001999sOk -435ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsimple_connect< >0.004717sOk -436ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsimple_exec< >0.005521sOk -437ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsimple_sftp< >0.006864sOk -438ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsshd_simple_exec< >0.116355sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrend_per_group< >0.000336sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcinit_per_group< >0.002131sOk -439ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcsimple_connect< >0.005271sOk -440ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcsimple_exec< >0.008497sOk -441ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcsimple_sftp< >0.006924sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcend_per_group< >0.000441sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.cominit_per_group< >0.002669sOk -442ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsimple_connect< >0.004744sOk -443ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsimple_exec< >0.006241sOk -444ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsimple_sftp< >0.006911sOk -445ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsshd_simple_exec< >0.111859sOk -ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comend_per_group< >0.000409sOk -ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.cominit_per_group< >0.002612sOk -446ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsimple_connect< >0.005448sOk -447ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsimple_exec< >0.006405sOk -448ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsimple_sftp< >0.006704sOk -449ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsshd_simple_exec< >0.113706sOk -ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comend_per_group< >0.000404sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcinit_per_group< >0.002848sOk -450ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcsimple_connect< >0.004906sOk -451ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcsimple_exec< >0.005903sOk -452ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcsimple_sftp< >0.007386sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcend_per_group< >0.000557sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002367sOk -453ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.004883sOk -454ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006184sOk -455ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006844sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000506sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002708sOk -456ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004788sOk -457ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.005681sOk -458ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006756sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000381sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcinit_per_group< >0.002217sOk -459ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcsimple_connect< >0.004859sOk -460ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcsimple_exec< >0.005961sOk -461ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcsimple_sftp< >0.006572sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcend_per_group< >0.000361sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrinit_per_group< >0.002577sOk -462ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsimple_connect< >0.005199sOk -463ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsimple_exec< >0.006232sOk -464ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsimple_sftp< >0.007088sOk -465ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsshd_simple_exec< >0.112476sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrend_per_group< >0.000341sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.cominit_per_group< >0.002760sOk -466ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsimple_connect< >0.005196sOk -467ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsimple_exec< >0.005905sOk -468ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsimple_sftp< >0.006042sOk -469ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsshd_simple_exec< >0.111686sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comend_per_group< >0.000457sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcinit_per_group< >0.002634sOk -470ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcsimple_connect< >0.004843sOk -471ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcsimple_exec< >0.005923sOk -472ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcsimple_sftp< >0.006670sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcend_per_group< >0.000511sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrinit_per_group< >0.002421sOk -473ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsimple_connect< >0.004707sOk -474ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsimple_exec< >0.006140sOk -475ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsimple_sftp< >0.006823sOk -476ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsshd_simple_exec< >0.111988sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrend_per_group< >0.000316sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcinit_per_group< >0.001978sOk -477ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcsimple_connect< >0.005072sOk -478ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcsimple_exec< >0.005781sOk -479ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcsimple_sftp< >0.006724sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcend_per_group< >0.000312sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrinit_per_group< >0.002311sOk -480ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsimple_connect< >0.005075sOk -481ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsimple_exec< >0.005758sOk -482ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsimple_sftp< >0.006848sOk -483ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsshd_simple_exec< >0.112735sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrend_per_group< >0.000619sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.cominit_per_group< >0.002304sOk -484ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_connect< >0.005037sOk -485ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_exec< >0.005952sOk -486ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_sftp< >0.006218sOk -487ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsshd_simple_exec< >0.111935sOk -ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comend_per_group< >0.000455sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcinit_per_group< >0.002568sOk -488ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcsimple_connect< >0.004959sOk -489ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcsimple_exec< >0.006423sOk -490ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcsimple_sftp< >0.006532sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcend_per_group< >0.000339sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002740sOk -491ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.005279sOk -492ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006206sOk -493ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006610sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000469sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002045sOk -494ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004870sOk -495ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.005726sOk -496ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006366sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000422sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcinit_per_group< >0.002167sOk -497ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcsimple_connect< >0.005049sOk -498ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcsimple_exec< >0.006044sOk -499ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcsimple_sftp< >0.006755sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcend_per_group< >0.000613sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrinit_per_group< >0.003205sOk -500ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsimple_connect< >0.005429sOk -501ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsimple_exec< >0.005931sOk -502ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsimple_sftp< >0.006511sOk -503ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsshd_simple_exec< >0.112490sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrend_per_group< >0.000401sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.cominit_per_group< >0.001695sOk -504ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsimple_connect< >0.004645sOk -505ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsimple_exec< >0.005554sOk -506ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsimple_sftp< >0.007147sOk -507ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsshd_simple_exec< >0.112833sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comend_per_group< >0.000417sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcinit_per_group< >0.002556sOk -508ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcsimple_connect< >0.005101sOk -509ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcsimple_exec< >0.006148sOk -510ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcsimple_sftp< >0.006747sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcend_per_group< >0.000614sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrinit_per_group< >0.002239sOk -511ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsimple_connect< >0.005101sOk -512ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsimple_exec< >0.005765sOk -513ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsimple_sftp< >0.007072sOk -514ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsshd_simple_exec< >0.113013sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrend_per_group< >0.000408sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcinit_per_group< >0.002179sOk -515ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcsimple_connect< >0.005225sOk -516ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcsimple_exec< >0.006708sOk -517ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcsimple_sftp< >0.007139sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcend_per_group< >0.000519sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrinit_per_group< >0.002154sOk -518ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsimple_connect< >0.004799sOk -519ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsimple_exec< >0.006481sOk -520ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsimple_sftp< >0.006744sOk -521ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsshd_simple_exec< >0.113198sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrend_per_group< >0.000512sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.cominit_per_group< >0.002486sOk -522ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsimple_connect< >0.004938sOk -523ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsimple_exec< >0.005867sOk -524ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsimple_sftp< >0.006723sOk -525ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsshd_simple_exec< >0.112615sOk -ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comend_per_group< >0.000426sOk -ssh_algorithms_SUITEcipherend_per_group< >0.000000sOk -ssh_algorithms_SUITEmacinit_per_group< >0.000013sOk==== mac ==== -ssh_algorithms_SUITEAEAD_AES_128_GCMinit_per_group< >0.002237sOk -526ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_connect< >0.005040sOk -527ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_exec< >0.005805sOk -528ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_sftp< >0.006222sOk -ssh_algorithms_SUITEAEAD_AES_128_GCMend_per_group< >0.000336sOk -ssh_algorithms_SUITEAEAD_AES_256_GCMinit_per_group< >0.001972sOk -529ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_connect< >0.005007sOk -530ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_exec< >0.005615sOk -531ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_sftp< >0.006497sOk -ssh_algorithms_SUITEAEAD_AES_256_GCMend_per_group< >0.000566sOk -ssh_algorithms_SUITEhmac-sha1init_per_group< >0.002039sOk -532ssh_algorithms_SUITEhmac-sha1simple_connect< >0.004781sOk -533ssh_algorithms_SUITEhmac-sha1simple_exec< >0.005669sOk -534ssh_algorithms_SUITEhmac-sha1simple_sftp< >0.006189sOk -535ssh_algorithms_SUITEhmac-sha1sshd_simple_exec< >0.112145sOk -ssh_algorithms_SUITEhmac-sha1end_per_group< >0.000381sOk -ssh_algorithms_SUITEhmac-sha1-96init_per_group< >0.002054sOk -536ssh_algorithms_SUITEhmac-sha1-96simple_connect< >0.004747sOk -537ssh_algorithms_SUITEhmac-sha1-96simple_exec< >0.006076sOk -538ssh_algorithms_SUITEhmac-sha1-96simple_sftp< >0.006696sOk -ssh_algorithms_SUITEhmac-sha1-96end_per_group< >0.000327sOk -ssh_algorithms_SUITEhmac-sha1-etm@openssh.cominit_per_group< >0.002049sOk -539ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsimple_connect< >0.004985sOk -540ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsimple_exec< >0.005775sOk -541ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsimple_sftp< >0.006461sOk -542ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsshd_simple_exec< >0.111782sOk -ssh_algorithms_SUITEhmac-sha1-etm@openssh.comend_per_group< >0.000328sOk -ssh_algorithms_SUITEhmac-sha2-256init_per_group< >0.001899sOk -543ssh_algorithms_SUITEhmac-sha2-256simple_connect< >0.004836sOk -544ssh_algorithms_SUITEhmac-sha2-256simple_exec< >0.005819sOk -545ssh_algorithms_SUITEhmac-sha2-256simple_sftp< >0.006331sOk -546ssh_algorithms_SUITEhmac-sha2-256sshd_simple_exec< >0.112337sOk -ssh_algorithms_SUITEhmac-sha2-256end_per_group< >0.000414sOk -ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.cominit_per_group< >0.002190sOk -547ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsimple_connect< >0.004881sOk -548ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsimple_exec< >0.005509sOk -549ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsimple_sftp< >0.006204sOk -550ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.112398sOk -ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comend_per_group< >0.000565sOk -ssh_algorithms_SUITEhmac-sha2-512init_per_group< >0.001913sOk -551ssh_algorithms_SUITEhmac-sha2-512simple_connect< >0.005024sOk -552ssh_algorithms_SUITEhmac-sha2-512simple_exec< >0.005965sOk -553ssh_algorithms_SUITEhmac-sha2-512simple_sftp< >0.006429sOk -554ssh_algorithms_SUITEhmac-sha2-512sshd_simple_exec< >0.111703sOk -ssh_algorithms_SUITEhmac-sha2-512end_per_group< >0.000277sOk -ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.cominit_per_group< >0.001967sOk -555ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsimple_connect< >0.005057sOk -556ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsimple_exec< >0.006290sOk -557ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsimple_sftp< >0.006364sOk -558ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.111010sOk -ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comend_per_group< >0.000670sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMinit_per_group< >0.002378sOk -559ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_connect< >0.004775sOk -560ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_exec< >0.005959sOk -561ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_sftp< >0.006431sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMend_per_group< >0.000366sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1init_per_group< >0.002247sOk -562ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1simple_connect< >0.005065sOk -563ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1simple_exec< >0.005451sOk -564ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1simple_sftp< >0.006634sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1end_per_group< >0.000319sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96init_per_group< >0.002616sOk -565ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96simple_connect< >0.004741sOk -566ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96simple_exec< >0.006049sOk -567ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96simple_sftp< >0.006378sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96end_per_group< >0.000323sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.cominit_per_group< >0.002100sOk -568ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comsimple_connect< >0.004513sOk -569ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comsimple_exec< >0.005600sOk -570ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comsimple_sftp< >0.006419sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comend_per_group< >0.000379sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256init_per_group< >0.001952sOk -571ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256simple_connect< >0.004832sOk -572ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256simple_exec< >0.005523sOk -573ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256simple_sftp< >0.006753sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256end_per_group< >0.000367sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002243sOk -574ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005095sOk -575ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comsimple_exec< >0.005995sOk -576ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006339sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comend_per_group< >0.000417sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512init_per_group< >0.002328sOk -577ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512simple_connect< >0.005207sOk -578ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512simple_exec< >0.005768sOk -579ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512simple_sftp< >0.006425sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512end_per_group< >0.000561sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002636sOk -580ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comsimple_connect< >0.004684sOk -581ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006186sOk -582ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006368sOk -ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comend_per_group< >0.000510sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMinit_per_group< >0.002054sOk -583ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_connect< >0.004980sOk -584ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_exec< >0.005945sOk -585ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_sftp< >0.006353sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMend_per_group< >0.000325sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1init_per_group< >0.002786sOk -586ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1simple_connect< >0.004612sOk -587ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1simple_exec< >0.005586sOk -588ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1simple_sftp< >0.006768sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1end_per_group< >0.000425sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96init_per_group< >0.002198sOk -589ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96simple_connect< >0.004756sOk -590ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96simple_exec< >0.005791sOk -591ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96simple_sftp< >0.006245sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96end_per_group< >0.000326sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.cominit_per_group< >0.002288sOk -592ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comsimple_connect< >0.004974sOk -593ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comsimple_exec< >0.005898sOk -594ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comsimple_sftp< >0.006011sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comend_per_group< >0.000661sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256init_per_group< >0.002084sOk -595ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256simple_connect< >0.004970sOk -596ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256simple_exec< >0.006358sOk -597ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256simple_sftp< >0.006300sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256end_per_group< >0.000391sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002148sOk -598ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comsimple_connect< >0.004790sOk -599ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comsimple_exec< >0.005391sOk -600ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006252sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comend_per_group< >0.000565sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512init_per_group< >0.002084sOk -601ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512simple_connect< >0.004810sOk -602ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512simple_exec< >0.005857sOk -603ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512simple_sftp< >0.006228sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512end_per_group< >0.000325sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002642sOk -604ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comsimple_connect< >0.004956sOk -605ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comsimple_exec< >0.005811sOk -606ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006497sOk -ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comend_per_group< >0.000435sOk -ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMinit_per_group< >0.002182sOk -607ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMsimple_connect< >0.004632sOk -608ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMsimple_exec< >0.005943sOk -609ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMsimple_sftp< >0.006680sOk -ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMend_per_group< >0.000339sOk -ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMinit_per_group< >0.002298sOk -610ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMsimple_connect< >0.004869sOk -611ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMsimple_exec< >0.006112sOk -612ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMsimple_sftp< >0.006289sOk -ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMend_per_group< >0.000326sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96init_per_group< >0.002564sOk -613ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96simple_connect< >0.004431sOk -614ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96simple_exec< >0.005809sOk -615ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96simple_sftp< >0.006152sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96end_per_group< >0.000570sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.cominit_per_group< >0.002011sOk -616ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsimple_connect< >0.004485sOk -617ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsimple_exec< >0.005510sOk -618ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsimple_sftp< >0.005946sOk -619ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.112082sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comend_per_group< >0.000470sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256init_per_group< >0.001998sOk -620ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256simple_connect< >0.005364sOk -621ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256simple_exec< >0.006033sOk -622ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256simple_sftp< >0.006727sOk -623ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256sshd_simple_exec< >0.112545sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256end_per_group< >0.000462sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002151sOk -624ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.004983sOk -625ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.005812sOk -626ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006777sOk -627ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.113090sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000475sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512init_per_group< >0.002782sOk -628ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512simple_connect< >0.004991sOk -629ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512simple_exec< >0.005724sOk -630ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512simple_sftp< >0.006758sOk -631ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512sshd_simple_exec< >0.113579sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512end_per_group< >0.000716sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002731sOk -632ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005155sOk -633ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006400sOk -634ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006517sOk -635ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.112962sOk -ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000385sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMinit_per_group< >0.002770sOk -636ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMsimple_connect< >0.004597sOk -637ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMsimple_exec< >0.005995sOk -638ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMsimple_sftp< >0.006333sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMend_per_group< >0.000420sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMinit_per_group< >0.002491sOk -639ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMsimple_connect< >0.004835sOk -640ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMsimple_exec< >0.006195sOk -641ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMsimple_sftp< >0.006315sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMend_per_group< >0.000356sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1init_per_group< >0.001788sOk -642ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1simple_connect< >0.004968sOk -643ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1simple_exec< >0.005859sOk -644ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1simple_sftp< >0.006422sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1end_per_group< >0.000396sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.cominit_per_group< >0.002067sOk -645ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comsimple_connect< >0.004763sOk -646ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comsimple_exec< >0.005985sOk -647ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comsimple_sftp< >0.006882sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comend_per_group< >0.000304sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256init_per_group< >0.002733sOk -648ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256simple_connect< >0.004688sOk -649ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256simple_exec< >0.005813sOk -650ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256simple_sftp< >0.006413sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256end_per_group< >0.000454sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002710sOk -651ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.004945sOk -652ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006073sOk -653ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006757sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000506sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512init_per_group< >0.002416sOk -654ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512simple_connect< >0.004682sOk -655ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512simple_exec< >0.005741sOk -656ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512simple_sftp< >0.006684sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512end_per_group< >0.000449sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002230sOk -657ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005059sOk -658ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.005799sOk -659ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006036sOk -ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000371sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002553sOk -660ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.005060sOk -661ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.005983sOk -662ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006978sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000393sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002195sOk -663ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004956sOk -664ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.006083sOk -665ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006498sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000394sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1init_per_group< >0.002701sOk -666ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1simple_connect< >0.004820sOk -667ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1simple_exec< >0.005783sOk -668ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1simple_sftp< >0.006552sOk -669ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1sshd_simple_exec< >0.112492sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1end_per_group< >0.000445sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96init_per_group< >0.001949sOk -670ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96simple_connect< >0.004958sOk -671ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96simple_exec< >0.005951sOk -672ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96simple_sftp< >0.006323sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96end_per_group< >0.000386sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256init_per_group< >0.002023sOk -673ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256simple_connect< >0.004854sOk -674ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256simple_exec< >0.005775sOk -675ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256simple_sftp< >0.006562sOk -676ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256sshd_simple_exec< >0.112987sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256end_per_group< >0.000571sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002452sOk -677ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_connect< >0.004883sOk -678ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006000sOk -679ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006362sOk -680ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.112083sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comend_per_group< >0.000757sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512init_per_group< >0.002336sOk -681ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512simple_connect< >0.004971sOk -682ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512simple_exec< >0.005772sOk -683ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512simple_sftp< >0.006626sOk -684ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512sshd_simple_exec< >0.112319sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512end_per_group< >0.000451sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002576sOk -685ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_connect< >0.004610sOk -686ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_exec< >0.005876sOk -687ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006267sOk -688ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.112953sOk -ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comend_per_group< >0.000425sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMinit_per_group< >0.002657sOk -689ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMsimple_connect< >0.004823sOk -690ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMsimple_exec< >0.006000sOk -691ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMsimple_sftp< >0.006684sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMend_per_group< >0.000429sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMinit_per_group< >0.002047sOk -692ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMsimple_connect< >0.004909sOk -693ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMsimple_exec< >0.005850sOk -694ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMsimple_sftp< >0.006517sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMend_per_group< >0.000375sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1init_per_group< >0.002469sOk -695ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1simple_connect< >0.004841sOk -696ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1simple_exec< >0.005652sOk -697ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1simple_sftp< >0.006389sOk -698ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1sshd_simple_exec< >0.112572sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1end_per_group< >0.000385sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96init_per_group< >0.002256sOk -699ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96simple_connect< >0.005265sOk -700ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96simple_exec< >0.005864sOk -701ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96simple_sftp< >0.006395sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96end_per_group< >0.000310sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.cominit_per_group< >0.001784sOk -702ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsimple_connect< >0.004999sOk -703ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsimple_exec< >0.005463sOk -704ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsimple_sftp< >0.006559sOk -705ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.112445sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comend_per_group< >0.000512sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002789sOk -706ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005162sOk -707ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006447sOk -708ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006119sOk -709ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.111515sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000550sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512init_per_group< >0.002299sOk -710ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512simple_connect< >0.004833sOk -711ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512simple_exec< >0.005676sOk -712ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512simple_sftp< >0.006169sOk -713ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512sshd_simple_exec< >0.111201sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512end_per_group< >0.000434sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002467sOk -714ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.004802sOk -715ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.005895sOk -716ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006461sOk -717ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.112204sOk -ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000376sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002287sOk -718ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.004835sOk -719ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.005800sOk -720ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006631sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000393sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002432sOk -721ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004836sOk -722ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.005722sOk -723ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006447sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000310sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1init_per_group< >0.002543sOk -724ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1simple_connect< >0.005031sOk -725ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1simple_exec< >0.005812sOk -726ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1simple_sftp< >0.006191sOk -727ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1sshd_simple_exec< >0.112981sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1end_per_group< >0.000426sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96init_per_group< >0.002652sOk -728ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96simple_connect< >0.005164sOk -729ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96simple_exec< >0.005560sOk -730ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96simple_sftp< >0.006497sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96end_per_group< >0.000416sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.cominit_per_group< >0.002192sOk -731ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_connect< >0.005068sOk -732ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_exec< >0.006066sOk -733ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_sftp< >0.006332sOk -734ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.112241sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comend_per_group< >0.000522sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256init_per_group< >0.002885sOk -735ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256simple_connect< >0.005261sOk -736ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256simple_exec< >0.005867sOk -737ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256simple_sftp< >0.006360sOk -738ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256sshd_simple_exec< >0.111415sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256end_per_group< >0.000499sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512init_per_group< >0.002958sOk -739ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512simple_connect< >0.005650sOk -740ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512simple_exec< >0.006125sOk -741ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512simple_sftp< >0.006455sOk -742ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512sshd_simple_exec< >0.111847sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512end_per_group< >0.000575sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002548sOk -743ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005598sOk -744ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_exec< >0.005596sOk -745ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006582sOk -746ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.112064sOk -ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comend_per_group< >0.000615sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMinit_per_group< >0.002137sOk -747ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMsimple_connect< >0.004758sOk -748ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMsimple_exec< >0.006318sOk -749ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMsimple_sftp< >0.006517sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMend_per_group< >0.000357sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMinit_per_group< >0.002111sOk -750ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMsimple_connect< >0.005388sOk -751ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMsimple_exec< >0.006120sOk -752ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMsimple_sftp< >0.006531sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMend_per_group< >0.000340sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1init_per_group< >0.002426sOk -753ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1simple_connect< >0.005051sOk -754ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1simple_exec< >0.005650sOk -755ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1simple_sftp< >0.006531sOk -756ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1sshd_simple_exec< >0.112505sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1end_per_group< >0.000391sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96init_per_group< >0.002807sOk -757ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96simple_connect< >0.005079sOk -758ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96simple_exec< >0.006152sOk -759ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96simple_sftp< >0.007291sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96end_per_group< >0.000386sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.cominit_per_group< >0.002392sOk -760ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsimple_connect< >0.004867sOk -761ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsimple_exec< >0.006102sOk -762ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsimple_sftp< >0.007106sOk -763ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.112597sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comend_per_group< >0.000375sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256init_per_group< >0.002395sOk -764ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256simple_connect< >0.004978sOk -765ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256simple_exec< >0.005907sOk -766ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256simple_sftp< >0.006267sOk -767ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256sshd_simple_exec< >0.112067sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256end_per_group< >0.000402sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.001947sOk -768ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005126sOk -769ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006136sOk -770ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006442sOk -771ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.113403sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000409sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002065sOk -772ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005329sOk -773ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006184sOk -774ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006838sOk -775ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.111945sOk -ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000451sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002872sOk -776ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.004801sOk -777ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006001sOk -778ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006264sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000391sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002233sOk -779ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004848sOk -780ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.005832sOk -781ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006265sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000545sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1init_per_group< >0.002377sOk -782ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1simple_connect< >0.004603sOk -783ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1simple_exec< >0.005857sOk -784ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1simple_sftp< >0.006864sOk -785ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1sshd_simple_exec< >0.112546sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1end_per_group< >0.000584sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96init_per_group< >0.002303sOk -786ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96simple_connect< >0.005005sOk -787ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96simple_exec< >0.005910sOk -788ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96simple_sftp< >0.006262sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96end_per_group< >0.000365sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.cominit_per_group< >0.002830sOk -789ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_connect< >0.005272sOk -790ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_exec< >0.005811sOk -791ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_sftp< >0.006541sOk -792ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.113840sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comend_per_group< >0.000409sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256init_per_group< >0.002549sOk -793ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256simple_connect< >0.004786sOk -794ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256simple_exec< >0.006194sOk -795ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256simple_sftp< >0.006652sOk -796ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256sshd_simple_exec< >0.111792sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256end_per_group< >0.000495sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002029sOk -797ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005120sOk -798ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_exec< >0.005895sOk -799ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.005933sOk -800ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.111633sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comend_per_group< >0.000518sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512init_per_group< >0.002063sOk -801ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512simple_connect< >0.005163sOk -802ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512simple_exec< >0.005862sOk -803ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512simple_sftp< >0.006653sOk -804ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512sshd_simple_exec< >0.112157sOk -ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512end_per_group< >0.000396sOk -ssh_algorithms_SUITEmacend_per_group< >0.000000sOk -ssh_algorithms_SUITEcompressioninit_per_group< >0.000014sOk==== compression ==== -ssh_algorithms_SUITEnoneinit_per_group< >0.002185sOk -805ssh_algorithms_SUITEnonesimple_connect< >0.005592sOk -806ssh_algorithms_SUITEnonesimple_exec< >0.005847sOk -807ssh_algorithms_SUITEnonesimple_sftp< >0.006394sOk -808ssh_algorithms_SUITEnonesshd_simple_exec< >0.112588sOk -ssh_algorithms_SUITEnoneend_per_group< >0.000329sOk -ssh_algorithms_SUITEzlibinit_per_group< >0.002311sOk -809ssh_algorithms_SUITEzlibsimple_connect< >0.005163sOk -810ssh_algorithms_SUITEzlibsimple_exec< >0.006304sOk -811ssh_algorithms_SUITEzlibsimple_sftp< >0.007414sOk -ssh_algorithms_SUITEzlibend_per_group< >0.000401sOk -ssh_algorithms_SUITEzlib@openssh.cominit_per_group< >0.002072sOk -812ssh_algorithms_SUITEzlib@openssh.comsimple_connect< >0.004785sOk -813ssh_algorithms_SUITEzlib@openssh.comsimple_exec< >0.006528sOk -814ssh_algorithms_SUITEzlib@openssh.comsimple_sftp< >0.007033sOk -815ssh_algorithms_SUITEzlib@openssh.comsshd_simple_exec< >0.112277sOk -ssh_algorithms_SUITEzlib@openssh.comend_per_group< >0.000470sOk -ssh_algorithms_SUITED: compression none + zlibinit_per_group< >0.002370sOk -816ssh_algorithms_SUITED: compression none + zlibsimple_connect< >0.004818sOk -817ssh_algorithms_SUITED: compression none + zlibsimple_exec< >0.006375sOk -818ssh_algorithms_SUITED: compression none + zlibsimple_sftp< >0.006834sOk -ssh_algorithms_SUITED: compression none + zlibend_per_group< >0.000407sOk -ssh_algorithms_SUITED: compression none + zlib@openssh.cominit_per_group< >0.002263sOk -819ssh_algorithms_SUITED: compression none + zlib@openssh.comsimple_connect< >0.005347sOk -820ssh_algorithms_SUITED: compression none + zlib@openssh.comsimple_exec< >0.005689sOk -821ssh_algorithms_SUITED: compression none + zlib@openssh.comsimple_sftp< >0.006919sOk -822ssh_algorithms_SUITED: compression none + zlib@openssh.comsshd_simple_exec< >0.112543sOk -ssh_algorithms_SUITED: compression none + zlib@openssh.comend_per_group< >0.000394sOk -ssh_algorithms_SUITED: compression zlib + noneinit_per_group< >0.001890sOk -823ssh_algorithms_SUITED: compression zlib + nonesimple_connect< >0.005113sOk -824ssh_algorithms_SUITED: compression zlib + nonesimple_exec< >0.005939sOk -825ssh_algorithms_SUITED: compression zlib + nonesimple_sftp< >0.007570sOk -ssh_algorithms_SUITED: compression zlib + noneend_per_group< >0.000365sOk -ssh_algorithms_SUITED: compression zlib + zlib@openssh.cominit_per_group< >0.001959sOk -826ssh_algorithms_SUITED: compression zlib + zlib@openssh.comsimple_connect< >0.005433sOk -827ssh_algorithms_SUITED: compression zlib + zlib@openssh.comsimple_exec< >0.006190sOk -828ssh_algorithms_SUITED: compression zlib + zlib@openssh.comsimple_sftp< >0.007601sOk -ssh_algorithms_SUITED: compression zlib + zlib@openssh.comend_per_group< >0.000435sOk -ssh_algorithms_SUITED: compression zlib@openssh.com + noneinit_per_group< >0.002147sOk -829ssh_algorithms_SUITED: compression zlib@openssh.com + nonesimple_connect< >0.005034sOk -830ssh_algorithms_SUITED: compression zlib@openssh.com + nonesimple_exec< >0.005994sOk -831ssh_algorithms_SUITED: compression zlib@openssh.com + nonesimple_sftp< >0.007080sOk -832ssh_algorithms_SUITED: compression zlib@openssh.com + nonesshd_simple_exec< >0.112404sOk -ssh_algorithms_SUITED: compression zlib@openssh.com + noneend_per_group< >0.000411sOk -ssh_algorithms_SUITED: compression zlib@openssh.com + zlibinit_per_group< >0.002655sOk -833ssh_algorithms_SUITED: compression zlib@openssh.com + zlibsimple_connect< >0.005381sOk -834ssh_algorithms_SUITED: compression zlib@openssh.com + zlibsimple_exec< >0.006142sOk -835ssh_algorithms_SUITED: compression zlib@openssh.com + zlibsimple_sftp< >0.007110sOk -ssh_algorithms_SUITED: compression zlib@openssh.com + zlibend_per_group< >0.000407sOk -ssh_algorithms_SUITEcompressionend_per_group< >0.000001sOk -ssh_algorithms_SUITEpublic_keyinit_per_group< >0.000016sOk==== public_key ==== -ssh_algorithms_SUITEecdsa-sha2-nistp256init_per_group< >0.001358sOk -836ssh_algorithms_SUITEecdsa-sha2-nistp256simple_connect< >0.004937sOk -837ssh_algorithms_SUITEecdsa-sha2-nistp256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITEecdsa-sha2-nistp256end_per_group< >0.000001sOk -ssh_algorithms_SUITEecdsa-sha2-nistp384init_per_group< >0.001299sOk -838ssh_algorithms_SUITEecdsa-sha2-nistp384simple_connect< >0.008031sOk -ssh_algorithms_SUITEecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITEecdsa-sha2-nistp521init_per_group< >0.001500sOk -839ssh_algorithms_SUITEecdsa-sha2-nistp521simple_connect< >0.006158sOk -ssh_algorithms_SUITEecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITErsa-sha2-256init_per_group< >0.001005sOk -840ssh_algorithms_SUITErsa-sha2-256simple_connect< >0.006242sOk -841ssh_algorithms_SUITErsa-sha2-256sshd_simple_exec< >0.096993sOk -ssh_algorithms_SUITErsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITErsa-sha2-512init_per_group< >0.001483sOk -842ssh_algorithms_SUITErsa-sha2-512simple_connect< >0.006157sOk -843ssh_algorithms_SUITErsa-sha2-512sshd_simple_exec< >0.100893sOk -ssh_algorithms_SUITErsa-sha2-512end_per_group< >0.000000sOk -ssh_algorithms_SUITEssh-dssinit_per_group< >0.001356sOk -844ssh_algorithms_SUITEssh-dsssimple_connect< >0.004928sOk -ssh_algorithms_SUITEssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITEssh-ed25519init_per_group< >0.000957sOk -845ssh_algorithms_SUITEssh-ed25519simple_connect< >0.004614sOk -846ssh_algorithms_SUITEssh-ed25519sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITEssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITEssh-ed448init_per_group< >0.001281sOk -847ssh_algorithms_SUITEssh-ed448simple_connect< >0.005985sOk -ssh_algorithms_SUITEssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITEssh-rsainit_per_group< >0.001303sOk -848ssh_algorithms_SUITEssh-rsasimple_connect< >0.006061sOk -ssh_algorithms_SUITEssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384init_per_group< >0.002810sOk -849ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384simple_connect< >0.005874sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521init_per_group< >0.002001sOk -850ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521simple_connect< >0.005049sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256init_per_group< >0.002072sOk -851ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256simple_connect< >0.004765sOk -852ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512init_per_group< >0.002368sOk -853ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512simple_connect< >0.004803sOk -854ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-dssinit_per_group< >0.002090sOk -855ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-dsssimple_connect< >0.004800sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519init_per_group< >0.001938sOk -856ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519simple_connect< >0.004159sOk -857ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed448init_per_group< >0.002069sOk -858ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed448simple_connect< >0.004849sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-rsainit_per_group< >0.001865sOk -859ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-rsasimple_connect< >0.004749sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256init_per_group< >0.001854sOk -860ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256simple_connect< >0.005921sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521init_per_group< >0.002046sOk -861ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521simple_connect< >0.006581sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-256init_per_group< >0.002124sOk -862ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-256simple_connect< >0.006313sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-256end_per_group< >0.000001sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-512init_per_group< >0.002166sOk -863ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-512simple_connect< >0.006596sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-512end_per_group< >0.000001sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-dssinit_per_group< >0.001972sOk -864ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-dsssimple_connect< >0.006141sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed25519init_per_group< >0.001955sOk -865ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed25519simple_connect< >0.006627sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed448init_per_group< >0.002165sOk -866ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed448simple_connect< >0.006166sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-rsainit_per_group< >0.001843sOk -867ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-rsasimple_connect< >0.006194sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256init_per_group< >0.001874sOk -868ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256simple_connect< >0.005297sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384init_per_group< >0.001966sOk -869ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384simple_connect< >0.006576sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-256init_per_group< >0.001973sOk -870ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-256simple_connect< >0.005967sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-512init_per_group< >0.001896sOk -871ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-512simple_connect< >0.005600sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-512end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-dssinit_per_group< >0.001963sOk -872ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-dsssimple_connect< >0.005238sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed25519init_per_group< >0.002078sOk -873ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed25519simple_connect< >0.005021sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed448init_per_group< >0.001824sOk -874ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed448simple_connect< >0.006005sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-rsainit_per_group< >0.002148sOk -875ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-rsasimple_connect< >0.006017sOk -ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-rsaend_per_group< >0.000001sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256init_per_group< >0.001818sOk -876ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256simple_connect< >0.005527sOk -877ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256sshd_simple_exec< >0.097650sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp384init_per_group< >0.001977sOk -878ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp384simple_connect< >0.007017sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp521init_per_group< >0.002183sOk -879ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp521simple_connect< >0.006168sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512init_per_group< >0.002084sOk -880ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512simple_connect< >0.006526sOk -881ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512sshd_simple_exec< >0.096892sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-dssinit_per_group< >0.001946sOk -882ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-dsssimple_connect< >0.005573sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519init_per_group< >0.001875sOk -883ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519simple_connect< >0.005421sOk -884ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519sshd_simple_exec< >0.096819sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed448init_per_group< >0.002139sOk -885ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed448simple_connect< >0.005969sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-rsainit_per_group< >0.001647sOk -886ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-rsasimple_connect< >0.005920sOk -ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256init_per_group< >0.002193sOk -887ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256simple_connect< >0.005302sOk -888ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256sshd_simple_exec< >0.096681sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp384init_per_group< >0.002219sOk -889ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp384simple_connect< >0.007000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp521init_per_group< >0.002031sOk -890ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp521simple_connect< >0.006093sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp521end_per_group< >0.000001sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256init_per_group< >0.002194sOk -891ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256simple_connect< >0.006068sOk -892ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256sshd_simple_exec< >0.097108sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-dssinit_per_group< >0.002048sOk -893ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-dsssimple_connect< >0.005409sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519init_per_group< >0.001838sOk -894ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519simple_connect< >0.005482sOk -895ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519sshd_simple_exec< >0.096950sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519end_per_group< >0.000001sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed448init_per_group< >0.001843sOk -896ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed448simple_connect< >0.005850sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-rsainit_per_group< >0.002198sOk -897ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-rsasimple_connect< >0.006048sOk -ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp256init_per_group< >0.001933sOk -898ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp256simple_connect< >0.005048sOk -ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp384init_per_group< >0.002448sOk -899ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp384simple_connect< >0.006005sOk -ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp384end_per_group< >0.000001sOk -ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp521init_per_group< >0.001951sOk -900ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp521simple_connect< >0.005205sOk -ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-256init_per_group< >0.001660sOk -901ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-256simple_connect< >0.005210sOk -ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-512init_per_group< >0.002169sOk -902ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-512simple_connect< >0.004831sOk -ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-512end_per_group< >0.000001sOk -ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed25519init_per_group< >0.002067sOk -903ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed25519simple_connect< >0.004716sOk -ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed448init_per_group< >0.001958sOk -904ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed448simple_connect< >0.004794sOk -ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-dss + ssh-rsainit_per_group< >0.002521sOk -905ssh_algorithms_SUITED: public_key ssh-dss + ssh-rsasimple_connect< >0.004741sOk -ssh_algorithms_SUITED: public_key ssh-dss + ssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256init_per_group< >0.002082sOk -906ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256simple_connect< >0.004486sOk -907ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp384init_per_group< >0.002284sOk -908ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp384simple_connect< >0.006440sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp521init_per_group< >0.001806sOk -909ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp521simple_connect< >0.005299sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256init_per_group< >0.001812sOk -910ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256simple_connect< >0.004899sOk -911ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512init_per_group< >0.001697sOk -912ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512simple_connect< >0.004827sOk -913ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent -ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-dssinit_per_group< >0.002233sOk -914ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-dsssimple_connect< >0.004281sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-ed448init_per_group< >0.002096sOk -915ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-ed448simple_connect< >0.004700sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-rsainit_per_group< >0.001939sOk -916ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-rsasimple_connect< >0.004995sOk -ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp256init_per_group< >0.002178sOk -917ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp256simple_connect< >0.005268sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp384init_per_group< >0.001867sOk -918ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp384simple_connect< >0.006583sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp521init_per_group< >0.002279sOk -919ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp521simple_connect< >0.005707sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-256init_per_group< >0.002104sOk -920ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-256simple_connect< >0.005339sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-512init_per_group< >0.002025sOk -921ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-512simple_connect< >0.005276sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-512end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-dssinit_per_group< >0.002289sOk -922ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-dsssimple_connect< >0.004905sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-ed25519init_per_group< >0.002293sOk -923ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-ed25519simple_connect< >0.005045sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-rsainit_per_group< >0.002038sOk -924ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-rsasimple_connect< >0.005281sOk -ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-rsaend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp256init_per_group< >0.001642sOk -925ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp256simple_connect< >0.005860sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp384init_per_group< >0.001833sOk -926ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp384simple_connect< >0.006947sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp384end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp521init_per_group< >0.001889sOk -927ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp521simple_connect< >0.006221sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp521end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-256init_per_group< >0.001737sOk -928ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-256simple_connect< >0.005683sOk -ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-256end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-512init_per_group< >0.001733sOk -929ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-512simple_connect< >0.006536sOk -ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-512end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ssh-dssinit_per_group< >0.002415sOk -930ssh_algorithms_SUITED: public_key ssh-rsa + ssh-dsssimple_connect< >0.005142sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ssh-dssend_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed25519init_per_group< >0.001904sOk -931ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed25519simple_connect< >0.005282sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed25519end_per_group< >0.000000sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed448init_per_group< >0.002035sOk -932ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed448simple_connect< >0.005859sOk -ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed448end_per_group< >0.000000sOk -ssh_algorithms_SUITEpublic_keyend_per_group< >0.000000sOk -ssh_algorithms_SUITEend_per_suite< >0.001080sOk -ssh_basic_SUITEinit_per_suite< >0.008189sOkFIPS mode not supported by Erlang/OTP +26ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec_groups_no_match_too_large< >0.002719sOk +27ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256simple_exec_groups_no_match_too_small< >0.003163sOk +ssh_algorithms_SUITEdiffie-hellman-group-exchange-sha256end_per_group< >0.000431sOk +ssh_algorithms_SUITEdiffie-hellman-group1-sha1init_per_group< >0.002124sOk +28ssh_algorithms_SUITEdiffie-hellman-group1-sha1simple_connect< >0.005327sOk +29ssh_algorithms_SUITEdiffie-hellman-group1-sha1simple_exec< >0.006571sOk +30ssh_algorithms_SUITEdiffie-hellman-group1-sha1simple_sftp< >0.007278sOk +ssh_algorithms_SUITEdiffie-hellman-group1-sha1end_per_group< >0.000578sOk +ssh_algorithms_SUITEdiffie-hellman-group14-sha1init_per_group< >0.002220sOk +31ssh_algorithms_SUITEdiffie-hellman-group14-sha1simple_connect< >0.011308sOk +32ssh_algorithms_SUITEdiffie-hellman-group14-sha1simple_exec< >0.012359sOk +33ssh_algorithms_SUITEdiffie-hellman-group14-sha1simple_sftp< >0.013116sOk +ssh_algorithms_SUITEdiffie-hellman-group14-sha1end_per_group< >0.000502sOk +ssh_algorithms_SUITEdiffie-hellman-group14-sha256init_per_group< >0.002402sOk +34ssh_algorithms_SUITEdiffie-hellman-group14-sha256simple_connect< >0.011241sOk +35ssh_algorithms_SUITEdiffie-hellman-group14-sha256simple_exec< >0.014959sOk +36ssh_algorithms_SUITEdiffie-hellman-group14-sha256simple_sftp< >0.013161sOk +37ssh_algorithms_SUITEdiffie-hellman-group14-sha256sshd_simple_exec< >0.117120sOk +ssh_algorithms_SUITEdiffie-hellman-group14-sha256end_per_group< >0.000634sOk +ssh_algorithms_SUITEdiffie-hellman-group16-sha512init_per_group< >0.002545sOk +38ssh_algorithms_SUITEdiffie-hellman-group16-sha512simple_connect< >0.044954sOk +39ssh_algorithms_SUITEdiffie-hellman-group16-sha512simple_exec< >0.045443sOk +40ssh_algorithms_SUITEdiffie-hellman-group16-sha512simple_sftp< >0.046531sOk +41ssh_algorithms_SUITEdiffie-hellman-group16-sha512sshd_simple_exec< >0.136193sOk +ssh_algorithms_SUITEdiffie-hellman-group16-sha512end_per_group< >0.000563sOk +ssh_algorithms_SUITEdiffie-hellman-group18-sha512init_per_group< >0.002475sOk +42ssh_algorithms_SUITEdiffie-hellman-group18-sha512simple_connect< >0.281888sOk +43ssh_algorithms_SUITEdiffie-hellman-group18-sha512simple_exec< >0.282523sOk +44ssh_algorithms_SUITEdiffie-hellman-group18-sha512simple_sftp< >0.283059sOk +45ssh_algorithms_SUITEdiffie-hellman-group18-sha512sshd_simple_exec< >0.267859sOk +ssh_algorithms_SUITEdiffie-hellman-group18-sha512end_per_group< >0.000515sOk +ssh_algorithms_SUITEecdh-sha2-nistp256init_per_group< >0.002213sOk +46ssh_algorithms_SUITEecdh-sha2-nistp256simple_connect< >0.006098sOk +47ssh_algorithms_SUITEecdh-sha2-nistp256simple_exec< >0.005623sOk +48ssh_algorithms_SUITEecdh-sha2-nistp256simple_sftp< >0.006836sOk +49ssh_algorithms_SUITEecdh-sha2-nistp256sshd_simple_exec< >0.112153sOk +ssh_algorithms_SUITEecdh-sha2-nistp256end_per_group< >0.000517sOk +ssh_algorithms_SUITEecdh-sha2-nistp384init_per_group< >0.002175sOk +50ssh_algorithms_SUITEecdh-sha2-nistp384simple_connect< >0.008505sOk +51ssh_algorithms_SUITEecdh-sha2-nistp384simple_exec< >0.009434sOk +52ssh_algorithms_SUITEecdh-sha2-nistp384simple_sftp< >0.010269sOk +53ssh_algorithms_SUITEecdh-sha2-nistp384sshd_simple_exec< >0.118375sOk +ssh_algorithms_SUITEecdh-sha2-nistp384end_per_group< >0.000639sOk +ssh_algorithms_SUITEecdh-sha2-nistp521init_per_group< >0.002257sOk +54ssh_algorithms_SUITEecdh-sha2-nistp521simple_connect< >0.005988sOk +55ssh_algorithms_SUITEecdh-sha2-nistp521simple_exec< >0.006862sOk +56ssh_algorithms_SUITEecdh-sha2-nistp521simple_sftp< >0.007688sOk +57ssh_algorithms_SUITEecdh-sha2-nistp521sshd_simple_exec< >0.116228sOk +ssh_algorithms_SUITEecdh-sha2-nistp521end_per_group< >0.000499sOk +ssh_algorithms_SUITEkexend_per_group< >0.000001sOk +ssh_algorithms_SUITEcipherinit_per_group< >0.000020sOk==== cipher ==== +ssh_algorithms_SUITE3des-cbcinit_per_group< >0.002353sOk +58ssh_algorithms_SUITE3des-cbcsimple_connect< >0.005208sOk +59ssh_algorithms_SUITE3des-cbcsimple_exec< >0.006190sOk +60ssh_algorithms_SUITE3des-cbcsimple_sftp< >0.008847sOk +ssh_algorithms_SUITE3des-cbcend_per_group< >0.000875sOk +ssh_algorithms_SUITEAEAD_AES_128_GCMinit_per_group< >0.002171sOk +61ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_connect< >0.005173sOk +62ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_exec< >0.006266sOk +63ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_sftp< >0.006959sOk +ssh_algorithms_SUITEAEAD_AES_128_GCMend_per_group< >0.000479sOk +ssh_algorithms_SUITEAEAD_AES_256_GCMinit_per_group< >0.002363sOk +64ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_connect< >0.005120sOk +65ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_exec< >0.005987sOk +66ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_sftp< >0.006427sOk +ssh_algorithms_SUITEAEAD_AES_256_GCMend_per_group< >0.000477sOk +ssh_algorithms_SUITEaes128-cbcinit_per_group< >0.002206sOk +67ssh_algorithms_SUITEaes128-cbcsimple_connect< >0.004857sOk +68ssh_algorithms_SUITEaes128-cbcsimple_exec< >0.006453sOk +69ssh_algorithms_SUITEaes128-cbcsimple_sftp< >0.007084sOk +ssh_algorithms_SUITEaes128-cbcend_per_group< >0.000590sOk +ssh_algorithms_SUITEaes128-ctrinit_per_group< >0.002137sOk +70ssh_algorithms_SUITEaes128-ctrsimple_connect< >0.004707sOk +71ssh_algorithms_SUITEaes128-ctrsimple_exec< >0.005724sOk +72ssh_algorithms_SUITEaes128-ctrsimple_sftp< >0.006816sOk +73ssh_algorithms_SUITEaes128-ctrsshd_simple_exec< >0.118438sOk +ssh_algorithms_SUITEaes128-ctrend_per_group< >0.000473sOk +ssh_algorithms_SUITEaes128-gcm@openssh.cominit_per_group< >0.002534sOk +74ssh_algorithms_SUITEaes128-gcm@openssh.comsimple_connect< >0.004974sOk +75ssh_algorithms_SUITEaes128-gcm@openssh.comsimple_exec< >0.006018sOk +76ssh_algorithms_SUITEaes128-gcm@openssh.comsimple_sftp< >0.006756sOk +77ssh_algorithms_SUITEaes128-gcm@openssh.comsshd_simple_exec< >0.115361sOk +ssh_algorithms_SUITEaes128-gcm@openssh.comend_per_group< >0.000554sOk +ssh_algorithms_SUITEaes192-cbcinit_per_group< >0.002390sOk +78ssh_algorithms_SUITEaes192-cbcsimple_connect< >0.005043sOk +79ssh_algorithms_SUITEaes192-cbcsimple_exec< >0.006398sOk +80ssh_algorithms_SUITEaes192-cbcsimple_sftp< >0.006981sOk +ssh_algorithms_SUITEaes192-cbcend_per_group< >0.000480sOk +ssh_algorithms_SUITEaes192-ctrinit_per_group< >0.002147sOk +81ssh_algorithms_SUITEaes192-ctrsimple_connect< >0.005772sOk +82ssh_algorithms_SUITEaes192-ctrsimple_exec< >0.006356sOk +83ssh_algorithms_SUITEaes192-ctrsimple_sftp< >0.006517sOk +84ssh_algorithms_SUITEaes192-ctrsshd_simple_exec< >0.115981sOk +ssh_algorithms_SUITEaes192-ctrend_per_group< >0.000735sOk +ssh_algorithms_SUITEaes256-cbcinit_per_group< >0.002090sOk +85ssh_algorithms_SUITEaes256-cbcsimple_connect< >0.005148sOk +86ssh_algorithms_SUITEaes256-cbcsimple_exec< >0.006355sOk +87ssh_algorithms_SUITEaes256-cbcsimple_sftp< >0.007220sOk +ssh_algorithms_SUITEaes256-cbcend_per_group< >0.000745sOk +ssh_algorithms_SUITEaes256-ctrinit_per_group< >0.002090sOk +88ssh_algorithms_SUITEaes256-ctrsimple_connect< >0.005037sOk +89ssh_algorithms_SUITEaes256-ctrsimple_exec< >0.005963sOk +90ssh_algorithms_SUITEaes256-ctrsimple_sftp< >0.006786sOk +91ssh_algorithms_SUITEaes256-ctrsshd_simple_exec< >0.114671sOk +ssh_algorithms_SUITEaes256-ctrend_per_group< >0.000407sOk +ssh_algorithms_SUITEaes256-gcm@openssh.cominit_per_group< >0.002345sOk +92ssh_algorithms_SUITEaes256-gcm@openssh.comsimple_connect< >0.004914sOk +93ssh_algorithms_SUITEaes256-gcm@openssh.comsimple_exec< >0.006002sOk +94ssh_algorithms_SUITEaes256-gcm@openssh.comsimple_sftp< >0.006155sOk +95ssh_algorithms_SUITEaes256-gcm@openssh.comsshd_simple_exec< >0.114611sOk +ssh_algorithms_SUITEaes256-gcm@openssh.comend_per_group< >0.000663sOk +ssh_algorithms_SUITEchacha20-poly1305@openssh.cominit_per_group< >0.002171sOk +96ssh_algorithms_SUITEchacha20-poly1305@openssh.comsimple_connect< >0.004889sOk +97ssh_algorithms_SUITEchacha20-poly1305@openssh.comsimple_exec< >0.006521sOk +98ssh_algorithms_SUITEchacha20-poly1305@openssh.comsimple_sftp< >0.006869sOk +99ssh_algorithms_SUITEchacha20-poly1305@openssh.comsshd_simple_exec< >0.115698sOk +ssh_algorithms_SUITEchacha20-poly1305@openssh.comend_per_group< >0.000683sOk +ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMinit_per_group< >0.002334sOk +100ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMsimple_connect< >0.005140sOk +101ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMsimple_exec< >0.005972sOk +102ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMsimple_sftp< >0.008927sOk +ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_128_GCMend_per_group< >0.000405sOk +ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMinit_per_group< >0.002189sOk +103ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMsimple_connect< >0.004951sOk +104ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMsimple_exec< >0.005736sOk +105ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMsimple_sftp< >0.008591sOk +ssh_algorithms_SUITED: cipher 3des-cbc + AEAD_AES_256_GCMend_per_group< >0.000765sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcinit_per_group< >0.002171sOk +106ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcsimple_connect< >0.005273sOk +107ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcsimple_exec< >0.006097sOk +108ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcsimple_sftp< >0.008938sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes128-cbcend_per_group< >0.000562sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrinit_per_group< >0.002030sOk +109ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrsimple_connect< >0.004755sOk +110ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrsimple_exec< >0.006521sOk +111ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrsimple_sftp< >0.008780sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes128-ctrend_per_group< >0.000488sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.cominit_per_group< >0.001918sOk +112ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comsimple_connect< >0.004967sOk +113ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comsimple_exec< >0.005797sOk +114ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comsimple_sftp< >0.008333sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes128-gcm@openssh.comend_per_group< >0.000713sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcinit_per_group< >0.002027sOk +115ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcsimple_connect< >0.004841sOk +116ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcsimple_exec< >0.005940sOk +117ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcsimple_sftp< >0.008473sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes192-cbcend_per_group< >0.000480sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrinit_per_group< >0.002561sOk +118ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrsimple_connect< >0.005217sOk +119ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrsimple_exec< >0.006023sOk +120ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrsimple_sftp< >0.009196sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes192-ctrend_per_group< >0.000554sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcinit_per_group< >0.002393sOk +121ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcsimple_connect< >0.004687sOk +122ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcsimple_exec< >0.005839sOk +123ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcsimple_sftp< >0.008984sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes256-cbcend_per_group< >0.000404sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrinit_per_group< >0.002245sOk +124ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrsimple_connect< >0.004870sOk +125ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrsimple_exec< >0.005808sOk +126ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrsimple_sftp< >0.008480sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes256-ctrend_per_group< >0.000536sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.cominit_per_group< >0.002326sOk +127ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comsimple_connect< >0.004936sOk +128ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comsimple_exec< >0.005713sOk +129ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comsimple_sftp< >0.008343sOk +ssh_algorithms_SUITED: cipher 3des-cbc + aes256-gcm@openssh.comend_per_group< >0.000722sOk +ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002582sOk +130ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.004952sOk +131ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.006157sOk +132ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.008669sOk +ssh_algorithms_SUITED: cipher 3des-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000421sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcinit_per_group< >0.002467sOk +133ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcsimple_connect< >0.004788sOk +134ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcsimple_exec< >0.005737sOk +135ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcsimple_sftp< >0.006313sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + 3des-cbcend_per_group< >0.000442sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMinit_per_group< >0.002172sOk +136ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_connect< >0.004673sOk +137ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_exec< >0.005597sOk +138ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_sftp< >0.006808sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + AEAD_AES_256_GCMend_per_group< >0.000381sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcinit_per_group< >0.002262sOk +139ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcsimple_connect< >0.007259sOk +140ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcsimple_exec< >0.005817sOk +141ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcsimple_sftp< >0.007072sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-cbcend_per_group< >0.000555sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrinit_per_group< >0.002619sOk +142ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrsimple_connect< >0.004763sOk +143ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrsimple_exec< >0.006104sOk +144ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrsimple_sftp< >0.006799sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-ctrend_per_group< >0.000642sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.cominit_per_group< >0.002086sOk +145ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comsimple_connect< >0.004766sOk +146ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comsimple_exec< >0.005355sOk +147ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comsimple_sftp< >0.006539sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes128-gcm@openssh.comend_per_group< >0.000338sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcinit_per_group< >0.002422sOk +148ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcsimple_connect< >0.004814sOk +149ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcsimple_exec< >0.006690sOk +150ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcsimple_sftp< >0.006663sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-cbcend_per_group< >0.000585sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrinit_per_group< >0.002103sOk +151ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrsimple_connect< >0.004888sOk +152ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrsimple_exec< >0.006405sOk +153ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrsimple_sftp< >0.006758sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes192-ctrend_per_group< >0.000502sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcinit_per_group< >0.002878sOk +154ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcsimple_connect< >0.004855sOk +155ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcsimple_exec< >0.006247sOk +156ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcsimple_sftp< >0.007412sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-cbcend_per_group< >0.000549sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrinit_per_group< >0.002663sOk +157ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrsimple_connect< >0.004948sOk +158ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrsimple_exec< >0.005993sOk +159ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrsimple_sftp< >0.006802sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-ctrend_per_group< >0.000487sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.cominit_per_group< >0.002452sOk +160ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comsimple_connect< >0.004877sOk +161ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comsimple_exec< >0.005693sOk +162ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comsimple_sftp< >0.006514sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + aes256-gcm@openssh.comend_per_group< >0.000711sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.cominit_per_group< >0.002532sOk +163ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comsimple_connect< >0.004995sOk +164ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comsimple_exec< >0.006271sOk +165ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comsimple_sftp< >0.006513sOk +ssh_algorithms_SUITED: cipher AEAD_AES_128_GCM + chacha20-poly1305@openssh.comend_per_group< >0.000536sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcinit_per_group< >0.002525sOk +166ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcsimple_connect< >0.005131sOk +167ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcsimple_exec< >0.006230sOk +168ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcsimple_sftp< >0.006388sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + 3des-cbcend_per_group< >0.000408sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMinit_per_group< >0.002165sOk +169ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_connect< >0.004707sOk +170ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_exec< >0.005413sOk +171ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_sftp< >0.006396sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + AEAD_AES_128_GCMend_per_group< >0.000345sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcinit_per_group< >0.002611sOk +172ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcsimple_connect< >0.005286sOk +173ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcsimple_exec< >0.006505sOk +174ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcsimple_sftp< >0.006721sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-cbcend_per_group< >0.000500sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrinit_per_group< >0.002493sOk +175ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrsimple_connect< >0.004869sOk +176ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrsimple_exec< >0.006378sOk +177ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrsimple_sftp< >0.007061sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-ctrend_per_group< >0.000459sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.cominit_per_group< >0.002900sOk +178ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comsimple_connect< >0.004972sOk +179ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comsimple_exec< >0.005783sOk +180ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comsimple_sftp< >0.006769sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes128-gcm@openssh.comend_per_group< >0.000511sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcinit_per_group< >0.002017sOk +181ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcsimple_connect< >0.004663sOk +182ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcsimple_exec< >0.006147sOk +183ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcsimple_sftp< >0.007035sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-cbcend_per_group< >0.000489sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrinit_per_group< >0.002364sOk +184ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrsimple_connect< >0.005156sOk +185ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrsimple_exec< >0.006209sOk +186ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrsimple_sftp< >0.006490sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes192-ctrend_per_group< >0.000569sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcinit_per_group< >0.002748sOk +187ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcsimple_connect< >0.005249sOk +188ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcsimple_exec< >0.006400sOk +189ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcsimple_sftp< >0.006422sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-cbcend_per_group< >0.000676sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrinit_per_group< >0.002165sOk +190ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrsimple_connect< >0.004815sOk +191ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrsimple_exec< >0.006269sOk +192ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrsimple_sftp< >0.006895sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-ctrend_per_group< >0.000767sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.cominit_per_group< >0.002036sOk +193ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comsimple_connect< >0.004627sOk +194ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comsimple_exec< >0.005982sOk +195ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comsimple_sftp< >0.006244sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + aes256-gcm@openssh.comend_per_group< >0.000482sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.cominit_per_group< >0.002392sOk +196ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comsimple_connect< >0.005272sOk +197ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comsimple_exec< >0.006213sOk +198ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comsimple_sftp< >0.006666sOk +ssh_algorithms_SUITED: cipher AEAD_AES_256_GCM + chacha20-poly1305@openssh.comend_per_group< >0.000433sOk +ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcinit_per_group< >0.002474sOk +199ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcsimple_connect< >0.005168sOk +200ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcsimple_exec< >0.006568sOk +201ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcsimple_sftp< >0.006771sOk +ssh_algorithms_SUITED: cipher aes128-cbc + 3des-cbcend_per_group< >0.000805sOk +ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMinit_per_group< >0.002881sOk +202ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMsimple_connect< >0.004784sOk +203ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMsimple_exec< >0.006541sOk +204ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMsimple_sftp< >0.007555sOk +ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_128_GCMend_per_group< >0.000419sOk +ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMinit_per_group< >0.002126sOk +205ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMsimple_connect< >0.004785sOk +206ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMsimple_exec< >0.006561sOk +207ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMsimple_sftp< >0.006661sOk +ssh_algorithms_SUITED: cipher aes128-cbc + AEAD_AES_256_GCMend_per_group< >0.000347sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrinit_per_group< >0.002267sOk +208ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrsimple_connect< >0.004996sOk +209ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrsimple_exec< >0.005996sOk +210ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrsimple_sftp< >0.007223sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes128-ctrend_per_group< >0.000575sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.cominit_per_group< >0.002758sOk +211ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comsimple_connect< >0.005374sOk +212ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comsimple_exec< >0.006069sOk +213ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comsimple_sftp< >0.006876sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes128-gcm@openssh.comend_per_group< >0.000515sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcinit_per_group< >0.002433sOk +214ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcsimple_connect< >0.004879sOk +215ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcsimple_exec< >0.006218sOk +216ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcsimple_sftp< >0.006833sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes192-cbcend_per_group< >0.000673sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrinit_per_group< >0.002264sOk +217ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrsimple_connect< >0.005121sOk +218ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrsimple_exec< >0.005879sOk +219ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrsimple_sftp< >0.006628sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes192-ctrend_per_group< >0.000364sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcinit_per_group< >0.002030sOk +220ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcsimple_connect< >0.004868sOk +221ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcsimple_exec< >0.006068sOk +222ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcsimple_sftp< >0.006793sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes256-cbcend_per_group< >0.000500sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrinit_per_group< >0.002422sOk +223ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrsimple_connect< >0.004976sOk +224ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrsimple_exec< >0.006213sOk +225ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrsimple_sftp< >0.006814sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes256-ctrend_per_group< >0.000831sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.cominit_per_group< >0.002328sOk +226ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comsimple_connect< >0.005055sOk +227ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comsimple_exec< >0.006917sOk +228ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comsimple_sftp< >0.007286sOk +ssh_algorithms_SUITED: cipher aes128-cbc + aes256-gcm@openssh.comend_per_group< >0.000521sOk +ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002500sOk +229ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.005092sOk +230ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.006298sOk +231ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.007127sOk +ssh_algorithms_SUITED: cipher aes128-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000626sOk +ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcinit_per_group< >0.002546sOk +232ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcsimple_connect< >0.005253sOk +233ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcsimple_exec< >0.006323sOk +234ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcsimple_sftp< >0.007149sOk +ssh_algorithms_SUITED: cipher aes128-ctr + 3des-cbcend_per_group< >0.000605sOk +ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMinit_per_group< >0.002118sOk +235ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMsimple_connect< >0.004759sOk +236ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMsimple_exec< >0.006355sOk +237ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMsimple_sftp< >0.007030sOk +ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_128_GCMend_per_group< >0.000764sOk +ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMinit_per_group< >0.002579sOk +238ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMsimple_connect< >0.005158sOk +239ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMsimple_exec< >0.007126sOk +240ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMsimple_sftp< >0.007860sOk +ssh_algorithms_SUITED: cipher aes128-ctr + AEAD_AES_256_GCMend_per_group< >0.000788sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcinit_per_group< >0.002270sOk +241ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcsimple_connect< >0.005152sOk +242ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcsimple_exec< >0.006140sOk +243ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcsimple_sftp< >0.006998sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes128-cbcend_per_group< >0.000531sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.cominit_per_group< >0.002004sOk +244ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsimple_connect< >0.005355sOk +245ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsimple_exec< >0.006356sOk +246ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsimple_sftp< >0.007224sOk +247ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comsshd_simple_exec< >0.117298sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes128-gcm@openssh.comend_per_group< >0.000921sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcinit_per_group< >0.002378sOk +248ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcsimple_connect< >0.005380sOk +249ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcsimple_exec< >0.006444sOk +250ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcsimple_sftp< >0.007694sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes192-cbcend_per_group< >0.000521sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrinit_per_group< >0.002150sOk +251ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsimple_connect< >0.005301sOk +252ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsimple_exec< >0.006405sOk +253ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsimple_sftp< >0.007112sOk +254ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrsshd_simple_exec< >0.117582sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes192-ctrend_per_group< >0.000763sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcinit_per_group< >0.002152sOk +255ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcsimple_connect< >0.005415sOk +256ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcsimple_exec< >0.006430sOk +257ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcsimple_sftp< >0.006738sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes256-cbcend_per_group< >0.000401sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrinit_per_group< >0.002156sOk +258ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsimple_connect< >0.005390sOk +259ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsimple_exec< >0.006088sOk +260ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsimple_sftp< >0.007046sOk +261ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrsshd_simple_exec< >0.116386sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes256-ctrend_per_group< >0.000508sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.cominit_per_group< >0.002820sOk +262ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsimple_connect< >0.005296sOk +263ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsimple_exec< >0.006347sOk +264ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsimple_sftp< >0.007118sOk +265ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comsshd_simple_exec< >0.116013sOk +ssh_algorithms_SUITED: cipher aes128-ctr + aes256-gcm@openssh.comend_per_group< >0.000481sOk +ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.cominit_per_group< >0.002369sOk +266ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsimple_connect< >0.005090sOk +267ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsimple_exec< >0.005719sOk +268ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsimple_sftp< >0.006798sOk +269ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comsshd_simple_exec< >0.115276sOk +ssh_algorithms_SUITED: cipher aes128-ctr + chacha20-poly1305@openssh.comend_per_group< >0.000517sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcinit_per_group< >0.002205sOk +270ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcsimple_connect< >0.004873sOk +271ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcsimple_exec< >0.005901sOk +272ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcsimple_sftp< >0.006683sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + 3des-cbcend_per_group< >0.000422sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002893sOk +273ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.005058sOk +274ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006075sOk +275ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006239sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000373sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002490sOk +276ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004998sOk +277ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.005931sOk +278ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006209sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000403sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcinit_per_group< >0.002325sOk +279ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcsimple_connect< >0.005283sOk +280ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcsimple_exec< >0.005596sOk +281ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcsimple_sftp< >0.006457sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-cbcend_per_group< >0.000578sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrinit_per_group< >0.002430sOk +282ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsimple_connect< >0.005008sOk +283ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsimple_exec< >0.006025sOk +284ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsimple_sftp< >0.006839sOk +285ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrsshd_simple_exec< >0.115179sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes128-ctrend_per_group< >0.000384sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcinit_per_group< >0.002520sOk +286ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcsimple_connect< >0.004837sOk +287ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcsimple_exec< >0.006064sOk +288ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcsimple_sftp< >0.006657sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-cbcend_per_group< >0.000611sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrinit_per_group< >0.002662sOk +289ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsimple_connect< >0.004938sOk +290ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsimple_exec< >0.006249sOk +291ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsimple_sftp< >0.006537sOk +292ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrsshd_simple_exec< >0.116346sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes192-ctrend_per_group< >0.000729sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcinit_per_group< >0.002402sOk +293ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcsimple_connect< >0.004985sOk +294ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcsimple_exec< >0.006261sOk +295ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcsimple_sftp< >0.006694sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-cbcend_per_group< >0.000747sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrinit_per_group< >0.002785sOk +296ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsimple_connect< >0.005353sOk +297ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsimple_exec< >0.006365sOk +298ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsimple_sftp< >0.006642sOk +299ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrsshd_simple_exec< >0.116306sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-ctrend_per_group< >0.000727sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.cominit_per_group< >0.002789sOk +300ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsimple_connect< >0.005244sOk +301ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsimple_exec< >0.005986sOk +302ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsimple_sftp< >0.006490sOk +303ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comsshd_simple_exec< >0.117008sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + aes256-gcm@openssh.comend_per_group< >0.000543sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.cominit_per_group< >0.002619sOk +304ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_connect< >0.005120sOk +305ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_exec< >0.006464sOk +306ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_sftp< >0.006848sOk +307ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comsshd_simple_exec< >0.117215sOk +ssh_algorithms_SUITED: cipher aes128-gcm@openssh.com + chacha20-poly1305@openssh.comend_per_group< >0.000522sOk +ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcinit_per_group< >0.002158sOk +308ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcsimple_connect< >0.005522sOk +309ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcsimple_exec< >0.006503sOk +310ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcsimple_sftp< >0.007298sOk +ssh_algorithms_SUITED: cipher aes192-cbc + 3des-cbcend_per_group< >0.000699sOk +ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMinit_per_group< >0.002187sOk +311ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMsimple_connect< >0.005407sOk +312ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMsimple_exec< >0.006453sOk +313ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMsimple_sftp< >0.007230sOk +ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_128_GCMend_per_group< >0.000523sOk +ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMinit_per_group< >0.002294sOk +314ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMsimple_connect< >0.005383sOk +315ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMsimple_exec< >0.006185sOk +316ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMsimple_sftp< >0.007053sOk +ssh_algorithms_SUITED: cipher aes192-cbc + AEAD_AES_256_GCMend_per_group< >0.000652sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcinit_per_group< >0.002233sOk +317ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcsimple_connect< >0.005331sOk +318ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcsimple_exec< >0.006437sOk +319ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcsimple_sftp< >0.006953sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes128-cbcend_per_group< >0.000581sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrinit_per_group< >0.001964sOk +320ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrsimple_connect< >0.004886sOk +321ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrsimple_exec< >0.006138sOk +322ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrsimple_sftp< >0.007293sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes128-ctrend_per_group< >0.000492sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.cominit_per_group< >0.002216sOk +323ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comsimple_connect< >0.004918sOk +324ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comsimple_exec< >0.006377sOk +325ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comsimple_sftp< >0.007446sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes128-gcm@openssh.comend_per_group< >0.000610sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrinit_per_group< >0.002400sOk +326ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrsimple_connect< >0.005062sOk +327ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrsimple_exec< >0.006875sOk +328ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrsimple_sftp< >0.006951sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes192-ctrend_per_group< >0.000619sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcinit_per_group< >0.002687sOk +329ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcsimple_connect< >0.005138sOk +330ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcsimple_exec< >0.006493sOk +331ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcsimple_sftp< >0.007360sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes256-cbcend_per_group< >0.000695sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrinit_per_group< >0.001935sOk +332ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrsimple_connect< >0.005286sOk +333ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrsimple_exec< >0.006374sOk +334ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrsimple_sftp< >0.007429sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes256-ctrend_per_group< >0.000801sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.cominit_per_group< >0.002890sOk +335ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comsimple_connect< >0.005433sOk +336ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comsimple_exec< >0.005797sOk +337ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comsimple_sftp< >0.006817sOk +ssh_algorithms_SUITED: cipher aes192-cbc + aes256-gcm@openssh.comend_per_group< >0.000761sOk +ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002958sOk +338ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.005245sOk +339ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.006247sOk +340ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.007630sOk +ssh_algorithms_SUITED: cipher aes192-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000493sOk +ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcinit_per_group< >0.002516sOk +341ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcsimple_connect< >0.005098sOk +342ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcsimple_exec< >0.006519sOk +343ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcsimple_sftp< >0.007247sOk +ssh_algorithms_SUITED: cipher aes192-ctr + 3des-cbcend_per_group< >0.000598sOk +ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMinit_per_group< >0.002397sOk +344ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMsimple_connect< >0.005371sOk +345ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMsimple_exec< >0.006371sOk +346ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMsimple_sftp< >0.007139sOk +ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_128_GCMend_per_group< >0.000636sOk +ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMinit_per_group< >0.002272sOk +347ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMsimple_connect< >0.004966sOk +348ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMsimple_exec< >0.005880sOk +349ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMsimple_sftp< >0.007182sOk +ssh_algorithms_SUITED: cipher aes192-ctr + AEAD_AES_256_GCMend_per_group< >0.000529sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcinit_per_group< >0.002146sOk +350ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcsimple_connect< >0.005050sOk +351ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcsimple_exec< >0.005870sOk +352ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcsimple_sftp< >0.007061sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes128-cbcend_per_group< >0.000460sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrinit_per_group< >0.002863sOk +353ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsimple_connect< >0.005353sOk +354ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsimple_exec< >0.006395sOk +355ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsimple_sftp< >0.007190sOk +356ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrsshd_simple_exec< >0.116174sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes128-ctrend_per_group< >0.000487sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.cominit_per_group< >0.002316sOk +357ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsimple_connect< >0.005022sOk +358ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsimple_exec< >0.006144sOk +359ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsimple_sftp< >0.007218sOk +360ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comsshd_simple_exec< >0.115943sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes128-gcm@openssh.comend_per_group< >0.000600sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcinit_per_group< >0.002854sOk +361ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcsimple_connect< >0.004951sOk +362ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcsimple_exec< >0.006390sOk +363ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcsimple_sftp< >0.006811sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes192-cbcend_per_group< >0.000461sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcinit_per_group< >0.002344sOk +364ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcsimple_connect< >0.004986sOk +365ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcsimple_exec< >0.005899sOk +366ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcsimple_sftp< >0.007329sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes256-cbcend_per_group< >0.000578sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrinit_per_group< >0.002314sOk +367ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsimple_connect< >0.005105sOk +368ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsimple_exec< >0.006084sOk +369ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsimple_sftp< >0.006753sOk +370ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrsshd_simple_exec< >0.115008sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes256-ctrend_per_group< >0.000476sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.cominit_per_group< >0.002843sOk +371ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsimple_connect< >0.005103sOk +372ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsimple_exec< >0.005683sOk +373ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsimple_sftp< >0.007053sOk +374ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comsshd_simple_exec< >0.115940sOk +ssh_algorithms_SUITED: cipher aes192-ctr + aes256-gcm@openssh.comend_per_group< >0.000470sOk +ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.cominit_per_group< >0.002191sOk +375ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsimple_connect< >0.005304sOk +376ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsimple_exec< >0.006113sOk +377ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsimple_sftp< >0.006925sOk +378ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comsshd_simple_exec< >0.114697sOk +ssh_algorithms_SUITED: cipher aes192-ctr + chacha20-poly1305@openssh.comend_per_group< >0.000465sOk +ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcinit_per_group< >0.002315sOk +379ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcsimple_connect< >0.004871sOk +380ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcsimple_exec< >0.006267sOk +381ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcsimple_sftp< >0.007656sOk +ssh_algorithms_SUITED: cipher aes256-cbc + 3des-cbcend_per_group< >0.000412sOk +ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMinit_per_group< >0.002357sOk +382ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMsimple_connect< >0.005115sOk +383ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMsimple_exec< >0.005862sOk +384ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMsimple_sftp< >0.007022sOk +ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_128_GCMend_per_group< >0.000717sOk +ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMinit_per_group< >0.002520sOk +385ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMsimple_connect< >0.005439sOk +386ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMsimple_exec< >0.005933sOk +387ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMsimple_sftp< >0.007049sOk +ssh_algorithms_SUITED: cipher aes256-cbc + AEAD_AES_256_GCMend_per_group< >0.000374sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcinit_per_group< >0.002331sOk +388ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcsimple_connect< >0.005643sOk +389ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcsimple_exec< >0.005709sOk +390ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcsimple_sftp< >0.006714sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes128-cbcend_per_group< >0.000364sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrinit_per_group< >0.002170sOk +391ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrsimple_connect< >0.004921sOk +392ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrsimple_exec< >0.005769sOk +393ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrsimple_sftp< >0.006981sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes128-ctrend_per_group< >0.000532sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.cominit_per_group< >0.002732sOk +394ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comsimple_connect< >0.004979sOk +395ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comsimple_exec< >0.006242sOk +396ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comsimple_sftp< >0.007285sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes128-gcm@openssh.comend_per_group< >0.000771sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcinit_per_group< >0.002290sOk +397ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcsimple_connect< >0.005056sOk +398ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcsimple_exec< >0.006366sOk +399ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcsimple_sftp< >0.007173sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes192-cbcend_per_group< >0.000445sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrinit_per_group< >0.001967sOk +400ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrsimple_connect< >0.004818sOk +401ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrsimple_exec< >0.006300sOk +402ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrsimple_sftp< >0.007577sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes192-ctrend_per_group< >0.000480sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrinit_per_group< >0.002665sOk +403ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrsimple_connect< >0.005153sOk +404ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrsimple_exec< >0.006713sOk +405ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrsimple_sftp< >0.007554sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes256-ctrend_per_group< >0.000551sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.cominit_per_group< >0.002273sOk +406ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comsimple_connect< >0.005050sOk +407ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comsimple_exec< >0.006322sOk +408ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comsimple_sftp< >0.006986sOk +ssh_algorithms_SUITED: cipher aes256-cbc + aes256-gcm@openssh.comend_per_group< >0.000549sOk +ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.cominit_per_group< >0.002298sOk +409ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comsimple_connect< >0.005255sOk +410ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comsimple_exec< >0.006080sOk +411ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comsimple_sftp< >0.007332sOk +ssh_algorithms_SUITED: cipher aes256-cbc + chacha20-poly1305@openssh.comend_per_group< >0.000655sOk +ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcinit_per_group< >0.002620sOk +412ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcsimple_connect< >0.005406sOk +413ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcsimple_exec< >0.006167sOk +414ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcsimple_sftp< >0.007307sOk +ssh_algorithms_SUITED: cipher aes256-ctr + 3des-cbcend_per_group< >0.000527sOk +ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMinit_per_group< >0.002422sOk +415ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMsimple_connect< >0.005059sOk +416ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMsimple_exec< >0.006154sOk +417ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMsimple_sftp< >0.006884sOk +ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_128_GCMend_per_group< >0.000410sOk +ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMinit_per_group< >0.002923sOk +418ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMsimple_connect< >0.004974sOk +419ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMsimple_exec< >0.006200sOk +420ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMsimple_sftp< >0.006731sOk +ssh_algorithms_SUITED: cipher aes256-ctr + AEAD_AES_256_GCMend_per_group< >0.000460sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcinit_per_group< >0.002636sOk +421ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcsimple_connect< >0.005173sOk +422ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcsimple_exec< >0.006303sOk +423ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcsimple_sftp< >0.007036sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes128-cbcend_per_group< >0.000397sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrinit_per_group< >0.002248sOk +424ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsimple_connect< >0.004823sOk +425ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsimple_exec< >0.005870sOk +426ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsimple_sftp< >0.007107sOk +427ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrsshd_simple_exec< >0.116006sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes128-ctrend_per_group< >0.000666sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.cominit_per_group< >0.002605sOk +428ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsimple_connect< >0.005338sOk +429ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsimple_exec< >0.006185sOk +430ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsimple_sftp< >0.007192sOk +431ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comsshd_simple_exec< >0.116466sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes128-gcm@openssh.comend_per_group< >0.000439sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcinit_per_group< >0.002256sOk +432ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcsimple_connect< >0.005031sOk +433ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcsimple_exec< >0.006344sOk +434ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcsimple_sftp< >0.006860sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes192-cbcend_per_group< >0.000388sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrinit_per_group< >0.001882sOk +435ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsimple_connect< >0.005136sOk +436ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsimple_exec< >0.006261sOk +437ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsimple_sftp< >0.007284sOk +438ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrsshd_simple_exec< >0.116235sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes192-ctrend_per_group< >0.000397sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcinit_per_group< >0.002158sOk +439ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcsimple_connect< >0.004869sOk +440ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcsimple_exec< >0.006547sOk +441ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcsimple_sftp< >0.007150sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes256-cbcend_per_group< >0.000532sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.cominit_per_group< >0.001999sOk +442ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsimple_connect< >0.004787sOk +443ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsimple_exec< >0.005938sOk +444ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsimple_sftp< >0.006791sOk +445ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comsshd_simple_exec< >0.115611sOk +ssh_algorithms_SUITED: cipher aes256-ctr + aes256-gcm@openssh.comend_per_group< >0.000519sOk +ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.cominit_per_group< >0.002307sOk +446ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsimple_connect< >0.005350sOk +447ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsimple_exec< >0.006369sOk +448ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsimple_sftp< >0.007128sOk +449ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comsshd_simple_exec< >0.115646sOk +ssh_algorithms_SUITED: cipher aes256-ctr + chacha20-poly1305@openssh.comend_per_group< >0.000529sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcinit_per_group< >0.002481sOk +450ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcsimple_connect< >0.005093sOk +451ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcsimple_exec< >0.006295sOk +452ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcsimple_sftp< >0.006899sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + 3des-cbcend_per_group< >0.000344sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002235sOk +453ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.004920sOk +454ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006051sOk +455ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006658sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000492sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002989sOk +456ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004845sOk +457ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.006075sOk +458ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006774sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000326sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcinit_per_group< >0.002474sOk +459ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcsimple_connect< >0.004965sOk +460ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcsimple_exec< >0.006253sOk +461ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcsimple_sftp< >0.007186sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-cbcend_per_group< >0.000511sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrinit_per_group< >0.002948sOk +462ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsimple_connect< >0.005264sOk +463ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsimple_exec< >0.006745sOk +464ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsimple_sftp< >0.006823sOk +465ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrsshd_simple_exec< >0.116234sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-ctrend_per_group< >0.000416sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.cominit_per_group< >0.002700sOk +466ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsimple_connect< >0.004920sOk +467ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsimple_exec< >0.006001sOk +468ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsimple_sftp< >0.006810sOk +469ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comsshd_simple_exec< >0.116001sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes128-gcm@openssh.comend_per_group< >0.000303sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcinit_per_group< >0.002733sOk +470ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcsimple_connect< >0.005109sOk +471ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcsimple_exec< >0.006103sOk +472ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcsimple_sftp< >0.006596sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-cbcend_per_group< >0.000448sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrinit_per_group< >0.002030sOk +473ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsimple_connect< >0.005179sOk +474ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsimple_exec< >0.005986sOk +475ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsimple_sftp< >0.007426sOk +476ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrsshd_simple_exec< >0.115365sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes192-ctrend_per_group< >0.000440sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcinit_per_group< >0.002891sOk +477ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcsimple_connect< >0.005015sOk +478ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcsimple_exec< >0.006212sOk +479ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcsimple_sftp< >0.006653sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-cbcend_per_group< >0.000346sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrinit_per_group< >0.002852sOk +480ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsimple_connect< >0.005067sOk +481ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsimple_exec< >0.006018sOk +482ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsimple_sftp< >0.007269sOk +483ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrsshd_simple_exec< >0.117165sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + aes256-ctrend_per_group< >0.000551sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.cominit_per_group< >0.002800sOk +484ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_connect< >0.005565sOk +485ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_exec< >0.006214sOk +486ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsimple_sftp< >0.006882sOk +487ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comsshd_simple_exec< >0.117200sOk +ssh_algorithms_SUITED: cipher aes256-gcm@openssh.com + chacha20-poly1305@openssh.comend_per_group< >0.000431sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcinit_per_group< >0.002768sOk +488ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcsimple_connect< >0.005362sOk +489ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcsimple_exec< >0.006661sOk +490ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcsimple_sftp< >0.007291sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + 3des-cbcend_per_group< >0.000929sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.003063sOk +491ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.005491sOk +492ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006534sOk +493ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006995sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000448sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002353sOk +494ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.004917sOk +495ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.006394sOk +496ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006916sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000423sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcinit_per_group< >0.002452sOk +497ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcsimple_connect< >0.005203sOk +498ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcsimple_exec< >0.006283sOk +499ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcsimple_sftp< >0.007237sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-cbcend_per_group< >0.000554sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrinit_per_group< >0.002400sOk +500ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsimple_connect< >0.005253sOk +501ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsimple_exec< >0.006275sOk +502ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsimple_sftp< >0.007277sOk +503ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrsshd_simple_exec< >0.115694sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-ctrend_per_group< >0.000372sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.cominit_per_group< >0.002124sOk +504ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsimple_connect< >0.004939sOk +505ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsimple_exec< >0.006219sOk +506ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsimple_sftp< >0.007119sOk +507ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comsshd_simple_exec< >0.115653sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes128-gcm@openssh.comend_per_group< >0.000615sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcinit_per_group< >0.002197sOk +508ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcsimple_connect< >0.005094sOk +509ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcsimple_exec< >0.006479sOk +510ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcsimple_sftp< >0.007200sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-cbcend_per_group< >0.000587sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrinit_per_group< >0.002548sOk +511ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsimple_connect< >0.005037sOk +512ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsimple_exec< >0.006201sOk +513ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsimple_sftp< >0.007290sOk +514ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrsshd_simple_exec< >0.114313sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes192-ctrend_per_group< >0.000835sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcinit_per_group< >0.002715sOk +515ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcsimple_connect< >0.004923sOk +516ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcsimple_exec< >0.005990sOk +517ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcsimple_sftp< >0.006859sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-cbcend_per_group< >0.000493sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrinit_per_group< >0.002497sOk +518ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsimple_connect< >0.005399sOk +519ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsimple_exec< >0.005931sOk +520ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsimple_sftp< >0.006928sOk +521ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrsshd_simple_exec< >0.114304sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-ctrend_per_group< >0.000485sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.cominit_per_group< >0.002243sOk +522ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsimple_connect< >0.004791sOk +523ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsimple_exec< >0.006067sOk +524ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsimple_sftp< >0.006564sOk +525ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comsshd_simple_exec< >0.114068sOk +ssh_algorithms_SUITED: cipher chacha20-poly1305@openssh.com + aes256-gcm@openssh.comend_per_group< >0.000450sOk +ssh_algorithms_SUITEcipherend_per_group< >0.000000sOk +ssh_algorithms_SUITEmacinit_per_group< >0.000013sOk==== mac ==== +ssh_algorithms_SUITEAEAD_AES_128_GCMinit_per_group< >0.002334sOk +526ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_connect< >0.004894sOk +527ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_exec< >0.006062sOk +528ssh_algorithms_SUITEAEAD_AES_128_GCMsimple_sftp< >0.006693sOk +ssh_algorithms_SUITEAEAD_AES_128_GCMend_per_group< >0.000484sOk +ssh_algorithms_SUITEAEAD_AES_256_GCMinit_per_group< >0.002269sOk +529ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_connect< >0.005143sOk +530ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_exec< >0.006131sOk +531ssh_algorithms_SUITEAEAD_AES_256_GCMsimple_sftp< >0.006973sOk +ssh_algorithms_SUITEAEAD_AES_256_GCMend_per_group< >0.000627sOk +ssh_algorithms_SUITEhmac-sha1init_per_group< >0.002055sOk +532ssh_algorithms_SUITEhmac-sha1simple_connect< >0.005315sOk +533ssh_algorithms_SUITEhmac-sha1simple_exec< >0.005911sOk +534ssh_algorithms_SUITEhmac-sha1simple_sftp< >0.007272sOk +535ssh_algorithms_SUITEhmac-sha1sshd_simple_exec< >0.114930sOk +ssh_algorithms_SUITEhmac-sha1end_per_group< >0.000507sOk +ssh_algorithms_SUITEhmac-sha1-96init_per_group< >0.002222sOk +536ssh_algorithms_SUITEhmac-sha1-96simple_connect< >0.004961sOk +537ssh_algorithms_SUITEhmac-sha1-96simple_exec< >0.005641sOk +538ssh_algorithms_SUITEhmac-sha1-96simple_sftp< >0.006668sOk +ssh_algorithms_SUITEhmac-sha1-96end_per_group< >0.000519sOk +ssh_algorithms_SUITEhmac-sha1-etm@openssh.cominit_per_group< >0.002138sOk +539ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsimple_connect< >0.005444sOk +540ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsimple_exec< >0.005890sOk +541ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsimple_sftp< >0.006444sOk +542ssh_algorithms_SUITEhmac-sha1-etm@openssh.comsshd_simple_exec< >0.115906sOk +ssh_algorithms_SUITEhmac-sha1-etm@openssh.comend_per_group< >0.000584sOk +ssh_algorithms_SUITEhmac-sha2-256init_per_group< >0.002202sOk +543ssh_algorithms_SUITEhmac-sha2-256simple_connect< >0.005239sOk +544ssh_algorithms_SUITEhmac-sha2-256simple_exec< >0.006163sOk +545ssh_algorithms_SUITEhmac-sha2-256simple_sftp< >0.006738sOk +546ssh_algorithms_SUITEhmac-sha2-256sshd_simple_exec< >0.114182sOk +ssh_algorithms_SUITEhmac-sha2-256end_per_group< >0.000429sOk +ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.cominit_per_group< >0.001907sOk +547ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsimple_connect< >0.005248sOk +548ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsimple_exec< >0.006246sOk +549ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsimple_sftp< >0.006567sOk +550ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.116602sOk +ssh_algorithms_SUITEhmac-sha2-256-etm@openssh.comend_per_group< >0.000381sOk +ssh_algorithms_SUITEhmac-sha2-512init_per_group< >0.002029sOk +551ssh_algorithms_SUITEhmac-sha2-512simple_connect< >0.005066sOk +552ssh_algorithms_SUITEhmac-sha2-512simple_exec< >0.005677sOk +553ssh_algorithms_SUITEhmac-sha2-512simple_sftp< >0.006718sOk +554ssh_algorithms_SUITEhmac-sha2-512sshd_simple_exec< >0.114728sOk +ssh_algorithms_SUITEhmac-sha2-512end_per_group< >0.000660sOk +ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.cominit_per_group< >0.002275sOk +555ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsimple_connect< >0.005284sOk +556ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsimple_exec< >0.005695sOk +557ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsimple_sftp< >0.006367sOk +558ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.114928sOk +ssh_algorithms_SUITEhmac-sha2-512-etm@openssh.comend_per_group< >0.000570sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMinit_per_group< >0.002198sOk +559ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_connect< >0.005690sOk +560ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_exec< >0.006062sOk +561ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMsimple_sftp< >0.006291sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + AEAD_AES_256_GCMend_per_group< >0.000374sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1init_per_group< >0.002737sOk +562ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1simple_connect< >0.005319sOk +563ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1simple_exec< >0.005912sOk +564ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1simple_sftp< >0.006233sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1end_per_group< >0.000376sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96init_per_group< >0.002340sOk +565ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96simple_connect< >0.004847sOk +566ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96simple_exec< >0.005902sOk +567ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96simple_sftp< >0.006741sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-96end_per_group< >0.000329sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.cominit_per_group< >0.002294sOk +568ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comsimple_connect< >0.004925sOk +569ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comsimple_exec< >0.005632sOk +570ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comsimple_sftp< >0.006345sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha1-etm@openssh.comend_per_group< >0.000431sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256init_per_group< >0.002203sOk +571ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256simple_connect< >0.004961sOk +572ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256simple_exec< >0.006157sOk +573ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256simple_sftp< >0.006682sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256end_per_group< >0.000458sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002235sOk +574ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005685sOk +575ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006459sOk +576ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.007051sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-256-etm@openssh.comend_per_group< >0.000465sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512init_per_group< >0.002289sOk +577ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512simple_connect< >0.004996sOk +578ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512simple_exec< >0.005899sOk +579ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512simple_sftp< >0.006905sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512end_per_group< >0.000380sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002382sOk +580ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005282sOk +581ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006168sOk +582ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006737sOk +ssh_algorithms_SUITED: mac AEAD_AES_128_GCM + hmac-sha2-512-etm@openssh.comend_per_group< >0.000435sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMinit_per_group< >0.002187sOk +583ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_connect< >0.004846sOk +584ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_exec< >0.006364sOk +585ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMsimple_sftp< >0.006998sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + AEAD_AES_128_GCMend_per_group< >0.000617sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1init_per_group< >0.002718sOk +586ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1simple_connect< >0.004972sOk +587ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1simple_exec< >0.005796sOk +588ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1simple_sftp< >0.007173sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1end_per_group< >0.000316sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96init_per_group< >0.002690sOk +589ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96simple_connect< >0.005067sOk +590ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96simple_exec< >0.005675sOk +591ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96simple_sftp< >0.006391sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-96end_per_group< >0.000464sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.cominit_per_group< >0.002087sOk +592ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comsimple_connect< >0.005089sOk +593ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comsimple_exec< >0.006022sOk +594ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comsimple_sftp< >0.006317sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha1-etm@openssh.comend_per_group< >0.000421sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256init_per_group< >0.002537sOk +595ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256simple_connect< >0.005070sOk +596ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256simple_exec< >0.005916sOk +597ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256simple_sftp< >0.006480sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256end_per_group< >0.000449sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002211sOk +598ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comsimple_connect< >0.004976sOk +599ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006059sOk +600ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006733sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-256-etm@openssh.comend_per_group< >0.000316sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512init_per_group< >0.002255sOk +601ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512simple_connect< >0.005007sOk +602ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512simple_exec< >0.006345sOk +603ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512simple_sftp< >0.006944sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512end_per_group< >0.000442sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002659sOk +604ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005058sOk +605ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006210sOk +606ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006823sOk +ssh_algorithms_SUITED: mac AEAD_AES_256_GCM + hmac-sha2-512-etm@openssh.comend_per_group< >0.000405sOk +ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMinit_per_group< >0.002149sOk +607ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMsimple_connect< >0.005033sOk +608ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMsimple_exec< >0.006488sOk +609ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMsimple_sftp< >0.006788sOk +ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_128_GCMend_per_group< >0.000598sOk +ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMinit_per_group< >0.002350sOk +610ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMsimple_connect< >0.005356sOk +611ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMsimple_exec< >0.006094sOk +612ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMsimple_sftp< >0.006511sOk +ssh_algorithms_SUITED: mac hmac-sha1 + AEAD_AES_256_GCMend_per_group< >0.000495sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96init_per_group< >0.002723sOk +613ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96simple_connect< >0.004970sOk +614ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96simple_exec< >0.006431sOk +615ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96simple_sftp< >0.007185sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-96end_per_group< >0.000526sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.cominit_per_group< >0.002789sOk +616ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsimple_connect< >0.005068sOk +617ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsimple_exec< >0.005861sOk +618ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsimple_sftp< >0.006761sOk +619ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.114457sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha1-etm@openssh.comend_per_group< >0.000505sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256init_per_group< >0.002254sOk +620ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256simple_connect< >0.005317sOk +621ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256simple_exec< >0.006019sOk +622ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256simple_sftp< >0.006678sOk +623ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256sshd_simple_exec< >0.114678sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256end_per_group< >0.000462sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002314sOk +624ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005172sOk +625ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006194sOk +626ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006398sOk +627ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.114466sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000439sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512init_per_group< >0.002529sOk +628ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512simple_connect< >0.005292sOk +629ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512simple_exec< >0.005862sOk +630ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512simple_sftp< >0.006654sOk +631ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512sshd_simple_exec< >0.115127sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512end_per_group< >0.000625sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002521sOk +632ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005201sOk +633ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.005665sOk +634ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006551sOk +635ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.114903sOk +ssh_algorithms_SUITED: mac hmac-sha1 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000364sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMinit_per_group< >0.002286sOk +636ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMsimple_connect< >0.005071sOk +637ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMsimple_exec< >0.006021sOk +638ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMsimple_sftp< >0.006851sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_128_GCMend_per_group< >0.000455sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMinit_per_group< >0.002464sOk +639ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMsimple_connect< >0.005012sOk +640ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMsimple_exec< >0.006120sOk +641ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMsimple_sftp< >0.006751sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + AEAD_AES_256_GCMend_per_group< >0.000441sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1init_per_group< >0.002168sOk +642ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1simple_connect< >0.005070sOk +643ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1simple_exec< >0.005985sOk +644ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1simple_sftp< >0.006345sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1end_per_group< >0.000554sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.cominit_per_group< >0.002155sOk +645ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comsimple_connect< >0.005070sOk +646ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comsimple_exec< >0.006350sOk +647ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comsimple_sftp< >0.006419sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha1-etm@openssh.comend_per_group< >0.000624sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256init_per_group< >0.002317sOk +648ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256simple_connect< >0.005318sOk +649ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256simple_exec< >0.006166sOk +650ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256simple_sftp< >0.006787sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256end_per_group< >0.000372sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002337sOk +651ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005207sOk +652ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.005983sOk +653ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006734sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000564sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512init_per_group< >0.002164sOk +654ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512simple_connect< >0.005064sOk +655ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512simple_exec< >0.005931sOk +656ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512simple_sftp< >0.006614sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512end_per_group< >0.000695sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.003017sOk +657ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.004991sOk +658ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006205sOk +659ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006589sOk +ssh_algorithms_SUITED: mac hmac-sha1-96 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000372sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002146sOk +660ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.005284sOk +661ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006358sOk +662ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006738sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000451sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002201sOk +663ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.005164sOk +664ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.006220sOk +665ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006208sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000352sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1init_per_group< >0.002232sOk +666ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1simple_connect< >0.005179sOk +667ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1simple_exec< >0.006245sOk +668ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1simple_sftp< >0.006550sOk +669ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1sshd_simple_exec< >0.115108sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1end_per_group< >0.000378sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96init_per_group< >0.002368sOk +670ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96simple_connect< >0.004986sOk +671ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96simple_exec< >0.005847sOk +672ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96simple_sftp< >0.006989sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha1-96end_per_group< >0.000325sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256init_per_group< >0.002172sOk +673ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256simple_connect< >0.005459sOk +674ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256simple_exec< >0.006628sOk +675ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256simple_sftp< >0.006768sOk +676ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256sshd_simple_exec< >0.115709sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256end_per_group< >0.000769sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002022sOk +677ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_connect< >0.004902sOk +678ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006256sOk +679ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006789sOk +680ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.114934sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-256-etm@openssh.comend_per_group< >0.000340sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512init_per_group< >0.002747sOk +681ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512simple_connect< >0.005079sOk +682ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512simple_exec< >0.005755sOk +683ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512simple_sftp< >0.006928sOk +684ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512sshd_simple_exec< >0.115141sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512end_per_group< >0.000408sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002375sOk +685ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_connect< >0.004779sOk +686ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006275sOk +687ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006959sOk +688ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.114813sOk +ssh_algorithms_SUITED: mac hmac-sha1-etm@openssh.com + hmac-sha2-512-etm@openssh.comend_per_group< >0.000380sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMinit_per_group< >0.002105sOk +689ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMsimple_connect< >0.005325sOk +690ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMsimple_exec< >0.005986sOk +691ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMsimple_sftp< >0.006514sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_128_GCMend_per_group< >0.000559sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMinit_per_group< >0.002110sOk +692ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMsimple_connect< >0.004847sOk +693ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMsimple_exec< >0.006194sOk +694ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMsimple_sftp< >0.006508sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + AEAD_AES_256_GCMend_per_group< >0.000496sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1init_per_group< >0.002732sOk +695ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1simple_connect< >0.004719sOk +696ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1simple_exec< >0.005836sOk +697ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1simple_sftp< >0.006744sOk +698ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1sshd_simple_exec< >0.115074sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1end_per_group< >0.000417sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96init_per_group< >0.002072sOk +699ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96simple_connect< >0.005279sOk +700ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96simple_exec< >0.006555sOk +701ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96simple_sftp< >0.006656sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-96end_per_group< >0.000399sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.cominit_per_group< >0.002470sOk +702ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsimple_connect< >0.004931sOk +703ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsimple_exec< >0.006211sOk +704ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsimple_sftp< >0.006729sOk +705ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.115475sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha1-etm@openssh.comend_per_group< >0.000521sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002532sOk +706ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.004948sOk +707ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006199sOk +708ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006420sOk +709ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.114173sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000441sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512init_per_group< >0.002347sOk +710ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512simple_connect< >0.004986sOk +711ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512simple_exec< >0.006483sOk +712ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512simple_sftp< >0.007362sOk +713ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512sshd_simple_exec< >0.115346sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512end_per_group< >0.000445sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002105sOk +714ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005350sOk +715ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006104sOk +716ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006379sOk +717ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.114859sOk +ssh_algorithms_SUITED: mac hmac-sha2-256 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000461sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002432sOk +718ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.005059sOk +719ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.005932sOk +720ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.006584sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000430sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002304sOk +721ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.005132sOk +722ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.006063sOk +723ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006733sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000375sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1init_per_group< >0.002572sOk +724ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1simple_connect< >0.005016sOk +725ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1simple_exec< >0.006155sOk +726ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1simple_sftp< >0.006603sOk +727ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1sshd_simple_exec< >0.114869sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1end_per_group< >0.000737sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96init_per_group< >0.002278sOk +728ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96simple_connect< >0.004956sOk +729ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96simple_exec< >0.006214sOk +730ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96simple_sftp< >0.006338sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-96end_per_group< >0.000339sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.cominit_per_group< >0.002254sOk +731ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_connect< >0.005335sOk +732ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_exec< >0.005706sOk +733ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_sftp< >0.006611sOk +734ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.115348sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha1-etm@openssh.comend_per_group< >0.000692sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256init_per_group< >0.002573sOk +735ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256simple_connect< >0.005765sOk +736ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256simple_exec< >0.005846sOk +737ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256simple_sftp< >0.006776sOk +738ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256sshd_simple_exec< >0.113916sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-256end_per_group< >0.000420sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512init_per_group< >0.002647sOk +739ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512simple_connect< >0.005169sOk +740ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512simple_exec< >0.006015sOk +741ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512simple_sftp< >0.006793sOk +742ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512sshd_simple_exec< >0.114741sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512end_per_group< >0.000398sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.cominit_per_group< >0.001975sOk +743ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005091sOk +744ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006197sOk +745ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006813sOk +746ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.114981sOk +ssh_algorithms_SUITED: mac hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.comend_per_group< >0.000411sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMinit_per_group< >0.002153sOk +747ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMsimple_connect< >0.004948sOk +748ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMsimple_exec< >0.006174sOk +749ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMsimple_sftp< >0.006579sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_128_GCMend_per_group< >0.000404sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMinit_per_group< >0.002127sOk +750ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMsimple_connect< >0.005313sOk +751ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMsimple_exec< >0.005845sOk +752ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMsimple_sftp< >0.006525sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + AEAD_AES_256_GCMend_per_group< >0.000428sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1init_per_group< >0.002387sOk +753ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1simple_connect< >0.004913sOk +754ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1simple_exec< >0.006525sOk +755ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1simple_sftp< >0.007083sOk +756ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1sshd_simple_exec< >0.117058sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1end_per_group< >0.000532sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96init_per_group< >0.002168sOk +757ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96simple_connect< >0.005389sOk +758ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96simple_exec< >0.006198sOk +759ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96simple_sftp< >0.006912sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-96end_per_group< >0.000374sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.cominit_per_group< >0.002151sOk +760ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsimple_connect< >0.005267sOk +761ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsimple_exec< >0.006310sOk +762ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsimple_sftp< >0.007143sOk +763ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.114947sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha1-etm@openssh.comend_per_group< >0.000445sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256init_per_group< >0.002232sOk +764ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256simple_connect< >0.005225sOk +765ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256simple_exec< >0.006159sOk +766ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256simple_sftp< >0.006657sOk +767ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256sshd_simple_exec< >0.115412sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256end_per_group< >0.000724sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002437sOk +768ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005197sOk +769ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsimple_exec< >0.006242sOk +770ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.007032sOk +771ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.114873sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-256-etm@openssh.comend_per_group< >0.000589sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.cominit_per_group< >0.002107sOk +772ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsimple_connect< >0.005306sOk +773ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsimple_exec< >0.006190sOk +774ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsimple_sftp< >0.006832sOk +775ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comsshd_simple_exec< >0.115920sOk +ssh_algorithms_SUITED: mac hmac-sha2-512 + hmac-sha2-512-etm@openssh.comend_per_group< >0.000518sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMinit_per_group< >0.002896sOk +776ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMsimple_connect< >0.005332sOk +777ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMsimple_exec< >0.006304sOk +778ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMsimple_sftp< >0.007191sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_128_GCMend_per_group< >0.000588sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMinit_per_group< >0.002095sOk +779ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMsimple_connect< >0.005075sOk +780ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMsimple_exec< >0.006255sOk +781ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMsimple_sftp< >0.006763sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + AEAD_AES_256_GCMend_per_group< >0.000465sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1init_per_group< >0.002247sOk +782ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1simple_connect< >0.005562sOk +783ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1simple_exec< >0.006458sOk +784ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1simple_sftp< >0.006971sOk +785ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1sshd_simple_exec< >0.118531sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1end_per_group< >0.000689sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96init_per_group< >0.002737sOk +786ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96simple_connect< >0.005720sOk +787ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96simple_exec< >0.007198sOk +788ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96simple_sftp< >0.007137sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-96end_per_group< >0.000577sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.cominit_per_group< >0.002140sOk +789ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_connect< >0.005165sOk +790ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_exec< >0.006152sOk +791ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsimple_sftp< >0.007257sOk +792ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comsshd_simple_exec< >0.119122sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha1-etm@openssh.comend_per_group< >0.000567sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256init_per_group< >0.002687sOk +793ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256simple_connect< >0.005347sOk +794ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256simple_exec< >0.006648sOk +795ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256simple_sftp< >0.007098sOk +796ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256sshd_simple_exec< >0.117812sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256end_per_group< >0.000528sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.cominit_per_group< >0.002350sOk +797ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_connect< >0.005320sOk +798ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_exec< >0.005938sOk +799ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsimple_sftp< >0.006687sOk +800ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comsshd_simple_exec< >0.116814sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-256-etm@openssh.comend_per_group< >0.000500sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512init_per_group< >0.002217sOk +801ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512simple_connect< >0.005269sOk +802ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512simple_exec< >0.006312sOk +803ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512simple_sftp< >0.007132sOk +804ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512sshd_simple_exec< >0.115415sOk +ssh_algorithms_SUITED: mac hmac-sha2-512-etm@openssh.com + hmac-sha2-512end_per_group< >0.000436sOk +ssh_algorithms_SUITEmacend_per_group< >0.000001sOk +ssh_algorithms_SUITEcompressioninit_per_group< >0.000015sOk==== compression ==== +ssh_algorithms_SUITEnoneinit_per_group< >0.001999sOk +805ssh_algorithms_SUITEnonesimple_connect< >0.005810sOk +806ssh_algorithms_SUITEnonesimple_exec< >0.006920sOk +807ssh_algorithms_SUITEnonesimple_sftp< >0.006783sOk +808ssh_algorithms_SUITEnonesshd_simple_exec< >0.115476sOk +ssh_algorithms_SUITEnoneend_per_group< >0.000338sOk +ssh_algorithms_SUITEzlibinit_per_group< >0.002369sOk +809ssh_algorithms_SUITEzlibsimple_connect< >0.005827sOk +810ssh_algorithms_SUITEzlibsimple_exec< >0.007495sOk +811ssh_algorithms_SUITEzlibsimple_sftp< >0.007932sOk +ssh_algorithms_SUITEzlibend_per_group< >0.000488sOk +ssh_algorithms_SUITEzlib@openssh.cominit_per_group< >0.002375sOk +812ssh_algorithms_SUITEzlib@openssh.comsimple_connect< >0.005303sOk +813ssh_algorithms_SUITEzlib@openssh.comsimple_exec< >0.006028sOk +814ssh_algorithms_SUITEzlib@openssh.comsimple_sftp< >0.007173sOk +815ssh_algorithms_SUITEzlib@openssh.comsshd_simple_exec< >0.114591sOk +ssh_algorithms_SUITEzlib@openssh.comend_per_group< >0.000513sOk +ssh_algorithms_SUITED: compression none + zlibinit_per_group< >0.002490sOk +816ssh_algorithms_SUITED: compression none + zlibsimple_connect< >0.005147sOk +817ssh_algorithms_SUITED: compression none + zlibsimple_exec< >0.006126sOk +818ssh_algorithms_SUITED: compression none + zlibsimple_sftp< >0.007300sOk +ssh_algorithms_SUITED: compression none + zlibend_per_group< >0.000381sOk +ssh_algorithms_SUITED: compression none + zlib@openssh.cominit_per_group< >0.001972sOk +819ssh_algorithms_SUITED: compression none + zlib@openssh.comsimple_connect< >0.005372sOk +820ssh_algorithms_SUITED: compression none + zlib@openssh.comsimple_exec< >0.006312sOk +821ssh_algorithms_SUITED: compression none + zlib@openssh.comsimple_sftp< >0.007220sOk +822ssh_algorithms_SUITED: compression none + zlib@openssh.comsshd_simple_exec< >0.115493sOk +ssh_algorithms_SUITED: compression none + zlib@openssh.comend_per_group< >0.000456sOk +ssh_algorithms_SUITED: compression zlib + noneinit_per_group< >0.002413sOk +823ssh_algorithms_SUITED: compression zlib + nonesimple_connect< >0.005171sOk +824ssh_algorithms_SUITED: compression zlib + nonesimple_exec< >0.006093sOk +825ssh_algorithms_SUITED: compression zlib + nonesimple_sftp< >0.007410sOk +ssh_algorithms_SUITED: compression zlib + noneend_per_group< >0.000319sOk +ssh_algorithms_SUITED: compression zlib + zlib@openssh.cominit_per_group< >0.002566sOk +826ssh_algorithms_SUITED: compression zlib + zlib@openssh.comsimple_connect< >0.005415sOk +827ssh_algorithms_SUITED: compression zlib + zlib@openssh.comsimple_exec< >0.006475sOk +828ssh_algorithms_SUITED: compression zlib + zlib@openssh.comsimple_sftp< >0.007204sOk +ssh_algorithms_SUITED: compression zlib + zlib@openssh.comend_per_group< >0.000447sOk +ssh_algorithms_SUITED: compression zlib@openssh.com + noneinit_per_group< >0.002749sOk +829ssh_algorithms_SUITED: compression zlib@openssh.com + nonesimple_connect< >0.005179sOk +830ssh_algorithms_SUITED: compression zlib@openssh.com + nonesimple_exec< >0.006362sOk +831ssh_algorithms_SUITED: compression zlib@openssh.com + nonesimple_sftp< >0.006827sOk +832ssh_algorithms_SUITED: compression zlib@openssh.com + nonesshd_simple_exec< >0.115532sOk +ssh_algorithms_SUITED: compression zlib@openssh.com + noneend_per_group< >0.000566sOk +ssh_algorithms_SUITED: compression zlib@openssh.com + zlibinit_per_group< >0.002998sOk +833ssh_algorithms_SUITED: compression zlib@openssh.com + zlibsimple_connect< >0.005554sOk +834ssh_algorithms_SUITED: compression zlib@openssh.com + zlibsimple_exec< >0.006550sOk +835ssh_algorithms_SUITED: compression zlib@openssh.com + zlibsimple_sftp< >0.007830sOk +ssh_algorithms_SUITED: compression zlib@openssh.com + zlibend_per_group< >0.000516sOk +ssh_algorithms_SUITEcompressionend_per_group< >0.000000sOk +ssh_algorithms_SUITEpublic_keyinit_per_group< >0.000025sOk==== public_key ==== +ssh_algorithms_SUITEecdsa-sha2-nistp256init_per_group< >0.001555sOk +836ssh_algorithms_SUITEecdsa-sha2-nistp256simple_connect< >0.005474sOk +837ssh_algorithms_SUITEecdsa-sha2-nistp256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITEecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITEecdsa-sha2-nistp384init_per_group< >0.001488sOk +838ssh_algorithms_SUITEecdsa-sha2-nistp384simple_connect< >0.007514sOk +ssh_algorithms_SUITEecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITEecdsa-sha2-nistp521init_per_group< >0.001145sOk +839ssh_algorithms_SUITEecdsa-sha2-nistp521simple_connect< >0.006722sOk +ssh_algorithms_SUITEecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITErsa-sha2-256init_per_group< >0.001346sOk +840ssh_algorithms_SUITErsa-sha2-256simple_connect< >0.006191sOk +841ssh_algorithms_SUITErsa-sha2-256sshd_simple_exec< >0.100987sOk +ssh_algorithms_SUITErsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITErsa-sha2-512init_per_group< >0.001227sOk +842ssh_algorithms_SUITErsa-sha2-512simple_connect< >0.006505sOk +843ssh_algorithms_SUITErsa-sha2-512sshd_simple_exec< >0.099589sOk +ssh_algorithms_SUITErsa-sha2-512end_per_group< >0.000000sOk +ssh_algorithms_SUITEssh-dssinit_per_group< >0.001384sOk +844ssh_algorithms_SUITEssh-dsssimple_connect< >0.004744sOk +ssh_algorithms_SUITEssh-dssend_per_group< >0.000000sOk +ssh_algorithms_SUITEssh-ed25519init_per_group< >0.000962sOk +845ssh_algorithms_SUITEssh-ed25519simple_connect< >0.005129sOk +846ssh_algorithms_SUITEssh-ed25519sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITEssh-ed25519end_per_group< >0.000001sOk +ssh_algorithms_SUITEssh-ed448init_per_group< >0.001399sOk +847ssh_algorithms_SUITEssh-ed448simple_connect< >0.005922sOk +ssh_algorithms_SUITEssh-ed448end_per_group< >0.000001sOk +ssh_algorithms_SUITEssh-rsainit_per_group< >0.001458sOk +848ssh_algorithms_SUITEssh-rsasimple_connect< >0.006919sOk +ssh_algorithms_SUITEssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384init_per_group< >0.002945sOk +849ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384simple_connect< >0.006107sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384end_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521init_per_group< >0.002133sOk +850ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521simple_connect< >0.005697sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256init_per_group< >0.002016sOk +851ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256simple_connect< >0.004917sOk +852ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512init_per_group< >0.001947sOk +853ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512simple_connect< >0.005409sOk +854ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-dssinit_per_group< >0.001968sOk +855ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-dsssimple_connect< >0.004362sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-dssend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519init_per_group< >0.001881sOk +856ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519simple_connect< >0.004230sOk +857ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed25519end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed448init_per_group< >0.001636sOk +858ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed448simple_connect< >0.005000sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-ed448end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-rsainit_per_group< >0.002040sOk +859ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-rsasimple_connect< >0.004660sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp256 + ssh-rsaend_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256init_per_group< >0.002180sOk +860ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256simple_connect< >0.006124sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521init_per_group< >0.001976sOk +861ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521simple_connect< >0.006636sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-256init_per_group< >0.001788sOk +862ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-256simple_connect< >0.006721sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-256end_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-512init_per_group< >0.001882sOk +863ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-512simple_connect< >0.006992sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-dssinit_per_group< >0.001875sOk +864ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-dsssimple_connect< >0.005864sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-dssend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed25519init_per_group< >0.001921sOk +865ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed25519simple_connect< >0.006164sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed25519end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed448init_per_group< >0.001923sOk +866ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed448simple_connect< >0.006316sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-ed448end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-rsainit_per_group< >0.002015sOk +867ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-rsasimple_connect< >0.006790sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp384 + ssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256init_per_group< >0.002054sOk +868ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256simple_connect< >0.005508sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384init_per_group< >0.001876sOk +869ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384simple_connect< >0.006841sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-256init_per_group< >0.001905sOk +870ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-256simple_connect< >0.005927sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-512init_per_group< >0.002039sOk +871ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-512simple_connect< >0.006050sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-dssinit_per_group< >0.001821sOk +872ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-dsssimple_connect< >0.005417sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-dssend_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed25519init_per_group< >0.003068sOk +873ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed25519simple_connect< >0.005565sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed25519end_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed448init_per_group< >0.002379sOk +874ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed448simple_connect< >0.005826sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-ed448end_per_group< >0.000002sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-rsainit_per_group< >0.002062sOk +875ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-rsasimple_connect< >0.005948sOk +ssh_algorithms_SUITED: public_key ecdsa-sha2-nistp521 + ssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256init_per_group< >0.001866sOk +876ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256simple_connect< >0.005389sOk +877ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256sshd_simple_exec< >0.101234sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp384init_per_group< >0.001872sOk +878ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp384simple_connect< >0.007203sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp521init_per_group< >0.001809sOk +879ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp521simple_connect< >0.006272sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512init_per_group< >0.002017sOk +880ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512simple_connect< >0.006677sOk +881ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512sshd_simple_exec< >0.099547sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-dssinit_per_group< >0.001843sOk +882ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-dsssimple_connect< >0.006051sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-dssend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519init_per_group< >0.001977sOk +883ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519simple_connect< >0.005852sOk +884ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519sshd_simple_exec< >0.100281sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed25519end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed448init_per_group< >0.001918sOk +885ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed448simple_connect< >0.006307sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-ed448end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-rsainit_per_group< >0.002247sOk +886ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-rsasimple_connect< >0.006011sOk +ssh_algorithms_SUITED: public_key rsa-sha2-256 + ssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256init_per_group< >0.002032sOk +887ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256simple_connect< >0.005461sOk +888ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256sshd_simple_exec< >0.099878sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp384init_per_group< >0.001831sOk +889ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp384simple_connect< >0.007324sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp521init_per_group< >0.001876sOk +890ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp521simple_connect< >0.006387sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256init_per_group< >0.001951sOk +891ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256simple_connect< >0.006430sOk +892ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256sshd_simple_exec< >0.099858sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + rsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-dssinit_per_group< >0.001794sOk +893ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-dsssimple_connect< >0.005423sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-dssend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519init_per_group< >0.001927sOk +894ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519simple_connect< >0.005445sOk +895ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519sshd_simple_exec< >0.101305sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed25519end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed448init_per_group< >0.001857sOk +896ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed448simple_connect< >0.006071sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-ed448end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-rsainit_per_group< >0.002126sOk +897ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-rsasimple_connect< >0.005832sOk +ssh_algorithms_SUITED: public_key rsa-sha2-512 + ssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp256init_per_group< >0.001860sOk +898ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp256simple_connect< >0.004589sOk +ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp384init_per_group< >0.002249sOk +899ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp384simple_connect< >0.006144sOk +ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp521init_per_group< >0.002079sOk +900ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp521simple_connect< >0.005411sOk +ssh_algorithms_SUITED: public_key ssh-dss + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-256init_per_group< >0.002064sOk +901ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-256simple_connect< >0.005346sOk +ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-512init_per_group< >0.002282sOk +902ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-512simple_connect< >0.005351sOk +ssh_algorithms_SUITED: public_key ssh-dss + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed25519init_per_group< >0.002223sOk +903ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed25519simple_connect< >0.004670sOk +ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed25519end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed448init_per_group< >0.002038sOk +904ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed448simple_connect< >0.005064sOk +ssh_algorithms_SUITED: public_key ssh-dss + ssh-ed448end_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ssh-dss + ssh-rsainit_per_group< >0.002031sOk +905ssh_algorithms_SUITED: public_key ssh-dss + ssh-rsasimple_connect< >0.005161sOk +ssh_algorithms_SUITED: public_key ssh-dss + ssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256init_per_group< >0.002104sOk +906ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256simple_connect< >0.004477sOk +907ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp384init_per_group< >0.002108sOk +908ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp384simple_connect< >0.005931sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp521init_per_group< >0.002176sOk +909ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp521simple_connect< >0.005267sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256init_per_group< >0.002186sOk +910ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256simple_connect< >0.004955sOk +911ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512init_per_group< >0.001755sOk +912ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512simple_connect< >0.005122sOk +913ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512sshd_simple_exec< >0.000000sSKIPPEDNo user key: enoent +ssh_algorithms_SUITED: public_key ssh-ed25519 + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-dssinit_per_group< >0.002132sOk +914ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-dsssimple_connect< >0.004418sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-dssend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-ed448init_per_group< >0.001890sOk +915ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-ed448simple_connect< >0.004919sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-ed448end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-rsainit_per_group< >0.001834sOk +916ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-rsasimple_connect< >0.005208sOk +ssh_algorithms_SUITED: public_key ssh-ed25519 + ssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp256init_per_group< >0.001980sOk +917ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp256simple_connect< >0.005017sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp384init_per_group< >0.001731sOk +918ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp384simple_connect< >0.006961sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp521init_per_group< >0.001905sOk +919ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp521simple_connect< >0.006202sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-256init_per_group< >0.002012sOk +920ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-256simple_connect< >0.005636sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-512init_per_group< >0.002413sOk +921ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-512simple_connect< >0.005605sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-dssinit_per_group< >0.001939sOk +922ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-dsssimple_connect< >0.005148sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-dssend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-ed25519init_per_group< >0.002171sOk +923ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-ed25519simple_connect< >0.005135sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-ed25519end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-rsainit_per_group< >0.002078sOk +924ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-rsasimple_connect< >0.005531sOk +ssh_algorithms_SUITED: public_key ssh-ed448 + ssh-rsaend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp256init_per_group< >0.002023sOk +925ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp256simple_connect< >0.005539sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp256end_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp384init_per_group< >0.001602sOk +926ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp384simple_connect< >0.007150sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp384end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp521init_per_group< >0.002078sOk +927ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp521simple_connect< >0.006251sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ecdsa-sha2-nistp521end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-256init_per_group< >0.001970sOk +928ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-256simple_connect< >0.006247sOk +ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-256end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-512init_per_group< >0.001971sOk +929ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-512simple_connect< >0.006190sOk +ssh_algorithms_SUITED: public_key ssh-rsa + rsa-sha2-512end_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ssh-dssinit_per_group< >0.002027sOk +930ssh_algorithms_SUITED: public_key ssh-rsa + ssh-dsssimple_connect< >0.005841sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ssh-dssend_per_group< >0.000001sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed25519init_per_group< >0.001936sOk +931ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed25519simple_connect< >0.005900sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed25519end_per_group< >0.000000sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed448init_per_group< >0.001915sOk +932ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed448simple_connect< >0.007108sOk +ssh_algorithms_SUITED: public_key ssh-rsa + ssh-ed448end_per_group< >0.000001sOk +ssh_algorithms_SUITEpublic_keyend_per_group< >0.000000sOk +ssh_algorithms_SUITEend_per_suite< >0.001653sOk +ssh_basic_SUITEinit_per_suite< >0.007259sOkFIPS mode not supported by Erlang/OTP ssh_basic_SUITEall_testsinit_per_group< >0.000000sOk -ssh_basic_SUITEsequentialinit_per_group< >0.000000sOk -933ssh_basic_SUITEsequentialapp_test< >0.011633sOk -934ssh_basic_SUITEsequentialappup_test< >0.000593sOk -935ssh_basic_SUITEsequentialdaemon_already_started< >0.002439sOk -936ssh_basic_SUITEsequentialdaemon_error_closes_port< >0.001914sOk -937ssh_basic_SUITEsequentialdouble_close< >0.005994sOk -938ssh_basic_SUITEsequentialdaemon_opt_fd< >0.005700sOk -939ssh_basic_SUITEsequentialmulti_daemon_opt_fd< >0.035217sOk -940ssh_basic_SUITEsequentialpacket_size< >8.019417sOk -941ssh_basic_SUITEsequentialssh_info_print< >1.011037sOk -942ssh_basic_SUITEsequentialshell_exit_status< >30.008687sOk -943ssh_basic_SUITEsequentialsetopts_getopts< >0.007004sOk -944ssh_basic_SUITEsequentialknown_hosts< >0.016764sOk -945ssh_basic_SUITEsequentialssh_file_is_host_key< >0.483054sOk -946ssh_basic_SUITEsequentialssh_file_is_host_key_misc< >0.127441sOk -947ssh_basic_SUITEsequentialssh_file_is_auth_key< >0.000810sOk +ssh_basic_SUITEsequentialinit_per_group< >0.000000sOk +933ssh_basic_SUITEsequentialapp_test< >0.011407sOk +934ssh_basic_SUITEsequentialappup_test< >0.000687sOk +935ssh_basic_SUITEsequentialdaemon_already_started< >0.002688sOk +936ssh_basic_SUITEsequentialdaemon_error_closes_port< >0.002134sOk +937ssh_basic_SUITEsequentialdouble_close< >0.006809sOk +938ssh_basic_SUITEsequentialdaemon_opt_fd< >0.005972sOk +939ssh_basic_SUITEsequentialmulti_daemon_opt_fd< >0.034891sOk +940ssh_basic_SUITEsequentialpacket_size< >8.021442sOk +941ssh_basic_SUITEsequentialssh_info_print< >1.012072sOk +942ssh_basic_SUITEsequentialshell_exit_status< >30.008322sOk +943ssh_basic_SUITEsequentialsetopts_getopts< >0.007414sOk +944ssh_basic_SUITEsequentialknown_hosts< >0.017740sOk +945ssh_basic_SUITEsequentialssh_file_is_host_key< >0.826516sOk +946ssh_basic_SUITEsequentialssh_file_is_host_key_misc< >0.047935sOk +947ssh_basic_SUITEsequentialssh_file_is_auth_key< >0.001033sOk ssh_basic_SUITEsequentialend_per_group< >0.000000sOk -ssh_basic_SUITEp_basicinit_per_group< >0.000000sOk -948ssh_basic_SUITEp_basicsend< >0.072921sOk -949ssh_basic_SUITEp_basicpeername_sockname< >0.082226sOk -950ssh_basic_SUITEp_basicexec< >0.086966sOk -951ssh_basic_SUITEp_basicexec_compressed< >0.085005sOk -952ssh_basic_SUITEp_basicexec_with_io_out< >0.088407sOk -953ssh_basic_SUITEp_basicexec_with_io_in< >0.091815sOk -954ssh_basic_SUITEp_basiccli< >0.536008sOk -955ssh_basic_SUITEp_basiccli_exit_normal< >0.542594sOk -956ssh_basic_SUITEp_basiccli_exit_status< >0.556099sOk -957ssh_basic_SUITEp_basicidle_time_client< >16.091209sOk -958ssh_basic_SUITEp_basicidle_time_server< >16.090516sOk -959ssh_basic_SUITEp_basicmax_initial_idle_time< >8.077732sOk -960ssh_basic_SUITEp_basicopenssh_zlib_basic_test< >0.079011sOk -961ssh_basic_SUITEp_basicmisc_ssh_options< >0.092394sOk -962ssh_basic_SUITEp_basicinet_option< >0.079105sOk -963ssh_basic_SUITEp_basicinet6_option< >0.082188sOk -964ssh_basic_SUITEp_basicshell< >1.557793sOk -965ssh_basic_SUITEp_basicshell_socket< >1.559872sOk -966ssh_basic_SUITEp_basicshell_ssh_conn< >1.558235sOk -967ssh_basic_SUITEp_basicshell_no_unicode< >0.997619sOk -968ssh_basic_SUITEp_basicshell_unicode_string< >0.998561sOk -969ssh_basic_SUITEp_basicclose< >0.079818sOk -ssh_basic_SUITEp_basicend_per_group< >0.000000sOk -ssh_basic_SUITEinternal_errorinit_per_group< >0.000000sOk -970ssh_basic_SUITEinternal_errorinternal_error< >0.008964sOk -ssh_basic_SUITEinternal_errorend_per_group< >0.000000sOk -ssh_basic_SUITElogin_bad_pwd_no_retryinit_per_group< >0.000000sOk -971ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry1< >0.016694sOk -972ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry2< >0.015909sOk -973ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry3< >0.013877sOk -974ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry4< >0.015760sOk -975ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry5< >0.014632sOk -ssh_basic_SUITElogin_bad_pwd_no_retryend_per_group< >0.000000sOk -ssh_basic_SUITEkey_cbinit_per_group< >0.001215sOk -976ssh_basic_SUITEkey_cbkey_callback< >0.009837sOk -977ssh_basic_SUITEkey_cbkey_callback_options< >0.010814sOk -ssh_basic_SUITEkey_cbend_per_group< >0.000000sOk -ssh_basic_SUITEall_testsend_per_group< >0.000000sOk -ssh_basic_SUITEend_per_suite< >0.003233sOk +ssh_basic_SUITEp_basicinit_per_group< >0.000000sOk +948ssh_basic_SUITEp_basicsend< >0.086902sOk +949ssh_basic_SUITEp_basicpeername_sockname< >0.087350sOk +950ssh_basic_SUITEp_basicexec< >0.086016sOk +951ssh_basic_SUITEp_basicexec_compressed< >0.084599sOk +952ssh_basic_SUITEp_basicexec_with_io_out< >0.072659sOk +953ssh_basic_SUITEp_basicexec_with_io_in< >0.086935sOk +954ssh_basic_SUITEp_basiccli< >0.539823sOk +955ssh_basic_SUITEp_basiccli_exit_normal< >0.524003sOk +956ssh_basic_SUITEp_basiccli_exit_status< >0.542633sOk +957ssh_basic_SUITEp_basicidle_time_client< >16.091239sOk +958ssh_basic_SUITEp_basicidle_time_server< >16.091575sOk +959ssh_basic_SUITEp_basicmax_initial_idle_time< >8.077808sOk +960ssh_basic_SUITEp_basicopenssh_zlib_basic_test< >0.080620sOk +961ssh_basic_SUITEp_basicmisc_ssh_options< >0.092283sOk +962ssh_basic_SUITEp_basicinet_option< >0.080067sOk +963ssh_basic_SUITEp_basicinet6_option< >0.078885sOk +964ssh_basic_SUITEp_basicshell< >1.554778sOk +965ssh_basic_SUITEp_basicshell_socket< >1.555812sOk +966ssh_basic_SUITEp_basicshell_ssh_conn< >1.553215sOk +967ssh_basic_SUITEp_basicshell_no_unicode< >0.999835sOk +968ssh_basic_SUITEp_basicshell_unicode_string< >0.999690sOk +969ssh_basic_SUITEp_basicclose< >0.079717sOk +ssh_basic_SUITEp_basicend_per_group< >0.000000sOk +ssh_basic_SUITEinternal_errorinit_per_group< >0.000000sOk +970ssh_basic_SUITEinternal_errorinternal_error< >0.009942sOk +ssh_basic_SUITEinternal_errorend_per_group< >0.000000sOk +ssh_basic_SUITElogin_bad_pwd_no_retryinit_per_group< >0.000000sOk +971ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry1< >0.016905sOk +972ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry2< >0.016090sOk +973ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry3< >0.017368sOk +974ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry4< >0.017698sOk +975ssh_basic_SUITElogin_bad_pwd_no_retrylogin_bad_pwd_no_retry5< >0.016503sOk +ssh_basic_SUITElogin_bad_pwd_no_retryend_per_group< >0.000000sOk +ssh_basic_SUITEkey_cbinit_per_group< >0.000908sOk +976ssh_basic_SUITEkey_cbkey_callback< >0.009840sOk +977ssh_basic_SUITEkey_cbkey_callback_options< >0.011179sOk +ssh_basic_SUITEkey_cbend_per_group< >0.000000sOk +ssh_basic_SUITEall_testsend_per_group< >0.000000sOk +ssh_basic_SUITEend_per_suite< >0.003325sOk ssh_bench_SUITEall< >0.000sSKIPPEDBenchmarks run separately -ssh_chan_behaviours_SUITEinit_per_suite< >0.000655sOkFIPS mode not supported by Erlang/OTP -978ssh_chan_behaviours_SUITEnoexist_subsystem< >0.000404sOk -979ssh_chan_behaviours_SUITEundefined_subsystem< >0.000950sOk -980ssh_chan_behaviours_SUITEdefined_subsystem< >0.001432sOk -981ssh_chan_behaviours_SUITEsubsystem_client< >0.001842sOk -ssh_chan_behaviours_SUITEend_per_suite< >0.001133sOk -ssh_collect_labmachine_info_SUITEinit_per_suite< >0.000266sSKIPPEDNo 'collect_host_info' path configured +ssh_chan_behaviours_SUITEinit_per_suite< >0.000237sOkFIPS mode not supported by Erlang/OTP +978ssh_chan_behaviours_SUITEnoexist_subsystem< >0.000669sOk +979ssh_chan_behaviours_SUITEundefined_subsystem< >0.000906sOk +980ssh_chan_behaviours_SUITEdefined_subsystem< >0.001602sOk +981ssh_chan_behaviours_SUITEsubsystem_client< >0.001753sOk +ssh_chan_behaviours_SUITEend_per_suite< >0.001318sOk +ssh_collect_labmachine_info_SUITEinit_per_suite< >0.000277sSKIPPEDNo 'collect_host_info' path configured 982ssh_collect_labmachine_info_SUITEssh_info_lib< >0.000sSKIPPEDNo 'collect_host_info' path configured ssh_collect_labmachine_info_SUITEend_per_suite< >0.000sSKIPPEDNo 'collect_host_info' path configured ssh_connection_SUITEinit_per_suite< >0.000242sOkFIPS mode not supported by Erlang/OTP -ssh_connection_SUITEopensshinit_per_group< >0.042001sOk -983ssh_connection_SUITEopensshsimple_exec< >0.092934sOk -984ssh_connection_SUITEopensshsimple_exec_more_data< >0.094968sOk -985ssh_connection_SUITEopensshsimple_exec_sock< >0.093610sOk -986ssh_connection_SUITEopensshsimple_exec_two_socks< >0.098588sOk -987ssh_connection_SUITEopensshsmall_cat< >0.093344sOk -988ssh_connection_SUITEopensshbig_cat< >0.348520sOk -989ssh_connection_SUITEopensshsend_after_exit< >0.093606sOk -990ssh_connection_SUITEopensshptty_alloc_default< >0.094262sOk -991ssh_connection_SUITEopensshptty_alloc< >0.091820sOk -992ssh_connection_SUITEopensshptty_alloc_pixel< >0.091803sOk -993ssh_connection_SUITEopensshconnect_sock_not_passive< >0.000597sOk -994ssh_connection_SUITEopensshdaemon_sock_not_passive< >0.000659sOk +ssh_connection_SUITEopensshinit_per_group< >0.041816sOk +983ssh_connection_SUITEopensshsimple_exec< >0.094706sOk +984ssh_connection_SUITEopensshsimple_exec_more_data< >0.098418sOk +985ssh_connection_SUITEopensshsimple_exec_sock< >0.096431sOk +986ssh_connection_SUITEopensshsimple_exec_two_socks< >0.107513sOk +987ssh_connection_SUITEopensshsmall_cat< >0.094785sOk +988ssh_connection_SUITEopensshbig_cat< >0.342170sOk +989ssh_connection_SUITEopensshsend_after_exit< >0.094850sOk +990ssh_connection_SUITEopensshptty_alloc_default< >0.096912sOk +991ssh_connection_SUITEopensshptty_alloc< >0.094099sOk +992ssh_connection_SUITEopensshptty_alloc_pixel< >0.093269sOk +993ssh_connection_SUITEopensshconnect_sock_not_passive< >0.000628sOk +994ssh_connection_SUITEopensshdaemon_sock_not_passive< >0.000633sOk ssh_connection_SUITEopensshend_per_group< >0.000000sOk -995ssh_connection_SUITEsmall_interrupted_send< >0.139682sOk -996ssh_connection_SUITEinterrupted_send< >0.169599sOk -997ssh_connection_SUITEexec_erlang_term< >0.509773sOk -998ssh_connection_SUITEexec_erlang_term_non_default_shell< >0.508341sOk -999ssh_connection_SUITEexec_disabled< >1.009661sOk -1000ssh_connection_SUITEexec_shell_disabled< >0.508864sOk -1001ssh_connection_SUITEstart_shell< >1.009478sOk -1002ssh_connection_SUITEnew_shell_dumb_term< >0.507762sOk -1003ssh_connection_SUITEnew_shell_xterm_term< >0.507828sOk -1004ssh_connection_SUITEtrap_exit_connect< >0.005777sOk -1005ssh_connection_SUITEtrap_exit_daemon< >0.001168sOk -1006ssh_connection_SUITEstart_shell_pty< >1.009512sOk -1007ssh_connection_SUITEstart_shell_exec< >0.508815sOk -1008ssh_connection_SUITEstart_shell_exec_fun< >0.006672sOk -1009ssh_connection_SUITEstart_shell_exec_fun2< >0.006356sOk -1010ssh_connection_SUITEstart_shell_exec_fun3< >0.006560sOk -1011ssh_connection_SUITEstart_shell_exec_direct_fun< >0.006364sOk -1012ssh_connection_SUITEstart_shell_exec_direct_fun2< >0.006457sOk -1013ssh_connection_SUITEstart_shell_exec_direct_fun3< >0.006616sOk -1014ssh_connection_SUITEstart_shell_exec_direct_fun_more_data< >0.081693sOk -1015ssh_connection_SUITEstart_shell_exec_direct_fun1_error< >0.006897sOk -1016ssh_connection_SUITEstart_shell_exec_direct_fun1_error_type< >0.006390sOk -1017ssh_connection_SUITEstart_exec_direct_fun1_read_write< >0.008318sOk -1018ssh_connection_SUITEstart_exec_direct_fun1_read_write_advanced< >0.008652sOk -1019ssh_connection_SUITEstart_shell_sock_exec_fun< >0.006450sOk -1020ssh_connection_SUITEstart_shell_sock_daemon_exec< >0.005831sOk -1021ssh_connection_SUITEstart_shell_sock_daemon_exec_multi< >0.024912sOk -1022ssh_connection_SUITEencode_decode_pty_opts< >0.000017sOk -1023ssh_connection_SUITEconnect_sock_not_tcp< >0.000225sOk -1024ssh_connection_SUITEconnect2_invalid_options< >0.000002sOk -1025ssh_connection_SUITEconnect_invalid_port< >0.001488sOk -1026ssh_connection_SUITEconnect_invalid_options< >0.001561sOk -1027ssh_connection_SUITEconnect_invalid_timeout_0< >0.001535sOk -1028ssh_connection_SUITEconnect_invalid_timeout_1< >0.001620sOk +995ssh_connection_SUITEsmall_interrupted_send< >0.139577sOk +996ssh_connection_SUITEinterrupted_send< >0.171013sOk +997ssh_connection_SUITEexec_erlang_term< >0.509554sOk +998ssh_connection_SUITEexec_erlang_term_non_default_shell< >0.507411sOk +999ssh_connection_SUITEexec_disabled< >1.010671sOk +1000ssh_connection_SUITEexec_shell_disabled< >0.508774sOk +1001ssh_connection_SUITEstart_shell< >1.009040sOk +1002ssh_connection_SUITEnew_shell_dumb_term< >0.508177sOk +1003ssh_connection_SUITEnew_shell_xterm_term< >0.508549sOk +1004ssh_connection_SUITEtrap_exit_connect< >0.005900sOk +1005ssh_connection_SUITEtrap_exit_daemon< >0.001494sOk +1006ssh_connection_SUITEstart_shell_pty< >1.009559sOk +1007ssh_connection_SUITEstart_shell_exec< >0.512553sOk +1008ssh_connection_SUITEstart_shell_exec_fun< >0.006957sOk +1009ssh_connection_SUITEstart_shell_exec_fun2< >0.007156sOk +1010ssh_connection_SUITEstart_shell_exec_fun3< >0.006669sOk +1011ssh_connection_SUITEstart_shell_exec_direct_fun< >0.006488sOk +1012ssh_connection_SUITEstart_shell_exec_direct_fun2< >0.006503sOk +1013ssh_connection_SUITEstart_shell_exec_direct_fun3< >0.006437sOk +1014ssh_connection_SUITEstart_shell_exec_direct_fun_more_data< >0.082519sOk +1015ssh_connection_SUITEstart_shell_exec_direct_fun1_error< >0.007004sOk +1016ssh_connection_SUITEstart_shell_exec_direct_fun1_error_type< >0.006307sOk +1017ssh_connection_SUITEstart_exec_direct_fun1_read_write< >0.008390sOk +1018ssh_connection_SUITEstart_exec_direct_fun1_read_write_advanced< >0.008793sOk +1019ssh_connection_SUITEstart_shell_sock_exec_fun< >0.006278sOk +1020ssh_connection_SUITEstart_shell_sock_daemon_exec< >0.005748sOk +1021ssh_connection_SUITEstart_shell_sock_daemon_exec_multi< >0.024789sOk +1022ssh_connection_SUITEencode_decode_pty_opts< >0.000018sOk +1023ssh_connection_SUITEconnect_sock_not_tcp< >0.000194sOk +1024ssh_connection_SUITEconnect2_invalid_options< >0.000001sOk +1025ssh_connection_SUITEconnect_invalid_port< >0.001173sOk +1026ssh_connection_SUITEconnect_invalid_options< >0.001292sOk +1027ssh_connection_SUITEconnect_invalid_timeout_0< >0.001300sOk +1028ssh_connection_SUITEconnect_invalid_timeout_1< >0.001307sOk 1029ssh_connection_SUITEconnect3_invalid_port< >0.000002sOk 1030ssh_connection_SUITEconnect3_invalid_options< >0.000002sOk 1031ssh_connection_SUITEconnect3_invalid_timeout_0< >0.000002sOk -1032ssh_connection_SUITEconnect3_invalid_timeout_1< >0.000002sOk +1032ssh_connection_SUITEconnect3_invalid_timeout_1< >0.000003sOk 1033ssh_connection_SUITEconnect3_invalid_both< >0.000002sOk -1034ssh_connection_SUITEconnect4_invalid_two_0< >0.001335sOk -1035ssh_connection_SUITEconnect4_invalid_two_1< >0.001301sOk -1036ssh_connection_SUITEconnect4_invalid_two_2< >0.001289sOk -1037ssh_connection_SUITEconnect4_invalid_three< >0.001367sOk -1038ssh_connection_SUITEconnect_timeout< >2.000758sOk -1039ssh_connection_SUITEdaemon_sock_not_tcp< >0.000193sOk -1040ssh_connection_SUITEgracefull_invalid_version< >0.002741sOk(logger stats) boring: 1 -1041ssh_connection_SUITEgracefull_invalid_start< >0.002847sOk(logger stats) boring: 1 -1042ssh_connection_SUITEgracefull_invalid_long_start< >0.003291sOk(logger stats) boring: 1 -1043ssh_connection_SUITEgracefull_invalid_long_start_no_nl< >0.003077sOk(logger stats) boring: 1 -1044ssh_connection_SUITEkex_error< >0.005300sOk(logger stats) boring: 2 -1045ssh_connection_SUITEstop_listener< >0.017007sOk(logger stats) boring: 1 -1046ssh_connection_SUITEno_sensitive_leak< >0.608178sOk(logger stats) interesting: 1 boring: 9 -1047ssh_connection_SUITEstart_subsystem_on_closed_channel< >2.007604sOk(logger stats) boring: 8 -1048ssh_connection_SUITEmax_channels_option< >1.012464sOk(logger stats) interesting: 3 boring: 8 -ssh_connection_SUITEend_per_suite< >0.000004sOk -ssh_dbg_SUITEinit_per_suite< >0.009640sOkFIPS mode not supported by Erlang/OTP -common_testdbginit_per_group< >0.000061sOkstart of dbg -1049ssh_dbg_SUITEdbgdbg_basic< >0.051108sOk -1050ssh_dbg_SUITEdbgdbg_alg_terminate< >0.014614sOk -1051ssh_dbg_SUITEdbgdbg_ssh_messages< >0.011911sOk -1052ssh_dbg_SUITEdbgdbg_connections< >0.013411sOk -1053ssh_dbg_SUITEdbgdbg_channels< >1.013206sOk -1054ssh_dbg_SUITEdbgdbg_authentication< >0.022099sOk -1055ssh_dbg_SUITEdbgall_dbg< >0.027153sOk +1034ssh_connection_SUITEconnect4_invalid_two_0< >0.001313sOk +1035ssh_connection_SUITEconnect4_invalid_two_1< >0.001265sOk +1036ssh_connection_SUITEconnect4_invalid_two_2< >0.001303sOk +1037ssh_connection_SUITEconnect4_invalid_three< >0.001312sOk +1038ssh_connection_SUITEconnect_timeout< >2.001340sOk +1039ssh_connection_SUITEdaemon_sock_not_tcp< >0.000237sOk +1040ssh_connection_SUITEgracefull_invalid_version< >0.002792sOk(logger stats) boring: 1 +1041ssh_connection_SUITEgracefull_invalid_start< >0.002981sOk(logger stats) boring: 1 +1042ssh_connection_SUITEgracefull_invalid_long_start< >0.002940sOk(logger stats) boring: 1 +1043ssh_connection_SUITEgracefull_invalid_long_start_no_nl< >0.003231sOk(logger stats) boring: 1 +1044ssh_connection_SUITEkex_error< >0.004930sOk(logger stats) boring: 2 +1045ssh_connection_SUITEstop_listener< >0.016256sOk(logger stats) boring: 1 +1046ssh_connection_SUITEno_sensitive_leak< >0.607675sOk(logger stats) interesting: 1 boring: 9 +1047ssh_connection_SUITEstart_subsystem_on_closed_channel< >2.007515sOk(logger stats) boring: 8 +1048ssh_connection_SUITEmax_channels_option< >1.012869sOk(logger stats) interesting: 3 boring: 8 +ssh_connection_SUITEend_per_suite< >0.000008sOk +ssh_dbg_SUITEinit_per_suite< >0.009059sOkFIPS mode not supported by Erlang/OTP +common_testdbginit_per_group< >0.000041sOkstart of dbg +1049ssh_dbg_SUITEdbgdbg_basic< >0.051176sOk +1050ssh_dbg_SUITEdbgdbg_alg_terminate< >0.014382sOk +1051ssh_dbg_SUITEdbgdbg_ssh_messages< >0.011561sOk +1052ssh_dbg_SUITEdbgdbg_connections< >0.013602sOk +1053ssh_dbg_SUITEdbgdbg_channels< >1.012781sOk +1054ssh_dbg_SUITEdbgdbg_authentication< >0.021160sOk +1055ssh_dbg_SUITEdbgall_dbg< >0.025790sOk common_testdbgend_per_group< >0.000037sOkend of dbg -common_testcirc_bufinit_per_group< >0.000044sOkstart of circ_buf -1056ssh_dbg_SUITEcirc_bufcb_basic< >0.000007sOk -1057ssh_dbg_SUITEcirc_bufcb_print< >0.000450sOk -1058ssh_dbg_SUITEcirc_bufcb_macros_print< >0.000340sOk -common_testcirc_bufend_per_group< >0.000039sOkend of circ_buf -ssh_dbg_SUITEend_per_suite< >0.001444sOk -ssh_engine_SUITEinit_per_suite< >0.000828sOkFIPS mode not supported by Erlang/OTP -ssh_engine_SUITEdsa_keyinit_per_group< >0.003463sOk -1059ssh_engine_SUITEdsa_keysimple_connect< >0.015054sOk -ssh_engine_SUITEdsa_keyend_per_group< >0.000065sOk -ssh_engine_SUITErsa_keyinit_per_group< >0.002326sOk -1060ssh_engine_SUITErsa_keysimple_connect< >0.016272sOk -ssh_engine_SUITErsa_keyend_per_group< >0.000085sOk -ssh_engine_SUITEend_per_suite< >0.001613sOk -ssh_options_SUITEinit_per_suite< >0.000080sOkFIPS mode not supported by Erlang/OTP -1061ssh_options_SUITEconnectfun_disconnectfun_server< >0.005834sOk -1062ssh_options_SUITEconnectfun_disconnectfun_client< >0.005410sOk -1063ssh_options_SUITEserver_password_option< >0.010386sOk -1064ssh_options_SUITEserver_userpassword_option< >0.013591sOk -1065ssh_options_SUITEserver_pwdfun_option< >0.013508sOk -1066ssh_options_SUITEserver_pwdfun_4_option< >0.024952sOk -1067ssh_options_SUITEserver_keyboard_interactive< >0.006144sOk -1068ssh_options_SUITEserver_keyboard_interactive_extra_msg< >0.005568sOk -1069ssh_options_SUITEauth_method_kb_interactive_data_tuple< >0.010377sOk -1070ssh_options_SUITEauth_method_kb_interactive_data_fun3< >0.010126sOk -1071ssh_options_SUITEauth_method_kb_interactive_data_fun4< >0.010408sOk -1072ssh_options_SUITEauth_none< >0.005296sOk -ssh_options_SUITEdir_optionsinit_per_group< >0.000406sOk -1073ssh_options_SUITEdir_optionsuser_dir_option< >0.000198sOk -1074ssh_options_SUITEdir_optionsuser_dir_fun_option< >0.016012sOk -1075ssh_options_SUITEdir_optionssystem_dir_option< >0.000429sOk +common_testcirc_bufinit_per_group< >0.000061sOkstart of circ_buf +1056ssh_dbg_SUITEcirc_bufcb_basic< >0.000008sOk +1057ssh_dbg_SUITEcirc_bufcb_print< >0.000386sOk +1058ssh_dbg_SUITEcirc_bufcb_macros_print< >0.000288sOk +common_testcirc_bufend_per_group< >0.000045sOkend of circ_buf +ssh_dbg_SUITEend_per_suite< >0.001365sOk +ssh_engine_SUITEinit_per_suite< >0.000803sOkFIPS mode not supported by Erlang/OTP +ssh_engine_SUITEdsa_keyinit_per_group< >0.003461sOk +1059ssh_engine_SUITEdsa_keysimple_connect< >0.015261sOk +ssh_engine_SUITEdsa_keyend_per_group< >0.000054sOk +ssh_engine_SUITErsa_keyinit_per_group< >0.002259sOk +1060ssh_engine_SUITErsa_keysimple_connect< >0.016948sOk +ssh_engine_SUITErsa_keyend_per_group< >0.000099sOk +ssh_engine_SUITEend_per_suite< >0.001411sOk +ssh_options_SUITEinit_per_suite< >0.000089sOkFIPS mode not supported by Erlang/OTP +1061ssh_options_SUITEconnectfun_disconnectfun_server< >0.006076sOk +1062ssh_options_SUITEconnectfun_disconnectfun_client< >0.005477sOk +1063ssh_options_SUITEserver_password_option< >0.009547sOk +1064ssh_options_SUITEserver_userpassword_option< >0.013525sOk +1065ssh_options_SUITEserver_pwdfun_option< >0.013702sOk +1066ssh_options_SUITEserver_pwdfun_4_option< >0.025437sOk +1067ssh_options_SUITEserver_keyboard_interactive< >0.006662sOk +1068ssh_options_SUITEserver_keyboard_interactive_extra_msg< >0.006067sOk +1069ssh_options_SUITEauth_method_kb_interactive_data_tuple< >0.009933sOk +1070ssh_options_SUITEauth_method_kb_interactive_data_fun3< >0.011248sOk +1071ssh_options_SUITEauth_method_kb_interactive_data_fun4< >0.010072sOk +1072ssh_options_SUITEauth_none< >0.005533sOk +ssh_options_SUITEdir_optionsinit_per_group< >0.000334sOk +1073ssh_options_SUITEdir_optionsuser_dir_option< >0.000183sOk +1074ssh_options_SUITEdir_optionsuser_dir_fun_option< >0.014803sOk +1075ssh_options_SUITEdir_optionssystem_dir_option< >0.000351sOk ssh_options_SUITEdir_optionsend_per_group< >0.000000sOk -1076ssh_options_SUITEssh_connect_timeout< >0.000069sOk -1077ssh_options_SUITEssh_connect_arg4_timeout< >1.001266sOk -1078ssh_options_SUITEssh_daemon_minimal_remote_max_packet_size_option< >0.006212sOk -1079ssh_options_SUITEssh_msg_debug_fun_option_client< >0.006037sOk -1080ssh_options_SUITEssh_msg_debug_fun_option_server< >0.006170sOk -1081ssh_options_SUITEdisconnectfun_option_server< >0.006204sOk -1082ssh_options_SUITEdisconnectfun_option_client< >0.006012sOk -1083ssh_options_SUITEunexpectedfun_option_server< >0.005378sOk -1084ssh_options_SUITEunexpectedfun_option_client< >0.005638sOk -1085ssh_options_SUITEhostkey_fingerprint_check< >0.007179sOk -1086ssh_options_SUITEhostkey_fingerprint_check_md5< >0.007519sOk -1087ssh_options_SUITEhostkey_fingerprint_check_sha< >0.006675sOk -1088ssh_options_SUITEhostkey_fingerprint_check_sha256< >0.006897sOk -1089ssh_options_SUITEhostkey_fingerprint_check_sha384< >0.006620sOk -1090ssh_options_SUITEhostkey_fingerprint_check_sha512< >0.006920sOk -1091ssh_options_SUITEhostkey_fingerprint_check_list< >0.007189sOk -1092ssh_options_SUITEid_string_no_opt_client< >0.002208sOk -1093ssh_options_SUITEid_string_own_string_client< >0.002141sOk -1094ssh_options_SUITEid_string_own_string_client_trail_space< >0.002064sOk -1095ssh_options_SUITEid_string_random_client< >0.002177sOk -1096ssh_options_SUITEid_string_no_opt_server< >0.003080sOk -1097ssh_options_SUITEid_string_own_string_server< >0.002626sOk -1098ssh_options_SUITEid_string_own_string_server_trail_space< >0.002716sOk -1099ssh_options_SUITEid_string_random_server< >0.002899sOk -1100ssh_options_SUITEmax_log_item_len< >0.005746sOk -1101ssh_options_SUITEsave_accepted_host_option< >0.009378sOk -1102ssh_options_SUITEraw_option< >0.000186sOk -1103ssh_options_SUITEconfig_file< >0.383049sOk -1104ssh_options_SUITEconfig_file_modify_algorithms_order< >0.297020sOk -1105ssh_options_SUITEdaemon_replace_options_simple< >0.002192sOk -1106ssh_options_SUITEdaemon_replace_options_algs< >0.002191sOk -1107ssh_options_SUITEdaemon_replace_options_algs_connect< >0.030035sOk -1108ssh_options_SUITEdaemon_replace_options_algs_conf_file< >0.253687sOk -ssh_options_SUITEhardening_testsinit_per_group< >0.009708sOk -1109ssh_options_SUITEhardening_testsssh_connect_nonegtimeout_connected_parallel< >5.511304sOk -1110ssh_options_SUITEhardening_testsssh_connect_nonegtimeout_connected_sequential< >5.510036sOk -1111ssh_options_SUITEhardening_testsssh_connect_negtimeout_parallel< >4.002820sOk -1112ssh_options_SUITEhardening_testsssh_connect_negtimeout_sequential< >4.002858sOk -1113ssh_options_SUITEhardening_testsmax_sessions_ssh_connect_parallel< >0.036410sOk -1114ssh_options_SUITEhardening_testsmax_sessions_ssh_connect_sequential< >0.036343sOk -1115ssh_options_SUITEhardening_testsmax_sessions_sftp_start_channel_parallel< >0.138194sOk -1116ssh_options_SUITEhardening_testsmax_sessions_sftp_start_channel_sequential< >0.142152sOk -1117ssh_options_SUITEhardening_testsmax_sessions_drops_tcp_connects< >64.449975sOk -ssh_options_SUITEhardening_testsend_per_group< >0.000000sOk -ssh_options_SUITEend_per_suite< >0.000010sOk -ssh_property_test_SUITEinit_per_suite< >0.353937sOkFIPS mode not supported by Erlang/OTP +1076ssh_options_SUITEssh_connect_timeout< >0.000077sOk +1077ssh_options_SUITEssh_connect_arg4_timeout< >1.001323sOk +1078ssh_options_SUITEssh_daemon_minimal_remote_max_packet_size_option< >0.006850sOk +1079ssh_options_SUITEssh_msg_debug_fun_option_client< >0.005928sOk +1080ssh_options_SUITEssh_msg_debug_fun_option_server< >0.005980sOk +1081ssh_options_SUITEdisconnectfun_option_server< >0.006176sOk +1082ssh_options_SUITEdisconnectfun_option_client< >0.005913sOk +1083ssh_options_SUITEunexpectedfun_option_server< >0.005543sOk +1084ssh_options_SUITEunexpectedfun_option_client< >0.005567sOk +1085ssh_options_SUITEhostkey_fingerprint_check< >0.007340sOk +1086ssh_options_SUITEhostkey_fingerprint_check_md5< >0.007209sOk +1087ssh_options_SUITEhostkey_fingerprint_check_sha< >0.007068sOk +1088ssh_options_SUITEhostkey_fingerprint_check_sha256< >0.006714sOk +1089ssh_options_SUITEhostkey_fingerprint_check_sha384< >0.006343sOk +1090ssh_options_SUITEhostkey_fingerprint_check_sha512< >0.006861sOk +1091ssh_options_SUITEhostkey_fingerprint_check_list< >0.008278sOk +1092ssh_options_SUITEid_string_no_opt_client< >0.001872sOk +1093ssh_options_SUITEid_string_own_string_client< >0.001892sOk +1094ssh_options_SUITEid_string_own_string_client_trail_space< >0.001665sOk +1095ssh_options_SUITEid_string_random_client< >0.001666sOk +1096ssh_options_SUITEid_string_no_opt_server< >0.002941sOk +1097ssh_options_SUITEid_string_own_string_server< >0.002523sOk +1098ssh_options_SUITEid_string_own_string_server_trail_space< >0.002672sOk +1099ssh_options_SUITEid_string_random_server< >0.002713sOk +1100ssh_options_SUITEmax_log_item_len< >0.005802sOk +1101ssh_options_SUITEsave_accepted_host_option< >0.009696sOk +1102ssh_options_SUITEraw_option< >0.000124sOk +1103ssh_options_SUITEconfig_file< >0.396023sOk +1104ssh_options_SUITEconfig_file_modify_algorithms_order< >0.314074sOk +1105ssh_options_SUITEdaemon_replace_options_simple< >0.002639sOk +1106ssh_options_SUITEdaemon_replace_options_algs< >0.002260sOk +1107ssh_options_SUITEdaemon_replace_options_algs_connect< >0.032511sOk +1108ssh_options_SUITEdaemon_replace_options_algs_conf_file< >0.291500sOk +ssh_options_SUITEhardening_testsinit_per_group< >0.010508sOk +1109ssh_options_SUITEhardening_testsssh_connect_nonegtimeout_connected_parallel< >5.511989sOk +1110ssh_options_SUITEhardening_testsssh_connect_nonegtimeout_connected_sequential< >5.511822sOk +1111ssh_options_SUITEhardening_testsssh_connect_negtimeout_parallel< >4.002629sOk +1112ssh_options_SUITEhardening_testsssh_connect_negtimeout_sequential< >4.003170sOk +1113ssh_options_SUITEhardening_testsmax_sessions_ssh_connect_parallel< >0.036715sOk +1114ssh_options_SUITEhardening_testsmax_sessions_ssh_connect_sequential< >0.036746sOk +1115ssh_options_SUITEhardening_testsmax_sessions_sftp_start_channel_parallel< >0.140248sOk +1116ssh_options_SUITEhardening_testsmax_sessions_sftp_start_channel_sequential< >0.139463sOk +1117ssh_options_SUITEhardening_testsmax_sessions_drops_tcp_connects< >65.499672sOk +ssh_options_SUITEhardening_testsend_per_group< >0.000000sOk +ssh_options_SUITEend_per_suite< >0.000005sOk +ssh_property_test_SUITEinit_per_suite< >0.360488sOkFIPS mode not supported by Erlang/OTP ssh_property_test_SUITEmessagesinit_per_group< >0.000000sOk -1118ssh_property_test_SUITEmessagesdecode< >0.021983sOk -1119ssh_property_test_SUITEmessagesdecode_encode< >0.018331sOk +1118ssh_property_test_SUITEmessagesdecode< >0.025420sOk +1119ssh_property_test_SUITEmessagesdecode_encode< >0.021341sOk ssh_property_test_SUITEmessagesend_per_group< >0.000000sOk -1120ssh_property_test_SUITEclient_sends_info_timing< >120.827165sOk -ssh_property_test_SUITEclient_serverinit_per_group< >0.000000sOk -1121ssh_property_test_SUITEclient_serverclient_server_sequential< >1.197133sOk -1122ssh_property_test_SUITEclient_serverclient_server_parallel< >8.178450sOk -ssh_property_test_SUITEclient_serverend_per_group< >0.000000sOk +1120ssh_property_test_SUITEclient_sends_info_timing< >119.863862sOk +ssh_property_test_SUITEclient_serverinit_per_group< >0.000000sOk +1121ssh_property_test_SUITEclient_serverclient_server_sequential< >1.303733sOk +1122ssh_property_test_SUITEclient_serverclient_server_parallel< >4.674783sOk +ssh_property_test_SUITEclient_serverend_per_group< >0.000000sOk ssh_property_test_SUITEend_per_suite< >0.000000sOk -ssh_protocol_SUITEinit_per_suite< >0.015723sOkFIPS mode not supported by Erlang/OTP -common_testtool_testsinit_per_group< >0.000054sOkstart of tool_tests -1123ssh_protocol_SUITEtool_testslib_works_as_client< >0.094441sOk -1124ssh_protocol_SUITEtool_testslib_works_as_server< >0.014510sOk -1125ssh_protocol_SUITEtool_testslib_match< >0.000295sOk -1126ssh_protocol_SUITEtool_testslib_no_match< >0.000092sOk -common_testtool_testsend_per_group< >0.000035sOkend of tool_tests -1127ssh_protocol_SUITEclient_info_line< >1.008870sOk -common_testkexinit_per_group< >0.000043sOkstart of kex -1128ssh_protocol_SUITEkexno_common_alg_server_disconnects< >0.002750sOk -1129ssh_protocol_SUITEkexno_common_alg_client_disconnects< >0.003522sOk -1130ssh_protocol_SUITEkexgex_client_init_option_groups< >0.043695sOk -1131ssh_protocol_SUITEkexgex_server_gex_limit< >0.043072sOk -1132ssh_protocol_SUITEkexgex_client_init_option_groups_moduli_file< >0.043675sOk -1133ssh_protocol_SUITEkexgex_client_init_option_groups_file< >0.047049sOk -1134ssh_protocol_SUITEkexgex_client_old_request_exact< >0.043232sOk -1135ssh_protocol_SUITEkexgex_client_old_request_noexact< >0.043306sOk -1136ssh_protocol_SUITEkexkex_strict_negotiated< >0.512537sOk -1137ssh_protocol_SUITEkexkex_strict_msg_ignore< >0.655613sOk -1138ssh_protocol_SUITEkexkex_strict_msg_unknown< >0.656345sOk -common_testkexend_per_group< >0.000030sOkend of kex -common_testservice_requestsinit_per_group< >0.000036sOkstart of service_requests -1139ssh_protocol_SUITEservice_requestsbad_service_name< >0.054957sOk -1140ssh_protocol_SUITEservice_requestsbad_long_service_name< >0.059738sOk -1141ssh_protocol_SUITEservice_requestsbad_very_long_service_name< >0.135262sOk -1142ssh_protocol_SUITEservice_requestsempty_service_name< >0.093238sOk -1143ssh_protocol_SUITEservice_requestsbad_service_name_then_correct< >0.092536sOk -common_testservice_requestsend_per_group< >0.000054sOkend of service_requests -common_testauthenticationinit_per_group< >0.000032sOkstart of authentication -1144ssh_protocol_SUITEauthenticationclient_handles_keyboard_interactive_0_pwds< >0.015176sOk -1145ssh_protocol_SUITEauthenticationclient_handles_banner_keyboard_interactive< >0.015164sOk -common_testauthenticationend_per_group< >0.000033sOkend of authentication -common_testpacket_size_errorinit_per_group< >0.000059sOkstart of packet_size_error -1146ssh_protocol_SUITEpacket_size_errorpacket_length_too_large< >0.054506sOk -1147ssh_protocol_SUITEpacket_size_errorpacket_length_too_short< >0.093157sOk -common_testpacket_size_errorend_per_group< >0.000034sOkend of packet_size_error -common_testfield_size_errorinit_per_group< >0.000033sOkstart of field_size_error -1148ssh_protocol_SUITEfield_size_errorservice_name_length_too_large< >0.054592sOk -1149ssh_protocol_SUITEfield_size_errorservice_name_length_too_short< >0.054721sOk -common_testfield_size_errorend_per_group< >0.000063sOkend of field_size_error -common_testext_infoinit_per_group< >0.000034sOkstart of ext_info -1150ssh_protocol_SUITEext_infono_ext_info_s1< >0.055900sOk -1151ssh_protocol_SUITEext_infono_ext_info_s2< >0.056470sOk -1152ssh_protocol_SUITEext_infoext_info_s< >0.015863sOk -1153ssh_protocol_SUITEext_infoext_info_c< >0.016451sOk -common_testext_infoend_per_group< >0.000033sOkend of ext_info -common_testpreferred_algorithmsinit_per_group< >0.000031sOkstart of preferred_algorithms -1154ssh_protocol_SUITEpreferred_algorithmspreferred_algorithms< >0.000345sOk -1155ssh_protocol_SUITEpreferred_algorithmsmodify_append< >0.004226sOk -1156ssh_protocol_SUITEpreferred_algorithmsmodify_prepend< >0.004494sOk -1157ssh_protocol_SUITEpreferred_algorithmsmodify_rm< >0.004497sOk -1158ssh_protocol_SUITEpreferred_algorithmsmodify_combo< >0.004356sOk -common_testpreferred_algorithmsend_per_group< >0.000034sOkend of preferred_algorithms -common_testclient_close_earlyinit_per_group< >0.000038sOkstart of client_close_early -1159ssh_protocol_SUITEclient_close_earlyclient_close_after_hello< >30.203288sOk -common_testclient_close_earlyend_per_group< >0.000043sOkend of client_close_early -ssh_protocol_SUITEend_per_suite< >0.002157sOk -ssh_pubkey_SUITEinit_per_suite< >0.000471sOkFIPS mode not supported by Erlang/OTP +ssh_protocol_SUITEinit_per_suite< >0.012597sOkFIPS mode not supported by Erlang/OTP +common_testtool_testsinit_per_group< >0.000034sOkstart of tool_tests +1123ssh_protocol_SUITEtool_testslib_works_as_client< >0.094407sOk +1124ssh_protocol_SUITEtool_testslib_works_as_server< >0.014316sOk +1125ssh_protocol_SUITEtool_testslib_match< >0.000333sOk +1126ssh_protocol_SUITEtool_testslib_no_match< >0.000118sOk +common_testtool_testsend_per_group< >0.000051sOkend of tool_tests +1127ssh_protocol_SUITEclient_info_line< >1.007670sOk +common_testkexinit_per_group< >0.000062sOkstart of kex +1128ssh_protocol_SUITEkexno_common_alg_server_disconnects< >0.003161sOk +1129ssh_protocol_SUITEkexno_common_alg_client_disconnects< >0.003573sOk +1130ssh_protocol_SUITEkexgex_client_init_option_groups< >0.043959sOk +1131ssh_protocol_SUITEkexgex_server_gex_limit< >0.043461sOk +1132ssh_protocol_SUITEkexgex_client_init_option_groups_moduli_file< >0.044941sOk +1133ssh_protocol_SUITEkexgex_client_init_option_groups_file< >0.046554sOk +1134ssh_protocol_SUITEkexgex_client_old_request_exact< >0.043943sOk +1135ssh_protocol_SUITEkexgex_client_old_request_noexact< >0.043478sOk +1136ssh_protocol_SUITEkexkex_strict_negotiated< >0.513507sOk +1137ssh_protocol_SUITEkexkex_strict_msg_ignore< >0.655339sOk +1138ssh_protocol_SUITEkexkex_strict_msg_unknown< >0.655065sOk +common_testkexend_per_group< >0.000029sOkend of kex +common_testservice_requestsinit_per_group< >0.000032sOkstart of service_requests +1139ssh_protocol_SUITEservice_requestsbad_service_name< >0.054347sOk +1140ssh_protocol_SUITEservice_requestsbad_long_service_name< >0.095979sOk +1141ssh_protocol_SUITEservice_requestsbad_very_long_service_name< >0.133881sOk +1142ssh_protocol_SUITEservice_requestsempty_service_name< >0.093047sOk +1143ssh_protocol_SUITEservice_requestsbad_service_name_then_correct< >0.092643sOk +common_testservice_requestsend_per_group< >0.000035sOkend of service_requests +common_testauthenticationinit_per_group< >0.000031sOkstart of authentication +1144ssh_protocol_SUITEauthenticationclient_handles_keyboard_interactive_0_pwds< >0.015421sOk +1145ssh_protocol_SUITEauthenticationclient_handles_banner_keyboard_interactive< >0.015522sOk +common_testauthenticationend_per_group< >0.000036sOkend of authentication +common_testpacket_size_errorinit_per_group< >0.000036sOkstart of packet_size_error +1146ssh_protocol_SUITEpacket_size_errorpacket_length_too_large< >0.093074sOk +1147ssh_protocol_SUITEpacket_size_errorpacket_length_too_short< >0.092735sOk +common_testpacket_size_errorend_per_group< >0.000060sOkend of packet_size_error +common_testfield_size_errorinit_per_group< >0.000047sOkstart of field_size_error +1148ssh_protocol_SUITEfield_size_errorservice_name_length_too_large< >0.054938sOk +1149ssh_protocol_SUITEfield_size_errorservice_name_length_too_short< >0.092845sOk +common_testfield_size_errorend_per_group< >0.000050sOkend of field_size_error +common_testext_infoinit_per_group< >0.000043sOkstart of ext_info +1150ssh_protocol_SUITEext_infono_ext_info_s1< >0.094107sOk +1151ssh_protocol_SUITEext_infono_ext_info_s2< >0.056956sOk +1152ssh_protocol_SUITEext_infoext_info_s< >0.015581sOk +1153ssh_protocol_SUITEext_infoext_info_c< >0.016285sOk +common_testext_infoend_per_group< >0.000049sOkend of ext_info +common_testpreferred_algorithmsinit_per_group< >0.000034sOkstart of preferred_algorithms +1154ssh_protocol_SUITEpreferred_algorithmspreferred_algorithms< >0.000355sOk +1155ssh_protocol_SUITEpreferred_algorithmsmodify_append< >0.004171sOk +1156ssh_protocol_SUITEpreferred_algorithmsmodify_prepend< >0.004150sOk +1157ssh_protocol_SUITEpreferred_algorithmsmodify_rm< >0.004341sOk +1158ssh_protocol_SUITEpreferred_algorithmsmodify_combo< >0.004424sOk +common_testpreferred_algorithmsend_per_group< >0.000038sOkend of preferred_algorithms +common_testclient_close_earlyinit_per_group< >0.000035sOkstart of client_close_early +1159ssh_protocol_SUITEclient_close_earlyclient_close_after_hello< >30.221634sOk +common_testclient_close_earlyend_per_group< >0.000042sOkend of client_close_early +ssh_protocol_SUITEend_per_suite< >0.001527sOk +ssh_pubkey_SUITEinit_per_suite< >0.000518sOkFIPS mode not supported by Erlang/OTP ssh_pubkey_SUITEold_formatinit_per_group< >0.000002sOk -1160ssh_pubkey_SUITEold_formatcheck_dsa_disabled< >0.008211sOk -1161ssh_pubkey_SUITEold_formatcheck_rsa_sha1_disabled< >0.007287sOk -1162ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_rsa_sha2< >0.009393sOk -1163ssh_pubkey_SUITEold_formatconnect_rsa_sha1_to_dsa< >0.009914sOk -1164ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_dsa< >0.008958sOk -1165ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_ecdsa< >0.009052sOk -1166ssh_pubkey_SUITEold_formatconnect_dsa_to_rsa_sha2< >0.009096sOk -1167ssh_pubkey_SUITEold_formatconnect_dsa_to_dsa< >0.007747sOk -1168ssh_pubkey_SUITEold_formatconnect_dsa_to_ecdsa< >0.007899sOk -1169ssh_pubkey_SUITEold_formatconnect_ecdsa_to_rsa_sha2< >0.008325sOk -1170ssh_pubkey_SUITEold_formatconnect_ecdsa_to_dsa< >0.007695sOk -1171ssh_pubkey_SUITEold_formatconnect_ecdsa_to_ecdsa< >0.008290sOk -1172ssh_pubkey_SUITEold_formatconnect_dsa_to_ed25519< >0.008156sOk -1173ssh_pubkey_SUITEold_formatconnect_ecdsa_to_ed25519< >0.008201sOk -1174ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_ed25519< >0.008433sOk -1175ssh_pubkey_SUITEold_formatconnect_dsa_to_ed448< >0.008398sOk -1176ssh_pubkey_SUITEold_formatconnect_ecdsa_to_ed448< >0.008515sOk -1177ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_ed448< >0.009394sOk -ssh_pubkey_SUITEpassphraseinit_per_group< >0.000005sOk -1178ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_rsa_sha2< >0.011308sOk -1179ssh_pubkey_SUITEpassphraseconnect_rsa_sha1_to_dsa< >0.008837sOk -1180ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_dsa< >0.008629sOk -1181ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_ecdsa< >0.008412sOk -1182ssh_pubkey_SUITEpassphraseconnect_dsa_to_rsa_sha2< >0.009217sOk -1183ssh_pubkey_SUITEpassphraseconnect_dsa_to_dsa< >0.007421sOk -1184ssh_pubkey_SUITEpassphraseconnect_dsa_to_ecdsa< >0.007530sOk -1185ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_rsa_sha2< >0.008944sOk -1186ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_dsa< >0.008051sOk -1187ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_ecdsa< >0.007921sOk -1188ssh_pubkey_SUITEpassphraseconnect_dsa_to_ed25519< >0.008142sOk -1189ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_ed25519< >0.007815sOk -1190ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_ed25519< >0.008488sOk -1191ssh_pubkey_SUITEpassphraseconnect_dsa_to_ed448< >0.008015sOk -1192ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_ed448< >0.008085sOk -1193ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_ed448< >0.009991sOk +1160ssh_pubkey_SUITEold_formatcheck_dsa_disabled< >0.008464sOk +1161ssh_pubkey_SUITEold_formatcheck_rsa_sha1_disabled< >0.007894sOk +1162ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_rsa_sha2< >0.009561sOk +1163ssh_pubkey_SUITEold_formatconnect_rsa_sha1_to_dsa< >0.009215sOk +1164ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_dsa< >0.009376sOk +1165ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_ecdsa< >0.008599sOk +1166ssh_pubkey_SUITEold_formatconnect_dsa_to_rsa_sha2< >0.009382sOk +1167ssh_pubkey_SUITEold_formatconnect_dsa_to_dsa< >0.007624sOk +1168ssh_pubkey_SUITEold_formatconnect_dsa_to_ecdsa< >0.007767sOk +1169ssh_pubkey_SUITEold_formatconnect_ecdsa_to_rsa_sha2< >0.009095sOk +1170ssh_pubkey_SUITEold_formatconnect_ecdsa_to_dsa< >0.007547sOk +1171ssh_pubkey_SUITEold_formatconnect_ecdsa_to_ecdsa< >0.008225sOk +1172ssh_pubkey_SUITEold_formatconnect_dsa_to_ed25519< >0.008529sOk +1173ssh_pubkey_SUITEold_formatconnect_ecdsa_to_ed25519< >0.007770sOk +1174ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_ed25519< >0.009549sOk +1175ssh_pubkey_SUITEold_formatconnect_dsa_to_ed448< >0.008292sOk +1176ssh_pubkey_SUITEold_formatconnect_ecdsa_to_ed448< >0.008244sOk +1177ssh_pubkey_SUITEold_formatconnect_rsa_sha2_to_ed448< >0.009588sOk +ssh_pubkey_SUITEpassphraseinit_per_group< >0.000007sOk +1178ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_rsa_sha2< >0.011527sOk +1179ssh_pubkey_SUITEpassphraseconnect_rsa_sha1_to_dsa< >0.009115sOk +1180ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_dsa< >0.009834sOk +1181ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_ecdsa< >0.008850sOk +1182ssh_pubkey_SUITEpassphraseconnect_dsa_to_rsa_sha2< >0.009305sOk +1183ssh_pubkey_SUITEpassphraseconnect_dsa_to_dsa< >0.008024sOk +1184ssh_pubkey_SUITEpassphraseconnect_dsa_to_ecdsa< >0.008045sOk +1185ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_rsa_sha2< >0.008995sOk +1186ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_dsa< >0.008061sOk +1187ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_ecdsa< >0.007982sOk +1188ssh_pubkey_SUITEpassphraseconnect_dsa_to_ed25519< >0.008242sOk +1189ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_ed25519< >0.007981sOk +1190ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_ed25519< >0.008981sOk +1191ssh_pubkey_SUITEpassphraseconnect_dsa_to_ed448< >0.009050sOk +1192ssh_pubkey_SUITEpassphraseconnect_ecdsa_to_ed448< >0.008553sOk +1193ssh_pubkey_SUITEpassphraseconnect_rsa_sha2_to_ed448< >0.010235sOk ssh_pubkey_SUITEpassphraseend_per_group< >0.000000sOk -ssh_pubkey_SUITEold_formatend_per_group< >0.000000sOk -ssh_pubkey_SUITEnew_formatinit_per_group< >0.000002sOk -1194ssh_pubkey_SUITEnew_formatconnect_ed25519_to_dsa< >0.007605sOk -1195ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ecdsa< >0.007646sOk -1196ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed448< >0.008844sOk -1197ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed25519< >0.007507sOk -1198ssh_pubkey_SUITEnew_formatconnect_ed25519_to_rsa_sha2< >0.010051sOk -1199ssh_pubkey_SUITEnew_formatconnect_ed448_to_dsa< >0.008243sOk -1200ssh_pubkey_SUITEnew_formatconnect_ed448_to_ecdsa< >0.008223sOk -1201ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed25519< >0.008181sOk -1202ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed448< >0.008991sOk -1203ssh_pubkey_SUITEnew_formatconnect_ed448_to_rsa_sha2< >0.010895sOk -1204ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_rsa_sha2< >0.012595sOk -1205ssh_pubkey_SUITEnew_formatconnect_rsa_sha1_to_dsa< >0.010203sOk -1206ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_dsa< >0.010654sOk -1207ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ecdsa< >0.010128sOk -1208ssh_pubkey_SUITEnew_formatconnect_dsa_to_rsa_sha2< >0.010022sOk -1209ssh_pubkey_SUITEnew_formatconnect_dsa_to_dsa< >0.007840sOk -1210ssh_pubkey_SUITEnew_formatconnect_dsa_to_ecdsa< >0.007090sOk -1211ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_rsa_sha2< >0.009572sOk -1212ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_dsa< >0.007566sOk -1213ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ecdsa< >0.007369sOk -1214ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed25519< >0.007937sOk -1215ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed25519< >0.007397sOk -1216ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed25519< >0.011247sOk -1217ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed448< >0.008418sOk -1218ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed448< >0.008467sOk -1219ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed448< >0.011705sOk -ssh_pubkey_SUITEnew_formatend_per_group< >0.000000sOk -ssh_pubkey_SUITEoption_spaceinit_per_group< >0.000001sOk -ssh_pubkey_SUITEnew_formatinit_per_group< >0.000002sOk -1220ssh_pubkey_SUITEnew_formatconnect_ed25519_to_dsa< >0.008372sOk -1221ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ecdsa< >0.007380sOk -1222ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed448< >0.009363sOk -1223ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed25519< >0.007781sOk -1224ssh_pubkey_SUITEnew_formatconnect_ed25519_to_rsa_sha2< >0.010700sOk -1225ssh_pubkey_SUITEnew_formatconnect_ed448_to_dsa< >0.009203sOk -1226ssh_pubkey_SUITEnew_formatconnect_ed448_to_ecdsa< >0.007900sOk -1227ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed25519< >0.008526sOk -1228ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed448< >0.009332sOk -1229ssh_pubkey_SUITEnew_formatconnect_ed448_to_rsa_sha2< >0.010847sOk -1230ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_rsa_sha2< >0.013189sOk -1231ssh_pubkey_SUITEnew_formatconnect_rsa_sha1_to_dsa< >0.010667sOk -1232ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_dsa< >0.010615sOk -1233ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ecdsa< >0.010926sOk -1234ssh_pubkey_SUITEnew_formatconnect_dsa_to_rsa_sha2< >0.011078sOk -1235ssh_pubkey_SUITEnew_formatconnect_dsa_to_dsa< >0.008189sOk -1236ssh_pubkey_SUITEnew_formatconnect_dsa_to_ecdsa< >0.007840sOk -1237ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_rsa_sha2< >0.010105sOk -1238ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_dsa< >0.008115sOk -1239ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ecdsa< >0.008193sOk -1240ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed25519< >0.007509sOk -1241ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed25519< >0.007711sOk -1242ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed25519< >0.010689sOk -1243ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed448< >0.008336sOk -1244ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed448< >0.008722sOk -1245ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed448< >0.011122sOk -ssh_pubkey_SUITEnew_formatend_per_group< >0.000000sOk -ssh_pubkey_SUITEoption_spaceend_per_group< >0.000000sOk -ssh_pubkey_SUITEssh_hostkey_fingerprintinit_per_group< >0.000000sOk -1246ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_md5_implicit< >0.000068sOk +ssh_pubkey_SUITEold_formatend_per_group< >0.000000sOk +ssh_pubkey_SUITEnew_formatinit_per_group< >0.000002sOk +1194ssh_pubkey_SUITEnew_formatconnect_ed25519_to_dsa< >0.008767sOk +1195ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ecdsa< >0.007228sOk +1196ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed448< >0.008972sOk +1197ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed25519< >0.008854sOk +1198ssh_pubkey_SUITEnew_formatconnect_ed25519_to_rsa_sha2< >0.010435sOk +1199ssh_pubkey_SUITEnew_formatconnect_ed448_to_dsa< >0.008444sOk +1200ssh_pubkey_SUITEnew_formatconnect_ed448_to_ecdsa< >0.008727sOk +1201ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed25519< >0.008593sOk +1202ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed448< >0.008662sOk +1203ssh_pubkey_SUITEnew_formatconnect_ed448_to_rsa_sha2< >0.010971sOk +1204ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_rsa_sha2< >0.012807sOk +1205ssh_pubkey_SUITEnew_formatconnect_rsa_sha1_to_dsa< >0.010394sOk +1206ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_dsa< >0.010071sOk +1207ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ecdsa< >0.009637sOk +1208ssh_pubkey_SUITEnew_formatconnect_dsa_to_rsa_sha2< >0.010518sOk +1209ssh_pubkey_SUITEnew_formatconnect_dsa_to_dsa< >0.008400sOk +1210ssh_pubkey_SUITEnew_formatconnect_dsa_to_ecdsa< >0.007473sOk +1211ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_rsa_sha2< >0.010797sOk +1212ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_dsa< >0.008287sOk +1213ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ecdsa< >0.007701sOk +1214ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed25519< >0.007901sOk +1215ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed25519< >0.008527sOk +1216ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed25519< >0.009832sOk +1217ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed448< >0.008463sOk +1218ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed448< >0.008470sOk +1219ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed448< >0.011810sOk +ssh_pubkey_SUITEnew_formatend_per_group< >0.000000sOk +ssh_pubkey_SUITEoption_spaceinit_per_group< >0.000001sOk +ssh_pubkey_SUITEnew_formatinit_per_group< >0.000002sOk +1220ssh_pubkey_SUITEnew_formatconnect_ed25519_to_dsa< >0.008550sOk +1221ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ecdsa< >0.010246sOk +1222ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed448< >0.009002sOk +1223ssh_pubkey_SUITEnew_formatconnect_ed25519_to_ed25519< >0.009362sOk +1224ssh_pubkey_SUITEnew_formatconnect_ed25519_to_rsa_sha2< >0.013560sOk +1225ssh_pubkey_SUITEnew_formatconnect_ed448_to_dsa< >0.010044sOk +1226ssh_pubkey_SUITEnew_formatconnect_ed448_to_ecdsa< >0.008513sOk +1227ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed25519< >0.008706sOk +1228ssh_pubkey_SUITEnew_formatconnect_ed448_to_ed448< >0.009054sOk +1229ssh_pubkey_SUITEnew_formatconnect_ed448_to_rsa_sha2< >0.011640sOk +1230ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_rsa_sha2< >0.013725sOk +1231ssh_pubkey_SUITEnew_formatconnect_rsa_sha1_to_dsa< >0.010663sOk +1232ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_dsa< >0.011115sOk +1233ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ecdsa< >0.010834sOk +1234ssh_pubkey_SUITEnew_formatconnect_dsa_to_rsa_sha2< >0.010689sOk +1235ssh_pubkey_SUITEnew_formatconnect_dsa_to_dsa< >0.007931sOk +1236ssh_pubkey_SUITEnew_formatconnect_dsa_to_ecdsa< >0.008345sOk +1237ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_rsa_sha2< >0.010027sOk +1238ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_dsa< >0.007977sOk +1239ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ecdsa< >0.007859sOk +1240ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed25519< >0.008556sOk +1241ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed25519< >0.007841sOk +1242ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed25519< >0.010366sOk +1243ssh_pubkey_SUITEnew_formatconnect_dsa_to_ed448< >0.008493sOk +1244ssh_pubkey_SUITEnew_formatconnect_ecdsa_to_ed448< >0.008920sOk +1245ssh_pubkey_SUITEnew_formatconnect_rsa_sha2_to_ed448< >0.012233sOk +ssh_pubkey_SUITEnew_formatend_per_group< >0.000000sOk +ssh_pubkey_SUITEoption_spaceend_per_group< >0.000000sOk +ssh_pubkey_SUITEssh_hostkey_fingerprintinit_per_group< >0.000000sOk +1246ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_md5_implicit< >0.000094sOk 1247ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_md5< >0.000048sOk -1248ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_sha< >0.000029sOk +1248ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_sha< >0.000037sOk 1249ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_sha256< >0.000037sOk -1250ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_sha384< >0.000040sOk -1251ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_sha512< >0.000034sOk -1252ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_list< >0.000044sOk -ssh_pubkey_SUITEssh_hostkey_fingerprintend_per_group< >0.000000sOk -ssh_pubkey_SUITEssh_public_key_decode_encodeinit_per_group< >0.000003sOk -1253ssh_pubkey_SUITEssh_public_key_decode_encodessh_rsa_public_key< >0.000250sOk -1254ssh_pubkey_SUITEssh_public_key_decode_encodessh_dsa_public_key< >0.000226sOk -1255ssh_pubkey_SUITEssh_public_key_decode_encodessh_ecdsa_public_key< >0.000180sOk -1256ssh_pubkey_SUITEssh_public_key_decode_encodessh_rfc4716_rsa_comment< >0.000076sOk -1257ssh_pubkey_SUITEssh_public_key_decode_encodessh_rfc4716_dsa_comment< >0.000114sOk -1258ssh_pubkey_SUITEssh_public_key_decode_encodessh_rfc4716_rsa_subject< >0.000101sOk -1259ssh_pubkey_SUITEssh_public_key_decode_encodessh_list_public_key< >0.000893sOk -1260ssh_pubkey_SUITEssh_public_key_decode_encodessh_known_hosts< >0.000147sOk -1261ssh_pubkey_SUITEssh_public_key_decode_encodessh_auth_keys< >0.000347sOk -1262ssh_pubkey_SUITEssh_public_key_decode_encodessh_openssh_key_with_comment< >0.000077sOk -1263ssh_pubkey_SUITEssh_public_key_decode_encodessh_openssh_key_long_header< >0.000078sOk -ssh_pubkey_SUITEssh_public_key_decode_encodeend_per_group< >0.000000sOk -ssh_pubkey_SUITEpkcs8init_per_group< >0.000001sOk -1264ssh_pubkey_SUITEpkcs8ssh_hostkey_pkcs8< >0.013933sOk -ssh_pubkey_SUITEpkcs8end_per_group< >0.000000sOk -1265ssh_pubkey_SUITEchk_known_hosts< >0.014405sOk -ssh_pubkey_SUITEend_per_suite< >0.001698sOk -ssh_renegotiate_SUITEinit_per_suite< >0.011842sOkFIPS mode not supported by Erlang/OTP +1250ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_sha384< >0.000053sOk +1251ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_sha512< >0.000056sOk +1252ssh_pubkey_SUITEssh_hostkey_fingerprintssh_hostkey_fingerprint_list< >0.000084sOk +ssh_pubkey_SUITEssh_hostkey_fingerprintend_per_group< >0.000000sOk +ssh_pubkey_SUITEssh_public_key_decode_encodeinit_per_group< >0.000003sOk +1253ssh_pubkey_SUITEssh_public_key_decode_encodessh_rsa_public_key< >0.000276sOk +1254ssh_pubkey_SUITEssh_public_key_decode_encodessh_dsa_public_key< >0.000263sOk +1255ssh_pubkey_SUITEssh_public_key_decode_encodessh_ecdsa_public_key< >0.000197sOk +1256ssh_pubkey_SUITEssh_public_key_decode_encodessh_rfc4716_rsa_comment< >0.000092sOk +1257ssh_pubkey_SUITEssh_public_key_decode_encodessh_rfc4716_dsa_comment< >0.000140sOk +1258ssh_pubkey_SUITEssh_public_key_decode_encodessh_rfc4716_rsa_subject< >0.000106sOk +1259ssh_pubkey_SUITEssh_public_key_decode_encodessh_list_public_key< >0.001129sOk +1260ssh_pubkey_SUITEssh_public_key_decode_encodessh_known_hosts< >0.000170sOk +1261ssh_pubkey_SUITEssh_public_key_decode_encodessh_auth_keys< >0.000233sOk +1262ssh_pubkey_SUITEssh_public_key_decode_encodessh_openssh_key_with_comment< >0.000056sOk +1263ssh_pubkey_SUITEssh_public_key_decode_encodessh_openssh_key_long_header< >0.000073sOk +ssh_pubkey_SUITEssh_public_key_decode_encodeend_per_group< >0.000000sOk +ssh_pubkey_SUITEpkcs8init_per_group< >0.000002sOk +1264ssh_pubkey_SUITEpkcs8ssh_hostkey_pkcs8< >0.013531sOk +ssh_pubkey_SUITEpkcs8end_per_group< >0.000000sOk +1265ssh_pubkey_SUITEchk_known_hosts< >0.013458sOk +ssh_pubkey_SUITEend_per_suite< >0.001597sOk +ssh_renegotiate_SUITEinit_per_suite< >0.011874sOkFIPS mode not supported by Erlang/OTP ssh_renegotiate_SUITErenegotiateinit_per_group< >0.000000sOk -1266ssh_renegotiate_SUITErenegotiaterekey0< >60.089823sOk -1267ssh_renegotiate_SUITErenegotiaterekey1< >60.075187sOk -1268ssh_renegotiate_SUITErenegotiaterekey2< >60.085808sOk -1269ssh_renegotiate_SUITErenegotiaterekey3< >60.080838sOk -1270ssh_renegotiate_SUITErenegotiaterekey4< >60.071362sOk -1271ssh_renegotiate_SUITErenegotiaterekey_limit_client< >360.102161sOk -1272ssh_renegotiate_SUITErenegotiaterekey_limit_daemon< >360.101781sOk -1273ssh_renegotiate_SUITErenegotiaterekey_time_limit_client< >185.092377sOk -1274ssh_renegotiate_SUITErenegotiaterekey_time_limit_daemon< >185.089591sOk -1275ssh_renegotiate_SUITErenegotiatenorekey_limit_client< >120.089751sOk -1276ssh_renegotiate_SUITErenegotiatenorekey_limit_daemon< >120.093638sOk -1277ssh_renegotiate_SUITErenegotiaterenegotiate1< >2.147008sOk -1278ssh_renegotiate_SUITErenegotiaterenegotiate2< >2.157011sOk +1266ssh_renegotiate_SUITErenegotiaterekey0< >60.092782sOk +1267ssh_renegotiate_SUITErenegotiaterekey1< >60.073484sOk +1268ssh_renegotiate_SUITErenegotiaterekey2< >60.082504sOk +1269ssh_renegotiate_SUITErenegotiaterekey3< >60.076909sOk +1270ssh_renegotiate_SUITErenegotiaterekey4< >60.085074sOk +1271ssh_renegotiate_SUITErenegotiaterekey_limit_client< >360.099307sOk +1272ssh_renegotiate_SUITErenegotiaterekey_limit_daemon< >360.100099sOk +1273ssh_renegotiate_SUITErenegotiaterekey_time_limit_client< >185.089707sOk +1274ssh_renegotiate_SUITErenegotiaterekey_time_limit_daemon< >185.089042sOk +1275ssh_renegotiate_SUITErenegotiatenorekey_limit_client< >120.091493sOk +1276ssh_renegotiate_SUITErenegotiatenorekey_limit_daemon< >120.092524sOk +1277ssh_renegotiate_SUITErenegotiaterenegotiate1< >2.144901sOk +1278ssh_renegotiate_SUITErenegotiaterenegotiate2< >2.152993sOk ssh_renegotiate_SUITErenegotiateend_per_group< >0.000000sOk -ssh_renegotiate_SUITEend_per_suite< >0.001827sOk -ssh_sftp_SUITEinit_per_suite< >0.000652sOkFIPS mode not supported by Erlang/OTP -ssh_sftp_SUITEnot_unicodeinit_per_group< >0.002125sOkBegin [not_unicode] -ssh_sftp_SUITEerlang_serverinit_per_group< >0.001041sOkBegin [erlang_server,not_unicode] -ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000010sOkBegin [write_read_tests,erlang_server,not_unicode] -1279ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.005681sOk -1280ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000760sOk -1281ssh_sftp_SUITEwrite_read_testsread_file< >0.002743sOk -1282ssh_sftp_SUITEwrite_read_testsread_dir< >0.001219sOk -1283ssh_sftp_SUITEwrite_read_testswrite_file< >0.001284sOk -1284ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.007210sOk -1285ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.046519sOk -1286ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.048625sOk -1287ssh_sftp_SUITEwrite_read_testsrename_file< >0.003177sOk -1288ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.001332sOk -1289ssh_sftp_SUITEwrite_read_testsremove_file< >0.002475sOk -1290ssh_sftp_SUITEwrite_read_testslinks< >0.000667sOk -1291ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000473sOk -1292ssh_sftp_SUITEwrite_read_testsset_attributes< >0.001851sOk -1293ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.002874sOk -1294ssh_sftp_SUITEwrite_read_testsasync_read< >0.001028sOk -1295ssh_sftp_SUITEwrite_read_testsasync_write< >0.000951sOk -1296ssh_sftp_SUITEwrite_read_testsposition< >0.003268sOk -1297ssh_sftp_SUITEwrite_read_testspos_read< >0.002341sOk -1298ssh_sftp_SUITEwrite_read_testspos_write< >0.003603sOk -1299ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.429213sOk -ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000016sOkEnd [write_read_tests,erlang_server,not_unicode] -1300ssh_sftp_SUITEerlang_serverversion_option< >0.000841sOk -ssh_sftp_SUITEremote_tarinit_per_group< >0.021974sOkBegin [remote_tar,erlang_server,not_unicode] -1301ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.005320sOk -1302ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.005160sOk -1303ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000000sSKIPPEDUnicode test +ssh_renegotiate_SUITEend_per_suite< >0.001796sOk +ssh_sftp_SUITEinit_per_suite< >0.000545sOkFIPS mode not supported by Erlang/OTP +ssh_sftp_SUITEnot_unicodeinit_per_group< >0.001909sOkBegin [not_unicode] +ssh_sftp_SUITEerlang_serverinit_per_group< >0.001404sOkBegin [erlang_server,not_unicode] +ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000020sOkBegin [write_read_tests,erlang_server,not_unicode] +1279ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.005532sOk +1280ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000850sOk +1281ssh_sftp_SUITEwrite_read_testsread_file< >0.002833sOk +1282ssh_sftp_SUITEwrite_read_testsread_dir< >0.001408sOk +1283ssh_sftp_SUITEwrite_read_testswrite_file< >0.001319sOk +1284ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.007705sOk +1285ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.045563sOk +1286ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.046843sOk +1287ssh_sftp_SUITEwrite_read_testsrename_file< >0.002785sOk +1288ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.001335sOk +1289ssh_sftp_SUITEwrite_read_testsremove_file< >0.002566sOk +1290ssh_sftp_SUITEwrite_read_testslinks< >0.000716sOk +1291ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000441sOk +1292ssh_sftp_SUITEwrite_read_testsset_attributes< >0.002424sOk +1293ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.003560sOk +1294ssh_sftp_SUITEwrite_read_testsasync_read< >0.000938sOk +1295ssh_sftp_SUITEwrite_read_testsasync_write< >0.000955sOk +1296ssh_sftp_SUITEwrite_read_testsposition< >0.003300sOk +1297ssh_sftp_SUITEwrite_read_testspos_read< >0.002212sOk +1298ssh_sftp_SUITEwrite_read_testspos_write< >0.003391sOk +1299ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.429594sOk +ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000015sOkEnd [write_read_tests,erlang_server,not_unicode] +1300ssh_sftp_SUITEerlang_serverversion_option< >0.000781sOk +ssh_sftp_SUITEremote_tarinit_per_group< >0.021591sOkBegin [remote_tar,erlang_server,not_unicode] +1301ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.005012sOk +1302ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.005842sOk +1303ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000001sSKIPPEDUnicode test 1304ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.000001sSKIPPEDUnicode test -1305ssh_sftp_SUITEremote_tarfiles_to_tar< >0.006147sOk -1306ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.022185sOk -1307ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.006785sOk -1308ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006809sOk -1309ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.005113sOk -1310ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.037797sOk -1311ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.005176sOk -1312ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.166583sOk -1313ssh_sftp_SUITEremote_tarread_tar< >0.047022sOk -1314ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.046808sOk -1315ssh_sftp_SUITEremote_tarread_crypto_tar< >0.076481sOk -1316ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.052866sOk -1317ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.047682sOk -ssh_sftp_SUITEremote_tarend_per_group< >0.000027sOkEnd [remote_tar,erlang_server,not_unicode] -ssh_sftp_SUITEerlang_serverend_per_group< >0.000017sOkEnd [erlang_server,not_unicode] -ssh_sftp_SUITEopenssh_serverinit_per_group< >0.095261sOkBegin [openssh_server,not_unicode] -ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000012sOkBegin [write_read_tests,openssh_server,not_unicode] -1318ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.003100sOk -1319ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000599sOk -1320ssh_sftp_SUITEwrite_read_testsread_file< >0.002016sOk -1321ssh_sftp_SUITEwrite_read_testsread_dir< >0.000972sOk -1322ssh_sftp_SUITEwrite_read_testswrite_file< >0.000957sOk -1323ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.005309sOk -1324ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.046776sOk -1325ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.050537sOk -1326ssh_sftp_SUITEwrite_read_testsrename_file< >0.002106sOk -1327ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.000821sOk -1328ssh_sftp_SUITEwrite_read_testsremove_file< >0.002172sOk -1329ssh_sftp_SUITEwrite_read_testslinks< >0.000000sSKIPPEDknown bug in openssh -1330ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000337sOk -1331ssh_sftp_SUITEwrite_read_testsset_attributes< >0.000787sOk -1332ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.001906sOk -1333ssh_sftp_SUITEwrite_read_testsasync_read< >0.000608sOk -1334ssh_sftp_SUITEwrite_read_testsasync_write< >0.000724sOk -1335ssh_sftp_SUITEwrite_read_testsposition< >0.002113sOk -1336ssh_sftp_SUITEwrite_read_testspos_read< >0.001714sOk -1337ssh_sftp_SUITEwrite_read_testspos_write< >0.002414sOk -1338ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.507120sOk -ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000011sOkEnd [write_read_tests,openssh_server,not_unicode] -ssh_sftp_SUITEremote_tarinit_per_group< >0.039979sOkBegin [remote_tar,openssh_server,not_unicode] -1339ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001006sOk -1340ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.004252sOk -1341ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000001sSKIPPEDUnicode test -1342ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.000001sSKIPPEDUnicode test -1343ssh_sftp_SUITEremote_tarfiles_to_tar< >0.005557sOk -1344ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.022274sOk -1345ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.004982sOk -1346ssh_sftp_SUITEremote_tardirectory_to_tar< >0.005518sOk -1347ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.003802sOk -1348ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.036807sOk -1349ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.004303sOk -1350ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.178173sOk -1351ssh_sftp_SUITEremote_tarread_tar< >0.045094sOk -1352ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.055850sOk -1353ssh_sftp_SUITEremote_tarread_crypto_tar< >0.086277sOk -1354ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.048803sOk -1355ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.055552sOk -ssh_sftp_SUITEremote_tarend_per_group< >0.000012sOkEnd [remote_tar,openssh_server,not_unicode] -ssh_sftp_SUITEopenssh_serverend_per_group< >0.000011sOkEnd [openssh_server,not_unicode] -ssh_sftp_SUITEbig_recvpkt_sizeinit_per_group< >0.000000sOk -ssh_sftp_SUITEerlang_serverinit_per_group< >0.001224sOkBegin [erlang_server,big_recvpkt_size,not_unicode] -ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000010sOkBegin [write_read_tests,erlang_server,big_recvpkt_size,not_unicode] -1356ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.006100sOk -1357ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000799sOk -1358ssh_sftp_SUITEwrite_read_testsread_file< >0.002756sOk -1359ssh_sftp_SUITEwrite_read_testsread_dir< >0.001140sOk -1360ssh_sftp_SUITEwrite_read_testswrite_file< >0.001326sOk -1361ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.006920sOk -1362ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.045274sOk -1363ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.050441sOk -1364ssh_sftp_SUITEwrite_read_testsrename_file< >0.002770sOk -1365ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.001118sOk -1366ssh_sftp_SUITEwrite_read_testsremove_file< >0.002486sOk -1367ssh_sftp_SUITEwrite_read_testslinks< >0.000725sOk -1368ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000503sOk -1369ssh_sftp_SUITEwrite_read_testsset_attributes< >0.002046sOk -1370ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.003455sOk -1371ssh_sftp_SUITEwrite_read_testsasync_read< >0.000972sOk -1372ssh_sftp_SUITEwrite_read_testsasync_write< >0.000919sOk -1373ssh_sftp_SUITEwrite_read_testsposition< >0.002986sOk -1374ssh_sftp_SUITEwrite_read_testspos_read< >0.002685sOk -1375ssh_sftp_SUITEwrite_read_testspos_write< >0.003447sOk -1376ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.429187sOk -ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000012sOkEnd [write_read_tests,erlang_server,big_recvpkt_size,not_unicode] -1377ssh_sftp_SUITEerlang_serverversion_option< >0.000858sOk -ssh_sftp_SUITEremote_tarinit_per_group< >0.021298sOkBegin [remote_tar,erlang_server,big_recvpkt_size,not_unicode] -1378ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001550sOk -1379ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.005486sOk -1380ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000000sSKIPPEDUnicode test -1381ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.000001sSKIPPEDUnicode test -1382ssh_sftp_SUITEremote_tarfiles_to_tar< >0.006095sOk -1383ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.018657sOk -1384ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005585sOk -1385ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006205sOk -1386ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.004914sOk -1387ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.031503sOk -1388ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.004902sOk -1389ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.179031sOk -1390ssh_sftp_SUITEremote_tarread_tar< >0.046452sOk -1391ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.045548sOk -1392ssh_sftp_SUITEremote_tarread_crypto_tar< >0.076784sOk -1393ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.052212sOk -1394ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.046122sOk -ssh_sftp_SUITEremote_tarend_per_group< >0.000018sOkEnd [remote_tar,erlang_server,big_recvpkt_size,not_unicode] -ssh_sftp_SUITEerlang_serverend_per_group< >0.000010sOkEnd [erlang_server,big_recvpkt_size,not_unicode] -ssh_sftp_SUITEopenssh_serverinit_per_group< >0.095674sOkBegin [openssh_server,big_recvpkt_size,not_unicode] -ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000035sOkBegin [write_read_tests,openssh_server,big_recvpkt_size,not_unicode] -1395ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.002823sOk -1396ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000547sOk -1397ssh_sftp_SUITEwrite_read_testsread_file< >0.001883sOk -1398ssh_sftp_SUITEwrite_read_testsread_dir< >0.000926sOk -1399ssh_sftp_SUITEwrite_read_testswrite_file< >0.000971sOk -1400ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.004840sOk -1401ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.046016sOk -1402ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.049570sOk -1403ssh_sftp_SUITEwrite_read_testsrename_file< >0.002111sOk -1404ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.000844sOk -1405ssh_sftp_SUITEwrite_read_testsremove_file< >0.002103sOk -1406ssh_sftp_SUITEwrite_read_testslinks< >0.000000sSKIPPEDknown bug in openssh -1407ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000340sOk -1408ssh_sftp_SUITEwrite_read_testsset_attributes< >0.000741sOk -1409ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.001892sOk -1410ssh_sftp_SUITEwrite_read_testsasync_read< >0.000616sOk -1411ssh_sftp_SUITEwrite_read_testsasync_write< >0.000631sOk -1412ssh_sftp_SUITEwrite_read_testsposition< >0.002073sOk -1413ssh_sftp_SUITEwrite_read_testspos_read< >0.001752sOk -1414ssh_sftp_SUITEwrite_read_testspos_write< >0.002435sOk -1415ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.507143sOk -ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000012sOkEnd [write_read_tests,openssh_server,big_recvpkt_size,not_unicode] -ssh_sftp_SUITEremote_tarinit_per_group< >0.040296sOkBegin [remote_tar,openssh_server,big_recvpkt_size,not_unicode] -1416ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001137sOk -1417ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.004163sOk -1418ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000001sSKIPPEDUnicode test -1419ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.000001sSKIPPEDUnicode test -1420ssh_sftp_SUITEremote_tarfiles_to_tar< >0.005506sOk -1421ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.021876sOk -1422ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005054sOk -1423ssh_sftp_SUITEremote_tardirectory_to_tar< >0.005996sOk -1424ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.003768sOk -1425ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.038113sOk -1426ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.004982sOk -1427ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.185418sOk -1428ssh_sftp_SUITEremote_tarread_tar< >0.047568sOk -1429ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.049650sOk -1430ssh_sftp_SUITEremote_tarread_crypto_tar< >0.089509sOk -1431ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.051404sOk -1432ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.049986sOk -ssh_sftp_SUITEremote_tarend_per_group< >0.000013sOkEnd [remote_tar,openssh_server,big_recvpkt_size,not_unicode] -ssh_sftp_SUITEopenssh_serverend_per_group< >0.000011sOkEnd [openssh_server,big_recvpkt_size,not_unicode] -ssh_sftp_SUITEbig_recvpkt_sizeend_per_group< >0.000010sOkEnd [big_recvpkt_size,not_unicode] -1433ssh_sftp_SUITEnot_unicodesftp_nonexistent_subsystem< >0.023081sOk -ssh_sftp_SUITEnot_unicodeend_per_group< >0.000012sOkEnd [not_unicode] -ssh_sftp_SUITEunicodeinit_per_group< >0.002592sOkBegin [unicode] -ssh_sftp_SUITEerlang_serverinit_per_group< >0.001312sOkBegin [erlang_server,unicode] -ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000015sOkBegin [write_read_tests,erlang_server,unicode] -1434ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.005388sOk -1435ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000728sOk -1436ssh_sftp_SUITEwrite_read_testsread_file< >0.002362sOk -1437ssh_sftp_SUITEwrite_read_testsread_dir< >0.001388sOk -1438ssh_sftp_SUITEwrite_read_testswrite_file< >0.001374sOk -1439ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.006939sOk -1440ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.047840sOk -1441ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.053202sOk -1442ssh_sftp_SUITEwrite_read_testsrename_file< >0.003573sOk -1443ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.001270sOk -1444ssh_sftp_SUITEwrite_read_testsremove_file< >0.003138sOk -1445ssh_sftp_SUITEwrite_read_testslinks< >0.000602sOk -1446ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000437sOk -1447ssh_sftp_SUITEwrite_read_testsset_attributes< >0.002247sOk -1448ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.002922sOk -1449ssh_sftp_SUITEwrite_read_testsasync_read< >0.001013sOk -1450ssh_sftp_SUITEwrite_read_testsasync_write< >0.000942sOk -1451ssh_sftp_SUITEwrite_read_testsposition< >0.002960sOk -1452ssh_sftp_SUITEwrite_read_testspos_read< >0.002281sOk -1453ssh_sftp_SUITEwrite_read_testspos_write< >0.003657sOk -1454ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.429956sOk -ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000022sOkEnd [write_read_tests,erlang_server,unicode] -1455ssh_sftp_SUITEerlang_serverversion_option< >0.000729sOk -ssh_sftp_SUITEremote_tarinit_per_group< >0.021485sOkBegin [remote_tar,erlang_server,unicode] -1456ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001586sOk -1457ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.004970sOk -1458ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.005289sOk -1459ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.005725sOk -1460ssh_sftp_SUITEremote_tarfiles_to_tar< >0.007231sOk -1461ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.017181sOk -1462ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.006496sOk -1463ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006409sOk -1464ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.004623sOk -1465ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.031530sOk -1466ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.005851sOk -1467ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.172563sOk -1468ssh_sftp_SUITEremote_tarread_tar< >0.044745sOk -1469ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.046873sOk -1470ssh_sftp_SUITEremote_tarread_crypto_tar< >0.075272sOk -1471ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.046274sOk -1472ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.046040sOk -ssh_sftp_SUITEremote_tarend_per_group< >0.000015sOkEnd [remote_tar,erlang_server,unicode] -ssh_sftp_SUITEerlang_serverend_per_group< >0.000010sOkEnd [erlang_server,unicode] -ssh_sftp_SUITEopenssh_serverinit_per_group< >0.095572sOkBegin [openssh_server,unicode] -ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000039sOkBegin [write_read_tests,openssh_server,unicode] -1473ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.002938sOk -1474ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000567sOk -1475ssh_sftp_SUITEwrite_read_testsread_file< >0.001870sOk -1476ssh_sftp_SUITEwrite_read_testsread_dir< >0.000997sOk -1477ssh_sftp_SUITEwrite_read_testswrite_file< >0.000840sOk -1478ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.005514sOk -1479ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.048813sOk -1480ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.053290sOk -1481ssh_sftp_SUITEwrite_read_testsrename_file< >0.002412sOk -1482ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.000775sOk -1483ssh_sftp_SUITEwrite_read_testsremove_file< >0.001934sOk -1484ssh_sftp_SUITEwrite_read_testslinks< >0.000000sSKIPPEDknown bug in openssh -1485ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000347sOk -1486ssh_sftp_SUITEwrite_read_testsset_attributes< >0.000756sOk -1487ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.001996sOk -1488ssh_sftp_SUITEwrite_read_testsasync_read< >0.000601sOk -1489ssh_sftp_SUITEwrite_read_testsasync_write< >0.000768sOk -1490ssh_sftp_SUITEwrite_read_testsposition< >0.002029sOk -1491ssh_sftp_SUITEwrite_read_testspos_read< >0.001702sOk -1492ssh_sftp_SUITEwrite_read_testspos_write< >0.002320sOk -1493ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.508802sOk -ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000016sOkEnd [write_read_tests,openssh_server,unicode] -ssh_sftp_SUITEremote_tarinit_per_group< >0.039421sOkBegin [remote_tar,openssh_server,unicode] -1494ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001051sOk -1495ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.004288sOk -1496ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.004357sOk -1497ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.004681sOk -1498ssh_sftp_SUITEremote_tarfiles_to_tar< >0.006099sOk -1499ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.021683sOk -1500ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005189sOk -1501ssh_sftp_SUITEremote_tardirectory_to_tar< >0.005569sOk -1502ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.003702sOk -1503ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.034958sOk -1504ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.004723sOk -1505ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.188451sOk -1506ssh_sftp_SUITEremote_tarread_tar< >0.046249sOk -1507ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.048668sOk -1508ssh_sftp_SUITEremote_tarread_crypto_tar< >0.082608sOk -1509ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.048826sOk -1510ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.049651sOk -ssh_sftp_SUITEremote_tarend_per_group< >0.000015sOkEnd [remote_tar,openssh_server,unicode] -ssh_sftp_SUITEopenssh_serverend_per_group< >0.000013sOkEnd [openssh_server,unicode] -1511ssh_sftp_SUITEunicodesftp_nonexistent_subsystem< >0.021947sOk -ssh_sftp_SUITEunicodeend_per_group< >0.000015sOkEnd [unicode] -ssh_sftp_SUITEend_per_suite< >0.004410sOk -ssh_sftpd_SUITEinit_per_suite< >0.001526sOkFIPS mode not supported by Erlang/OTP -1512ssh_sftpd_SUITEopen_close_file< >0.001122sOk -1513ssh_sftpd_SUITEopen_close_dir< >0.000732sOk -1514ssh_sftpd_SUITEread_file< >0.000828sOk -1515ssh_sftpd_SUITEread_dir< >0.027650sOk -1516ssh_sftpd_SUITEwrite_file< >0.000636sOk -1517ssh_sftpd_SUITErename_file< >0.001509sOk -1518ssh_sftpd_SUITEmk_rm_dir< >0.001166sOk -1519ssh_sftpd_SUITEremove_file< >0.000681sOk -1520ssh_sftpd_SUITEreal_path< >0.000610sOk -1521ssh_sftpd_SUITEretrieve_attributes< >0.001301sOk -1522ssh_sftpd_SUITEset_attributes< >0.001394sOk -1523ssh_sftpd_SUITElinks< >0.000607sOk -1524ssh_sftpd_SUITEver3_rename< >0.000356sOk -1525ssh_sftpd_SUITEver3_open_flags< >0.001719sOk -1526ssh_sftpd_SUITErelpath< >0.000507sOk -1527ssh_sftpd_SUITEsshd_read_file< >0.000686sOk -1528ssh_sftpd_SUITEver6_basic< >0.000267sOk -1529ssh_sftpd_SUITEaccess_outside_root< >0.000822sOk -1530ssh_sftpd_SUITEroot_with_cwd< >0.001480sOk -1531ssh_sftpd_SUITErelative_path< >0.000512sOk -1532ssh_sftpd_SUITEopen_file_dir_v5< >0.000509sOk -1533ssh_sftpd_SUITEopen_file_dir_v6< >0.000490sOk -ssh_sftpd_SUITEend_per_suite< >0.000076sOk -ssh_sftpd_erlclient_SUITEinit_per_suite< >0.013831sOkFIPS mode not supported by Erlang/OTP -1534ssh_sftpd_erlclient_SUITEclose_file< >0.001340sOk -1535ssh_sftpd_erlclient_SUITEquit< >5.011375sOk -1536ssh_sftpd_erlclient_SUITEfile_cb< >0.003778sOk -1537ssh_sftpd_erlclient_SUITEroot_dir< >0.003208sOk -1538ssh_sftpd_erlclient_SUITElist_dir_limited< >0.003402sOk -1539ssh_sftpd_erlclient_SUITEver6_basic< >0.000696sOk +1305ssh_sftp_SUITEremote_tarfiles_to_tar< >0.006455sOk +1306ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.018359sOk +1307ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005708sOk +1308ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006797sOk +1309ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.005399sOk +1310ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.030271sOk +1311ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.006040sOk +1312ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.178819sOk +1313ssh_sftp_SUITEremote_tarread_tar< >0.043649sOk +1314ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.047431sOk +1315ssh_sftp_SUITEremote_tarread_crypto_tar< >0.085543sOk +1316ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.045809sOk +1317ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.044908sOk +ssh_sftp_SUITEremote_tarend_per_group< >0.000014sOkEnd [remote_tar,erlang_server,not_unicode] +ssh_sftp_SUITEerlang_serverend_per_group< >0.000012sOkEnd [erlang_server,not_unicode] +ssh_sftp_SUITEopenssh_serverinit_per_group< >0.096121sOkBegin [openssh_server,not_unicode] +ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000017sOkBegin [write_read_tests,openssh_server,not_unicode] +1318ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.002786sOk +1319ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000518sOk +1320ssh_sftp_SUITEwrite_read_testsread_file< >0.001941sOk +1321ssh_sftp_SUITEwrite_read_testsread_dir< >0.000967sOk +1322ssh_sftp_SUITEwrite_read_testswrite_file< >0.000940sOk +1323ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.005023sOk +1324ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.045946sOk +1325ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.048550sOk +1326ssh_sftp_SUITEwrite_read_testsrename_file< >0.002196sOk +1327ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.000835sOk +1328ssh_sftp_SUITEwrite_read_testsremove_file< >0.002122sOk +1329ssh_sftp_SUITEwrite_read_testslinks< >0.000000sSKIPPEDknown bug in openssh +1330ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000422sOk +1331ssh_sftp_SUITEwrite_read_testsset_attributes< >0.000776sOk +1332ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.002228sOk +1333ssh_sftp_SUITEwrite_read_testsasync_read< >0.000623sOk +1334ssh_sftp_SUITEwrite_read_testsasync_write< >0.000707sOk +1335ssh_sftp_SUITEwrite_read_testsposition< >0.002093sOk +1336ssh_sftp_SUITEwrite_read_testspos_read< >0.001768sOk +1337ssh_sftp_SUITEwrite_read_testspos_write< >0.002510sOk +1338ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.509729sOk +ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000012sOkEnd [write_read_tests,openssh_server,not_unicode] +ssh_sftp_SUITEremote_tarinit_per_group< >0.040814sOkBegin [remote_tar,openssh_server,not_unicode] +1339ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001065sOk +1340ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.004438sOk +1341ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000001sSKIPPEDUnicode test +1342ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.000001sSKIPPEDUnicode test +1343ssh_sftp_SUITEremote_tarfiles_to_tar< >0.005515sOk +1344ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.021893sOk +1345ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005069sOk +1346ssh_sftp_SUITEremote_tardirectory_to_tar< >0.005744sOk +1347ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.003806sOk +1348ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.038657sOk +1349ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.004272sOk +1350ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.181212sOk +1351ssh_sftp_SUITEremote_tarread_tar< >0.047941sOk +1352ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.052272sOk +1353ssh_sftp_SUITEremote_tarread_crypto_tar< >0.085587sOk +1354ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.049174sOk +1355ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.055327sOk +ssh_sftp_SUITEremote_tarend_per_group< >0.000015sOkEnd [remote_tar,openssh_server,not_unicode] +ssh_sftp_SUITEopenssh_serverend_per_group< >0.000012sOkEnd [openssh_server,not_unicode] +ssh_sftp_SUITEbig_recvpkt_sizeinit_per_group< >0.000000sOk +ssh_sftp_SUITEerlang_serverinit_per_group< >0.001131sOkBegin [erlang_server,big_recvpkt_size,not_unicode] +ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000010sOkBegin [write_read_tests,erlang_server,big_recvpkt_size,not_unicode] +1356ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.005887sOk +1357ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000684sOk +1358ssh_sftp_SUITEwrite_read_testsread_file< >0.002266sOk +1359ssh_sftp_SUITEwrite_read_testsread_dir< >0.001387sOk +1360ssh_sftp_SUITEwrite_read_testswrite_file< >0.001279sOk +1361ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.007207sOk +1362ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.046276sOk +1363ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.048312sOk +1364ssh_sftp_SUITEwrite_read_testsrename_file< >0.003138sOk +1365ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.001284sOk +1366ssh_sftp_SUITEwrite_read_testsremove_file< >0.003306sOk +1367ssh_sftp_SUITEwrite_read_testslinks< >0.000620sOk +1368ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000444sOk +1369ssh_sftp_SUITEwrite_read_testsset_attributes< >0.002162sOk +1370ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.003498sOk +1371ssh_sftp_SUITEwrite_read_testsasync_read< >0.001046sOk +1372ssh_sftp_SUITEwrite_read_testsasync_write< >0.001042sOk +1373ssh_sftp_SUITEwrite_read_testsposition< >0.003251sOk +1374ssh_sftp_SUITEwrite_read_testspos_read< >0.002509sOk +1375ssh_sftp_SUITEwrite_read_testspos_write< >0.003346sOk +1376ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.430085sOk +ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000022sOkEnd [write_read_tests,erlang_server,big_recvpkt_size,not_unicode] +1377ssh_sftp_SUITEerlang_serverversion_option< >0.000833sOk +ssh_sftp_SUITEremote_tarinit_per_group< >0.021225sOkBegin [remote_tar,erlang_server,big_recvpkt_size,not_unicode] +1378ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001635sOk +1379ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.005236sOk +1380ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000001sSKIPPEDUnicode test +1381ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.000001sSKIPPEDUnicode test +1382ssh_sftp_SUITEremote_tarfiles_to_tar< >0.007557sOk +1383ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.017772sOk +1384ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005761sOk +1385ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006881sOk +1386ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.004565sOk +1387ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.029787sOk +1388ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.006020sOk +1389ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.168962sOk +1390ssh_sftp_SUITEremote_tarread_tar< >0.044231sOk +1391ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.046272sOk +1392ssh_sftp_SUITEremote_tarread_crypto_tar< >0.074310sOk +1393ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.041844sOk +1394ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.041879sOk +ssh_sftp_SUITEremote_tarend_per_group< >0.000014sOkEnd [remote_tar,erlang_server,big_recvpkt_size,not_unicode] +ssh_sftp_SUITEerlang_serverend_per_group< >0.000017sOkEnd [erlang_server,big_recvpkt_size,not_unicode] +ssh_sftp_SUITEopenssh_serverinit_per_group< >0.095552sOkBegin [openssh_server,big_recvpkt_size,not_unicode] +ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000031sOkBegin [write_read_tests,openssh_server,big_recvpkt_size,not_unicode] +1395ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.003065sOk +1396ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000502sOk +1397ssh_sftp_SUITEwrite_read_testsread_file< >0.001855sOk +1398ssh_sftp_SUITEwrite_read_testsread_dir< >0.000909sOk +1399ssh_sftp_SUITEwrite_read_testswrite_file< >0.000906sOk +1400ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.005012sOk +1401ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.043454sOk +1402ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.054754sOk +1403ssh_sftp_SUITEwrite_read_testsrename_file< >0.002034sOk +1404ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.000913sOk +1405ssh_sftp_SUITEwrite_read_testsremove_file< >0.002285sOk +1406ssh_sftp_SUITEwrite_read_testslinks< >0.000000sSKIPPEDknown bug in openssh +1407ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000371sOk +1408ssh_sftp_SUITEwrite_read_testsset_attributes< >0.000795sOk +1409ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.001957sOk +1410ssh_sftp_SUITEwrite_read_testsasync_read< >0.000629sOk +1411ssh_sftp_SUITEwrite_read_testsasync_write< >0.000678sOk +1412ssh_sftp_SUITEwrite_read_testsposition< >0.002239sOk +1413ssh_sftp_SUITEwrite_read_testspos_read< >0.001925sOk +1414ssh_sftp_SUITEwrite_read_testspos_write< >0.002509sOk +1415ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.508787sOk +ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000014sOkEnd [write_read_tests,openssh_server,big_recvpkt_size,not_unicode] +ssh_sftp_SUITEremote_tarinit_per_group< >0.040706sOkBegin [remote_tar,openssh_server,big_recvpkt_size,not_unicode] +1416ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.000965sOk +1417ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.004448sOk +1418ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.000001sSKIPPEDUnicode test +1419ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.000001sSKIPPEDUnicode test +1420ssh_sftp_SUITEremote_tarfiles_to_tar< >0.005595sOk +1421ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.022689sOk +1422ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005139sOk +1423ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006061sOk +1424ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.003643sOk +1425ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.036672sOk +1426ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.004964sOk +1427ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.177762sOk +1428ssh_sftp_SUITEremote_tarread_tar< >0.047908sOk +1429ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.055667sOk +1430ssh_sftp_SUITEremote_tarread_crypto_tar< >0.086664sOk +1431ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.049536sOk +1432ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.050646sOk +ssh_sftp_SUITEremote_tarend_per_group< >0.000017sOkEnd [remote_tar,openssh_server,big_recvpkt_size,not_unicode] +ssh_sftp_SUITEopenssh_serverend_per_group< >0.000015sOkEnd [openssh_server,big_recvpkt_size,not_unicode] +ssh_sftp_SUITEbig_recvpkt_sizeend_per_group< >0.000015sOkEnd [big_recvpkt_size,not_unicode] +1433ssh_sftp_SUITEnot_unicodesftp_nonexistent_subsystem< >0.022273sOk +ssh_sftp_SUITEnot_unicodeend_per_group< >0.000013sOkEnd [not_unicode] +ssh_sftp_SUITEunicodeinit_per_group< >0.002137sOkBegin [unicode] +ssh_sftp_SUITEerlang_serverinit_per_group< >0.001338sOkBegin [erlang_server,unicode] +ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000019sOkBegin [write_read_tests,erlang_server,unicode] +1434ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.005882sOk +1435ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000793sOk +1436ssh_sftp_SUITEwrite_read_testsread_file< >0.002428sOk +1437ssh_sftp_SUITEwrite_read_testsread_dir< >0.001606sOk +1438ssh_sftp_SUITEwrite_read_testswrite_file< >0.001450sOk +1439ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.007607sOk +1440ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.048782sOk +1441ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.053174sOk +1442ssh_sftp_SUITEwrite_read_testsrename_file< >0.003639sOk +1443ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.001169sOk +1444ssh_sftp_SUITEwrite_read_testsremove_file< >0.003294sOk +1445ssh_sftp_SUITEwrite_read_testslinks< >0.000591sOk +1446ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000489sOk +1447ssh_sftp_SUITEwrite_read_testsset_attributes< >0.001931sOk +1448ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.003540sOk +1449ssh_sftp_SUITEwrite_read_testsasync_read< >0.000960sOk +1450ssh_sftp_SUITEwrite_read_testsasync_write< >0.001030sOk +1451ssh_sftp_SUITEwrite_read_testsposition< >0.002472sOk +1452ssh_sftp_SUITEwrite_read_testspos_read< >0.002685sOk +1453ssh_sftp_SUITEwrite_read_testspos_write< >0.003665sOk +1454ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.429678sOk +ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000026sOkEnd [write_read_tests,erlang_server,unicode] +1455ssh_sftp_SUITEerlang_serverversion_option< >0.000873sOk +ssh_sftp_SUITEremote_tarinit_per_group< >0.022485sOkBegin [remote_tar,erlang_server,unicode] +1456ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001462sOk +1457ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.005677sOk +1458ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.005869sOk +1459ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.006259sOk +1460ssh_sftp_SUITEremote_tarfiles_to_tar< >0.007324sOk +1461ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.018074sOk +1462ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.006632sOk +1463ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006050sOk +1464ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.005359sOk +1465ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.036979sOk +1466ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.006710sOk +1467ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.171546sOk +1468ssh_sftp_SUITEremote_tarread_tar< >0.046859sOk +1469ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.047480sOk +1470ssh_sftp_SUITEremote_tarread_crypto_tar< >0.073247sOk +1471ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.046341sOk +1472ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.049850sOk +ssh_sftp_SUITEremote_tarend_per_group< >0.000015sOkEnd [remote_tar,erlang_server,unicode] +ssh_sftp_SUITEerlang_serverend_per_group< >0.000013sOkEnd [erlang_server,unicode] +ssh_sftp_SUITEopenssh_serverinit_per_group< >0.099750sOkBegin [openssh_server,unicode] +ssh_sftp_SUITEwrite_read_testsinit_per_group< >0.000024sOkBegin [write_read_tests,openssh_server,unicode] +1473ssh_sftp_SUITEwrite_read_testsopen_close_file< >0.003532sOk +1474ssh_sftp_SUITEwrite_read_testsopen_close_dir< >0.000651sOk +1475ssh_sftp_SUITEwrite_read_testsread_file< >0.002013sOk +1476ssh_sftp_SUITEwrite_read_testsread_dir< >0.001035sOk +1477ssh_sftp_SUITEwrite_read_testswrite_file< >0.000989sOk +1478ssh_sftp_SUITEwrite_read_testswrite_file_iolist< >0.005553sOk +1479ssh_sftp_SUITEwrite_read_testswrite_big_file< >0.050295sOk +1480ssh_sftp_SUITEwrite_read_testssftp_read_big_file< >0.053476sOk +1481ssh_sftp_SUITEwrite_read_testsrename_file< >0.002526sOk +1482ssh_sftp_SUITEwrite_read_testsmk_rm_dir< >0.000849sOk +1483ssh_sftp_SUITEwrite_read_testsremove_file< >0.002152sOk +1484ssh_sftp_SUITEwrite_read_testslinks< >0.000000sSKIPPEDknown bug in openssh +1485ssh_sftp_SUITEwrite_read_testsretrieve_attributes< >0.000367sOk +1486ssh_sftp_SUITEwrite_read_testsset_attributes< >0.000881sOk +1487ssh_sftp_SUITEwrite_read_testsfile_owner_access< >0.001949sOk +1488ssh_sftp_SUITEwrite_read_testsasync_read< >0.000672sOk +1489ssh_sftp_SUITEwrite_read_testsasync_write< >0.000740sOk +1490ssh_sftp_SUITEwrite_read_testsposition< >0.002210sOk +1491ssh_sftp_SUITEwrite_read_testspos_read< >0.001717sOk +1492ssh_sftp_SUITEwrite_read_testspos_write< >0.002457sOk +1493ssh_sftp_SUITEwrite_read_testsstart_channel_sock< >0.509790sOk +ssh_sftp_SUITEwrite_read_testsend_per_group< >0.000012sOkEnd [write_read_tests,openssh_server,unicode] +ssh_sftp_SUITEremote_tarinit_per_group< >0.041334sOkBegin [remote_tar,openssh_server,unicode] +1494ssh_sftp_SUITEremote_tarcreate_empty_tar< >0.001037sOk +1495ssh_sftp_SUITEremote_tarascii_filename_ascii_contents_to_tar< >0.004361sOk +1496ssh_sftp_SUITEremote_tarascii_filename_unicode_contents_to_tar< >0.004394sOk +1497ssh_sftp_SUITEremote_tarunicode_filename_ascii_contents_to_tar< >0.004720sOk +1498ssh_sftp_SUITEremote_tarfiles_to_tar< >0.006137sOk +1499ssh_sftp_SUITEremote_tarbig_file_to_tar< >0.022471sOk +1500ssh_sftp_SUITEremote_tarfiles_chunked_to_tar< >0.005445sOk +1501ssh_sftp_SUITEremote_tardirectory_to_tar< >0.006377sOk +1502ssh_sftp_SUITEremote_tarbinaries_to_tar< >0.003993sOk +1503ssh_sftp_SUITEremote_tarnull_crypto_tar< >0.037154sOk +1504ssh_sftp_SUITEremote_tarsimple_crypto_tar_small< >0.005308sOk +1505ssh_sftp_SUITEremote_tarsimple_crypto_tar_big< >0.181573sOk +1506ssh_sftp_SUITEremote_tarread_tar< >0.046907sOk +1507ssh_sftp_SUITEremote_tarread_null_crypto_tar< >0.049617sOk +1508ssh_sftp_SUITEremote_tarread_crypto_tar< >0.083095sOk +1509ssh_sftp_SUITEremote_tarblock_size_1_crypto_tar< >0.047930sOk +1510ssh_sftp_SUITEremote_tarblock_size_16_crypto_tar< >0.048842sOk +ssh_sftp_SUITEremote_tarend_per_group< >0.000015sOkEnd [remote_tar,openssh_server,unicode] +ssh_sftp_SUITEopenssh_serverend_per_group< >0.000013sOkEnd [openssh_server,unicode] +1511ssh_sftp_SUITEunicodesftp_nonexistent_subsystem< >0.022525sOk +ssh_sftp_SUITEunicodeend_per_group< >0.000012sOkEnd [unicode] +ssh_sftp_SUITEend_per_suite< >0.004177sOk +ssh_sftpd_SUITEinit_per_suite< >0.001230sOkFIPS mode not supported by Erlang/OTP +1512ssh_sftpd_SUITEopen_close_file< >0.001129sOk +1513ssh_sftpd_SUITEopen_close_dir< >0.000701sOk +1514ssh_sftpd_SUITEread_file< >0.000576sOk +1515ssh_sftpd_SUITEread_dir< >0.021479sOk +1516ssh_sftpd_SUITEwrite_file< >0.000679sOk +1517ssh_sftpd_SUITErename_file< >0.001377sOk +1518ssh_sftpd_SUITEmk_rm_dir< >0.001184sOk +1519ssh_sftpd_SUITEremove_file< >0.000550sOk +1520ssh_sftpd_SUITEreal_path< >0.000549sOk +1521ssh_sftpd_SUITEretrieve_attributes< >0.001424sOk +1522ssh_sftpd_SUITEset_attributes< >0.001385sOk +1523ssh_sftpd_SUITElinks< >0.000710sOk +1524ssh_sftpd_SUITEver3_rename< >0.000378sOk +1525ssh_sftpd_SUITEver3_open_flags< >0.001650sOk +1526ssh_sftpd_SUITErelpath< >0.000405sOk +1527ssh_sftpd_SUITEsshd_read_file< >0.000605sOk +1528ssh_sftpd_SUITEver6_basic< >0.000276sOk +1529ssh_sftpd_SUITEaccess_outside_root< >0.000919sOk +1530ssh_sftpd_SUITEroot_with_cwd< >0.001254sOk +1531ssh_sftpd_SUITErelative_path< >0.000475sOk +1532ssh_sftpd_SUITEopen_file_dir_v5< >0.000492sOk +1533ssh_sftpd_SUITEopen_file_dir_v6< >0.000398sOk +ssh_sftpd_SUITEend_per_suite< >0.000034sOk +ssh_sftpd_erlclient_SUITEinit_per_suite< >0.015366sOkFIPS mode not supported by Erlang/OTP +1534ssh_sftpd_erlclient_SUITEclose_file< >0.001640sOk +1535ssh_sftpd_erlclient_SUITEquit< >5.010947sOk +1536ssh_sftpd_erlclient_SUITEfile_cb< >0.003826sOk +1537ssh_sftpd_erlclient_SUITEroot_dir< >0.002993sOk +1538ssh_sftpd_erlclient_SUITElist_dir_limited< >0.003210sOk +1539ssh_sftpd_erlclient_SUITEver6_basic< >0.000671sOk ssh_sftpd_erlclient_SUITEend_per_suite< >0.000000sOk -ssh_sup_SUITEinit_per_suite< >0.000194sOkFIPS mode not supported by Erlang/OTP +ssh_sup_SUITEinit_per_suite< >0.000135sOkFIPS mode not supported by Erlang/OTP 1540ssh_sup_SUITEdefault_tree< >0.000019sOk -1541ssh_sup_SUITEsshc_subtree< >1.012268sOk -1542ssh_sup_SUITEsshd_subtree< >0.507950sOk -1543ssh_sup_SUITEsshd_subtree_profile< >0.507214sOk -1544ssh_sup_SUITEkilled_acceptor_restarts< >0.012317sOk -1545ssh_sup_SUITEshell_channel_tree< >5.007245sOk +1541ssh_sup_SUITEsshc_subtree< >1.512045sOk +1542ssh_sup_SUITEsshd_subtree< >0.508019sOk +1543ssh_sup_SUITEsshd_subtree_profile< >0.506971sOk +1544ssh_sup_SUITEkilled_acceptor_restarts< >0.011915sOk +1545ssh_sup_SUITEshell_channel_tree< >5.007367sOk ssh_sup_SUITEend_per_suite< >0.000000sOk -ssh_to_openssh_SUITEinit_per_suite< >0.142980sOkFIPS mode not supported by Erlang/OTP -ssh_to_openssh_SUITEerlang_clientinit_per_group< >0.009386sOk -1546ssh_to_openssh_SUITEerlang_clienttunnel_in_erlclient_erlserver< >0.010954sOk -1547ssh_to_openssh_SUITEerlang_clienttunnel_out_erlclient_erlserver< >0.010093sOk -ssh_to_openssh_SUITEtunnel_distro_serverinit_per_group< >0.144767sOk -1548ssh_to_openssh_SUITEtunnel_distro_servertunnel_in_erlclient_openssh_server< >0.133976sOk -1549ssh_to_openssh_SUITEtunnel_distro_servertunnel_out_erlclient_openssh_server< >0.135241sOk +ssh_to_openssh_SUITEinit_per_suite< >0.144079sOkFIPS mode not supported by Erlang/OTP +ssh_to_openssh_SUITEerlang_clientinit_per_group< >0.009212sOk +1546ssh_to_openssh_SUITEerlang_clienttunnel_in_erlclient_erlserver< >0.010936sOk +1547ssh_to_openssh_SUITEerlang_clienttunnel_out_erlclient_erlserver< >0.010184sOk +ssh_to_openssh_SUITEtunnel_distro_serverinit_per_group< >0.145867sOk +1548ssh_to_openssh_SUITEtunnel_distro_servertunnel_in_erlclient_openssh_server< >0.134982sOk +1549ssh_to_openssh_SUITEtunnel_distro_servertunnel_out_erlclient_openssh_server< >0.135629sOk ssh_to_openssh_SUITEtunnel_distro_serverend_per_group< >0.000000sOk -1550ssh_to_openssh_SUITEerlang_clienterlang_shell_client_openssh_server< >1.594797sOk -1551ssh_to_openssh_SUITEerlang_clienteclient_oserver_kex_strict< >2.595484sOk -ssh_to_openssh_SUITEerlang_clientend_per_group< >0.000000sOk -ssh_to_openssh_SUITEerlang_serverinit_per_group< >0.000000sOk -ssh_to_openssh_SUITEtunnel_distro_clientinit_per_group< >0.144375sOk -1552ssh_to_openssh_SUITEtunnel_distro_clienttunnel_in_non_erlclient_erlserver< >1.004932sOk -1553ssh_to_openssh_SUITEtunnel_distro_clienttunnel_out_non_erlclient_erlserver< >1.005405sOk -ssh_to_openssh_SUITEtunnel_distro_clientend_per_group< >0.000000sOk -1554ssh_to_openssh_SUITEerlang_servererlang_server_openssh_client_renegotiate< >0.637130sOk -1555ssh_to_openssh_SUITEerlang_servereserver_oclient_kex_strict< >1.116185sOk -1556ssh_to_openssh_SUITEerlang_serverexec_with_io_in_sshc< >0.564036sOk -1557ssh_to_openssh_SUITEerlang_serverexec_direct_with_io_in_sshc< >0.602731sOk -ssh_to_openssh_SUITEerlang_serverend_per_group< >0.000000sOk +1550ssh_to_openssh_SUITEerlang_clienterlang_shell_client_openssh_server< >1.594083sOk +1551ssh_to_openssh_SUITEerlang_clienteclient_oserver_kex_strict< >2.595479sOk +ssh_to_openssh_SUITEerlang_clientend_per_group< >0.000000sOk +ssh_to_openssh_SUITEerlang_serverinit_per_group< >0.000000sOk +ssh_to_openssh_SUITEtunnel_distro_clientinit_per_group< >0.146390sOk +1552ssh_to_openssh_SUITEtunnel_distro_clienttunnel_in_non_erlclient_erlserver< >1.005521sOk +1553ssh_to_openssh_SUITEtunnel_distro_clienttunnel_out_non_erlclient_erlserver< >1.005608sOk +ssh_to_openssh_SUITEtunnel_distro_clientend_per_group< >0.000000sOk +1554ssh_to_openssh_SUITEerlang_servererlang_server_openssh_client_renegotiate< >0.636650sOk +1555ssh_to_openssh_SUITEerlang_servereserver_oclient_kex_strict< >1.116325sOk +1556ssh_to_openssh_SUITEerlang_serverexec_with_io_in_sshc< >0.564022sOk +1557ssh_to_openssh_SUITEerlang_serverexec_direct_with_io_in_sshc< >0.602829sOk +ssh_to_openssh_SUITEerlang_serverend_per_group< >0.000000sOk ssh_to_openssh_SUITEend_per_suite< >0.000000sOk ssh_upgrade_SUITEall< >0.000sSKIPPEDBenchmarks run separately -TOTAL2038.640243s
      Ok1537 Ok, 0 Failed, 20 Skipped of 1557
      Elapsed Time: 838.360s +TOTAL2036.919627s
      Ok1537 Ok, 0 Failed, 20 Skipped of 1557
      Elapsed Time: 837.212s @@ -2489,7 +2489,7 @@

      Test started at 2025-01-09 11:32:23

      | Latest test result

      diff --git a/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.summary b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.summary new file mode 100644 index 0000000000000..93413f90a7445 --- /dev/null +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/suite.summary @@ -0,0 +1 @@ +{summary,{1537,0,20,0,837212073}}. diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/unexpected_io.log.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/unexpected_io.log.html similarity index 93% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/unexpected_io.log.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/unexpected_io.log.html index 2bad07f17e527..403976f1e08c7 100644 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/unexpected_io.log.html +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/unexpected_io.log.html @@ -16,27 +16,27 @@

      Unexpected I/O

       
       
      -
      *** User 2025-01-09 11:32:23.099 ***
      +
      *** User 2025-01-10 18:55:39.238 ***
       ***ssh_test_lib:647: error:{{shutdown,"No host key available"},{accept,[]}}
       
       
      -
      *** User 2025-01-09 11:32:23.109 ***
      +
      *** User 2025-01-10 18:55:39.249 ***
       ssh_test_lib:779 os:find_executable("ssh")
       
       
      -
      *** User 2025-01-09 11:32:23.109 ***
      +
      *** User 2025-01-10 18:55:39.249 ***
       ssh_test_lib:785 Found "ssh" at "/usr/bin/ssh"
       
       
      -
      *** User 2025-01-09 11:32:23.115 ***
      +
      *** User 2025-01-10 18:55:39.255 ***
       ssh_test_lib:788 Found OpenSSH  "OpenSSH_8.9p1 Ubuntu-3ubuntu0.10, OpenSSL 3.0.2 15 Mar 2022\n"
       
       
      -
      *** User 2025-01-09 11:32:23.115 ***
      +
      *** User 2025-01-10 18:55:39.256 ***
       ErlAlgos = [{kex,['curve25519-sha256','curve25519-sha256@libssh.org',
                         'curve448-sha512','diffie-hellman-group-exchange-sha1',
                         'diffie-hellman-group-exchange-sha256',
      @@ -1328,31 +1328,27 @@ 

      Unexpected I/O

       
      -
      *** User 2025-01-09 11:34:00.746 ***
      -is_integer(Port) Call ssh:shell("3d82f27beab7", 45923, [{user_interaction,
      +
      *** User 2025-01-10 18:57:17.958 ***
      +is_integer(Port) Call ssh:shell("c7ed2a2b61d4", 43507, [{user_interaction,
                                                                false},
                                                               {silently_accept_hosts,
                                                                true},
                                                               {save_accepted_host,
                                                                false},
                                                               {user_dir,
      -                                                         "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"},
      -                                                        {silently_accept_hosts,
      -                                                         true},
      -                                                        {user,"foo"},
      -                                                        {password,"bar"}])
      +                                                         "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"}])
       
       
      -
      *** User 2025-01-09 11:34:00.747 ***
      -is_integer(Port) Call ssh:shell("3d82f27beab7", 33579, [{user_interaction,
      +
      *** User 2025-01-10 18:57:17.958 ***
      +is_integer(Port) Call ssh:shell("c7ed2a2b61d4", 46587, [{user_interaction,
                                                                false},
                                                               {silently_accept_hosts,
                                                                true},
                                                               {save_accepted_host,
                                                                false},
                                                               {user_dir,
      -                                                         "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"},
      +                                                         "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"},
                                                               {silently_accept_hosts,
                                                                true},
                                                               {user,"foo"},
      @@ -1360,46 +1356,53 @@ 

      Unexpected I/O

       
      -
      *** User 2025-01-09 11:34:00.748 ***
      -is_integer(Port) Call ssh:shell("3d82f27beab7", 35381, [{user_interaction,
      +
      *** User 2025-01-10 18:57:17.961 ***
      +is_integer(Port) Call ssh:shell("c7ed2a2b61d4", 40797, [{user_interaction,
                                                                false},
                                                               {silently_accept_hosts,
                                                                true},
                                                               {save_accepted_host,
                                                                false},
                                                               {user_dir,
      -                                                         "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"}])
      +                                                         "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"},
      +                                                        {silently_accept_hosts,
      +                                                         true},
      +                                                        {user,"foo"},
      +                                                        {password,"bar"}])
       
       
      -
      *** User 2025-01-09 11:34:00.749 ***
      -Socket Call ssh:shell(#Port<0.2455>, [{user_interaction,false},
      +
      *** User 2025-01-10 18:57:17.961 ***
      +Socket Call ssh:shell(#Port<0.2458>, [{user_interaction,false},
                                             {silently_accept_hosts,true},
                                             {save_accepted_host,false},
                                             {user_dir,
      -                                       "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"}])
      +                                       "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"}])
       
       
      -
      *** User 2025-01-09 11:34:00.768 ***
      -is_pid(ConnRef) Call ssh:shell(<0.16877.0>)
      +
      *** User 2025-01-10 18:57:17.976 ***
      +is_pid(ConnRef) Call ssh:shell(<0.16873.0>)
       
       
      -
      *** User 2025-01-09 11:34:01.771 ***
      -ssh_test_lib:366 ssh_test_lib:start_shell(33579, <0.16859.0>, [{user_dir,
      -                                                                "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"},
      -                                                               {silently_accept_hosts,
      -                                                                true},
      -                                                               {user,"foo"},
      -                                                               {password,
      -                                                                "bar"}]) -> ok
      +
      *** User 2025-01-10 18:57:18.979 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16590.0>,
      +                                      {#Ref<0.2249181432.4200071172.216828>,
      +                                       1553215,ok,
      +                                       [{ssh_basic_SUITE,shell_ssh_conn}],
      +                                       []}}
       
       
      -
      *** User 2025-01-09 11:34:01.772 ***
      -ssh_test_lib:366 ssh_test_lib:start_shell(45923, <0.16856.0>, [{user_dir,
      -                                                                "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"},
      +
      *** User 2025-01-10 18:57:18.979 ***
      +ssh_test_lib:366 ssh_test_lib:start_shell(<0.16873.0>, <0.16871.0>, undefined) -> ok
      +
      +
      +
      +
      *** User 2025-01-10 18:57:18.980 ***
      +ssh_test_lib:366 ssh_test_lib:start_shell(46587, <0.16863.0>, [{user_dir,
      +                                                                "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"},
                                                                      {silently_accept_hosts,
                                                                       true},
                                                                      {user,"foo"},
      @@ -1408,74 +1411,71 @@ 

      Unexpected I/O

       
      -
      *** User 2025-01-09 11:34:01.772 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16577.0>,
      -                                      {#Ref<0.2369918816.2834563075.110681>,
      -                                       1557793,ok,
      +
      *** User 2025-01-10 18:57:18.980 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16587.0>,
      +                                      {#Ref<0.2249181432.4200595458.91199>,
      +                                       1554778,ok,
                                              [{ssh_basic_SUITE,shell}],
                                              []}}
       
       
      -
      *** User 2025-01-09 11:34:01.773 ***
      -ssh_test_lib:366 ssh_test_lib:start_shell(35381, <0.16865.0>, [{user_dir,
      -                                                                "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"}]) -> ok
      -
      -
      -
      -
      *** User 2025-01-09 11:34:01.773 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16593.0>,
      -                                      {#Ref<0.2369918816.2834563075.110911>,
      -                                       997619,ok,
      -                                       [{ssh_basic_SUITE,shell_no_unicode}],
      -                                       []}}
      +
      *** User 2025-01-10 18:57:18.980 ***
      +ssh_test_lib:366 ssh_test_lib:start_shell(43507, <0.16865.0>, [{user_dir,
      +                                                                "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"}]) -> ok
       
       
      -
      *** User 2025-01-09 11:34:01.773 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16588.0>,
      -                                      {#Ref<0.2369918816.2834300932.215398>,
      -                                       1558235,ok,
      -                                       [{ssh_basic_SUITE,shell_ssh_conn}],
      +
      *** User 2025-01-10 18:57:18.981 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16585.0>,
      +                                      {#Ref<0.2249181432.4200595457.193651>,
      +                                       1555812,ok,
      +                                       [{ssh_basic_SUITE,shell_socket}],
                                              []}}
       
       
      -
      *** User 2025-01-09 11:34:01.773 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16589.0>,
      -                                   {#Ref<0.2369918816.2834825217.147063>,
      -                                    998561,ok,
      +
      *** User 2025-01-10 18:57:18.981 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16593.0>,
      +                                   {#Ref<0.2249181432.4200071172.216854>,
      +                                    999690,ok,
                                           [{ssh_basic_SUITE,shell_unicode_string}],
                                           []}}
       
       
      -
      *** User 2025-01-09 11:34:01.773 ***
      -ssh_test_lib:366 ssh_test_lib:start_shell(<0.16877.0>, <0.16858.0>, undefined) -> ok
      +
      *** User 2025-01-10 18:57:18.981 ***
      +ssh_test_lib:366 ssh_test_lib:start_shell(#Port<0.2458>, <0.16884.0>, [{user_dir,
      +                                                                        "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"}]) -> ok
       
       
      -
      *** User 2025-01-09 11:34:01.774 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16586.0>,
      -                                      {#Ref<0.2369918816.2834563075.110799>,
      -                                       1559872,ok,
      -                                       [{ssh_basic_SUITE,shell_socket}],
      -                                       []}}
      +
      *** User 2025-01-10 18:57:18.982 ***
      +ssh_test_lib:366 ssh_test_lib:start_shell(40797, <0.16880.0>, [{user_dir,
      +                                                                "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/run.2025-01-10_18.55.39/log_private/"},
      +                                                               {silently_accept_hosts,
      +                                                                true},
      +                                                               {user,"foo"},
      +                                                               {password,
      +                                                                "bar"}]) -> ok
       
       
      -
      *** User 2025-01-09 11:34:01.774 ***
      -ssh_test_lib:366 ssh_test_lib:start_shell(#Port<0.2455>, <0.16875.0>, [{user_dir,
      -                                                                        "/buildroot/otp/lib/ssh/make_test_dir/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/run.2025-01-09_11.32.23/log_private/"}]) -> ok
      +
      *** User 2025-01-10 18:57:18.982 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.16592.0>,
      +                                      {#Ref<0.2249181432.4200071172.216842>,
      +                                       999835,ok,
      +                                       [{ssh_basic_SUITE,shell_no_unicode}],
      +                                       []}}
       
       
      -
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-09 11:34:16.470 ***
      -=INFO REPORT==== 9-Jan-2025::11:34:16.470638 ===
      +
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-10 18:57:33.688 ***
      +=INFO REPORT==== 10-Jan-2025::18:57:33.688313 ===
       Erlang SSH client version: 5.2.5 (OpenSSL 3.0.2 15 Mar 2022).
      -Address: 127.0.0.1:51726
      +Address: 127.0.0.1:33770
       Peer server version: "SSH-2.0-Erlang/5.2.5"
      -Peer address: 127.0.0.1:42781
      +Peer address: 127.0.0.1:34765
       Disconnects with code = 14 [RFC4253 11.1]: Unable to connect using the available authentication methods
       State = {userauth,client}
       Module = ssh_fsm_userauth_client, Line = 97.
      @@ -1486,12 +1486,12 @@ 

      Unexpected I/O

       
      -
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-09 11:34:16.471 ***
      -=INFO REPORT==== 9-Jan-2025::11:34:16.471007 ===
      +
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-10 18:57:33.689 ***
      +=INFO REPORT==== 10-Jan-2025::18:57:33.688835 ===
       Erlang SSH client version: 5.2.5 (OpenSSL 3.0.2 15 Mar 2022).
      -Address: 127.0.0.1:40922
      +Address: 127.0.0.1:37502
       Peer server version: "SSH-2.0-Erlang/5.2.5"
      -Peer address: 127.0.0.1:40307
      +Peer address: 127.0.0.1:36653
       Disconnects with code = 14 [RFC4253 11.1]: Unable to connect using the available authentication methods
       State = {userauth,client}
       Module = ssh_fsm_userauth_client, Line = 97.
      @@ -1502,12 +1502,12 @@ 

      Unexpected I/O

       
      -
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-09 11:34:16.472 ***
      -=INFO REPORT==== 9-Jan-2025::11:34:16.472861 ===
      +
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-10 18:57:33.689 ***
      +=INFO REPORT==== 10-Jan-2025::18:57:33.688994 ===
       Erlang SSH client version: 5.2.5 (OpenSSL 3.0.2 15 Mar 2022).
      -Address: 127.0.0.1:58724
      +Address: 127.0.0.1:44882
       Peer server version: "SSH-2.0-Erlang/5.2.5"
      -Peer address: 127.0.0.1:36863
      +Peer address: 127.0.0.1:36845
       Disconnects with code = 14 [RFC4253 11.1]: Unable to connect using the available authentication methods
       State = {userauth,client}
       Module = ssh_fsm_userauth_client, Line = 97.
      @@ -1518,12 +1518,12 @@ 

      Unexpected I/O

       
      -
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-09 11:34:16.473 ***
      -=INFO REPORT==== 9-Jan-2025::11:34:16.473031 ===
      +
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-10 18:57:33.689 ***
      +=INFO REPORT==== 10-Jan-2025::18:57:33.689403 ===
       Erlang SSH client version: 5.2.5 (OpenSSL 3.0.2 15 Mar 2022).
      -Address: 127.0.0.1:59850
      +Address: 127.0.0.1:56632
       Peer server version: "SSH-2.0-Erlang/5.2.5"
      -Peer address: 127.0.0.1:40051
      +Peer address: 127.0.0.1:38969
       Disconnects with code = 14 [RFC4253 11.1]: Unable to connect using the available authentication methods
       State = {userauth,client}
       Module = ssh_fsm_userauth_client, Line = 97.
      @@ -1534,48 +1534,39 @@ 

      Unexpected I/O

       
      -
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-09 11:34:16.473 ***
      -=INFO REPORT==== 9-Jan-2025::11:34:16.473587 ===
      -Erlang SSH client version: 5.2.5 (OpenSSL 3.0.2 15 Mar 2022).
      -Address: 127.0.0.1:55894
      -Peer server version: "SSH-2.0-Erlang/5.2.5"
      -Peer address: 127.0.0.1:45361
      -Disconnects with code = 14 [RFC4253 11.1]: Unable to connect using the available authentication methods
      -State = {userauth,client}
      -Module = ssh_fsm_userauth_client, Line = 97.
      -Details:
      -  User auth failed for: "foo"
      -
      +
      *** System report during login_bad_pwd_no_retry in ssh_basic_SUITE 2025-01-10 18:57:33.689 ***
      +=INFO REPORT==== 10-Jan-2025::18:57:33.689818 ===
      +Accept failed on 0.0.0.0:38969 for connect from 127.0.0.1:56632: shutdown
       
       
       
      -
      *** User 2025-01-09 11:35:16.137 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.19920.0>,
      -                                   {#Ref<0.2369918816.2834563075.129536>,
      -                                    5511304,true,
      +
      *** User 2025-01-10 18:58:33.466 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.19923.0>,
      +                                   {#Ref<0.2249181432.4200595457.246126>,
      +                                    5511989,true,
                                           [{ssh_options_SUITE,
                                             ssh_connect_nonegtimeout_connected_parallel}],
                                           []}}
       
       
      -
      *** User 2025-01-09 11:35:21.673 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.19951.0>,
      -                                   {#Ref<0.2369918816.2834825218.138914>,
      -                                    5510036,true,
      +
      *** User 2025-01-10 18:58:39.004 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.19954.0>,
      +                                   {#Ref<0.2249181432.4200595458.123455>,
      +                                    5511822,true,
                                           [{ssh_options_SUITE,
                                             ssh_connect_nonegtimeout_connected_sequential}],
                                           []}}
       
       
      -
      *** System report during ssh_property_test_SUITE:client_sends_info_timing/1 2025-01-09 11:38:36.086 ***
      -=INFO REPORT==== 9-Jan-2025::11:38:36.086112 ===
      +
      *** System report during ssh_property_test_SUITE:client_sends_info_timing/1 2025-01-10 19:01:53.515 ***
      +=INFO REPORT==== 10-Jan-2025::19:01:53.515318 ===
       Erlang SSH server version: 5.2.5 (OpenSSL 3.0.2 15 Mar 2022).
      -Address: 127.0.0.1:45479
      +Address: 127.0.0.1:43201
       Peer client version: undefined
      -Peer address: 127.0.0.1:40050
      +Peer address: 127.0.0.1:33412
       Protocol mismatch.
       State = {hello,server}
       Module = ssh_connection_handler, Line = 648.
      @@ -1590,12 +1581,12 @@ 

      Unexpected I/O

       
      -
      *** System report during ssh_property_test_SUITE:client_sends_info_timing/1 2025-01-09 11:38:36.087 ***
      -=INFO REPORT==== 9-Jan-2025::11:38:36.087533 ===
      +
      *** System report during ssh_property_test_SUITE:client_sends_info_timing/1 2025-01-10 19:01:53.517 ***
      +=INFO REPORT==== 10-Jan-2025::19:01:53.517098 ===
       Erlang SSH server version: 5.2.5 (OpenSSL 3.0.2 15 Mar 2022).
      -Address: 127.0.0.1:45479
      +Address: 127.0.0.1:43201
       Peer client version: undefined
      -Peer address: 127.0.0.1:40054
      +Peer address: 127.0.0.1:33424
       Protocol mismatch.
       State = {hello,server}
       Module = ssh_connection_handler, Line = 648.
      @@ -1610,20 +1601,20 @@ 

      Unexpected I/O

       
      -
      *** User 2025-01-09 11:46:13.436 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.45530.0>,
      -                                   {#Ref<0.2369918816.2835349505.40848>,
      -                                    1594797,ok,
      +
      *** User 2025-01-10 19:09:28.420 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.45414.0>,
      +                                   {#Ref<0.2249181432.4201119745.129601>,
      +                                    1594083,ok,
                                           [{ssh_to_openssh_SUITE,
                                             erlang_shell_client_openssh_server}],
                                           []}}
       
       
      -
      *** User 2025-01-09 11:46:16.057 ***
      -ssh_test_lib:loop_io_server/2 got {'EXIT',<0.45546.0>,
      -                                   {#Ref<0.2369918816.2835349505.41265>,
      -                                    2595484,ok,
      +
      *** User 2025-01-10 19:09:31.041 ***
      +ssh_test_lib:loop_io_server/2 got {'EXIT',<0.45430.0>,
      +                                   {#Ref<0.2249181432.4201119745.130018>,
      +                                    2595479,ok,
                                           [{ssh_to_openssh_SUITE,
                                             eclient_oserver_kex_strict}],
                                           []}}
      @@ -1637,7 +1628,7 @@ 

      Unexpected I/O

      | Latest test result

      diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_agent_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_agent_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_agent_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_agent_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_algorithms_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_algorithms_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_algorithms_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_algorithms_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_basic_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_basic_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_basic_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_basic_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_chan_behaviours_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_chan_behaviours_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_chan_behaviours_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_chan_behaviours_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_collect_labmachine_info_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_collect_labmachine_info_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_collect_labmachine_info_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_collect_labmachine_info_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_connection_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_connection_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_connection_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_connection_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_dbg_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_dbg_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_dbg_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_dbg_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_engine_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_engine_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_engine_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_engine_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_options_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_options_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_options_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_options_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_property_test_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_property_test_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_property_test_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_property_test_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_protocol_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_protocol_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_protocol_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_protocol_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_pubkey_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_pubkey_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_pubkey_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_pubkey_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_renegotiate_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_renegotiate_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_renegotiate_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_renegotiate_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sftp_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sftp_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sftp_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sftp_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sftpd_erlclient_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sftpd_erlclient_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sftpd_erlclient_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sftpd_erlclient_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sftpd_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sftpd_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sftpd_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sftpd_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sup_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sup_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_sup_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_sup_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_to_openssh_suite.src.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_to_openssh_suite.src.html similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/make_test_dir.ssh_test.logs/ssh_to_openssh_suite.src.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/make_test_dir.ssh_test.logs/ssh_to_openssh_suite.src.html diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/misc_io.log.html b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/misc_io.log.html similarity index 99% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/misc_io.log.html rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/misc_io.log.html index a2394bd0e2a43..d09066a2a29e7 100644 --- a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/misc_io.log.html +++ b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/misc_io.log.html @@ -17,27 +17,27 @@

      PRE-TEST LOG

       
       
      -
      *** User 2025-01-09 11:32:22.909 ***
      +
      *** User 2025-01-10 18:55:39.047 ***
       ***ssh_test_lib:647: error:{{shutdown,"No host key available"},{accept,[]}}
       
       
      -
      *** User 2025-01-09 11:32:22.924 ***
      +
      *** User 2025-01-10 18:55:39.063 ***
       ssh_test_lib:779 os:find_executable("ssh")
       
       
      -
      *** User 2025-01-09 11:32:22.924 ***
      +
      *** User 2025-01-10 18:55:39.063 ***
       ssh_test_lib:785 Found "ssh" at "/usr/bin/ssh"
       
       
      -
      *** User 2025-01-09 11:32:22.930 ***
      +
      *** User 2025-01-10 18:55:39.068 ***
       ssh_test_lib:788 Found OpenSSH  "OpenSSH_8.9p1 Ubuntu-3ubuntu0.10, OpenSSL 3.0.2 15 Mar 2022\n"
       
       
      -
      *** User 2025-01-09 11:32:22.930 ***
      +
      *** User 2025-01-10 18:55:39.069 ***
       ErlAlgos = [{kex,['curve25519-sha256','curve25519-sha256@libssh.org',
                         'curve448-sha512','diffie-hellman-group-exchange-sha1',
                         'diffie-hellman-group-exchange-sha256',
      @@ -1342,7 +1342,7 @@ 

      POST-TEST LOG

      | Latest test result

      diff --git a/prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/ssh_sftpd_file_alt.beam b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/ssh_sftpd_file_alt.beam similarity index 100% rename from prs/9277/ct_logs/ct_run.test_server@3d82f27beab7.2025-01-09_11.32.22/ssh_sftpd_file_alt.beam rename to prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/ssh_sftpd_file_alt.beam diff --git a/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/totals.info b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/totals.info new file mode 100644 index 0000000000000..979d1de9e4830 Binary files /dev/null and b/prs/9277/ct_logs/ct_run.test_server@c7ed2a2b61d4.2025-01-10_18.55.38/totals.info differ diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/last_name b/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/last_name deleted file mode 100644 index a316bd5f838e3..0000000000000 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/last_name +++ /dev/null @@ -1 +0,0 @@ -/buildroot/otp/erts/make_test_dir/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27 diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/last_name b/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/last_name deleted file mode 100644 index a316bd5f838e3..0000000000000 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/last_name +++ /dev/null @@ -1 +0,0 @@ -/buildroot/otp/erts/make_test_dir/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27 diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.summary b/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.summary deleted file mode 100644 index 033f59c1fe629..0000000000000 --- a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/make_test_dir.system_test.logs/run.2025-01-09_11.49.27/suite.summary +++ /dev/null @@ -1 +0,0 @@ -{summary,{107,0,2,0,244804685}}. diff --git a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/totals.info b/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/totals.info deleted file mode 100644 index 1945e0005074e..0000000000000 Binary files a/prs/9277/ct_logs/ct_run.test_server@e52b4f92c4db.2025-01-09_11.49.27/totals.info and /dev/null differ diff --git a/prs/9277/ct_logs/index.html b/prs/9277/ct_logs/index.html index be6d76491f3ce..5388290701443 100644 --- a/prs/9277/ct_logs/index.html +++ b/prs/9277/ct_logs/index.html @@ -107,27 +107,27 @@

      Test Results

      -make_test_dir.ssh_test +make_test_dir.ssh_test - -Thu Jan 09 2025 11:32:22 +Fri Jan 10 2025 18:55:38 1537 0 20 (20/0) 0 -test_server@3d82f27beab7 -CT Log +test_server@c7ed2a2b61d4 +CT Log none -make_test_dir.system_test +make_test_dir.system_test - -Thu Jan 09 2025 11:49:27 +Fri Jan 10 2025 19:12:36 107 0 2 (2/0) 0 -test_server@e52b4f92c4db -CT Log +test_server@30452ec2e0b4 +CT Log none @@ -150,7 +150,7 @@

      Test Results



      diff --git a/prs/9277/ct_logs/suite.log.latest.html b/prs/9277/ct_logs/suite.log.latest.html index 46dbfae9f8218..0108f85f282df 100644 --- a/prs/9277/ct_logs/suite.log.latest.html +++ b/prs/9277/ct_logs/suite.log.latest.html @@ -3,6 +3,6 @@ redirect - + diff --git a/prs/9277/ct_logs/variables-test_server@e52b4f92c4db b/prs/9277/ct_logs/variables-test_server@30452ec2e0b4 similarity index 100% rename from prs/9277/ct_logs/variables-test_server@e52b4f92c4db rename to prs/9277/ct_logs/variables-test_server@30452ec2e0b4 diff --git a/prs/9277/ct_logs/variables-test_server@3d82f27beab7 b/prs/9277/ct_logs/variables-test_server@c7ed2a2b61d4 similarity index 100% rename from prs/9277/ct_logs/variables-test_server@3d82f27beab7 rename to prs/9277/ct_logs/variables-test_server@c7ed2a2b61d4 diff --git a/prs/9277/doc/system/Erlang System Documentation.epub b/prs/9277/doc/system/Erlang System Documentation.epub index 831502d18cdf0..ba3ffae4d4476 100644 Binary files a/prs/9277/doc/system/Erlang System Documentation.epub and b/prs/9277/doc/system/Erlang System Documentation.epub differ diff --git a/prs/9277/doc/system/applications.html b/prs/9277/doc/system/applications.html index da3a2c360bb76..8a5e5a0c56f82 100644 --- a/prs/9277/doc/system/applications.html +++ b/prs/9277/doc/system/applications.html @@ -139,8 +139,8 @@

      Application Callback Module

      How to start and stop the code for the application, including its supervision -tree, is described by two callback functions:

      start(StartType, StartArgs) -> {ok, Pid} | {ok, Pid, State}
      -stop(State)
      • start/2 is called when starting the application and is to create the +tree, is described by two callback functions:

        start(StartType, StartArgs) -> {ok, Pid} | {ok, Pid, State}
        +stop(State)
        • start/2 is called when starting the application and is to create the supervision tree by starting the top supervisor. It is expected to return the pid of the top supervisor and an optional term, State, which defaults to []. This term is passed as is to stop/1.
        • StartType is usually the atom normal. It has other values only in the case @@ -150,15 +150,15 @@

          necessary cleaning up. The actual stopping of the application, that is, shutting down the supervision tree, is handled automatically as described in Starting and Stopping Applications.

        Example of an application callback module for packaging the supervision tree -from Supervisor Behaviour:

        -module(ch_app).
        --behaviour(application).
        +from Supervisor Behaviour:

        -module(ch_app).
        +-behaviour(application).
         
        --export([start/2, stop/1]).
        +-export([start/2, stop/1]).
         
        -start(_Type, _Args) ->
        -    ch_sup:start_link().
        +start(_Type, _Args) ->
        +    ch_sup:start_link().
         
        -stop(_State) ->
        +stop(_State) ->
             ok.

        A library application that cannot be started or stopped does not need any application callback module.

        @@ -177,14 +177,14 @@

        in this case ch_app and [], respectively. This means that the following is called when the application is to be started:

        ch_app:start(normal, [])

        The following is called when the application is stopped:

        ch_app:stop([])

        When using systools, the Erlang/OTP tools for packaging code (see Section Releases), the keys description, vsn, modules, -registered, and applications are also to be specified:

        {application, ch_app,
        - [{description, "Channel allocator"},
        -  {vsn, "1"},
        -  {modules, [ch_app, ch_sup, ch3]},
        -  {registered, [ch3]},
        -  {applications, [kernel, stdlib, sasl]},
        -  {mod, {ch_app,[]}}
        - ]}.
        • description - A short description, a string. Defaults to "".
        • vsn - Version number, a string. Defaults to "".
        • modules - All modules introduced by this application. systools uses +registered, and applications are also to be specified:

          {application, ch_app,
          + [{description, "Channel allocator"},
          +  {vsn, "1"},
          +  {modules, [ch_app, ch_sup, ch3]},
          +  {registered, [ch3]},
          +  {applications, [kernel, stdlib, sasl]},
          +  {mod, {ch_app,[]}}
          + ]}.
          • description - A short description, a string. Defaults to "".
          • vsn - Version number, a string. Defaults to "".
          • modules - All modules introduced by this application. systools uses this list when generating boot scripts and tar files. A module must only be included in one application. Defaults to [].
          • registered - All names of registered processes in the application. systools uses this list to detect name clashes between applications. @@ -304,30 +304,30 @@

            Loading and Unloading Applications

            Before an application can be started, it must be loaded. The application -controller reads and stores the information from the .app file:

            1> application:load(ch_app).
            +controller reads and stores the information from the .app file:

            1> application:load(ch_app).
             ok
            -2> application:loaded_applications().
            -[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
            - {stdlib,"ERTS  CXC 138 10","1.11.4.3"},
            - {ch_app,"Channel allocator","1"}]

            An application that has been stopped, or has never been started, can be +2> application:loaded_applications(). +[{kernel,"ERTS CXC 138 10","2.8.1.3"}, + {stdlib,"ERTS CXC 138 10","1.11.4.3"}, + {ch_app,"Channel allocator","1"}]

            An application that has been stopped, or has never been started, can be unloaded. The information about the application is erased from the internal -database of the application controller.

            3> application:unload(ch_app).
            +database of the application controller.

            3> application:unload(ch_app).
             ok
            -4> application:loaded_applications().
            -[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
            - {stdlib,"ERTS  CXC 138 10","1.11.4.3"}]

            Note

            Loading/unloading an application does not load/unload the code used by the +4> application:loaded_applications(). +[{kernel,"ERTS CXC 138 10","2.8.1.3"}, + {stdlib,"ERTS CXC 138 10","1.11.4.3"}]

            Note

            Loading/unloading an application does not load/unload the code used by the application. Code loading is handled in the usual way by the code server.

            Starting and Stopping Applications

            -

            An application is started by calling:

            5> application:start(ch_app).
            +

            An application is started by calling:

            5> application:start(ch_app).
             ok
            -6> application:which_applications().
            -[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
            - {stdlib,"ERTS  CXC 138 10","1.11.4.3"},
            - {ch_app,"Channel allocator","1"}]

            If the application is not already loaded, the application controller first loads +6> application:which_applications(). +[{kernel,"ERTS CXC 138 10","2.8.1.3"}, + {stdlib,"ERTS CXC 138 10","1.11.4.3"}, + {ch_app,"Channel allocator","1"}]

            If the application is not already loaded, the application controller first loads it using application:load/1. It checks the value of the applications key to ensure that all applications that are to be started before this application are running.

            Following that, the application controller creates an application master for @@ -351,47 +351,47 @@

            Configuring an Application

            An application can be configured using configuration parameters. These are a -list of {Par,Val} tuples specified by a key env in the .app file:

            {application, ch_app,
            - [{description, "Channel allocator"},
            -  {vsn, "1"},
            -  {modules, [ch_app, ch_sup, ch3]},
            -  {registered, [ch3]},
            -  {applications, [kernel, stdlib, sasl]},
            -  {mod, {ch_app,[]}},
            -  {env, [{file, "/usr/local/log"}]}
            - ]}.

            Par is to be an atom. Val is any term. The application can retrieve the +list of {Par,Val} tuples specified by a key env in the .app file:

            {application, ch_app,
            + [{description, "Channel allocator"},
            +  {vsn, "1"},
            +  {modules, [ch_app, ch_sup, ch3]},
            +  {registered, [ch3]},
            +  {applications, [kernel, stdlib, sasl]},
            +  {mod, {ch_app,[]}},
            +  {env, [{file, "/usr/local/log"}]}
            + ]}.

            Par is to be an atom. Val is any term. The application can retrieve the value of a configuration parameter by calling application:get_env(App, Par) or a number of similar functions. For more information, see module application in Kernel.

            Example:

            % erl
            -Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
            +Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
             
            -Eshell V5.2.3.6  (abort with ^G)
            -1> application:start(ch_app).
            +Eshell V5.2.3.6  (abort with ^G)
            +1> application:start(ch_app).
             ok
            -2> application:get_env(ch_app, file).
            -{ok,"/usr/local/log"}

            The values in the .app file can be overridden by values in a system +2> application:get_env(ch_app, file). +{ok,"/usr/local/log"}

        The values in the .app file can be overridden by values in a system configuration file. This is a file that contains configuration parameters for -relevant applications:

        [{Application1, [{Par11,Val11},...]},
        +relevant applications:

        [{Application1, [{Par11,Val11},...]},
          ...,
        - {ApplicationN, [{ParN1,ValN1},...]}].

        The system configuration is to be called Name.config and Erlang is to be + {ApplicationN, [{ParN1,ValN1},...]}].

        The system configuration is to be called Name.config and Erlang is to be started with the command-line argument -config Name. For details, see config in Kernel.

        Example:

        A file test.config is created with the following contents:

        [{ch_app, [{file, "testlog"}]}].

        The value of file overrides the value of file as defined in the .app file:

        % erl -config test
        -Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
        +Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
         
        -Eshell V5.2.3.6  (abort with ^G)
        -1> application:start(ch_app).
        +Eshell V5.2.3.6  (abort with ^G)
        +1> application:start(ch_app).
         ok
        -2> application:get_env(ch_app, file).
        -{ok,"testlog"}

        If release handling is used, exactly one system +2> application:get_env(ch_app, file). +{ok,"testlog"}

      If release handling is used, exactly one system configuration file is to be used and that file is to be called sys.config.

      The values in the .app file and the values in a system configuration file can be overridden directly from the command line:

      % erl -ApplName Par1 Val1 ... ParN ValN

      Example:

      % erl -ch_app file '"testlog"'
      -Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
      +Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
       
      -Eshell V5.2.3.6  (abort with ^G)
      -1> application:start(ch_app).
      +Eshell V5.2.3.6  (abort with ^G)
      +1> application:start(ch_app).
       ok
      -2> application:get_env(ch_app, file).
      -{ok,"testlog"}

      +2> application:get_env(ch_app, file). +{ok,"testlog"}

      diff --git a/prs/9277/doc/system/appup_cookbook.html b/prs/9277/doc/system/appup_cookbook.html index 32650f96eea95..76435eaff7b08 100644 --- a/prs/9277/doc/system/appup_cookbook.html +++ b/prs/9277/doc/system/appup_cookbook.html @@ -124,10 +124,10 @@

      When a functional module has been changed, for example, if a new function has been added or a bug has been corrected, simple code replacement is sufficient, -for example:

      {"2",
      - [{"1", [{load_module, m}]}],
      - [{"1", [{load_module, m}]}]
      -}.

      +for example:

      {"2",
      + [{"1", [{load_module, m}]}],
      + [{"1", [{load_module, m}]}]
      +}.

      @@ -146,10 +146,10 @@

      A callback module is a functional module, and for code extensions simple code replacement is sufficient.

      Example

      When adding a function to ch3, as described in the example in -Release Handling, ch_app.appup looks as follows:

      {"2",
      - [{"1", [{load_module, ch3}]}],
      - [{"1", [{load_module, ch3}]}]
      -}.

      OTP also supports changing the internal state of behaviour processes; see +Release Handling, ch_app.appup looks as follows:

      {"2",
      + [{"1", [{load_module, ch3}]}],
      + [{"1", [{load_module, ch3}]}]
      +}.

      OTP also supports changing the internal state of behaviour processes; see Changing Internal State.

      @@ -163,21 +163,21 @@

      gen_server Behaviour. The internal state is a term Chs representing the available channels. Assume you want to add a counter N, which keeps track of the number of alloc requests so far. This means that the -format must be changed to {Chs,N}.

      The .appup file can look as follows:

      {"2",
      - [{"1", [{update, ch3, {advanced, []}}]}],
      - [{"1", [{update, ch3, {advanced, []}}]}]
      -}.

      The third element of the update instruction is a tuple {advanced,Extra}, +format must be changed to {Chs,N}.

      The .appup file can look as follows:

      {"2",
      + [{"1", [{update, ch3, {advanced, []}}]}],
      + [{"1", [{update, ch3, {advanced, []}}]}]
      +}.

      The third element of the update instruction is a tuple {advanced,Extra}, which says that the affected processes are to do a state transformation before loading the new version of the module. This is done by the processes calling the callback function code_change/3 (see gen_server in STDLIB). -The term Extra, in this case [], is passed as is to the function:

      -module(ch3).
      +The term Extra, in this case [], is passed as is to the function:

      -module(ch3).
       ...
      --export([code_change/3]).
      +-export([code_change/3]).
       ...
      -code_change({down, _Vsn}, {Chs, N}, _Extra) ->
      -    {ok, Chs};
      -code_change(_Vsn, Chs, _Extra) ->
      -    {ok, {Chs, 0}}.

      The first argument is {down,Vsn} if there is a downgrade, or Vsn if there is +code_change({down, _Vsn}, {Chs, N}, _Extra) -> + {ok, Chs}; +code_change(_Vsn, Chs, _Extra) -> + {ok, {Chs, 0}}.

      The first argument is {down,Vsn} if there is a downgrade, or Vsn if there is a upgrade. The term Vsn is fetched from the 'original' version of the module, that is, the version you are upgrading from, or downgrading to.

      The version is defined by the module attribute vsn, if any. There is no such attribute in ch3, so in this case the version is the checksum (a huge integer) @@ -194,29 +194,29 @@

      can occur during release upgrade if the new version of m1 is loaded first and calls ch3:available/0 before the new version of ch3 is loaded.

      Thus, ch3 must be loaded before m1, in the upgrade case, and conversely in the downgrade case. m1 is said to be dependent on ch3. In a release -handling instruction, this is expressed by the DepMods element:

      {load_module, Module, DepMods}
      -{update, Module, {advanced, Extra}, DepMods}

      DepMods is a list of modules, on which Module is dependent.

      Example

      The module m1 in application myapp is dependent on ch3 when +handling instruction, this is expressed by the DepMods element:

      {load_module, Module, DepMods}
      +{update, Module, {advanced, Extra}, DepMods}

      DepMods is a list of modules, on which Module is dependent.

      Example

      The module m1 in application myapp is dependent on ch3 when upgrading from "1" to "2", or downgrading from "2" to "1":

      myapp.appup:
       
      -{"2",
      - [{"1", [{load_module, m1, [ch3]}]}],
      - [{"1", [{load_module, m1, [ch3]}]}]
      -}.
      +{"2",
      + [{"1", [{load_module, m1, [ch3]}]}],
      + [{"1", [{load_module, m1, [ch3]}]}]
      +}.
       
       ch_app.appup:
       
      -{"2",
      - [{"1", [{load_module, ch3}]}],
      - [{"1", [{load_module, ch3}]}]
      -}.

      If instead m1 and ch3 belong to the same application, the .appup file can -look as follows:

      {"2",
      - [{"1",
      -   [{load_module, ch3},
      -    {load_module, m1, [ch3]}]}],
      - [{"1",
      -   [{load_module, ch3},
      -    {load_module, m1, [ch3]}]}]
      -}.

      m1 is dependent on ch3 also when downgrading. systools knows the +{"2", + [{"1", [{load_module, ch3}]}], + [{"1", [{load_module, ch3}]}] +}.

      If instead m1 and ch3 belong to the same application, the .appup file can +look as follows:

      {"2",
      + [{"1",
      +   [{load_module, ch3},
      +    {load_module, m1, [ch3]}]}],
      + [{"1",
      +   [{load_module, ch3},
      +    {load_module, m1, [ch3]}]}]
      +}.

      m1 is dependent on ch3 also when downgrading. systools knows the difference between up- and downgrading and generates a correct relup, where ch3 is loaded before m1 when upgrading, but m1 is loaded before ch3 when downgrading.

      @@ -231,22 +231,22 @@

      synchronized code replacement must be used.

      Note

      The name(s) of the user-defined residence module(s) must be listed in the Modules part of the child specification for the special process. Otherwise the release handler cannot find the process.

      Example

      Consider the example ch4 in sys and proc_lib. -When started by a supervisor, the child specification can look as follows:

      {ch4, {ch4, start_link, []},
      - permanent, brutal_kill, worker, [ch4]}

      If ch4 is part of the application sp_app and a new version of the module is +When started by a supervisor, the child specification can look as follows:

      {ch4, {ch4, start_link, []},
      + permanent, brutal_kill, worker, [ch4]}

      If ch4 is part of the application sp_app and a new version of the module is to be loaded when upgrading from version "1" to "2" of this application, -sp_app.appup can look as follows:

      {"2",
      - [{"1", [{update, ch4, {advanced, []}}]}],
      - [{"1", [{update, ch4, {advanced, []}}]}]
      -}.

      The update instruction must contain the tuple {advanced,Extra}. The +sp_app.appup can look as follows:

      {"2",
      + [{"1", [{update, ch4, {advanced, []}}]}],
      + [{"1", [{update, ch4, {advanced, []}}]}]
      +}.

      The update instruction must contain the tuple {advanced,Extra}. The instruction makes the special process call the callback function system_code_change/4, a function the user must implement. The term Extra, in -this case [], is passed as is to system_code_change/4:

      -module(ch4).
      +this case [], is passed as is to system_code_change/4:

      -module(ch4).
       ...
      --export([system_code_change/4]).
      +-export([system_code_change/4]).
       ...
       
      -system_code_change(Chs, _Module, _OldVsn, _Extra) ->
      -    {ok, Chs}.
      • The first argument is the internal state State, passed from +system_code_change(Chs, _Module, _OldVsn, _Extra) -> + {ok, Chs}.
      • The first argument is the internal state State, passed from function sys:handle_system_msg(Request, From, Parent, Module, Deb, State), and called by the special process when a system message is received. In ch4, the internal state is the set of available channels Chs.
      • The second argument is the name of the module (ch4).
      • The third argument is Vsn or {down,Vsn}, as described for @@ -275,24 +275,24 @@

        of upgrade and downgrade. Then the new return value of init/1 can be checked and the internal state be changed accordingly.

        The following upgrade instruction is used for supervisors:

        {update, Module, supervisor}

        Example

        To change the restart strategy of ch_sup (from Supervisor Behaviour) from one_for_one to one_for_all, -change the callback function init/1 in ch_sup.erl:

        -module(ch_sup).
        +change the callback function init/1 in ch_sup.erl:

        -module(ch_sup).
         ...
         
        -init(_Args) ->
        -    {ok, {#{strategy => one_for_all, ...}, ...}}.

        The file ch_app.appup:

        {"2",
        - [{"1", [{update, ch_sup, supervisor}]}],
        - [{"1", [{update, ch_sup, supervisor}]}]
        -}.

        +init(_Args) -> + {ok, {#{strategy => one_for_all, ...}, ...}}.

        The file ch_app.appup:

        {"2",
        + [{"1", [{update, ch_sup, supervisor}]}],
        + [{"1", [{update, ch_sup, supervisor}]}]
        +}.

        Changing Child Specifications

        The instruction, and thus the .appup file, when changing an existing child -specification, is the same as when changing properties as described earlier:

        {"2",
        - [{"1", [{update, ch_sup, supervisor}]}],
        - [{"1", [{update, ch_sup, supervisor}]}]
        -}.

        The changes do not affect existing child processes. For example, changing the +specification, is the same as when changing properties as described earlier:

        {"2",
        + [{"1", [{update, ch_sup, supervisor}]}],
        + [{"1", [{update, ch_sup, supervisor}]}]
        +}.

        The changes do not affect existing child processes. For example, changing the start function only specifies how the child process is to be restarted, if needed later on.

        The id of the child specification cannot be changed.

        Changing the Modules field of the child specification can affect the release handling process itself, as this field is used to identify which processes are @@ -307,34 +307,34 @@

        Child processes are not automatically started or terminated, this must be done using apply instructions.

        Example

        Assume a new child process m1 is to be added to ch_sup when upgrading ch_app from "1" to "2". This means m1 is to be deleted when -downgrading from "2" to "1":

        {"2",
        - [{"1",
        -   [{update, ch_sup, supervisor},
        -    {apply, {supervisor, restart_child, [ch_sup, m1]}}
        -   ]}],
        - [{"1",
        -   [{apply, {supervisor, terminate_child, [ch_sup, m1]}},
        -    {apply, {supervisor, delete_child, [ch_sup, m1]}},
        -    {update, ch_sup, supervisor}
        -   ]}]
        -}.

        The order of the instructions is important.

        The supervisor must be registered as ch_sup for the script to work. If the +downgrading from "2" to "1":

        {"2",
        + [{"1",
        +   [{update, ch_sup, supervisor},
        +    {apply, {supervisor, restart_child, [ch_sup, m1]}}
        +   ]}],
        + [{"1",
        +   [{apply, {supervisor, terminate_child, [ch_sup, m1]}},
        +    {apply, {supervisor, delete_child, [ch_sup, m1]}},
        +    {update, ch_sup, supervisor}
        +   ]}]
        +}.

        The order of the instructions is important.

        The supervisor must be registered as ch_sup for the script to work. If the supervisor is not registered, it cannot be accessed directly from the script. Instead a help function that finds the pid of the supervisor and calls supervisor:restart_child, and so on, must be written. This function is then to be called from the script using the apply instruction.

        If the module m1 is introduced in version "2" of ch_app, it must also be -loaded when upgrading and deleted when downgrading:

        {"2",
        - [{"1",
        -   [{add_module, m1},
        -    {update, ch_sup, supervisor},
        -    {apply, {supervisor, restart_child, [ch_sup, m1]}}
        -   ]}],
        - [{"1",
        -   [{apply, {supervisor, terminate_child, [ch_sup, m1]}},
        -    {apply, {supervisor, delete_child, [ch_sup, m1]}},
        -    {update, ch_sup, supervisor},
        -    {delete_module, m1}
        -   ]}]
        -}.

        As stated earlier, the order of the instructions is important. When upgrading, +loaded when upgrading and deleted when downgrading:

        {"2",
        + [{"1",
        +   [{add_module, m1},
        +    {update, ch_sup, supervisor},
        +    {apply, {supervisor, restart_child, [ch_sup, m1]}}
        +   ]}],
        + [{"1",
        +   [{apply, {supervisor, terminate_child, [ch_sup, m1]}},
        +    {apply, {supervisor, delete_child, [ch_sup, m1]}},
        +    {update, ch_sup, supervisor},
        +    {delete_module, m1}
        +   ]}]
        +}.

        As stated earlier, the order of the instructions is important. When upgrading, m1 must be loaded, and the supervisor child specification changed, before the new child process can be started. When downgrading, the child process must be terminated before the child specification is changed and the module is deleted.

        @@ -343,9 +343,9 @@

        Adding or Deleting a Module

        -

        _Example

        _ A new functional module m is added to ch_app:

        {"2",
        - [{"1", [{add_module, m}]}],
        - [{"1", [{delete_module, m}]}]

        +

        _Example

        _ A new functional module m is added to ch_app:

        {"2",
        + [{"1", [{add_module, m}]}],
        + [{"1", [{delete_module, m}]}]

        @@ -373,10 +373,10 @@

        been restructured.

        Example

        When adding a child m1 to ch_sup, as in Adding and Deleting Child Processes in Changing a Supervisor, an alternative to updating the supervisor is to restart the entire -application:

        {"2",
        - [{"1", [{restart_application, ch_app}]}],
        - [{"1", [{restart_application, ch_app}]}]
        -}.

        +application:

        {"2",
        + [{"1", [{restart_application, ch_app}]}],
        + [{"1", [{restart_application, ch_app}]}]
        +}.

        @@ -384,10 +384,10 @@

        When installing a release, the application specifications are automatically updated before evaluating the relup script. Thus, no instructions are needed -in the .appup file:

        {"2",
        - [{"1", []}],
        - [{"1", []}]
        -}.

        +in the .appup file:

        {"2",
        + [{"1", []}],
        + [{"1", []}]
        +}.

        @@ -410,18 +410,18 @@

        manually created.

        Example

        Assume there is a release containing an application prim_app, which have a supervisor prim_sup in its supervision tree.

        In a new version of the release, the application ch_app is to be included in prim_app. That is, its topmost supervisor ch_sup is to be started as a child -process to prim_sup.

        The workflow is as follows:

        Step 1) Edit the code for prim_sup:

        init(...) ->
        -    {ok, {...supervisor flags...,
        -          [...,
        -           {ch_sup, {ch_sup,start_link,[]},
        -            permanent,infinity,supervisor,[ch_sup]},
        -           ...]}}.

        Step 2) Edit the .app file for prim_app:

        {application, prim_app,
        - [...,
        -  {vsn, "2"},
        +process to prim_sup.

        The workflow is as follows:

        Step 1) Edit the code for prim_sup:

        init(...) ->
        +    {ok, {...supervisor flags...,
        +          [...,
        +           {ch_sup, {ch_sup,start_link,[]},
        +            permanent,infinity,supervisor,[ch_sup]},
        +           ...]}}.

        Step 2) Edit the .app file for prim_app:

        {application, prim_app,
        + [...,
        +  {vsn, "2"},
           ...,
        -  {included_applications, [ch_app]},
        +  {included_applications, [ch_app]},
           ...
        - ]}.

        Step 3) Create a new .rel file, including ch_app:

        {release,
        + ]}.

        Step 3) Create a new .rel file, including ch_app:

        {release,
          ...,
          [...,
           {prim_app, "2"},
        @@ -440,38 +440,38 @@ 

        the case of downgrade). This is because ch_app is included in the new .rel file, but not in the old one.

        Instead, a correct relup file can be created manually, either from scratch or by editing the generated version. The instructions for starting/stopping -ch_app are replaced by instructions for loading/unloading the application:

        {"B",
        - [{"A",
        -   [],
        -   [{load_object_code,{ch_app,"1",[ch_sup,ch3]}},
        -    {load_object_code,{prim_app,"2",[prim_app,prim_sup]}},
        +ch_app are replaced by instructions for loading/unloading the application:

        {"B",
        + [{"A",
        +   [],
        +   [{load_object_code,{ch_app,"1",[ch_sup,ch3]}},
        +    {load_object_code,{prim_app,"2",[prim_app,prim_sup]}},
             point_of_no_return,
        -    {apply,{application,stop,[prim_app]}},
        -    {remove,{prim_app,brutal_purge,brutal_purge}},
        -    {remove,{prim_sup,brutal_purge,brutal_purge}},
        -    {purge,[prim_app,prim_sup]},
        -    {load,{prim_app,brutal_purge,brutal_purge}},
        -    {load,{prim_sup,brutal_purge,brutal_purge}},
        -    {load,{ch_sup,brutal_purge,brutal_purge}},
        -    {load,{ch3,brutal_purge,brutal_purge}},
        -    {apply,{application,load,[ch_app]}},
        -    {apply,{application,start,[prim_app,permanent]}}]}],
        - [{"A",
        -   [],
        -   [{load_object_code,{prim_app,"1",[prim_app,prim_sup]}},
        +    {apply,{application,stop,[prim_app]}},
        +    {remove,{prim_app,brutal_purge,brutal_purge}},
        +    {remove,{prim_sup,brutal_purge,brutal_purge}},
        +    {purge,[prim_app,prim_sup]},
        +    {load,{prim_app,brutal_purge,brutal_purge}},
        +    {load,{prim_sup,brutal_purge,brutal_purge}},
        +    {load,{ch_sup,brutal_purge,brutal_purge}},
        +    {load,{ch3,brutal_purge,brutal_purge}},
        +    {apply,{application,load,[ch_app]}},
        +    {apply,{application,start,[prim_app,permanent]}}]}],
        + [{"A",
        +   [],
        +   [{load_object_code,{prim_app,"1",[prim_app,prim_sup]}},
             point_of_no_return,
        -    {apply,{application,stop,[prim_app]}},
        -    {apply,{application,unload,[ch_app]}},
        -    {remove,{ch_sup,brutal_purge,brutal_purge}},
        -    {remove,{ch3,brutal_purge,brutal_purge}},
        -    {purge,[ch_sup,ch3]},
        -    {remove,{prim_app,brutal_purge,brutal_purge}},
        -    {remove,{prim_sup,brutal_purge,brutal_purge}},
        -    {purge,[prim_app,prim_sup]},
        -    {load,{prim_app,brutal_purge,brutal_purge}},
        -    {load,{prim_sup,brutal_purge,brutal_purge}},
        -    {apply,{application,start,[prim_app,permanent]}}]}]
        -}.

        + {apply,{application,stop,[prim_app]}}, + {apply,{application,unload,[ch_app]}}, + {remove,{ch_sup,brutal_purge,brutal_purge}}, + {remove,{ch3,brutal_purge,brutal_purge}}, + {purge,[ch_sup,ch3]}, + {remove,{prim_app,brutal_purge,brutal_purge}}, + {remove,{prim_sup,brutal_purge,brutal_purge}}, + {purge,[prim_app,prim_sup]}, + {load,{prim_app,brutal_purge,brutal_purge}}, + {load,{prim_sup,brutal_purge,brutal_purge}}, + {apply,{application,start,[prim_app,permanent]}}]}] +}.

        @@ -484,35 +484,35 @@

        generated version. Load all code for ch_app first, and also load the application specification, before prim_sup is updated. When downgrading, prim_sup is to updated first, before the code for ch_app and its application -specification are unloaded.

        {"B",
        - [{"A",
        -   [],
        -   [{load_object_code,{ch_app,"1",[ch_sup,ch3]}},
        -    {load_object_code,{prim_app,"2",[prim_sup]}},
        +specification are unloaded.

        {"B",
        + [{"A",
        +   [],
        +   [{load_object_code,{ch_app,"1",[ch_sup,ch3]}},
        +    {load_object_code,{prim_app,"2",[prim_sup]}},
             point_of_no_return,
        -    {load,{ch_sup,brutal_purge,brutal_purge}},
        -    {load,{ch3,brutal_purge,brutal_purge}},
        -    {apply,{application,load,[ch_app]}},
        -    {suspend,[prim_sup]},
        -    {load,{prim_sup,brutal_purge,brutal_purge}},
        -    {code_change,up,[{prim_sup,[]}]},
        -    {resume,[prim_sup]},
        -    {apply,{supervisor,restart_child,[prim_sup,ch_sup]}}]}],
        - [{"A",
        -   [],
        -   [{load_object_code,{prim_app,"1",[prim_sup]}},
        +    {load,{ch_sup,brutal_purge,brutal_purge}},
        +    {load,{ch3,brutal_purge,brutal_purge}},
        +    {apply,{application,load,[ch_app]}},
        +    {suspend,[prim_sup]},
        +    {load,{prim_sup,brutal_purge,brutal_purge}},
        +    {code_change,up,[{prim_sup,[]}]},
        +    {resume,[prim_sup]},
        +    {apply,{supervisor,restart_child,[prim_sup,ch_sup]}}]}],
        + [{"A",
        +   [],
        +   [{load_object_code,{prim_app,"1",[prim_sup]}},
             point_of_no_return,
        -    {apply,{supervisor,terminate_child,[prim_sup,ch_sup]}},
        -    {apply,{supervisor,delete_child,[prim_sup,ch_sup]}},
        -    {suspend,[prim_sup]},
        -    {load,{prim_sup,brutal_purge,brutal_purge}},
        -    {code_change,down,[{prim_sup,[]}]},
        -    {resume,[prim_sup]},
        -    {remove,{ch_sup,brutal_purge,brutal_purge}},
        -    {remove,{ch3,brutal_purge,brutal_purge}},
        -    {purge,[ch_sup,ch3]},
        -    {apply,{application,unload,[ch_app]}}]}]
        -}.

        + {apply,{supervisor,terminate_child,[prim_sup,ch_sup]}}, + {apply,{supervisor,delete_child,[prim_sup,ch_sup]}}, + {suspend,[prim_sup]}, + {load,{prim_sup,brutal_purge,brutal_purge}}, + {code_change,down,[{prim_sup,[]}]}, + {resume,[prim_sup]}, + {remove,{ch_sup,brutal_purge,brutal_purge}}, + {remove,{ch3,brutal_purge,brutal_purge}}, + {purge,[ch_sup,ch3]}, + {apply,{application,unload,[ch_app]}}]}] +}.

        @@ -522,28 +522,28 @@

        for example, a port program, is application-dependent and OTP provides no special support.

        Example

        When changing code for a port program, assume that the Erlang process controlling the port is a gen_server portc and that the port is opened in -the callback function init/1:

        init(...) ->
        +the callback function init/1:

        init(...) ->
             ...,
        -    PortPrg = filename:join(code:priv_dir(App), "portc"),
        -    Port = open_port({spawn,PortPrg}, [...]),
        +    PortPrg = filename:join(code:priv_dir(App), "portc"),
        +    Port = open_port({spawn,PortPrg}, [...]),
             ...,
        -    {ok, #state{port=Port, ...}}.

        If the port program is to be updated, the code for the gen_server can be + {ok, #state{port=Port, ...}}.

        If the port program is to be updated, the code for the gen_server can be extended with a code_change/3 function, which closes the old port and opens a new port. (If necessary, the gen_server can first request data that must be -saved from the port program and pass this data to the new port):

        code_change(_OldVsn, State, port) ->
        +saved from the port program and pass this data to the new port):

        code_change(_OldVsn, State, port) ->
             State#state.port ! close,
             receive
        -        {Port,close} ->
        +        {Port,close} ->
                     true
             end,
        -    PortPrg = filename:join(code:priv_dir(App), "portc"),
        -    Port = open_port({spawn,PortPrg}, [...]),
        -    {ok, #state{port=Port, ...}}.

        Update the application version number in the .app file and write an .appup -file:

        ["2",
        - [{"1", [{update, portc, {advanced,port}}]}],
        - [{"1", [{update, portc, {advanced,port}}]}]
        -].

        Ensure that the priv directory, where the C program is located, is included in -the new release package:

        1> systools:make_tar("my_release", [{dirs,[priv]}]).
        +    PortPrg = filename:join(code:priv_dir(App), "portc"),
        +    Port = open_port({spawn,PortPrg}, [...]),
        +    {ok, #state{port=Port, ...}}.

        Update the application version number in the .app file and write an .appup +file:

        ["2",
        + [{"1", [{update, portc, {advanced,port}}]}],
        + [{"1", [{update, portc, {advanced,port}}]}]
        +].

        Ensure that the priv directory, where the C program is located, is included in +the new release package:

        1> systools:make_tar("my_release", [{dirs,[priv]}]).
         ...

        @@ -559,14 +559,14 @@

        restart_emulator (Low-Level) in Release Handling Instructions.

      If a runtime system restart is necessary and no upgrade instructions are needed, that is, if the restart itself is enough for the upgraded applications to start -running the new versions, a simple .relup file can be created manually:

      {"B",
      - [{"A",
      -   [],
      -   [restart_emulator]}],
      - [{"A",
      -   [],
      -   [restart_emulator]}]
      -}.

      In this case, the release handler framework with automatic packing and unpacking +running the new versions, a simple .relup file can be created manually:

      {"B",
      + [{"A",
      +   [],
      +   [restart_emulator]}],
      + [{"A",
      +   [],
      +   [restart_emulator]}]
      +}.

      In this case, the release handler framework with automatic packing and unpacking of release packages, automatic path updates, and so on, can be used without having to specify .appup files.

      diff --git a/prs/9277/doc/system/benchmarking.html b/prs/9277/doc/system/benchmarking.html index c40bc5f087c8f..ed648baac9f93 100644 --- a/prs/9277/doc/system/benchmarking.html +++ b/prs/9277/doc/system/benchmarking.html @@ -148,8 +148,8 @@

      crypto:strong_rand_bytes(100). 1 1915 Ki 522 ns 90%

      rand:bytes/1 is still faster when we generate 100 bytes at the time, but the relative difference is smaller.

      % erlperf 'rand:bytes(1000).' 'crypto:strong_rand_bytes(1000).'
       Code                                    ||        QPS       Time   Rel
      -crypto:strong_rand_bytes(1000).          1    1518 Ki     658 ns  100%
      -rand:bytes(1000).                        1     284 Ki    3521 ns   19%

      When we generate 1000 bytes at the time, crypto:strong_rand_bytes/1 is +crypto:strong_rand_bytes(1000). 1 1518 Ki 658 ns 100% +rand:bytes(1000). 1 284 Ki 3521 ns 19%

      When we generate 1000 bytes at the time, crypto:strong_rand_bytes/1 is now the fastest.

      diff --git a/prs/9277/doc/system/binaryhandling.html b/prs/9277/doc/system/binaryhandling.html index 07581215b02c9..679113f07badf 100644 --- a/prs/9277/doc/system/binaryhandling.html +++ b/prs/9277/doc/system/binaryhandling.html @@ -118,35 +118,35 @@

      This section gives a few examples on how to handle binaries in an efficient way. The sections that follow take an in-depth look at how binaries are implemented and how to best take advantages of the optimizations done by the compiler and -runtime system.

      Binaries can be efficiently built in the following way:

      DO

      my_list_to_binary(List) ->
      -    my_list_to_binary(List, <<>>).
      +runtime system.

      Binaries can be efficiently built in the following way:

      DO

      my_list_to_binary(List) ->
      +    my_list_to_binary(List, <<>>).
       
      -my_list_to_binary([H|T], Acc) ->
      -    my_list_to_binary(T, <<Acc/binary,H>>);
      -my_list_to_binary([], Acc) ->
      +my_list_to_binary([H|T], Acc) ->
      +    my_list_to_binary(T, <<Acc/binary,H>>);
      +my_list_to_binary([], Acc) ->
           Acc.

      Appending data to a binary as in the example is efficient because it is specially optimized by the runtime system to avoid copying the Acc binary -every time.

      Prepending data to a binary in a loop is not efficient:

      DO NOT

      rev_list_to_binary(List) ->
      -    rev_list_to_binary(List, <<>>).
      +every time.

      Prepending data to a binary in a loop is not efficient:

      DO NOT

      rev_list_to_binary(List) ->
      +    rev_list_to_binary(List, <<>>).
       
      -rev_list_to_binary([H|T], Acc) ->
      -    rev_list_to_binary(T, <<H,Acc/binary>>);
      -rev_list_to_binary([], Acc) ->
      +rev_list_to_binary([H|T], Acc) ->
      +    rev_list_to_binary(T, <<H,Acc/binary>>);
      +rev_list_to_binary([], Acc) ->
           Acc.

      This is not efficient for long lists because the Acc binary is copied every -time. One way to make the function more efficient is like this:

      DO NOT

      rev_list_to_binary(List) ->
      -    rev_list_to_binary(lists:reverse(List), <<>>).
      -
      -rev_list_to_binary([H|T], Acc) ->
      -    rev_list_to_binary(T, <<Acc/binary,H>>);
      -rev_list_to_binary([], Acc) ->
      -    Acc.

      Another way to avoid copying the binary each time is like this:

      DO

      rev_list_to_binary([H|T]) ->
      -    RevTail = rev_list_to_binary(T),
      +time. One way to make the function more efficient is like this:

      DO NOT

      rev_list_to_binary(List) ->
      +    rev_list_to_binary(lists:reverse(List), <<>>).
      +
      +rev_list_to_binary([H|T], Acc) ->
      +    rev_list_to_binary(T, <<Acc/binary,H>>);
      +rev_list_to_binary([], Acc) ->
      +    Acc.

      Another way to avoid copying the binary each time is like this:

      DO

      rev_list_to_binary([H|T]) ->
      +    RevTail = rev_list_to_binary(T),
           <<RevTail/binary,H>>;
      -rev_list_to_binary([]) ->
      +rev_list_to_binary([]) ->
           <<>>.

      Note that in each of the DO examples, the binary to be appended to is always -given as the first segment.

      Binaries can be efficiently matched in the following way:

      DO

      my_binary_to_list(<<H,T/binary>>) ->
      -    [H|my_binary_to_list(T)];
      -my_binary_to_list(<<>>) -> [].

      +given as the first segment.

      Binaries can be efficiently matched in the following way:

      DO

      my_binary_to_list(<<H,T/binary>>) ->
      +    [H|my_binary_to_list(T)];
      +my_binary_to_list(<<>>) -> [].

      @@ -223,7 +223,7 @@

      Bin2 = <<Bin1/binary,4,5,6>>, %% 3 Bin3 = <<Bin2/binary,7,8,9>>, %% 4 Bin4 = <<Bin1/binary,17>>, %% 5 !!! -{Bin4,Bin3} %% 6

      • Line 1 (marked with the %% 1 comment), assigns a +{Bin4,Bin3} %% 6

      • Line 1 (marked with the %% 1 comment), assigns a heap binary to the Bin0 variable.

      • Line 2 is an append operation. As Bin0 has not been involved in an append operation, a new refc binary is created and the contents of Bin0 is copied into it. The ProcBin part of the refc @@ -257,15 +257,15 @@

        for every append operation, the runtime system must create a sub binary.

        When the compiler can determine that none of those situations need to be handled and that the append operation cannot possibly fail, the compiler generates code that causes the runtime system to apply a more efficient variant of the -optimization.

        Example:

        -module(repack).
        --export([repack/1]).
        +optimization.

        Example:

        -module(repack).
        +-export([repack/1]).
         
        -repack(Bin) when is_binary(Bin) ->
        -    repack(Bin, <<>>).
        +repack(Bin) when is_binary(Bin) ->
        +    repack(Bin, <<>>).
         
        -repack(<<C:8,T/binary>>, Result) ->
        -    repack(T, <<Result/binary,C:16>>);
        -repack(<<>>, Result) ->
        +repack(<<C:8,T/binary>>, Result) ->
        +    repack(T, <<Result/binary,C:16>>);
        +repack(<<>>, Result) ->
             Result.

        The repack/2 function only keeps a single version of the binary, so there is never any need to copy the binary. The compiler rewrites the creation of the empty binary in repack/1 to instead create a refc binary with 256 bytes @@ -308,9 +308,9 @@

        Matching Binaries

        -

        Let us revisit the example in the beginning of the previous section:

        DO

        my_binary_to_list(<<H,T/binary>>) ->
        -    [H|my_binary_to_list(T)];
        -my_binary_to_list(<<>>) -> [].

        The first time my_binary_to_list/1 is called, a +

        Let us revisit the example in the beginning of the previous section:

        DO

        my_binary_to_list(<<H,T/binary>>) ->
        +    [H|my_binary_to_list(T)];
        +my_binary_to_list(<<>>) -> [].

        The first time my_binary_to_list/1 is called, a match context is created. The match context points to the first byte of the binary. 1 byte is matched out and the match context is updated to point to the second byte in the binary.

        At this point it would make sense to create a @@ -325,24 +325,24 @@

        there is no longer any reference to it).

        To summarize, my_binary_to_list/1 only needs to create one match context and no sub binaries.

        Notice that the match context in my_binary_to_list/1 was discarded when the entire binary had been traversed. What happens if the iteration stops before it -has reached the end of the binary? Will the optimization still work?

        after_zero(<<0,T/binary>>) ->
        +has reached the end of the binary? Will the optimization still work?

        after_zero(<<0,T/binary>>) ->
             T;
        -after_zero(<<_,T/binary>>) ->
        -    after_zero(T);
        -after_zero(<<>>) ->
        +after_zero(<<_,T/binary>>) ->
        +    after_zero(T);
        +after_zero(<<>>) ->
             <<>>.

        Yes, it will. The compiler will remove the building of the sub binary in the second clause:

        ...
        -after_zero(<<_,T/binary>>) ->
        -    after_zero(T);
        -...

        But it will generate code that builds a sub binary in the first clause:

        after_zero(<<0,T/binary>>) ->
        +after_zero(<<_,T/binary>>) ->
        +    after_zero(T);
        +...

        But it will generate code that builds a sub binary in the first clause:

        after_zero(<<0,T/binary>>) ->
             T;
         ...

        Therefore, after_zero/1 builds one match context and one sub binary (assuming -it is passed a binary that contains a zero byte).

        Code like the following will also be optimized:

        all_but_zeroes_to_list(Buffer, Acc, 0) ->
        -    {lists:reverse(Acc),Buffer};
        -all_but_zeroes_to_list(<<0,T/binary>>, Acc, Remaining) ->
        -    all_but_zeroes_to_list(T, Acc, Remaining-1);
        -all_but_zeroes_to_list(<<Byte,T/binary>>, Acc, Remaining) ->
        -    all_but_zeroes_to_list(T, [Byte|Acc], Remaining-1).

        The compiler removes building of sub binaries in the second and third clauses, +it is passed a binary that contains a zero byte).

        Code like the following will also be optimized:

        all_but_zeroes_to_list(Buffer, Acc, 0) ->
        +    {lists:reverse(Acc),Buffer};
        +all_but_zeroes_to_list(<<0,T/binary>>, Acc, Remaining) ->
        +    all_but_zeroes_to_list(T, Acc, Remaining-1);
        +all_but_zeroes_to_list(<<Byte,T/binary>>, Acc, Remaining) ->
        +    all_but_zeroes_to_list(T, [Byte|Acc], Remaining-1).

        The compiler removes building of sub binaries in the second and third clauses, and it adds an instruction to the first clause that converts Buffer from a match context to a sub binary (or do nothing if Buffer is a binary already).

        But in more complicated code, how can one know whether the optimization is applied or not?

        @@ -358,13 +358,13 @@

        practical approach.

        The warnings look as follows:

        ./efficiency_guide.erl:60: Warning: NOT OPTIMIZED: binary is returned from the function
         ./efficiency_guide.erl:62: Warning: OPTIMIZED: match context reused

        To make it clearer exactly what code the warnings refer to, the warnings in the following examples are inserted as comments after the clause they refer to, for -example:

        after_zero(<<0,T/binary>>) ->
        +example:

        after_zero(<<0,T/binary>>) ->
                  %% BINARY CREATED: binary is returned from the function
             T;
        -after_zero(<<_,T/binary>>) ->
        +after_zero(<<_,T/binary>>) ->
                  %% OPTIMIZED: match context reused
        -    after_zero(T);
        -after_zero(<<>>) ->
        +    after_zero(T);
        +after_zero(<<>>) ->
             <<>>.

        The warning for the first clause says that the creation of a sub binary cannot be delayed, because it will be returned. The warning for the second clause says that a sub binary will not be created (yet).

        @@ -374,14 +374,14 @@

        Unused Variables

        The compiler figures out if a variable is unused. The same code is generated for -each of the following functions:

        count1(<<_,T/binary>>, Count) -> count1(T, Count+1);
        -count1(<<>>, Count) -> Count.
        +each of the following functions:

        count1(<<_,T/binary>>, Count) -> count1(T, Count+1);
        +count1(<<>>, Count) -> Count.
         
        -count2(<<H,T/binary>>, Count) -> count2(T, Count+1);
        -count2(<<>>, Count) -> Count.
        +count2(<<H,T/binary>>, Count) -> count2(T, Count+1);
        +count2(<<>>, Count) -> Count.
         
        -count3(<<_H,T/binary>>, Count) -> count3(T, Count+1);
        -count3(<<>>, Count) -> Count.

        In each iteration, the first 8 bits in the binary will be skipped, not matched +count3(<<_H,T/binary>>, Count) -> count3(T, Count+1); +count3(<<>>, Count) -> Count.

        In each iteration, the first 8 bits in the binary will be skipped, not matched out.

      diff --git a/prs/9277/doc/system/bit_syntax.html b/prs/9277/doc/system/bit_syntax.html index a197d2c884ce5..757049827bea4 100644 --- a/prs/9277/doc/system/bit_syntax.html +++ b/prs/9277/doc/system/bit_syntax.html @@ -145,17 +145,17 @@

      variables, and Bin2 is bound, as in Example 2:

      <<D:16, E, F/binary>> = Bin2

      This gives D = 273, E = 00, and F binds to a binary of size 1: binary_to_list(F) = [42].

      Example 4: The following is a more elaborate example of matching. Here, Dgram is bound to the consecutive bytes of an IP datagram of IP protocol -version 4. The ambition is to extract the header and the data of the datagram:

      -define(IP_VERSION, 4).
      --define(IP_MIN_HDR_LEN, 5).
      +version 4. The ambition is to extract the header and the data of the datagram:

      -define(IP_VERSION, 4).
      +-define(IP_MIN_HDR_LEN, 5).
       
      -DgramSize = byte_size(Dgram),
      +DgramSize = byte_size(Dgram),
       case Dgram of
           <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16,
             ID:16, Flgs:3, FragOff:13,
             TTL:8, Proto:8, HdrChkSum:16,
             SrcIP:32,
             DestIP:32, RestDgram/binary>> when HLen>=5, 4*HLen=<DgramSize ->
      -        OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
      +        OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
               <<Opts:OptsLen/binary,Data/binary>> = RestDgram,
           ...
       end.

      Here, the segment corresponding to the Opts variable has a type modifier, @@ -233,7 +233,7 @@

      However, for syntactical reasons, both Value and Size must be enclosed in parenthesis if the expression consists of anything more than a single literal or a variable. The following gives a compiler syntax error:

      <<X+1:8>>

      This expression must be rewritten into the following, to be accepted by the -compiler:

      <<(X+1):8>>

      +compiler:

      <<(X+1):8>>

      @@ -253,11 +253,11 @@

      restrictions on the size. A segment of type float must have size 64 or 32.

      As mentioned earlier, segments have the following general syntax:

      Value:Size/TypeSpecifierList

      When matching Value, value must be either a variable or an integer, or a floating point literal. Expressions are not allowed.

      Size must be a guard expression, which can use -literals and previously bound variables. The following is not allowed:

      foo(N, <<X:N,T/binary>>) ->
      -   {X,T}.

      The two occurrences of N are not related. The compiler will complain that the -N in the size field is unbound.

      The correct way to write this example is as follows:

      foo(N, Bin) ->
      +literals and previously bound variables. The following is not allowed:

      foo(N, <<X:N,T/binary>>) ->
      +   {X,T}.

      The two occurrences of N are not related. The compiler will complain that the +N in the size field is unbound.

      The correct way to write this example is as follows:

      foo(N, Bin) ->
          <<X:N,T/binary>> = Bin,
      -   {X,T}.

      Note

      Before OTP 23, Size was restricted to be an integer or a variable bound to + {X,T}.

      Note

      Before OTP 23, Size was restricted to be an integer or a variable bound to an integer.

      @@ -266,28 +266,28 @@

      There is one exception to the rule that a variable that is used as size must be previously bound. It is possible to match and bind a variable, and use it as a -size within the same binary pattern. For example:

      bar(<<Sz:8,Payload:Sz/binary-unit:8,Rest/binary>>) ->
      -   {Payload,Rest}.

      Here Sz is bound to the value in the first byte of the binary. Sz is then -used at the number of bytes to match out as a binary.

      Starting in OTP 23, the size can be a guard expression:

      bar(<<Sz:8,Payload:((Sz-1)*8)/binary,Rest/binary>>) ->
      -   {Payload,Rest}.

      Here Sz is the combined size of the header and the payload, so we will need to +size within the same binary pattern. For example:

      bar(<<Sz:8,Payload:Sz/binary-unit:8,Rest/binary>>) ->
      +   {Payload,Rest}.

      Here Sz is bound to the value in the first byte of the binary. Sz is then +used at the number of bytes to match out as a binary.

      Starting in OTP 23, the size can be a guard expression:

      bar(<<Sz:8,Payload:((Sz-1)*8)/binary,Rest/binary>>) ->
      +   {Payload,Rest}.

      Here Sz is the combined size of the header and the payload, so we will need to subtract one byte to get the size of the payload.

      Getting the Rest of the Binary or Bitstring

      -

      To match out the rest of a binary, specify a binary field without size:

      foo(<<A:8,Rest/binary>>) ->

      The size of the tail must be evenly divisible by 8.

      To match out the rest of a bitstring, specify a field without size:

      foo(<<A:8,Rest/bitstring>>) ->

      There are no restrictions on the number of bits in the tail.

      +

      To match out the rest of a binary, specify a binary field without size:

      foo(<<A:8,Rest/binary>>) ->

      The size of the tail must be evenly divisible by 8.

      To match out the rest of a bitstring, specify a field without size:

      foo(<<A:8,Rest/bitstring>>) ->

      There are no restrictions on the number of bits in the tail.

      Appending to a Binary

      -

      Appending to a binary in an efficient way can be done as follows:

      triples_to_bin(T) ->
      -    triples_to_bin(T, <<>>).
      +

      Appending to a binary in an efficient way can be done as follows:

      triples_to_bin(T) ->
      +    triples_to_bin(T, <<>>).
       
      -triples_to_bin([{X,Y,Z} | T], Acc) ->
      -    triples_to_bin(T, <<Acc/binary,X:32,Y:32,Z:32>>);
      -triples_to_bin([], Acc) ->
      +triples_to_bin([{X,Y,Z} | T], Acc) ->
      +    triples_to_bin(T, <<Acc/binary,X:32,Y:32,Z:32>>);
      +triples_to_bin([], Acc) ->
           Acc.

      diff --git a/prs/9277/doc/system/c_port.html b/prs/9277/doc/system/c_port.html index 42cf7a0f65585..40a44eb8c9643 100644 --- a/prs/9277/doc/system/c_port.html +++ b/prs/9277/doc/system/c_port.html @@ -152,93 +152,93 @@

      length indicator is to be used to simplify the communication between C and Erlang. The Erlang port automatically adds the length indicator, but this must be done explicitly in the external C program.

      The process is also set to trap exits, which enables detection of failure of the -external program:

      -module(complex1).
      --export([start/1, init/1]).
      -
      -start(ExtPrg) ->
      -  spawn(?MODULE, init, [ExtPrg]).
      -
      -init(ExtPrg) ->
      -  register(complex, self()),
      -  process_flag(trap_exit, true),
      -  Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
      -  loop(Port).

      Now complex1:foo/1 and complex1:bar/1 can be implemented. Both send a -message to the complex process and receive the following replies:

      foo(X) ->
      -  call_port({foo, X}).
      -bar(Y) ->
      -  call_port({bar, Y}).
      -
      -call_port(Msg) ->
      -  complex ! {call, self(), Msg},
      +external program:

      -module(complex1).
      +-export([start/1, init/1]).
      +
      +start(ExtPrg) ->
      +  spawn(?MODULE, init, [ExtPrg]).
      +
      +init(ExtPrg) ->
      +  register(complex, self()),
      +  process_flag(trap_exit, true),
      +  Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
      +  loop(Port).

      Now complex1:foo/1 and complex1:bar/1 can be implemented. Both send a +message to the complex process and receive the following replies:

      foo(X) ->
      +  call_port({foo, X}).
      +bar(Y) ->
      +  call_port({bar, Y}).
      +
      +call_port(Msg) ->
      +  complex ! {call, self(), Msg},
         receive
      -    {complex, Result} ->
      +    {complex, Result} ->
             Result
      -  end.

      The complex process does the following:

      • Encodes the message into a sequence of bytes.
      • Sends it to the port.
      • Waits for a reply.
      • Decodes the reply.
      • Sends it back to the caller:
      loop(Port) ->
      +  end.

      The complex process does the following:

      • Encodes the message into a sequence of bytes.
      • Sends it to the port.
      • Waits for a reply.
      • Decodes the reply.
      • Sends it back to the caller:
      loop(Port) ->
         receive
      -    {call, Caller, Msg} ->
      -      Port ! {self(), {command, encode(Msg)}},
      +    {call, Caller, Msg} ->
      +      Port ! {self(), {command, encode(Msg)}},
             receive
      -        {Port, {data, Data}} ->
      -          Caller ! {complex, decode(Data)}
      +        {Port, {data, Data}} ->
      +          Caller ! {complex, decode(Data)}
             end,
      -      loop(Port)
      +      loop(Port)
         end.

      Assuming that both the arguments and the results from the C functions are less than 256, a simple encoding/decoding scheme is employed. In this scheme, foo is represented by byte 1, bar is represented by 2, and the argument/result is -represented by a single byte as well:

      encode({foo, X}) -> [1, X];
      -encode({bar, Y}) -> [2, Y].
      +represented by a single byte as well:

      encode({foo, X}) -> [1, X];
      +encode({bar, Y}) -> [2, Y].
       
      -decode([Int]) -> Int.

      The resulting Erlang program, including functionality for stopping the port and -detecting port failures, is as follows:

      -module(complex1).
      --export([start/1, stop/0, init/1]).
      --export([foo/1, bar/1]).
      +decode([Int]) -> Int.

      The resulting Erlang program, including functionality for stopping the port and +detecting port failures, is as follows:

      -module(complex1).
      +-export([start/1, stop/0, init/1]).
      +-export([foo/1, bar/1]).
       
      -start(ExtPrg) ->
      -    spawn(?MODULE, init, [ExtPrg]).
      -stop() ->
      +start(ExtPrg) ->
      +    spawn(?MODULE, init, [ExtPrg]).
      +stop() ->
           complex ! stop.
       
      -foo(X) ->
      -    call_port({foo, X}).
      -bar(Y) ->
      -    call_port({bar, Y}).
      +foo(X) ->
      +    call_port({foo, X}).
      +bar(Y) ->
      +    call_port({bar, Y}).
       
      -call_port(Msg) ->
      -    complex ! {call, self(), Msg},
      +call_port(Msg) ->
      +    complex ! {call, self(), Msg},
           receive
      -	{complex, Result} ->
      +	{complex, Result} ->
       	    Result
           end.
       
      -init(ExtPrg) ->
      -    register(complex, self()),
      -    process_flag(trap_exit, true),
      -    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
      -    loop(Port).
      +init(ExtPrg) ->
      +    register(complex, self()),
      +    process_flag(trap_exit, true),
      +    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
      +    loop(Port).
       
      -loop(Port) ->
      +loop(Port) ->
           receive
      -	{call, Caller, Msg} ->
      -	    Port ! {self(), {command, encode(Msg)}},
      +	{call, Caller, Msg} ->
      +	    Port ! {self(), {command, encode(Msg)}},
       	    receive
      -		{Port, {data, Data}} ->
      -		    Caller ! {complex, decode(Data)}
      +		{Port, {data, Data}} ->
      +		    Caller ! {complex, decode(Data)}
       	    end,
      -	    loop(Port);
      +	    loop(Port);
       	stop ->
      -	    Port ! {self(), close},
      +	    Port ! {self(), close},
       	    receive
      -		{Port, closed} ->
      -		    exit(normal)
      +		{Port, closed} ->
      +		    exit(normal)
       	    end;
      -	{'EXIT', Port, Reason} ->
      -	    exit(port_terminated)
      +	{'EXIT', Port, Reason} ->
      +	    exit(port_terminated)
           end.
       
      -encode({foo, X}) -> [1, X];
      -encode({bar, Y}) -> [2, Y].
      +encode({foo, X}) -> [1, X];
      +encode({bar, Y}) -> [2, Y].
       
      -decode([Int]) -> Int.

      +decode([Int]) -> Int.

      @@ -255,55 +255,55 @@

      typedef unsigned char byte; -int read_exact(byte *buf, int len) -{ +int read_exact(byte *buf, int len) +{ int i, got=0; - do { - if ((i = read(0, buf+got, len-got)) <= 0){ - return(i); - } + do { + if ((i = read(0, buf+got, len-got)) <= 0){ + return(i); + } got += i; - } while (got<len); + } while (got<len); - return(len); -} + return(len); +} -int write_exact(byte *buf, int len) -{ +int write_exact(byte *buf, int len) +{ int i, wrote = 0; - do { - if ((i = write(1, buf+wrote, len-wrote)) <= 0) - return (i); + do { + if ((i = write(1, buf+wrote, len-wrote)) <= 0) + return (i); wrote += i; - } while (wrote<len); + } while (wrote<len); - return (len); -} + return (len); +} -int read_cmd(byte *buf) -{ +int read_cmd(byte *buf) +{ int len; - if (read_exact(buf, 2) != 2) - return(-1); - len = (buf[0] << 8) | buf[1]; - return read_exact(buf, len); -} + if (read_exact(buf, 2) != 2) + return(-1); + len = (buf[0] << 8) | buf[1]; + return read_exact(buf, len); +} -int write_cmd(byte *buf, int len) -{ +int write_cmd(byte *buf, int len) +{ byte li; - li = (len >> 8) & 0xff; - write_exact(&li, 1); + li = (len >> 8) & 0xff; + write_exact(&li, 1); li = len & 0xff; - write_exact(&li, 1); + write_exact(&li, 1); - return write_exact(buf, len); -}

      Notice that stdin and stdout are for buffered input/output and must not be + return write_exact(buf, len); +}

      Notice that stdin and stdout are for buffered input/output and must not be used for the communication with Erlang.

      In the main function, the C program is to listen for a message from Erlang and, according to the selected encoding/decoding scheme, use the first byte to determine which function to call and the second byte as argument to the @@ -311,24 +311,24 @@

      typedef unsigned char byte; -int main() { +int main() { int fn, arg, res; - byte buf[100]; - - while (read_cmd(buf) > 0) { - fn = buf[0]; - arg = buf[1]; - - if (fn == 1) { - res = foo(arg); - } else if (fn == 2) { - res = bar(arg); - } - - buf[0] = res; - write_cmd(buf, 1); - } -}

      Notice that the C program is in a while-loop, checking for the return value + byte buf[100]; + + while (read_cmd(buf) > 0) { + fn = buf[0]; + arg = buf[1]; + + if (fn == 1) { + res = foo(arg); + } else if (fn == 2) { + res = bar(arg); + } + + buf[0] = res; + write_cmd(buf, 1); + } +}

      Notice that the C program is in a while-loop, checking for the return value of read_cmd/1. This is because the C program must detect when the port closes and terminates.

      @@ -337,17 +337,17 @@

      Running the Example

      Step 1. Compile the C code:

      $ gcc -o extprg complex.c erl_comm.c port.c

      Step 2. Start Erlang and compile the Erlang code:

      $ erl
      -Erlang/OTP 26 [erts-14.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
      +Erlang/OTP 26 [erts-14.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
       
      -Eshell V14.2 (press Ctrl+G to abort, type help(). for help)
      -1> c(complex1).
      -{ok,complex1}

      Step 3. Run the example:

      2> complex1:start("./extprg").
      +Eshell V14.2 (press Ctrl+G to abort, type help(). for help)
      +1> c(complex1).
      +{ok,complex1}

      Step 3. Run the example:

      2> complex1:start("./extprg").
       <0.34.0>
      -3> complex1:foo(3).
      +3> complex1:foo(3).
       4
      -4> complex1:bar(5).
      +4> complex1:bar(5).
       10
      -5> complex1:stop().
      +5> complex1:stop().
       stop

      diff --git a/prs/9277/doc/system/c_portdriver.html b/prs/9277/doc/system/c_portdriver.html index b8b57485579d6..68a8757731222 100644 --- a/prs/9277/doc/system/c_portdriver.html +++ b/prs/9277/doc/system/c_portdriver.html @@ -155,104 +155,104 @@

      argument.

      The port is then created using the BIF open_port/2, with the tuple {spawn, DriverName} as the first argument. The string SharedLib is the name of the port driver. The second argument is a list of options, none in this -case:

      -module(complex5).
      --export([start/1, init/1]).
      +case:

      -module(complex5).
      +-export([start/1, init/1]).
       
      -start(SharedLib) ->
      -    case erl_ddll:load_driver(".", SharedLib) of
      +start(SharedLib) ->
      +    case erl_ddll:load_driver(".", SharedLib) of
               ok -> ok;
      -        {error, already_loaded} -> ok;
      -        _ -> exit({error, could_not_load_driver})
      +        {error, already_loaded} -> ok;
      +        _ -> exit({error, could_not_load_driver})
           end,
      -    spawn(?MODULE, init, [SharedLib]).
      -
      -init(SharedLib) ->
      -  register(complex, self()),
      -  Port = open_port({spawn, SharedLib}, []),
      -  loop(Port).

      Now complex5:foo/1 and complex5:bar/1 can be implemented. Both send a -message to the complex process and receive the following reply:

      foo(X) ->
      -    call_port({foo, X}).
      -bar(Y) ->
      -    call_port({bar, Y}).
      -
      -call_port(Msg) ->
      -    complex ! {call, self(), Msg},
      +    spawn(?MODULE, init, [SharedLib]).
      +
      +init(SharedLib) ->
      +  register(complex, self()),
      +  Port = open_port({spawn, SharedLib}, []),
      +  loop(Port).

      Now complex5:foo/1 and complex5:bar/1 can be implemented. Both send a +message to the complex process and receive the following reply:

      foo(X) ->
      +    call_port({foo, X}).
      +bar(Y) ->
      +    call_port({bar, Y}).
      +
      +call_port(Msg) ->
      +    complex ! {call, self(), Msg},
           receive
      -        {complex, Result} ->
      +        {complex, Result} ->
                   Result
      -    end.

      The complex process performs the following:

      • Encodes the message into a sequence of bytes.
      • Sends it to the port.
      • Waits for a reply.
      • Decodes the reply.
      • Sends it back to the caller:
      loop(Port) ->
      +    end.

      The complex process performs the following:

      • Encodes the message into a sequence of bytes.
      • Sends it to the port.
      • Waits for a reply.
      • Decodes the reply.
      • Sends it back to the caller:
      loop(Port) ->
           receive
      -        {call, Caller, Msg} ->
      -            Port ! {self(), {command, encode(Msg)}},
      +        {call, Caller, Msg} ->
      +            Port ! {self(), {command, encode(Msg)}},
                   receive
      -                {Port, {data, Data}} ->
      -                    Caller ! {complex, decode(Data)}
      +                {Port, {data, Data}} ->
      +                    Caller ! {complex, decode(Data)}
                   end,
      -            loop(Port)
      +            loop(Port)
           end.

      Assuming that both the arguments and the results from the C functions are less than 256, a simple encoding/decoding scheme is employed. In this scheme, foo is represented by byte 1, bar is represented by 2, and the argument/result is -represented by a single byte as well:

      encode({foo, X}) -> [1, X];
      -encode({bar, Y}) -> [2, Y].
      +represented by a single byte as well:

      encode({foo, X}) -> [1, X];
      +encode({bar, Y}) -> [2, Y].
       
      -decode([Int]) -> Int.

      The resulting Erlang program, including functions for stopping the port and +decode([Int]) -> Int.

      The resulting Erlang program, including functions for stopping the port and detecting port failures, is as follows:

      
      --module(complex5).
      --export([start/1, stop/0, init/1]).
      --export([foo/1, bar/1]).
      +-module(complex5).
      +-export([start/1, stop/0, init/1]).
      +-export([foo/1, bar/1]).
       
      -start(SharedLib) ->
      -    case erl_ddll:load_driver(".", SharedLib) of
      +start(SharedLib) ->
      +    case erl_ddll:load_driver(".", SharedLib) of
       	ok -> ok;
      -	{error, already_loaded} -> ok;
      -	_ -> exit({error, could_not_load_driver})
      +	{error, already_loaded} -> ok;
      +	_ -> exit({error, could_not_load_driver})
           end,
      -    spawn(?MODULE, init, [SharedLib]).
      +    spawn(?MODULE, init, [SharedLib]).
       
      -init(SharedLib) ->
      -    register(complex, self()),
      -    Port = open_port({spawn, SharedLib}, []),
      -    loop(Port).
      +init(SharedLib) ->
      +    register(complex, self()),
      +    Port = open_port({spawn, SharedLib}, []),
      +    loop(Port).
       
      -stop() ->
      +stop() ->
           complex ! stop.
       
      -foo(X) ->
      -    call_port({foo, X}).
      -bar(Y) ->
      -    call_port({bar, Y}).
      +foo(X) ->
      +    call_port({foo, X}).
      +bar(Y) ->
      +    call_port({bar, Y}).
       
      -call_port(Msg) ->
      -    complex ! {call, self(), Msg},
      +call_port(Msg) ->
      +    complex ! {call, self(), Msg},
           receive
      -	{complex, Result} ->
      +	{complex, Result} ->
       	    Result
           end.
       
      -loop(Port) ->
      +loop(Port) ->
           receive
      -	{call, Caller, Msg} ->
      -	    Port ! {self(), {command, encode(Msg)}},
      +	{call, Caller, Msg} ->
      +	    Port ! {self(), {command, encode(Msg)}},
       	    receive
      -		{Port, {data, Data}} ->
      -		    Caller ! {complex, decode(Data)}
      +		{Port, {data, Data}} ->
      +		    Caller ! {complex, decode(Data)}
       	    end,
      -	    loop(Port);
      +	    loop(Port);
       	stop ->
      -	    Port ! {self(), close},
      +	    Port ! {self(), close},
       	    receive
      -		{Port, closed} ->
      -		    exit(normal)
      +		{Port, closed} ->
      +		    exit(normal)
       	    end;
      -	{'EXIT', Port, Reason} ->
      -	    io:format("~p ~n", [Reason]),
      -	    exit(port_terminated)
      +	{'EXIT', Port, Reason} ->
      +	    io:format("~p ~n", [Reason]),
      +	    exit(port_terminated)
           end.
       
      -encode({foo, X}) -> [1, X];
      -encode({bar, Y}) -> [2, Y].
      +encode({foo, X}) -> [1, X];
      +encode({bar, Y}) -> [2, Y].
       
      -decode([Int]) -> Int.

      +decode([Int]) -> Int.

      @@ -277,36 +277,36 @@

      #include <stdio.h> #include "erl_driver.h" -typedef struct { +typedef struct { ErlDrvPort port; -} example_data; +} example_data; -static ErlDrvData example_drv_start(ErlDrvPort port, char *buff) -{ - example_data* d = (example_data*)driver_alloc(sizeof(example_data)); +static ErlDrvData example_drv_start(ErlDrvPort port, char *buff) +{ + example_data* d = (example_data*)driver_alloc(sizeof(example_data)); d->port = port; - return (ErlDrvData)d; -} - -static void example_drv_stop(ErlDrvData handle) -{ - driver_free((char*)handle); -} - -static void example_drv_output(ErlDrvData handle, char *buff, - ErlDrvSizeT bufflen) -{ - example_data* d = (example_data*)handle; - char fn = buff[0], arg = buff[1], res; - if (fn == 1) { - res = foo(arg); - } else if (fn == 2) { - res = bar(arg); - } - driver_output(d->port, &res, 1); -} - -ErlDrvEntry example_driver_entry = { + return (ErlDrvData)d; +} + +static void example_drv_stop(ErlDrvData handle) +{ + driver_free((char*)handle); +} + +static void example_drv_output(ErlDrvData handle, char *buff, + ErlDrvSizeT bufflen) +{ + example_data* d = (example_data*)handle; + char fn = buff[0], arg = buff[1], res; + if (fn == 1) { + res = foo(arg); + } else if (fn == 2) { + res = bar(arg); + } + driver_output(d->port, &res, 1); +} + +ErlDrvEntry example_driver_entry = { NULL, /* F_PTR init, called when driver is loaded */ example_drv_start, /* L_PTR start, called when port is opened */ example_drv_stop, /* F_PTR stop, called when port is closed */ @@ -338,12 +338,12 @@

      monitored process dies */ NULL /* F_PTR stop_select, called to close an event object */ -}; +}; -DRIVER_INIT(example_drv) /* must match name in driver_entry */ -{ +DRIVER_INIT(example_drv) /* must match name in driver_entry */ +{ return &example_driver_entry; -}

      +}

      @@ -351,17 +351,17 @@

      Step 1. Compile the C code:

      unix> gcc -o example_drv.so -fpic -shared complex.c port_driver.c
       windows> cl -LD -MD -Fe example_drv.dll complex.c port_driver.c

      Step 2. Start Erlang and compile the Erlang code:

      > erl
      -Erlang/OTP 26 [erts-14.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
      +Erlang/OTP 26 [erts-14.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]
       
      -Eshell V14.2 (press Ctrl+G to abort, type help(). for help)
      -1> c(complex5).
      -{ok,complex5}

      Step 3. Run the example:

      2> complex5:start("example_drv").
      +Eshell V14.2 (press Ctrl+G to abort, type help(). for help)
      +1> c(complex5).
      +{ok,complex5}

      Step 3. Run the example:

      2> complex5:start("example_drv").
       <0.34.0>
      -3> complex5:foo(3).
      +3> complex5:foo(3).
       4
      -4> complex5:bar(5).
      +4> complex5:bar(5).
       10
      -5> complex5:stop().
      +5> complex5:stop().
       stop

      diff --git a/prs/9277/doc/system/code_loading.html b/prs/9277/doc/system/code_loading.html index 260daedcf2ae1..a582a05aa241c 100644 --- a/prs/9277/doc/system/code_loading.html +++ b/prs/9277/doc/system/code_loading.html @@ -126,8 +126,8 @@

      Erlang programs must be compiled to object code. The compiler can generate a new file that contains the object code. The current abstract machine, which runs the object code, is called BEAM, therefore the object files get the suffix -.beam. The compiler can also generate a binary which can be loaded directly.

      The compiler is located in the module compile in Compiler.

      compile:file(Module)
      -compile:file(Module, Options)

      The Erlang shell understands the command c(Module), which both compiles and +.beam. The compiler can also generate a binary which can be loaded directly.

      The compiler is located in the module compile in Compiler.

      compile:file(Module)
      +compile:file(Module, Options)

      The Erlang shell understands the command c(Module), which both compiles and loads Module.

      There is also a module make, which provides a set of functions similar to the UNIX type Make functions, see module make in Tools.

      The compiler can also be accessed from the OS prompt using the erl executable in ERTS.

      % erl -compile Module1...ModuleN
      @@ -160,16 +160,16 @@ 

      evaluated because of processes lingering in the old code.

      If a third instance of the module is loaded, the code server removes (purges) the old code and any processes lingering in it is terminated. Then the third instance becomes 'current' and the previously current code becomes 'old'.

      To change from old code to current code, a process must make a fully qualified -function call.

      Example:

      -module(m).
      --export([loop/0]).
      +function call.

      Example:

      -module(m).
      +-export([loop/0]).
       
      -loop() ->
      +loop() ->
           receive
               code_switch ->
      -            m:loop();
      +            m:loop();
               Msg ->
                   ...
      -            loop()
      +            loop()
           end.

      To make the process change code, send the message code_switch to it. The process then makes a fully qualified call to m:loop() and changes to current code. Notice that m:loop/0 must be exported.

      For code replacement of funs to work, use the syntax @@ -180,7 +180,7 @@

      Running a Function When a Module is Loaded

      The -on_load() directive names a function that is to be run automatically when -a module is loaded.

      Its syntax is as follows:

      -on_load(Name/0).

      It is not necessary to export the function. It is called in a freshly spawned +a module is loaded.

      Its syntax is as follows:

      -on_load(Name/0).

      It is not necessary to export the function. It is called in a freshly spawned process (which terminates as soon as the function returns).

      The function must return ok if the module is to become the new current code for the module and become callable.

      Returning any other value or generating an exception causes the new code to be unloaded. If the return value is not an atom, a warning error report is sent to @@ -193,13 +193,13 @@

      code would become old, essentially leaving the system without any working and reachable instance of the module.

      In embedded mode, first all modules are loaded. Then all on_load functions are called. The system is terminated unless all of the on_load functions return -ok.

      Example:

      -module(m).
      --on_load(load_my_nifs/0).
      +ok.

      Example:

      -module(m).
      +-on_load(load_my_nifs/0).
       
      -load_my_nifs() ->
      +load_my_nifs() ->
           NifPath = ...,    %Set up the path to the NIF library.
           Info = ...,       %Initialize the Info term
      -    erlang:load_nif(NifPath, Info).

      If the call to erlang:load_nif/2 fails, the module is unloaded and a warning + erlang:load_nif(NifPath, Info).

      If the call to erlang:load_nif/2 fails, the module is unloaded and a warning report is sent to the error loader.

      diff --git a/prs/9277/doc/system/commoncaveats.html b/prs/9277/doc/system/commoncaveats.html index ed7d7e6e40db7..7456848a923d4 100644 --- a/prs/9277/doc/system/commoncaveats.html +++ b/prs/9277/doc/system/commoncaveats.html @@ -122,23 +122,23 @@

      Operator ++

      The ++ operator copies its left-hand side operand. That is clearly -seen if we do our own implementation in Erlang:

      my_plus_plus([H|T], Tail) ->
      -    [H|my_plus_plus(T, Tail)];
      -my_plus_plus([], Tail) ->
      -    Tail.

      We must be careful how we use ++ in a loop. First is how not to use it:

      DO NOT

      naive_reverse([H|T]) ->
      -    naive_reverse(T) ++ [H];
      -naive_reverse([]) ->
      -    [].

      As the ++ operator copies its left-hand side operand, the growing -result is copied repeatedly, leading to quadratic complexity.

      On the other hand, using ++ in loop like this is perfectly fine:

      OK

      naive_but_ok_reverse(List) ->
      -    naive_but_ok_reverse(List, []).
      -
      -naive_but_ok_reverse([H|T], Acc) ->
      -    naive_but_ok_reverse(T, [H] ++ Acc);
      -naive_but_ok_reverse([], Acc) ->
      +seen if we do our own implementation in Erlang:

      my_plus_plus([H|T], Tail) ->
      +    [H|my_plus_plus(T, Tail)];
      +my_plus_plus([], Tail) ->
      +    Tail.

      We must be careful how we use ++ in a loop. First is how not to use it:

      DO NOT

      naive_reverse([H|T]) ->
      +    naive_reverse(T) ++ [H];
      +naive_reverse([]) ->
      +    [].

      As the ++ operator copies its left-hand side operand, the growing +result is copied repeatedly, leading to quadratic complexity.

      On the other hand, using ++ in loop like this is perfectly fine:

      OK

      naive_but_ok_reverse(List) ->
      +    naive_but_ok_reverse(List, []).
      +
      +naive_but_ok_reverse([H|T], Acc) ->
      +    naive_but_ok_reverse(T, [H] ++ Acc);
      +naive_but_ok_reverse([], Acc) ->
           Acc.

      Each list element is copied only once. The growing result Acc is the right-hand -side operand, which it is not copied.

      Experienced Erlang programmers would probably write as follows:

      DO

      vanilla_reverse([H|T], Acc) ->
      -    vanilla_reverse(T, [H|Acc]);
      -vanilla_reverse([], Acc) ->
      +side operand, which it is not copied.

      Experienced Erlang programmers would probably write as follows:

      DO

      vanilla_reverse([H|T], Acc) ->
      +    vanilla_reverse(T, [H|Acc]);
      +vanilla_reverse([], Acc) ->
           Acc.

      In principle, this is slightly more efficient because the list element [H] is not built before being copied and discarded. In practice, the compiler rewrites [H] ++ Acc to [H|Acc].

      @@ -164,41 +164,41 @@

      Accidental Copying and Loss of Sharing

      When spawning a new process using a fun, one can accidentally copy more data to -the process than intended. For example:

      DO NOT

      accidental1(State) ->
      -    spawn(fun() ->
      -                  io:format("~p\n", [State#state.info])
      -          end).

      The code in the fun will extract one element from the record and print it. The +the process than intended. For example:

      DO NOT

      accidental1(State) ->
      +    spawn(fun() ->
      +                  io:format("~p\n", [State#state.info])
      +          end).

      The code in the fun will extract one element from the record and print it. The rest of the state record is not used. However, when the spawn/1 -function is executed, the entire record is copied to the newly created process.

      The same kind of problem can happen with a map:

      DO NOT

      accidental2(State) ->
      -    spawn(fun() ->
      -                  io:format("~p\n", [map_get(info, State)])
      -          end).

      In the following example (part of a module implementing the gen_server -behavior) the created fun is sent to another process:

      DO NOT

      handle_call(give_me_a_fun, _From, State) ->
      -    Fun = fun() -> State#state.size =:= 42 end,
      -    {reply, Fun, State}.

      How bad that unnecessary copy is depends on the contents of the record or the -map.

      For example, if the state record is initialized like this:

      init1() ->
      -    #state{data=lists:seq(1, 10000)}.

      a list with 10000 elements (or about 20000 heap words) will be copied to the +function is executed, the entire record is copied to the newly created process.

      The same kind of problem can happen with a map:

      DO NOT

      accidental2(State) ->
      +    spawn(fun() ->
      +                  io:format("~p\n", [map_get(info, State)])
      +          end).

      In the following example (part of a module implementing the gen_server +behavior) the created fun is sent to another process:

      DO NOT

      handle_call(give_me_a_fun, _From, State) ->
      +    Fun = fun() -> State#state.size =:= 42 end,
      +    {reply, Fun, State}.

      How bad that unnecessary copy is depends on the contents of the record or the +map.

      For example, if the state record is initialized like this:

      init1() ->
      +    #state{data=lists:seq(1, 10000)}.

      a list with 10000 elements (or about 20000 heap words) will be copied to the newly created process.

      An unnecessary copy of 10000 element list can be bad enough, but it can get even worse if the state record contains shared subterms. Here is a simple example -of a term with a shared subterm:

      {SubTerm, SubTerm}

      When a term is copied to another process, sharing of subterms will be lost and -the copied term can be many times larger than the original term. For example:

      init2() ->
      -    SharedSubTerms = lists:foldl(fun(_, A) -> [A|A] end, [0], lists:seq(1, 15)),
      -    #state{data=Shared}.

      In the process that calls init2/0, the size of the data field in the state +of a term with a shared subterm:

      {SubTerm, SubTerm}

      When a term is copied to another process, sharing of subterms will be lost and +the copied term can be many times larger than the original term. For example:

      init2() ->
      +    SharedSubTerms = lists:foldl(fun(_, A) -> [A|A] end, [0], lists:seq(1, 15)),
      +    #state{data=Shared}.

      In the process that calls init2/0, the size of the data field in the state record will be 32 heap words. When the record is copied to the newly created process, sharing will be lost and the size of the copied data field will be 131070 heap words. More details about loss off sharing are found in a later section.

      To avoid the problem, outside of the fun extract only the fields of the record -that are actually used:

      DO

      fixed_accidental1(State) ->
      +that are actually used:

      DO

      fixed_accidental1(State) ->
           Info = State#state.info,
      -    spawn(fun() ->
      -                  io:format("~p\n", [Info])
      -          end).

      Similarly, outside of the fun extract only the map elements that are actually -used:

      DO

      fixed_accidental2(State) ->
      -    Info = map_get(info, State),
      -    spawn(fun() ->
      -                  io:format("~p\n", [Info])
      -          end).

      + spawn(fun() -> + io:format("~p\n", [Info]) + end).

      Similarly, outside of the fun extract only the map elements that are actually +used:

      DO

      fixed_accidental2(State) ->
      +    Info = map_get(info, State),
      +    spawn(fun() ->
      +                  io:format("~p\n", [Info])
      +          end).

      @@ -213,7 +213,7 @@

      to guard against a denial-of-service attack. (All atoms that are allowed must have been created earlier, for example, by using all of them in a module and loading that module.)

      Using list_to_atom/1 to construct an atom that -is passed to apply/3 is quite expensive.

      DO NOT

      apply(list_to_atom("some_prefix"++Var), foo, Args)

      +is passed to apply/3 is quite expensive.

      DO NOT

      apply(list_to_atom("some_prefix"++Var), foo, Args)

      @@ -225,8 +225,8 @@

      execute in constant time.

      Normally, there is no need to worry about the speed of length/1, because it is efficiently implemented in C. In time-critical code, you might want to avoid it if the input list could potentially be very long.

      Some uses of length/1 can be replaced by matching. For example, -the following code:

      foo(L) when length(L) >= 3 ->
      -    ...

      can be rewritten to:

      foo([_,_,_|_]=L) ->
      +the following code:

      foo(L) when length(L) >= 3 ->
      +    ...

      can be rewritten to:

      foo([_,_,_|_]=L) ->
          ...

      One slight difference is that length(L) fails if L is an improper list, while the pattern in the second code fragment accepts an improper list.

      @@ -242,10 +242,10 @@

      as if the tuple was copied, the call to setelement/3 is replaced with a special destructive setelement instruction. In the following code sequence, the first setelement/3 call copies the tuple -and modifies the ninth element:

      multiple_setelement(T0) when tuple_size(T0) =:= 9 ->
      -    T1 = setelement(9, T0, bar),
      -    T2 = setelement(7, T1, foobar),
      -    setelement(5, T2, new_value).

      The two following setelement/3 calls modify the tuple in +and modifies the ninth element:

      multiple_setelement(T0) when tuple_size(T0) =:= 9 ->
      +    T1 = setelement(9, T0, bar),
      +    T2 = setelement(7, T1, foobar),
      +    setelement(5, T2, new_value).

      The two following setelement/3 calls modify the tuple in place.

      For the optimization to be applied, all the following conditions must be true:

      • The tuple argument must be known to be a tuple of a known size.
      • The indices must be integer literals, not variables or expressions.
      • The indices must be given in descending order.
      • There must be no calls to another function in between the calls to setelement/3.
      • The tuple returned from one setelement/3 call must only be used in the subsequent call to setelement/3.

      If the code cannot be structured as in the multiple_setelement/1 example, the diff --git a/prs/9277/doc/system/conc_prog.html b/prs/9277/doc/system/conc_prog.html index 35242dea2392b..426d50462ed30 100644 --- a/prs/9277/doc/system/conc_prog.html +++ b/prs/9277/doc/system/conc_prog.html @@ -136,21 +136,21 @@

      Threads of execution in Erlang share no data, that is why they are called processes).

      The Erlang BIF spawn is used to create a new process: spawn(Module, Exported_Function, List of Arguments). Consider the following -module:

      -module(tut14).
      +module:

      -module(tut14).
       
      --export([start/0, say_something/2]).
      +-export([start/0, say_something/2]).
       
      -say_something(What, 0) ->
      +say_something(What, 0) ->
           done;
      -say_something(What, Times) ->
      -    io:format("~p~n", [What]),
      -    say_something(What, Times - 1).
      -
      -start() ->
      -    spawn(tut14, say_something, [hello, 3]),
      -    spawn(tut14, say_something, [goodbye, 3]).
      5> c(tut14).
      -{ok,tut14}
      -6> tut14:say_something(hello, 3).
      +say_something(What, Times) ->
      +    io:format("~p~n", [What]),
      +    say_something(What, Times - 1).
      +
      +start() ->
      +    spawn(tut14, say_something, [hello, 3]),
      +    spawn(tut14, say_something, [goodbye, 3]).
      5> c(tut14).
      +{ok,tut14}
      +6> tut14:say_something(hello, 3).
       hello
       hello
       hello
      @@ -159,7 +159,7 @@ 

      processes, one that writes "hello" three times and one that writes "goodbye" three times. Both processes use the function say_something. Notice that a function used in this way by spawn, to start a process, must be exported from -the module (that is, in the -export at the start of the module).

      9> tut14:start().
      +the module (that is, in the -export at the start of the module).

      9> tut14:start().
       hello
       goodbye
       <0.63.0>
      @@ -170,7 +170,7 @@ 

      Instead, the first process wrote a "hello", the second a "goodbye", the first another "hello" and so forth. But where did the <0.63.0> come from? The return value of a function is the return value of the last "thing" in the function. The -last thing in the function start is

      spawn(tut14, say_something, [goodbye, 3]).

      spawn returns a process identifier, or pid, which uniquely identifies the +last thing in the function start is

      spawn(tut14, say_something, [goodbye, 3]).

      spawn returns a process identifier, or pid, which uniquely identifies the process. So <0.63.0> is the pid of the spawn function call above. The next example shows how to use pids.

      Notice also that ~p is used instead of ~w in io:format/2. To quote the manual:

      ~p Writes the data with standard syntax in the same way as ~w, but breaks terms whose printed representation is longer than one line into many lines and indents @@ -182,37 +182,37 @@

      Message Passing

      In the following example two processes are created and they send messages to -each other a number of times.

      -module(tut15).
      +each other a number of times.

      -module(tut15).
       
      --export([start/0, ping/2, pong/0]).
      +-export([start/0, ping/2, pong/0]).
       
      -ping(0, Pong_PID) ->
      +ping(0, Pong_PID) ->
           Pong_PID ! finished,
      -    io:format("ping finished~n", []);
      +    io:format("ping finished~n", []);
       
      -ping(N, Pong_PID) ->
      -    Pong_PID ! {ping, self()},
      +ping(N, Pong_PID) ->
      +    Pong_PID ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping(N - 1, Pong_PID).
      +    ping(N - 1, Pong_PID).
       
      -pong() ->
      +pong() ->
           receive
               finished ->
      -            io:format("Pong finished~n", []);
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +            io:format("Pong finished~n", []);
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           end.
       
      -start() ->
      -    Pong_PID = spawn(tut15, pong, []),
      -    spawn(tut15, ping, [3, Pong_PID]).
      1> c(tut15).
      -{ok,tut15}
      -2> tut15: start().
      +start() ->
      +    Pong_PID = spawn(tut15, pong, []),
      +    spawn(tut15, ping, [3, Pong_PID]).
      1> c(tut15).
      +{ok,tut15}
      +2> tut15: start().
       <0.36.0>
       Pong received ping
       Ping received pong
      @@ -221,14 +221,14 @@ 

      Pong received ping Ping received pong ping finished -Pong finished

      The function start first creates a process, let us call it "pong":

      Pong_PID = spawn(tut15, pong, [])

      This process executes tut15:pong(). Pong_PID is the process identity of the -"pong" process. The function start now creates another process "ping":

      spawn(tut15, ping, [3, Pong_PID]),

      This process executes:

      tut15:ping(3, Pong_PID)

      <0.36.0> is the return value from the start function.

      The process "pong" now does:

      receive
      +Pong finished

      The function start first creates a process, let us call it "pong":

      Pong_PID = spawn(tut15, pong, [])

      This process executes tut15:pong(). Pong_PID is the process identity of the +"pong" process. The function start now creates another process "ping":

      spawn(tut15, ping, [3, Pong_PID]),

      This process executes:

      tut15:ping(3, Pong_PID)

      <0.36.0> is the return value from the start function.

      The process "pong" now does:

      receive
           finished ->
      -        io:format("Pong finished~n", []);
      -    {ping, Ping_PID} ->
      -        io:format("Pong received ping~n", []),
      +        io:format("Pong finished~n", []);
      +    {ping, Ping_PID} ->
      +        io:format("Pong received ping~n", []),
               Ping_PID ! pong,
      -        pong()
      +        pong()
       end.

      The receive construct is used to allow processes to wait for messages from other processes. It has the following format:

      receive
          pattern1 ->
      @@ -257,21 +257,21 @@ 

      procedure is repeated.

      The Erlang implementation is "clever" and minimizes the number of times each message is tested against the patterns in each receive.

      Now back to the ping pong example.

      "Pong" is waiting for messages. If the atom finished is received, "pong" writes "Pong finished" to the output and, as it has nothing more to do, -terminates. If it receives a message with the format:

      {ping, Ping_PID}

      it writes "Pong received ping" to the output and sends the atom pong to the +terminates. If it receives a message with the format:

      {ping, Ping_PID}

      it writes "Pong received ping" to the output and sends the atom pong to the process "ping":

      Ping_PID ! pong

      Notice how the operator "!" is used to send messages. The syntax of "!" is:

      Pid ! Message

      That is, Message (any Erlang term) is sent to the process with identity Pid.

      After sending the message pong to the process "ping", "pong" calls the pong function again, which causes it to get back to the receive again and wait for -another message.

      Now let us look at the process "ping". Recall that it was started by executing:

      tut15:ping(3, Pong_PID)

      Looking at the function ping/2, the second clause of ping/2 is executed +another message.

      Now let us look at the process "ping". Recall that it was started by executing:

      tut15:ping(3, Pong_PID)

      Looking at the function ping/2, the second clause of ping/2 is executed since the value of the first argument is 3 (not 0) (first clause head is -ping(0,Pong_PID), second clause head is ping(N,Pong_PID), so N becomes 3).

      The second clause sends a message to "pong":

      Pong_PID ! {ping, self()},

      self/0 returns the pid of the process that executes self/0, in this case the +ping(0,Pong_PID), second clause head is ping(N,Pong_PID), so N becomes 3).

      The second clause sends a message to "pong":

      Pong_PID ! {ping, self()},

      self/0 returns the pid of the process that executes self/0, in this case the pid of "ping". (Recall the code for "pong", this lands up in the variable Ping_PID in the receive previously explained.)

      "Ping" now waits for a reply from "pong":

      receive
           pong ->
      -        io:format("Ping received pong~n", [])
      +        io:format("Ping received pong~n", [])
       end,

      It writes "Ping received pong" when this reply arrives, after which "ping" calls -the ping function again.

      ping(N - 1, Pong_PID)

      N-1 causes the first argument to be decremented until it becomes 0. When this -occurs, the first clause of ping/2 is executed:

      ping(0, Pong_PID) ->
      +the ping function again.

      ping(N - 1, Pong_PID)

      N-1 causes the first argument to be decremented until it becomes 0. When this +occurs, the first clause of ping/2 is executed:

      ping(0, Pong_PID) ->
           Pong_PID !  finished,
      -    io:format("ping finished~n", []);

      The atom finished is sent to "pong" (causing it to terminate as described + io:format("ping finished~n", []);

      The atom finished is sent to "pong" (causing it to terminate as described above) and "ping finished" is written to the output. "Ping" then terminates as it has nothing left to do.

      @@ -285,38 +285,38 @@

      processes which need to know each other's identities are started independently of each other. Erlang thus provides a mechanism for processes to be given names so that these names can be used as identities instead of pids. This is done by -using the register BIF:

      register(some_atom, Pid)

      Let us now rewrite the ping pong example using this and give the name pong to -the "pong" process:

      -module(tut16).
      +using the register BIF:

      register(some_atom, Pid)

      Let us now rewrite the ping pong example using this and give the name pong to +the "pong" process:

      -module(tut16).
       
      --export([start/0, ping/1, pong/0]).
      +-export([start/0, ping/1, pong/0]).
       
      -ping(0) ->
      +ping(0) ->
           pong ! finished,
      -    io:format("ping finished~n", []);
      +    io:format("ping finished~n", []);
       
      -ping(N) ->
      -    pong ! {ping, self()},
      +ping(N) ->
      +    pong ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping(N - 1).
      +    ping(N - 1).
       
      -pong() ->
      +pong() ->
           receive
               finished ->
      -            io:format("Pong finished~n", []);
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +            io:format("Pong finished~n", []);
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           end.
       
      -start() ->
      -    register(pong, spawn(tut16, pong, [])),
      -    spawn(tut16, ping, [3]).
      2> c(tut16).
      -{ok, tut16}
      -3> tut16:start().
      +start() ->
      +    register(pong, spawn(tut16, pong, [])),
      +    spawn(tut16, ping, [3]).
      2> c(tut16).
      +{ok, tut16}
      +3> tut16:start().
       <0.38.0>
       Pong received ping
       Ping received pong
      @@ -325,8 +325,8 @@ 

      Pong received ping Ping received pong ping finished -Pong finished

      Here the start/0 function,

      register(pong, spawn(tut16, pong, [])),

      both spawns the "pong" process and gives it the name pong. In the "ping" -process, messages can be sent to pong by:

      pong ! {ping, self()},

      ping/2 now becomes ping/1 as the argument Pong_PID is not needed.

      +Pong finished

      Here the start/0 function,

      register(pong, spawn(tut16, pong, [])),

      both spawns the "pong" process and gives it the name pong. In the "ping" +process, messages can be sent to pong by:

      pong ! {ping, self()},

      ping/2 now becomes ping/1 as the argument Pong_PID is not needed.

      @@ -354,37 +354,37 @@

      Erlang system running on a computer is called an Erlang node.

      (Note: erl -sname assumes that all nodes are in the same IP domain and we can use only the first component of the IP address, if we want to use nodes in different domains we use -name instead, but then all IP address must be given -in full.)

      Here is the ping pong example modified to run on two separate nodes:

      -module(tut17).
      +in full.)

      Here is the ping pong example modified to run on two separate nodes:

      -module(tut17).
       
      --export([start_ping/1, start_pong/0,  ping/2, pong/0]).
      +-export([start_ping/1, start_pong/0,  ping/2, pong/0]).
       
      -ping(0, Pong_Node) ->
      -    {pong, Pong_Node} ! finished,
      -    io:format("ping finished~n", []);
      +ping(0, Pong_Node) ->
      +    {pong, Pong_Node} ! finished,
      +    io:format("ping finished~n", []);
       
      -ping(N, Pong_Node) ->
      -    {pong, Pong_Node} ! {ping, self()},
      +ping(N, Pong_Node) ->
      +    {pong, Pong_Node} ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping(N - 1, Pong_Node).
      +    ping(N - 1, Pong_Node).
       
      -pong() ->
      +pong() ->
           receive
               finished ->
      -            io:format("Pong finished~n", []);
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +            io:format("Pong finished~n", []);
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           end.
       
      -start_pong() ->
      -    register(pong, spawn(tut17, pong, [])).
      +start_pong() ->
      +    register(pong, spawn(tut17, pong, [])).
       
      -start_ping(Pong_Node) ->
      -    spawn(tut17, ping, [3, Pong_Node]).

      Let us assume there are two computers called gollum and kosken. First a node is +start_ping(Pong_Node) -> + spawn(tut17, ping, [3, Pong_Node]).

      Let us assume there are two computers called gollum and kosken. First a node is started on kosken, called ping, and then a node on gollum, called pong.

      On kosken (on a Linux/UNIX system):

      kosken> erl -sname ping
       Erlang (BEAM) emulator version 5.2.3.7 [hipe] [threads:0]
       
      @@ -393,10 +393,10 @@ 

      Erlang (BEAM) emulator version 5.2.3.7 [hipe] [threads:0] Eshell V5.2.3.7 (abort with ^G) -(pong@gollum)1>

      Now the "pong" process on gollum is started:

      (pong@gollum)1> tut17:start_pong().
      +(pong@gollum)1>

      Now the "pong" process on gollum is started:

      (pong@gollum)1> tut17:start_pong().
       true

      And the "ping" process on kosken is started (from the code above you can see that a parameter of the start_ping function is the node name of the Erlang -system where "pong" is running):

      (ping@kosken)1> tut17:start_ping(pong@gollum).
      +system where "pong" is running):

      (ping@kosken)1> tut17:start_ping(pong@gollum).
       <0.37.0>
       Ping received pong
       Ping received pong
      @@ -406,46 +406,46 @@ 

      Pong received ping Pong received ping Pong finished -(pong@gollum)2>

      Looking at the tut17 code, you see that the pong function itself is +(pong@gollum)2>

      Looking at the tut17 code, you see that the pong function itself is unchanged, the following lines work in the same way irrespective of on which -node the "ping" process is executes:

      {ping, Ping_PID} ->
      -    io:format("Pong received ping~n", []),
      +node the "ping" process is executes:

      {ping, Ping_PID} ->
      +    io:format("Pong received ping~n", []),
           Ping_PID ! pong,

      Thus, Erlang pids contain information about where the process executes. So if you know the pid of a process, the ! operator can be used to send it a -message disregarding if the process is on the same node or on a different node.

      A difference is how messages are sent to a registered process on another node:

      {pong, Pong_Node} ! {ping, self()},

      A tuple {registered_name,node_name} is used instead of just the +message disregarding if the process is on the same node or on a different node.

      A difference is how messages are sent to a registered process on another node:

      {pong, Pong_Node} ! {ping, self()},

      A tuple {registered_name,node_name} is used instead of just the registered_name.

      In the previous example, "ping" and "pong" were started from the shells of two separate Erlang nodes. spawn can also be used to start processes in other nodes.

      The next example is the ping pong program, yet again, but this time "ping" is -started in another node:

      -module(tut18).
      +started in another node:

      -module(tut18).
       
      --export([start/1,  ping/2, pong/0]).
      +-export([start/1,  ping/2, pong/0]).
       
      -ping(0, Pong_Node) ->
      -    {pong, Pong_Node} ! finished,
      -    io:format("ping finished~n", []);
      +ping(0, Pong_Node) ->
      +    {pong, Pong_Node} ! finished,
      +    io:format("ping finished~n", []);
       
      -ping(N, Pong_Node) ->
      -    {pong, Pong_Node} ! {ping, self()},
      +ping(N, Pong_Node) ->
      +    {pong, Pong_Node} ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping(N - 1, Pong_Node).
      +    ping(N - 1, Pong_Node).
       
      -pong() ->
      +pong() ->
           receive
               finished ->
      -            io:format("Pong finished~n", []);
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +            io:format("Pong finished~n", []);
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           end.
       
      -start(Ping_Node) ->
      -    register(pong, spawn(tut18, pong, [])),
      -    spawn(Ping_Node, tut18, ping, [3, node()]).

      Assuming an Erlang system called ping (but not the "ping" process) has already -been started on kosken, then on gollum this is done:

      (pong@gollum)1> tut18:start(ping@kosken).
      +start(Ping_Node) ->
      +    register(pong, spawn(tut18, pong, [])),
      +    spawn(Ping_Node, tut18, ping, [3, node()]).

      Assuming an Erlang system called ping (but not the "ping" process) has already +been started on kosken, then on gollum this is done:

      (pong@gollum)1> tut18:start(ping@kosken).
       <3934.39.0>
       Pong received ping
       Ping received pong
      @@ -520,140 +520,140 @@ 

      %%% Configuration: change the server_node() function to return the %%% name of the node where the messenger server runs --module(messenger). --export([start_server/0, server/1, logon/1, logoff/0, message/2, client/2]). +-module(messenger). +-export([start_server/0, server/1, logon/1, logoff/0, message/2, client/2]). %%% Change the function below to return the name of the node where the %%% messenger server runs -server_node() -> +server_node() -> messenger@super. %%% This is the server process for the "messenger" %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...] -server(User_List) -> +server(User_List) -> receive - {From, logon, Name} -> - New_User_List = server_logon(From, Name, User_List), - server(New_User_List); - {From, logoff} -> - New_User_List = server_logoff(From, User_List), - server(New_User_List); - {From, message_to, To, Message} -> - server_transfer(From, To, Message, User_List), - io:format("list is now: ~p~n", [User_List]), - server(User_List) + {From, logon, Name} -> + New_User_List = server_logon(From, Name, User_List), + server(New_User_List); + {From, logoff} -> + New_User_List = server_logoff(From, User_List), + server(New_User_List); + {From, message_to, To, Message} -> + server_transfer(From, To, Message, User_List), + io:format("list is now: ~p~n", [User_List]), + server(User_List) end. %%% Start the server -start_server() -> - register(messenger, spawn(messenger, server, [[]])). +start_server() -> + register(messenger, spawn(messenger, server, [[]])). %%% Server adds a new user to the user list -server_logon(From, Name, User_List) -> +server_logon(From, Name, User_List) -> %% check if logged on anywhere else - case lists:keymember(Name, 2, User_List) of + case lists:keymember(Name, 2, User_List) of true -> - From ! {messenger, stop, user_exists_at_other_node}, %reject logon + From ! {messenger, stop, user_exists_at_other_node}, %reject logon User_List; false -> - From ! {messenger, logged_on}, - [{From, Name} | User_List] %add user to the list + From ! {messenger, logged_on}, + [{From, Name} | User_List] %add user to the list end. %%% Server deletes a user from the user list -server_logoff(From, User_List) -> - lists:keydelete(From, 1, User_List). +server_logoff(From, User_List) -> + lists:keydelete(From, 1, User_List). %%% Server transfers a message between user -server_transfer(From, To, Message, User_List) -> +server_transfer(From, To, Message, User_List) -> %% check that the user is logged on and who he is - case lists:keysearch(From, 1, User_List) of + case lists:keysearch(From, 1, User_List) of false -> - From ! {messenger, stop, you_are_not_logged_on}; - {value, {From, Name}} -> - server_transfer(From, Name, To, Message, User_List) + From ! {messenger, stop, you_are_not_logged_on}; + {value, {From, Name}} -> + server_transfer(From, Name, To, Message, User_List) end. %%% If the user exists, send the message -server_transfer(From, Name, To, Message, User_List) -> +server_transfer(From, Name, To, Message, User_List) -> %% Find the receiver and send the message - case lists:keysearch(To, 2, User_List) of + case lists:keysearch(To, 2, User_List) of false -> - From ! {messenger, receiver_not_found}; - {value, {ToPid, To}} -> - ToPid ! {message_from, Name, Message}, - From ! {messenger, sent} + From ! {messenger, receiver_not_found}; + {value, {ToPid, To}} -> + ToPid ! {message_from, Name, Message}, + From ! {messenger, sent} end. %%% User Commands -logon(Name) -> - case whereis(mess_client) of +logon(Name) -> + case whereis(mess_client) of undefined -> - register(mess_client, - spawn(messenger, client, [server_node(), Name])); + register(mess_client, + spawn(messenger, client, [server_node(), Name])); _ -> already_logged_on end. -logoff() -> +logoff() -> mess_client ! logoff. -message(ToName, Message) -> - case whereis(mess_client) of % Test if the client is running +message(ToName, Message) -> + case whereis(mess_client) of % Test if the client is running undefined -> not_logged_on; - _ -> mess_client ! {message_to, ToName, Message}, + _ -> mess_client ! {message_to, ToName, Message}, ok end. %%% The client process which runs on each server node -client(Server_Node, Name) -> - {messenger, Server_Node} ! {self(), logon, Name}, - await_result(), - client(Server_Node). +client(Server_Node, Name) -> + {messenger, Server_Node} ! {self(), logon, Name}, + await_result(), + client(Server_Node). -client(Server_Node) -> +client(Server_Node) -> receive logoff -> - {messenger, Server_Node} ! {self(), logoff}, - exit(normal); - {message_to, ToName, Message} -> - {messenger, Server_Node} ! {self(), message_to, ToName, Message}, - await_result(); - {message_from, FromName, Message} -> - io:format("Message from ~p: ~p~n", [FromName, Message]) + {messenger, Server_Node} ! {self(), logoff}, + exit(normal); + {message_to, ToName, Message} -> + {messenger, Server_Node} ! {self(), message_to, ToName, Message}, + await_result(); + {message_from, FromName, Message} -> + io:format("Message from ~p: ~p~n", [FromName, Message]) end, - client(Server_Node). + client(Server_Node). %%% wait for a response from the server -await_result() -> +await_result() -> receive - {messenger, stop, Why} -> % Stop the client - io:format("~p~n", [Why]), - exit(normal); - {messenger, What} -> % Normal response - io:format("~p~n", [What]) + {messenger, stop, Why} -> % Stop the client + io:format("~p~n", [Why]), + exit(normal); + {messenger, What} -> % Normal response + io:format("~p~n", [What]) end.

      To use this program, you need to:

      • Configure the server_node() function.
      • Copy the compiled code (messenger.beam) to the directory on each computer where you start Erlang.

      In the following example using this program, nodes are started on four different computers. If you do not have that many machines available on your network, you can start several nodes on the same machine.

      Four Erlang nodes are started up: messenger@super, c1@bilbo, c2@kosken, -c3@gollum.

      First the server at messenger@super is started up:

      (messenger@super)1> messenger:start_server().
      -true

      Now Peter logs on at c1@bilbo:

      (c1@bilbo)1> messenger:logon(peter).
      +c3@gollum.

      First the server at messenger@super is started up:

      (messenger@super)1> messenger:start_server().
      +true

      Now Peter logs on at c1@bilbo:

      (c1@bilbo)1> messenger:logon(peter).
       true
      -logged_on

      James logs on at c2@kosken:

      (c2@kosken)1> messenger:logon(james).
      +logged_on

      James logs on at c2@kosken:

      (c2@kosken)1> messenger:logon(james).
       true
      -logged_on

      And Fred logs on at c3@gollum:

      (c3@gollum)1> messenger:logon(fred).
      +logged_on

      And Fred logs on at c3@gollum:

      (c3@gollum)1> messenger:logon(fred).
       true
      -logged_on

      Now Peter sends Fred a message:

      (c1@bilbo)2> messenger:message(fred, "hello").
      +logged_on

      Now Peter sends Fred a message:

      (c1@bilbo)2> messenger:message(fred, "hello").
       ok
       sent

      Fred receives the message and sends a message to Peter and logs off:

      Message from peter: "hello"
      -(c3@gollum)2> messenger:message(peter, "go away, I'm busy").
      +(c3@gollum)2> messenger:message(peter, "go away, I'm busy").
       ok
       sent
      -(c3@gollum)3> messenger:logoff().
      -logoff

      James now tries to send a message to Fred:

      (c2@kosken)2> messenger:message(fred, "peter doesn't like you").
      +(c3@gollum)3> messenger:logoff().
      +logoff

      James now tries to send a message to Fred:

      (c2@kosken)2> messenger:message(fred, "peter doesn't like you").
       ok
       receiver_not_found

      But this fails as Fred has already logged off.

      First let us look at some of the new concepts that have been introduced.

      There are two versions of the server_transfer function: one with four arguments (server_transfer/4) and one with five (server_transfer/5). These @@ -667,12 +667,12 @@

      lists:keymember(Key,Position,Lists) looks through a list of tuples and looks at Position in each tuple to see if it is the same as Key. The first element is position 1. If it finds a tuple where the element at Position is the same -as Key, it returns true, otherwise false.

      3> lists:keymember(a, 2, [{x,y,z},{b,b,b},{b,a,c},{q,r,s}]).
      +as Key, it returns true, otherwise false.

      3> lists:keymember(a, 2, [{x,y,z},{b,b,b},{b,a,c},{q,r,s}]).
       true
      -4> lists:keymember(p, 2, [{x,y,z},{b,b,b},{b,a,c},{q,r,s}]).
      +4> lists:keymember(p, 2, [{x,y,z},{b,b,b},{b,a,c},{q,r,s}]).
       false

      lists:keydelete works in the same way but deletes the first tuple found (if -any) and returns the remaining list:

      5> lists:keydelete(a, 2, [{x,y,z},{b,b,b},{b,a,c},{q,r,s}]).
      -[{x,y,z},{b,b,b},{q,r,s}]

      lists:keysearch is like lists:keymember, but it returns +any) and returns the remaining list:

      5> lists:keydelete(a, 2, [{x,y,z},{b,b,b},{b,a,c},{q,r,s}]).
      +[{x,y,z},{b,b,b},{q,r,s}]

      lists:keysearch is like lists:keymember, but it returns {value,Tuple_Found} or the atom false.

      There are many very useful functions in the lists module.

      An Erlang process (conceptually) runs until it does a receive and there is no message which it wants to receive in the message queue. "conceptually" is used here because the Erlang system shares the CPU time between the active processes @@ -685,15 +685,15 @@

      of name RegisteredName exists. If it exists, the pid of that process is returned. If it does not exist, the atom undefined is returned.

      You should by now be able to understand most of the code in the messenger-module. Let us study one case in detail: a message is sent from one -user to another.

      The first user "sends" the message in the example above by:

      messenger:message(fred, "hello")

      After testing that the client process exists:

      whereis(mess_client)

      And a message is sent to mess_client:

      mess_client ! {message_to, fred, "hello"}

      The client sends the message to the server by:

      {messenger, messenger@super} ! {self(), message_to, fred, "hello"},

      And waits for a reply from the server.

      The server receives this message and calls:

      server_transfer(From, fred, "hello", User_List),

      This checks that the pid From is in the User_List:

      lists:keysearch(From, 1, User_List)

      If keysearch returns the atom false, some error has occurred and the server -sends back the message:

      From ! {messenger, stop, you_are_not_logged_on}

      This is received by the client, which in turn does exit(normal) +user to another.

      The first user "sends" the message in the example above by:

      messenger:message(fred, "hello")

      After testing that the client process exists:

      whereis(mess_client)

      And a message is sent to mess_client:

      mess_client ! {message_to, fred, "hello"}

      The client sends the message to the server by:

      {messenger, messenger@super} ! {self(), message_to, fred, "hello"},

      And waits for a reply from the server.

      The server receives this message and calls:

      server_transfer(From, fred, "hello", User_List),

      This checks that the pid From is in the User_List:

      lists:keysearch(From, 1, User_List)

      If keysearch returns the atom false, some error has occurred and the server +sends back the message:

      From ! {messenger, stop, you_are_not_logged_on}

      This is received by the client, which in turn does exit(normal) and terminates. If keysearch returns {value,{From,Name}} it is certain that -the user is logged on and that his name (peter) is in variable Name.

      Let us now call:

      server_transfer(From, peter, fred, "hello", User_List)

      Notice that as this is server_transfer/5, it is not the same as the previous +the user is logged on and that his name (peter) is in variable Name.

      Let us now call:

      server_transfer(From, peter, fred, "hello", User_List)

      Notice that as this is server_transfer/5, it is not the same as the previous function server_transfer/4. Another keysearch is done on User_List to find -the pid of the client corresponding to fred:

      lists:keysearch(fred, 2, User_List)

      This time argument 2 is used, which is the second element in the tuple. If this +the pid of the client corresponding to fred:

      lists:keysearch(fred, 2, User_List)

      This time argument 2 is used, which is the second element in the tuple. If this returns the atom false, fred is not logged on and the following message is -sent:

      From ! {messenger, receiver_not_found};

      This is received by the client.

      If keysearch returns:

      {value, {ToPid, fred}}

      The following message is sent to fred's client:

      ToPid ! {message_from, peter, "hello"},

      The following message is sent to peter's client:

      From ! {messenger, sent}

      Fred's client receives the message and prints it:

      {message_from, peter, "hello"} ->
      -    io:format("Message from ~p: ~p~n", [peter, "hello"])

      Peter's client receives the message in the await_result function.

      +sent:

      From ! {messenger, receiver_not_found};

      This is received by the client.

      If keysearch returns:

      {value, {ToPid, fred}}

      The following message is sent to fred's client:

      ToPid ! {message_from, peter, "hello"},

      The following message is sent to peter's client:

      From ! {messenger, sent}

      Fred's client receives the message and prints it:

      {message_from, peter, "hello"} ->
      +    io:format("Message from ~p: ~p~n", [peter, "hello"])

      Peter's client receives the message in the await_result function.

      diff --git a/prs/9277/doc/system/create_target.html b/prs/9277/doc/system/create_target.html index 18d895b1a1591..6451c427f6f92 100644 --- a/prs/9277/doc/system/create_target.html +++ b/prs/9277/doc/system/create_target.html @@ -142,13 +142,13 @@

      SASL), which specifies the ERTS version and lists all applications that are to be included in the new basic target system. An example is the following mysystem.rel file:

      %% mysystem.rel
      -{release,
      - {"MYSYSTEM", "FIRST"},
      - {erts, "5.10.4"},
      - [{kernel, "2.16.4"},
      -  {stdlib, "1.19.4"},
      -  {sasl, "2.3.4"},
      -  {pea, "1.0"}]}.

      The listed applications are not only original Erlang/OTP applications but +{release, + {"MYSYSTEM", "FIRST"}, + {erts, "5.10.4"}, + [{kernel, "2.16.4"}, + {stdlib, "1.19.4"}, + {sasl, "2.3.4"}, + {pea, "1.0"}]}.

      The listed applications are not only original Erlang/OTP applications but possibly also new applications that you have written (here exemplified by the application Pea (pea)).

      Step 2. Start Erlang/OTP from the directory where the mysystem.rel file resides:

      % erl -pa /home/user/target_system/myapps/pea-1.0/ebin

      The -pa argument prepends the path to the ebin directory for @@ -246,17 +246,17 @@

      In this example the Pea application has been changed, and so are the applications ERTS, Kernel, STDLIB and SASL.

      Step 1. Create the file .rel:

      %% mysystem2.rel
      -{release,
      - {"MYSYSTEM", "SECOND"},
      - {erts, "6.0"},
      - [{kernel, "3.0"},
      -  {stdlib, "2.0"},
      -  {sasl, "2.4"},
      -  {pea, "2.0"}]}.

      Step 2. Create the application upgrade file (see +{release, + {"MYSYSTEM", "SECOND"}, + {erts, "6.0"}, + [{kernel, "3.0"}, + {stdlib, "2.0"}, + {sasl, "2.4"}, + {pea, "2.0"}]}.

      Step 2. Create the application upgrade file (see appup in SASL) for Pea, for example:

      %% pea.appup
      -{"2.0",
      - [{"1.0",[{load_module,pea_lib}]}],
      - [{"1.0",[{load_module,pea_lib}]}]}.

      Step 3. From the directory where the file mysystem2.rel resides, start the +{"2.0", + [{"1.0",[{load_module,pea_lib}]}], + [{"1.0",[{load_module,pea_lib}]}]}.

      Step 3. From the directory where the file mysystem2.rel resides, start the Erlang/OTP system, giving the path to the new version of Pea:

      % erl -pa /home/user/target_system/myapps/pea-2.0/ebin

      Step 4. Create the release upgrade file (see relup in SASL):

      1> systools:make_relup("mysystem2",["mysystem"],["mysystem"],
           [{path,["/home/user/target_system/myapps/pea-1.0/ebin",
      @@ -296,21 +296,21 @@ 

      release_handler:install_release/1 means that the release_handler has restarted the node by using heart. This is always done when the upgrade involves a change of the applications ERTS, Kernel, STDLIB, or SASL. For more -information, see Upgrade when Erlang/OTP has Changed.

      The node is accessible through a new pipe:

      % /usr/local/erl-target/bin/to_erl /tmp/erlang.pipe.2

      List the available releases in the system:

      1> release_handler:which_releases().
      -[{"MYSYSTEM","SECOND",
      -  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
      -  current},
      - {"MYSYSTEM","FIRST",
      -  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
      -  permanent}]

      Our new release, "SECOND", is now the current release, but we can also see that +information, see Upgrade when Erlang/OTP has Changed.

      The node is accessible through a new pipe:

      % /usr/local/erl-target/bin/to_erl /tmp/erlang.pipe.2

      List the available releases in the system:

      1> release_handler:which_releases().
      +[{"MYSYSTEM","SECOND",
      +  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
      +  current},
      + {"MYSYSTEM","FIRST",
      +  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
      +  permanent}]

      Our new release, "SECOND", is now the current release, but we can also see that our "FIRST" release is still permanent. This means that if the node would be -restarted now, it would come up running the "FIRST" release again.

      Step 3. Make the new release permanent:

      2> release_handler:make_permanent("SECOND").

      Check the releases again:

      3> release_handler:which_releases().
      -[{"MYSYSTEM","SECOND",
      -  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
      -  permanent},
      - {"MYSYSTEM","FIRST",
      -  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
      -  old}]

      We see that the new release version is permanent, so it would be safe to +restarted now, it would come up running the "FIRST" release again.

      Step 3. Make the new release permanent:

      2> release_handler:make_permanent("SECOND").

      Check the releases again:

      3> release_handler:which_releases().
      +[{"MYSYSTEM","SECOND",
      +  ["kernel-3.0","stdlib-2.0","sasl-2.4","pea-2.0"],
      +  permanent},
      + {"MYSYSTEM","FIRST",
      +  ["kernel-2.16.4","stdlib-1.19.4","sasl-2.3.4","pea-1.0"],
      +  old}]

      We see that the new release version is permanent, so it would be safe to restart the node.

      @@ -319,8 +319,8 @@

      This module can also be found in the examples directory of the SASL application.

      
      --module(target_system).
      --export([create/1, create/2, install/2]).
      +-module(target_system).
      +-export([create/1, create/2, install/2]).
       
       %% Note: RelFileName below is the *stem* without trailing .rel,
       %% .script etc.
      @@ -328,176 +328,176 @@ 

      %% create(RelFileName) %% -create(RelFileName) -> - create(RelFileName,[]). +create(RelFileName) -> + create(RelFileName,[]). -create(RelFileName,SystoolsOpts) -> +create(RelFileName,SystoolsOpts) -> RelFile = RelFileName ++ ".rel", - Dir = filename:dirname(RelFileName), - PlainRelFileName = filename:join(Dir,"plain"), + Dir = filename:dirname(RelFileName), + PlainRelFileName = filename:join(Dir,"plain"), PlainRelFile = PlainRelFileName ++ ".rel", - io:fwrite("Reading file: ~ts ...~n", [RelFile]), - {ok, [RelSpec]} = file:consult(RelFile), - io:fwrite("Creating file: ~ts from ~ts ...~n", - [PlainRelFile, RelFile]), - {release, - {RelName, RelVsn}, - {erts, ErtsVsn}, - AppVsns} = RelSpec, - PlainRelSpec = {release, - {RelName, RelVsn}, - {erts, ErtsVsn}, - lists:filter(fun({kernel, _}) -> + io:fwrite("Reading file: ~ts ...~n", [RelFile]), + {ok, [RelSpec]} = file:consult(RelFile), + io:fwrite("Creating file: ~ts from ~ts ...~n", + [PlainRelFile, RelFile]), + {release, + {RelName, RelVsn}, + {erts, ErtsVsn}, + AppVsns} = RelSpec, + PlainRelSpec = {release, + {RelName, RelVsn}, + {erts, ErtsVsn}, + lists:filter(fun({kernel, _}) -> true; - ({stdlib, _}) -> + ({stdlib, _}) -> true; - (_) -> + (_) -> false - end, AppVsns) - }, - {ok, Fd} = file:open(PlainRelFile, [write]), - io:fwrite(Fd, "~p.~n", [PlainRelSpec]), - file:close(Fd), + end, AppVsns) + }, + {ok, Fd} = file:open(PlainRelFile, [write]), + io:fwrite(Fd, "~p.~n", [PlainRelSpec]), + file:close(Fd), - io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n", - [PlainRelFileName,PlainRelFileName]), - make_script(PlainRelFileName,SystoolsOpts), + io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n", + [PlainRelFileName,PlainRelFileName]), + make_script(PlainRelFileName,SystoolsOpts), - io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n", - [RelFileName, RelFileName]), - make_script(RelFileName,SystoolsOpts), + io:fwrite("Making \"~ts.script\" and \"~ts.boot\" files ...~n", + [RelFileName, RelFileName]), + make_script(RelFileName,SystoolsOpts), TarFileName = RelFileName ++ ".tar.gz", - io:fwrite("Creating tar file ~ts ...~n", [TarFileName]), - make_tar(RelFileName,SystoolsOpts), + io:fwrite("Creating tar file ~ts ...~n", [TarFileName]), + make_tar(RelFileName,SystoolsOpts), - TmpDir = filename:join(Dir,"tmp"), - io:fwrite("Creating directory ~tp ...~n",[TmpDir]), - file:make_dir(TmpDir), + TmpDir = filename:join(Dir,"tmp"), + io:fwrite("Creating directory ~tp ...~n",[TmpDir]), + file:make_dir(TmpDir), - io:fwrite("Extracting ~ts into directory ~ts ...~n", [TarFileName,TmpDir]), - extract_tar(TarFileName, TmpDir), + io:fwrite("Extracting ~ts into directory ~ts ...~n", [TarFileName,TmpDir]), + extract_tar(TarFileName, TmpDir), - TmpBinDir = filename:join([TmpDir, "bin"]), - ErtsBinDir = filename:join([TmpDir, "erts-" ++ ErtsVsn, "bin"]), - io:fwrite("Deleting \"erl\" and \"start\" in directory ~ts ...~n", - [ErtsBinDir]), - file:delete(filename:join([ErtsBinDir, "erl"])), - file:delete(filename:join([ErtsBinDir, "start"])), + TmpBinDir = filename:join([TmpDir, "bin"]), + ErtsBinDir = filename:join([TmpDir, "erts-" ++ ErtsVsn, "bin"]), + io:fwrite("Deleting \"erl\" and \"start\" in directory ~ts ...~n", + [ErtsBinDir]), + file:delete(filename:join([ErtsBinDir, "erl"])), + file:delete(filename:join([ErtsBinDir, "start"])), - io:fwrite("Creating temporary directory ~ts ...~n", [TmpBinDir]), - file:make_dir(TmpBinDir), + io:fwrite("Creating temporary directory ~ts ...~n", [TmpBinDir]), + file:make_dir(TmpBinDir), - io:fwrite("Copying file \"~ts.boot\" to ~ts ...~n", - [PlainRelFileName, filename:join([TmpBinDir, "start.boot"])]), - copy_file(PlainRelFileName++".boot",filename:join([TmpBinDir, "start.boot"])), + io:fwrite("Copying file \"~ts.boot\" to ~ts ...~n", + [PlainRelFileName, filename:join([TmpBinDir, "start.boot"])]), + copy_file(PlainRelFileName++".boot",filename:join([TmpBinDir, "start.boot"])), - io:fwrite("Copying files \"epmd\", \"run_erl\" and \"to_erl\" from \n" + io:fwrite("Copying files \"epmd\", \"run_erl\" and \"to_erl\" from \n" "~ts to ~ts ...~n", - [ErtsBinDir, TmpBinDir]), - copy_file(filename:join([ErtsBinDir, "epmd"]), - filename:join([TmpBinDir, "epmd"]), [preserve]), - copy_file(filename:join([ErtsBinDir, "run_erl"]), - filename:join([TmpBinDir, "run_erl"]), [preserve]), - copy_file(filename:join([ErtsBinDir, "to_erl"]), - filename:join([TmpBinDir, "to_erl"]), [preserve]), + [ErtsBinDir, TmpBinDir]), + copy_file(filename:join([ErtsBinDir, "epmd"]), + filename:join([TmpBinDir, "epmd"]), [preserve]), + copy_file(filename:join([ErtsBinDir, "run_erl"]), + filename:join([TmpBinDir, "run_erl"]), [preserve]), + copy_file(filename:join([ErtsBinDir, "to_erl"]), + filename:join([TmpBinDir, "to_erl"]), [preserve]), %% This is needed if 'start' script created from 'start.src' shall %% be used as it points out this directory as log dir for 'run_erl' - TmpLogDir = filename:join([TmpDir, "log"]), - io:fwrite("Creating temporary directory ~ts ...~n", [TmpLogDir]), - ok = file:make_dir(TmpLogDir), - - StartErlDataFile = filename:join([TmpDir, "releases", "start_erl.data"]), - io:fwrite("Creating ~ts ...~n", [StartErlDataFile]), - StartErlData = io_lib:fwrite("~s ~s~n", [ErtsVsn, RelVsn]), - write_file(StartErlDataFile, StartErlData), - - io:fwrite("Recreating tar file ~ts from contents in directory ~ts ...~n", - [TarFileName,TmpDir]), - {ok, Tar} = erl_tar:open(TarFileName, [write, compressed]), + TmpLogDir = filename:join([TmpDir, "log"]), + io:fwrite("Creating temporary directory ~ts ...~n", [TmpLogDir]), + ok = file:make_dir(TmpLogDir), + + StartErlDataFile = filename:join([TmpDir, "releases", "start_erl.data"]), + io:fwrite("Creating ~ts ...~n", [StartErlDataFile]), + StartErlData = io_lib:fwrite("~s ~s~n", [ErtsVsn, RelVsn]), + write_file(StartErlDataFile, StartErlData), + + io:fwrite("Recreating tar file ~ts from contents in directory ~ts ...~n", + [TarFileName,TmpDir]), + {ok, Tar} = erl_tar:open(TarFileName, [write, compressed]), %% {ok, Cwd} = file:get_cwd(), %% file:set_cwd("tmp"), ErtsDir = "erts-"++ErtsVsn, - erl_tar:add(Tar, filename:join(TmpDir,"bin"), "bin", []), - erl_tar:add(Tar, filename:join(TmpDir,ErtsDir), ErtsDir, []), - erl_tar:add(Tar, filename:join(TmpDir,"releases"), "releases", []), - erl_tar:add(Tar, filename:join(TmpDir,"lib"), "lib", []), - erl_tar:add(Tar, filename:join(TmpDir,"log"), "log", []), - erl_tar:close(Tar), + erl_tar:add(Tar, filename:join(TmpDir,"bin"), "bin", []), + erl_tar:add(Tar, filename:join(TmpDir,ErtsDir), ErtsDir, []), + erl_tar:add(Tar, filename:join(TmpDir,"releases"), "releases", []), + erl_tar:add(Tar, filename:join(TmpDir,"lib"), "lib", []), + erl_tar:add(Tar, filename:join(TmpDir,"log"), "log", []), + erl_tar:close(Tar), %% file:set_cwd(Cwd), - io:fwrite("Removing directory ~ts ...~n",[TmpDir]), - remove_dir_tree(TmpDir), + io:fwrite("Removing directory ~ts ...~n",[TmpDir]), + remove_dir_tree(TmpDir), ok. -install(RelFileName, RootDir) -> +install(RelFileName, RootDir) -> TarFile = RelFileName ++ ".tar.gz", - io:fwrite("Extracting ~ts ...~n", [TarFile]), - extract_tar(TarFile, RootDir), - StartErlDataFile = filename:join([RootDir, "releases", "start_erl.data"]), - {ok, StartErlData} = read_txt_file(StartErlDataFile), - [ErlVsn, _RelVsn| _] = string:tokens(StartErlData, " \n"), - ErtsBinDir = filename:join([RootDir, "erts-" ++ ErlVsn, "bin"]), - BinDir = filename:join([RootDir, "bin"]), - io:fwrite("Substituting in erl.src, start.src and start_erl.src to " - "form erl, start and start_erl ...\n"), - subst_src_scripts(["erl", "start", "start_erl"], ErtsBinDir, BinDir, - [{"FINAL_ROOTDIR", RootDir}, {"EMU", "beam"}], - [preserve]), + io:fwrite("Extracting ~ts ...~n", [TarFile]), + extract_tar(TarFile, RootDir), + StartErlDataFile = filename:join([RootDir, "releases", "start_erl.data"]), + {ok, StartErlData} = read_txt_file(StartErlDataFile), + [ErlVsn, _RelVsn| _] = string:tokens(StartErlData, " \n"), + ErtsBinDir = filename:join([RootDir, "erts-" ++ ErlVsn, "bin"]), + BinDir = filename:join([RootDir, "bin"]), + io:fwrite("Substituting in erl.src, start.src and start_erl.src to " + "form erl, start and start_erl ...\n"), + subst_src_scripts(["erl", "start", "start_erl"], ErtsBinDir, BinDir, + [{"FINAL_ROOTDIR", RootDir}, {"EMU", "beam"}], + [preserve]), %%! Workaround for pre OTP 17.0: start.src and start_erl.src did %%! not have correct permissions, so the above 'preserve' option did not help - ok = file:change_mode(filename:join(BinDir,"start"),8#0755), - ok = file:change_mode(filename:join(BinDir,"start_erl"),8#0755), + ok = file:change_mode(filename:join(BinDir,"start"),8#0755), + ok = file:change_mode(filename:join(BinDir,"start_erl"),8#0755), - io:fwrite("Creating the RELEASES file ...\n"), - create_RELEASES(RootDir, filename:join([RootDir, "releases", - filename:basename(RelFileName)])). + io:fwrite("Creating the RELEASES file ...\n"), + create_RELEASES(RootDir, filename:join([RootDir, "releases", + filename:basename(RelFileName)])). %% LOCALS %% make_script(RelFileName,Opts) %% -make_script(RelFileName,Opts) -> - systools:make_script(RelFileName, [no_module_tests, - {outdir,filename:dirname(RelFileName)} - |Opts]). +make_script(RelFileName,Opts) -> + systools:make_script(RelFileName, [no_module_tests, + {outdir,filename:dirname(RelFileName)} + |Opts]). %% make_tar(RelFileName,Opts) %% -make_tar(RelFileName,Opts) -> - RootDir = code:root_dir(), - systools:make_tar(RelFileName, [{erts, RootDir}, - {outdir,filename:dirname(RelFileName)} - |Opts]). +make_tar(RelFileName,Opts) -> + RootDir = code:root_dir(), + systools:make_tar(RelFileName, [{erts, RootDir}, + {outdir,filename:dirname(RelFileName)} + |Opts]). %% extract_tar(TarFile, DestDir) %% -extract_tar(TarFile, DestDir) -> - erl_tar:extract(TarFile, [{cwd, DestDir}, compressed]). - -create_RELEASES(DestDir, RelFileName) -> - release_handler:create_RELEASES(DestDir, RelFileName ++ ".rel"). - -subst_src_scripts(Scripts, SrcDir, DestDir, Vars, Opts) -> - lists:foreach(fun(Script) -> - subst_src_script(Script, SrcDir, DestDir, - Vars, Opts) - end, Scripts). - -subst_src_script(Script, SrcDir, DestDir, Vars, Opts) -> - subst_file(filename:join([SrcDir, Script ++ ".src"]), - filename:join([DestDir, Script]), - Vars, Opts). - -subst_file(Src, Dest, Vars, Opts) -> - {ok, Conts} = read_txt_file(Src), - NConts = subst(Conts, Vars), - write_file(Dest, NConts), - case lists:member(preserve, Opts) of +extract_tar(TarFile, DestDir) -> + erl_tar:extract(TarFile, [{cwd, DestDir}, compressed]). + +create_RELEASES(DestDir, RelFileName) -> + release_handler:create_RELEASES(DestDir, RelFileName ++ ".rel"). + +subst_src_scripts(Scripts, SrcDir, DestDir, Vars, Opts) -> + lists:foreach(fun(Script) -> + subst_src_script(Script, SrcDir, DestDir, + Vars, Opts) + end, Scripts). + +subst_src_script(Script, SrcDir, DestDir, Vars, Opts) -> + subst_file(filename:join([SrcDir, Script ++ ".src"]), + filename:join([DestDir, Script]), + Vars, Opts). + +subst_file(Src, Dest, Vars, Opts) -> + {ok, Conts} = read_txt_file(Src), + NConts = subst(Conts, Vars), + write_file(Dest, NConts), + case lists:member(preserve, Opts) of true -> - {ok, FileInfo} = file:read_file_info(Src), - file:write_file_info(Dest, FileInfo); + {ok, FileInfo} = file:read_file_info(Src), + file:write_file_info(Dest, FileInfo); false -> ok end. @@ -508,71 +508,71 @@

      %% Substitute all occurrences of %Var% for Val in Str, using the list %% of variables in Vars. %% -subst(Str, Vars) -> - subst(Str, Vars, []). - -subst([$%, C| Rest], Vars, Result) when $A =< C, C =< $Z -> - subst_var([C| Rest], Vars, Result, []); -subst([$%, C| Rest], Vars, Result) when $a =< C, C =< $z -> - subst_var([C| Rest], Vars, Result, []); -subst([$%, C| Rest], Vars, Result) when C == $_ -> - subst_var([C| Rest], Vars, Result, []); -subst([C| Rest], Vars, Result) -> - subst(Rest, Vars, [C| Result]); -subst([], _Vars, Result) -> - lists:reverse(Result). - -subst_var([$%| Rest], Vars, Result, VarAcc) -> - Key = lists:reverse(VarAcc), - case lists:keysearch(Key, 1, Vars) of - {value, {Key, Value}} -> - subst(Rest, Vars, lists:reverse(Value, Result)); +subst(Str, Vars) -> + subst(Str, Vars, []). + +subst([$%, C| Rest], Vars, Result) when $A =< C, C =< $Z -> + subst_var([C| Rest], Vars, Result, []); +subst([$%, C| Rest], Vars, Result) when $a =< C, C =< $z -> + subst_var([C| Rest], Vars, Result, []); +subst([$%, C| Rest], Vars, Result) when C == $_ -> + subst_var([C| Rest], Vars, Result, []); +subst([C| Rest], Vars, Result) -> + subst(Rest, Vars, [C| Result]); +subst([], _Vars, Result) -> + lists:reverse(Result). + +subst_var([$%| Rest], Vars, Result, VarAcc) -> + Key = lists:reverse(VarAcc), + case lists:keysearch(Key, 1, Vars) of + {value, {Key, Value}} -> + subst(Rest, Vars, lists:reverse(Value, Result)); false -> - subst(Rest, Vars, [$%| VarAcc ++ [$%| Result]]) + subst(Rest, Vars, [$%| VarAcc ++ [$%| Result]]) end; -subst_var([C| Rest], Vars, Result, VarAcc) -> - subst_var(Rest, Vars, Result, [C| VarAcc]); -subst_var([], Vars, Result, VarAcc) -> - subst([], Vars, [VarAcc ++ [$%| Result]]). +subst_var([C| Rest], Vars, Result, VarAcc) -> + subst_var(Rest, Vars, Result, [C| VarAcc]); +subst_var([], Vars, Result, VarAcc) -> + subst([], Vars, [VarAcc ++ [$%| Result]]). -copy_file(Src, Dest) -> - copy_file(Src, Dest, []). +copy_file(Src, Dest) -> + copy_file(Src, Dest, []). -copy_file(Src, Dest, Opts) -> - {ok,_} = file:copy(Src, Dest), - case lists:member(preserve, Opts) of +copy_file(Src, Dest, Opts) -> + {ok,_} = file:copy(Src, Dest), + case lists:member(preserve, Opts) of true -> - {ok, FileInfo} = file:read_file_info(Src), - file:write_file_info(Dest, FileInfo); + {ok, FileInfo} = file:read_file_info(Src), + file:write_file_info(Dest, FileInfo); false -> ok end. -write_file(FName, Conts) -> - Enc = file:native_name_encoding(), - {ok, Fd} = file:open(FName, [write]), - file:write(Fd, unicode:characters_to_binary(Conts,Enc,Enc)), - file:close(Fd). +write_file(FName, Conts) -> + Enc = file:native_name_encoding(), + {ok, Fd} = file:open(FName, [write]), + file:write(Fd, unicode:characters_to_binary(Conts,Enc,Enc)), + file:close(Fd). -read_txt_file(File) -> - {ok, Bin} = file:read_file(File), - {ok, binary_to_list(Bin)}. +read_txt_file(File) -> + {ok, Bin} = file:read_file(File), + {ok, binary_to_list(Bin)}. -remove_dir_tree(Dir) -> - remove_all_files(".", [Dir]). +remove_dir_tree(Dir) -> + remove_all_files(".", [Dir]). -remove_all_files(Dir, Files) -> - lists:foreach(fun(File) -> - FilePath = filename:join([Dir, File]), - case filelib:is_dir(FilePath) of +remove_all_files(Dir, Files) -> + lists:foreach(fun(File) -> + FilePath = filename:join([Dir, File]), + case filelib:is_dir(FilePath) of true -> - {ok, DirFiles} = file:list_dir(FilePath), - remove_all_files(FilePath, DirFiles), - file:del_dir(FilePath); + {ok, DirFiles} = file:list_dir(FilePath), + remove_all_files(FilePath, DirFiles), + file:del_dir(FilePath); _ -> - file:delete(FilePath) + file:delete(FilePath) end - end, Files).

      + end, Files).

      diff --git a/prs/9277/doc/system/data_types.html b/prs/9277/doc/system/data_types.html index 69e1f1456ed70..c4b351f105eb5 100644 --- a/prs/9277/doc/system/data_types.html +++ b/prs/9277/doc/system/data_types.html @@ -196,10 +196,10 @@

      arithmetic operations. This is because floats are represented by a fixed number of bits in a base-2 system while printed floats are represented with a base-10 system. Erlang uses 64-bit floats. Here are examples of this phenomenon:

      1> 0.1+0.2.
      -0.30000000000000004

      The real numbers 0.1 and 0.2 cannot be represented exactly as floats.

      1> {36028797018963968.0, 36028797018963968 == 36028797018963968.0,
      -  36028797018963970.0, 36028797018963970 == 36028797018963970.0}.
      -{3.602879701896397e16, true,
      - 3.602879701896397e16, false}.

      The value 36028797018963968 can be represented exactly as a float value but +0.30000000000000004

      The real numbers 0.1 and 0.2 cannot be represented exactly as floats.

      1> {36028797018963968.0, 36028797018963968 == 36028797018963968.0,
      +  36028797018963970.0, 36028797018963970 == 36028797018963970.0}.
      +{3.602879701896397e16, true,
      + 3.602879701896397e16, false}.

      The value 36028797018963968 can be represented exactly as a float value but Erlang's pretty printer rounds 36028797018963968.0 to 3.602879701896397e16 (=36028797018963970.0) as all values in the range [36028797018963966.0, 36028797018963972.0] are represented by @@ -241,11 +241,11 @@

      3> <<1:1,0:1>>. <<2:2>>

      The is_bitstring/1 BIF tests whether a term is a bit string, and the is_binary/1 -BIF tests whether a term is a binary.

      Examples:

      1> is_bitstring(<<1:1>>).
      +BIF tests whether a term is a binary.

      Examples:

      1> is_bitstring(<<1:1>>).
       true
      -2> is_binary(<<1:1>>).
      +2> is_binary(<<1:1>>).
       false
      -3> is_binary(<<42>>).
      +3> is_binary(<<42>>).
       true
       

      For more examples, see Programming Examples.

      @@ -257,9 +257,9 @@

      among connected nodes. A reference is created by calling the make_ref/0 BIF. The is_reference/1 BIF tests whether a term -is a reference.

      Examples:

      1> Ref = make_ref().
      +is a reference.

      Examples:

      1> Ref = make_ref().
       #Ref<0.76482849.3801088007.198204>
      -2> is_reference(Ref).
      +2> is_reference(Ref).
       true

      @@ -268,17 +268,17 @@

      A fun is a functional object. Funs make it possible to create an anonymous function and pass the function itself — not its name — as argument to other -functions.

      Examples:

      1> Fun1 = fun (X) -> X+1 end.
      +functions.

      Examples:

      1> Fun1 = fun (X) -> X+1 end.
       #Fun<erl_eval.6.39074546>
      -2> Fun1(2).
      +2> Fun1(2).
       3

      The is_function/1 and is_function/2 -BIFs tests whether a term is a fun.

      Examples:

      1> F = fun() -> ok end.
      +BIFs tests whether a term is a fun.

      Examples:

      1> F = fun() -> ok end.
       #Fun<erl_eval.43.105768164>
      -2> is_function(F).
      +2> is_function(F).
       true
      -3> is_function(F, 0).
      +3> is_function(F, 0).
       true
      -4> is_function(F, 1).
      +4> is_function(F, 1).
       false

      Read more about funs in Fun Expressions. For more examples, see Programming Examples.

      @@ -304,17 +304,17 @@

      a message, which is the case when calling the spawn_request/5 BIF. A Pid is typically used when when sending a process a signal. The -is_pid/1 BIF tests whether a term is a Pid.

      Example:

      -module(m).
      --export([loop/0]).
      +is_pid/1 BIF tests whether a term is a Pid.

      Example:

      -module(m).
      +-export([loop/0]).
       
      -loop() ->
      +loop() ->
           receive
               who_are_you ->
      -            io:format("I am ~p~n", [self()]),
      -            loop()
      +            io:format("I am ~p~n", [self()]),
      +            loop()
           end.
       
      -1> P = spawn(m, loop, []).
      +1> P = spawn(m, loop, []).
       <0.58.0>
       2> P ! who_are_you.
       I am <0.58.0>
      @@ -325,19 +325,19 @@ 

      Tuple

      A tuple is a compound data type with a fixed number of terms:

      {Term1,...,TermN}

      Each term Term in the tuple is called an element. The number of elements is -said to be the size of the tuple.

      There exists a number of BIFs to manipulate tuples.

      Examples:

      1> P = {adam,24,{july,29}}.
      -{adam,24,{july,29}}
      -2> element(1,P).
      +said to be the size of the tuple.

      There exists a number of BIFs to manipulate tuples.

      Examples:

      1> P = {adam,24,{july,29}}.
      +{adam,24,{july,29}}
      +2> element(1,P).
       adam
      -3> element(3,P).
      -{july,29}
      -4> P2 = setelement(2,P,25).
      -{adam,25,{july,29}}
      -5> tuple_size(P).
      +3> element(3,P).
      +{july,29}
      +4> P2 = setelement(2,P,25).
      +{adam,25,{july,29}}
      +5> tuple_size(P).
       3
      -6> tuple_size({}).
      +6> tuple_size({}).
       0
      -7> is_tuple({a,b,c}).
      +7> is_tuple({a,b,c}).
       true

      @@ -346,17 +346,17 @@

      A map is a compound data type with a variable number of key-value associations:

      #{Key1 => Value1, ..., KeyN => ValueN}

      Each key-value association in the map is called an association pair. The key and value parts of the pair are called elements. The number of association -pairs is said to be the size of the map.

      There exists a number of BIFs to manipulate maps.

      Examples:

      1> M1 = #{name => adam, age => 24, date => {july,29}}.
      -#{age => 24,date => {july,29},name => adam}
      -2> maps:get(name, M1).
      +pairs is said to be the size of the map.

      There exists a number of BIFs to manipulate maps.

      Examples:

      1> M1 = #{name => adam, age => 24, date => {july,29}}.
      +#{age => 24,date => {july,29},name => adam}
      +2> maps:get(name, M1).
       adam
      -3> maps:get(date, M1).
      -{july,29}
      -4> M2 = maps:update(age, 25, M1).
      -#{age => 25,date => {july,29},name => adam}
      -5> map_size(M).
      +3> maps:get(date, M1).
      +{july,29}
      +4> M2 = maps:update(age, 25, M1).
      +#{age => 25,date => {july,29},name => adam}
      +5> map_size(M).
       3
      -6> map_size(#{}).
      +6> map_size(#{}).
       0

      A collection of maps processing functions are found in module maps in STDLIB.

      Read more about maps in Map Expressions.

      Change

      Maps were introduced as an experimental feature in Erlang/OTP R17. Their functionality was extended and became fully supported in Erlang/OTP 18.

      @@ -371,19 +371,19 @@

      latter can be expressed as [H|T]. The notation [Term1,...,TermN] above is equivalent with the list [Term1|[...|[TermN|[]]]].

      Example:

      [] is a list, thus
      [c|[]] is a list, thus
      [b|[c|[]]] is a list, thus
      [a|[b|[c|[]]]] is a list, or in short [a,b,c]

      A list where the tail is a list is sometimes called a proper list. It is allowed to have a list where the tail is not a list, for example, [a|b]. -However, this type of list is of little practical use.

      Examples:

      1> L1 = [a,2,{c,4}].
      -[a,2,{c,4}]
      -2> [H|T] = L1.
      -[a,2,{c,4}]
      +However, this type of list is of little practical use.

      Examples:

      1> L1 = [a,2,{c,4}].
      +[a,2,{c,4}]
      +2> [H|T] = L1.
      +[a,2,{c,4}]
       3> H.
       a
       4> T.
      -[2,{c,4}]
      -5> L2 = [d|T].
      -[d,2,{c,4}]
      -6> length(L1).
      +[2,{c,4}]
      +5> L2 = [d|T].
      +[d,2,{c,4}]
      +6> length(L1).
       3
      -7> length([]).
      +7> length([]).
       0

      A collection of list processing functions are found in module lists in STDLIB.

      @@ -511,16 +511,16 @@

      data type. Instead, record expressions are translated to tuple expressions during compilation. Therefore, record expressions are not understood by the shell unless special actions are taken. For details, see module shell -in STDLIB.

      Examples:

      -module(person).
      --export([new/2]).
      +in STDLIB.

      Examples:

      -module(person).
      +-export([new/2]).
       
      --record(person, {name, age}).
      +-record(person, {name, age}).
       
      -new(Name, Age) ->
      -    #person{name=Name, age=Age}.
      +new(Name, Age) ->
      +    #person{name=Name, age=Age}.
       
      -1> person:new(ernie, 44).
      -{person,ernie,44}

      Read more about records in Records. More examples are +1> person:new(ernie, 44). +{person,ernie,44}

      Read more about records in Records. More examples are found in Programming Examples.

      @@ -533,11 +533,11 @@

      true 2> true or false. true -3> is_boolean(true). +3> is_boolean(true). true -4> is_boolean(false). +4> is_boolean(false). true -5> is_boolean(ok). +5> is_boolean(ok). false

      @@ -563,39 +563,39 @@

      Type Conversions

      -

      There are a number of BIFs for type conversions.

      Examples:

      1> atom_to_list(hello).
      +

      There are a number of BIFs for type conversions.

      Examples:

      1> atom_to_list(hello).
       "hello"
      -2> list_to_atom("hello").
      +2> list_to_atom("hello").
       hello
      -3> binary_to_list(<<"hello">>).
      +3> binary_to_list(<<"hello">>).
       "hello"
      -4> binary_to_list(<<104,101,108,108,111>>).
      +4> binary_to_list(<<104,101,108,108,111>>).
       "hello"
      -5> list_to_binary("hello").
      +5> list_to_binary("hello").
       <<104,101,108,108,111>>
      -6> float_to_list(7.0).
      +6> float_to_list(7.0).
       "7.00000000000000000000e+00"
      -7> list_to_float("7.000e+00").
      +7> list_to_float("7.000e+00").
       7.0
      -8> integer_to_list(77).
      +8> integer_to_list(77).
       "77"
      -9> list_to_integer("77").
      +9> list_to_integer("77").
       77
      -10> tuple_to_list({a,b,c}).
      -[a,b,c]
      -11> list_to_tuple([a,b,c]).
      -{a,b,c}
      -12> term_to_binary({a,b,c}).
      +10> tuple_to_list({a,b,c}).
      +[a,b,c]
      +11> list_to_tuple([a,b,c]).
      +{a,b,c}
      +12> term_to_binary({a,b,c}).
       <<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>
      -13> binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>).
      -{a,b,c}
      -14> binary_to_integer(<<"77">>).
      +13> binary_to_term(<<131,104,3,100,0,1,97,100,0,1,98,100,0,1,99>>).
      +{a,b,c}
      +14> binary_to_integer(<<"77">>).
       77
      -15> integer_to_binary(77).
      +15> integer_to_binary(77).
       <<"77">>
      -16> float_to_binary(7.0).
      +16> float_to_binary(7.0).
       <<"7.00000000000000000000e+00">>
      -17> binary_to_float(<<"7.000e+00">>).
      +17> binary_to_float(<<"7.000e+00">>).
       7.0

      diff --git a/prs/9277/doc/system/design_principles.html b/prs/9277/doc/system/design_principles.html index 4f6c6a8211962..fd36883de3f68 100644 --- a/prs/9277/doc/system/design_principles.html +++ b/prs/9277/doc/system/design_principles.html @@ -156,94 +156,94 @@

      specific part. Consider the following code (written in plain Erlang) for a simple server, which keeps track of a number of "channels". Other processes can allocate and free the channels by calling the functions alloc/0 and free/1, -respectively.

      -module(ch1).
      --export([start/0]).
      --export([alloc/0, free/1]).
      --export([init/0]).
      +respectively.

      -module(ch1).
      +-export([start/0]).
      +-export([alloc/0, free/1]).
      +-export([init/0]).
       
      -start() ->
      -    spawn(ch1, init, []).
      +start() ->
      +    spawn(ch1, init, []).
       
      -alloc() ->
      -    ch1 ! {self(), alloc},
      +alloc() ->
      +    ch1 ! {self(), alloc},
           receive
      -        {ch1, Res} ->
      +        {ch1, Res} ->
                   Res
           end.
       
      -free(Ch) ->
      -    ch1 ! {free, Ch},
      +free(Ch) ->
      +    ch1 ! {free, Ch},
           ok.
       
      -init() ->
      -    register(ch1, self()),
      -    Chs = channels(),
      -    loop(Chs).
      +init() ->
      +    register(ch1, self()),
      +    Chs = channels(),
      +    loop(Chs).
       
      -loop(Chs) ->
      +loop(Chs) ->
           receive
      -        {From, alloc} ->
      -            {Ch, Chs2} = alloc(Chs),
      -            From ! {ch1, Ch},
      -            loop(Chs2);
      -        {free, Ch} ->
      -            Chs2 = free(Ch, Chs),
      -            loop(Chs2)
      -    end.

      The code for the server can be rewritten into a generic part server.erl:

      -module(server).
      --export([start/1]).
      --export([call/2, cast/2]).
      --export([init/1]).
      -
      -start(Mod) ->
      -    spawn(server, init, [Mod]).
      -
      -call(Name, Req) ->
      -    Name ! {call, self(), Req},
      +        {From, alloc} ->
      +            {Ch, Chs2} = alloc(Chs),
      +            From ! {ch1, Ch},
      +            loop(Chs2);
      +        {free, Ch} ->
      +            Chs2 = free(Ch, Chs),
      +            loop(Chs2)
      +    end.

      The code for the server can be rewritten into a generic part server.erl:

      -module(server).
      +-export([start/1]).
      +-export([call/2, cast/2]).
      +-export([init/1]).
      +
      +start(Mod) ->
      +    spawn(server, init, [Mod]).
      +
      +call(Name, Req) ->
      +    Name ! {call, self(), Req},
           receive
      -        {Name, Res} ->
      +        {Name, Res} ->
                   Res
           end.
       
      -cast(Name, Req) ->
      -    Name ! {cast, Req},
      +cast(Name, Req) ->
      +    Name ! {cast, Req},
           ok.
       
      -init(Mod) ->
      -    register(Mod, self()),
      -    State = Mod:init(),
      -    loop(Mod, State).
      +init(Mod) ->
      +    register(Mod, self()),
      +    State = Mod:init(),
      +    loop(Mod, State).
       
      -loop(Mod, State) ->
      +loop(Mod, State) ->
           receive
      -        {call, From, Req} ->
      -            {Res, State2} = Mod:handle_call(Req, State),
      -            From ! {Mod, Res},
      -            loop(Mod, State2);
      -        {cast, Req} ->
      -            State2 = Mod:handle_cast(Req, State),
      -            loop(Mod, State2)
      -    end.

      And a callback module ch2.erl:

      -module(ch2).
      --export([start/0]).
      --export([alloc/0, free/1]).
      --export([init/0, handle_call/2, handle_cast/2]).
      -
      -start() ->
      -    server:start(ch2).
      -
      -alloc() ->
      -    server:call(ch2, alloc).
      -
      -free(Ch) ->
      -    server:cast(ch2, {free, Ch}).
      -
      -init() ->
      -    channels().
      -
      -handle_call(alloc, Chs) ->
      -    alloc(Chs). % => {Ch,Chs2}
      -
      -handle_cast({free, Ch}, Chs) ->
      -    free(Ch, Chs). % => Chs2

      Notice the following:

      • The code in server can be reused to build many different servers.
      • The server name, in this example the atom ch2, is hidden from the users of + {call, From, Req} -> + {Res, State2} = Mod:handle_call(Req, State), + From ! {Mod, Res}, + loop(Mod, State2); + {cast, Req} -> + State2 = Mod:handle_cast(Req, State), + loop(Mod, State2) + end.

      And a callback module ch2.erl:

      -module(ch2).
      +-export([start/0]).
      +-export([alloc/0, free/1]).
      +-export([init/0, handle_call/2, handle_cast/2]).
      +
      +start() ->
      +    server:start(ch2).
      +
      +alloc() ->
      +    server:call(ch2, alloc).
      +
      +free(Ch) ->
      +    server:cast(ch2, {free, Ch}).
      +
      +init() ->
      +    channels().
      +
      +handle_call(alloc, Chs) ->
      +    alloc(Chs). % => {Ch,Chs2}
      +
      +handle_cast({free, Ch}, Chs) ->
      +    free(Ch, Chs). % => Chs2

      Notice the following:

      @@ -184,7 +184,7 @@

      and other diagrams to better show the usage of the module. Instead of writing a long text in the moduledoc attribute, it could be better to break it out into an external page.

      The moduledoc attribute should start with a short paragraph describing the -module and then go into greater details. For example:

      -module(arith).
      +module and then go into greater details. For example:

      -module(arith).
       -moduledoc """
          A module for basic arithmetic.
       
      @@ -207,9 +207,9 @@ 

      deprecated and what to use instead.
    • format - The format to use for all documentation in this module. The default is text/markdown. It should be written using the mime type -of the format.

    Example:

    -moduledoc {file, "../doc/arith.asciidoc"}.
    --moduledoc #{since => "0.1", format => "text/asciidoc"}.
    --moduledoc #{deprecated => "Use the Erlang arithmetic operators instead."}.

    +of the format.

Example:

-moduledoc {file, "../doc/arith.asciidoc"}.
+-moduledoc #{since => "0.1", format => "text/asciidoc"}.
+-moduledoc #{deprecated => "Use the Erlang arithmetic operators instead."}.

@@ -224,7 +224,7 @@

We use a special number here so that we know that this number comes from this module. """. --opaque number() :: {arith, erlang:number()}. +-opaque number() :: {arith, erlang:number()}. -doc """ Adds two numbers. @@ -235,8 +235,8 @@

1> arith:add(arith:number(1), arith:number(2)). {number, 3} ``` """. --spec add(number(), number()) -> number(). -add({number, One}, {number, Two}) -> {number, One + Two}.

+-spec add(number(), number()) -> number(). +add({number, One}, {number, Two}) -> {number, One + Two}.

@@ -248,12 +248,12 @@

automatically insert this key if there is a -deprecated attribute marking a function as deprecated.

  • equiv => unicode:chardata() | F/A | F(...) - Notes that this function is equivalent to another function in this module. The equivalence can be described using either -Func/Arity, Func(Args) or a unicode string. For example:

    -doc #{equiv => add/3}.
    -add(One, Two) -> add(One, Two, []).
    -add(One, Two, Options) -> ...

    or

    -doc #{equiv => add(One, Two, [])}.
    --spec add(One :: number(), Two :: number()) -> number().
    -add(One, Two) -> add(One, Two, []).
    -add(One, Two, Options) -> ...

    The entry into the EEP-48 doc chunk metadata is +Func/Arity, Func(Args) or a unicode string. For example:

    -doc #{equiv => add/3}.
    +add(One, Two) -> add(One, Two, []).
    +add(One, Two, Options) -> ...

    or

    -doc #{equiv => add(One, Two, [])}.
    +-spec add(One :: number(), Two :: number()) -> number().
    +add(One, Two) -> add(One, Two, []).
    +add(One, Two, Options) -> ...

    The entry into the EEP-48 doc chunk metadata is the value converted to a string.

  • exported => boolean() - A boolean/0 signifying if the entry is exported or not. This value is automatically set by the compiler and should not be set by the user.

  • @@ -264,20 +264,20 @@

    The doc signature is a short text shown to describe the function and its arguments. By default it is determined by looking at the names of the arguments in the --spec or function. For example:

    add(One, Two) -> One + Two.
    +-spec or function. For example:

    add(One, Two) -> One + Two.
     
    --spec sub(One :: integer(), Two :: integer()) -> integer().
    -sub(X, Y) -> X - Y.

    will have a signature of add(One, Two) and sub(One, Two).

    For types or callbacks, the signature is derived from the type or callback -specification. For example:

    -type number(Value) :: {number, Value}.
    +-spec sub(One :: integer(), Two :: integer()) -> integer().
    +sub(X, Y) -> X - Y.

    will have a signature of add(One, Two) and sub(One, Two).

    For types or callbacks, the signature is derived from the type or callback +specification. For example:

    -type number(Value) :: {number, Value}.
     %% signature will be `number(Value)`
     
    --opaque number() :: {number, number()}.
    +-opaque number() :: {number, number()}.
     %% signature will be `number()`
     
    --callback increment(In :: number()) -> Out.
    +-callback increment(In :: number()) -> Out.
     %% signature will be `increment(In)`
     
    --callback increment(In) -> Out when In :: number().
    +-callback increment(In) -> Out when In :: number().
     %% signature will be `increment(In)`

    If it is not possible to "easily" figure out a nice signature from the code, the MFA syntax is used instead. For example: add/2, number/1, increment/1

    It is possible to supply a custom signature by placing it as the first line of the -doc attribute. The provided signature must be in the form of a function @@ -286,7 +286,7 @@

    Adds two numbers. """. -add(A, B) -> A + B.

    Will create the signature add(One, Two). The signature will be removed from the +add(A, B) -> A + B.

    Will create the signature add(One, Two). The signature will be removed from the documentation string, so in the example above only the text "Adds two numbers" will be part of the documentation. This works for functions, types, and callbacks.

    diff --git a/prs/9277/doc/system/error_logging.html b/prs/9277/doc/system/error_logging.html index ddf705f9e3343..9e4d33db0631a 100644 --- a/prs/9277/doc/system/error_logging.html +++ b/prs/9277/doc/system/error_logging.html @@ -147,7 +147,7 @@

    logger_sasl_compatible to true. For more information, see SASL Error Logging in the SASL User's Guide.

    % erl -kernel logger_level info
    -Erlang/OTP 21 [erts-10.0] [source-13c50db] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
    +Erlang/OTP 21 [erts-10.0] [source-13c50db] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
     
     =PROGRESS REPORT==== 8-Jun-2018::16:54:19.916404 ===
         application: kernel
    @@ -156,22 +156,22 @@ 

    application: stdlib started_at: nonode@nohost =PROGRESS REPORT==== 8-Jun-2018::16:54:19.925755 === - supervisor: {local,kernel_safe_sup} - started: [{pid,<0.74.0>}, - {id,disk_log_sup}, - {mfargs,{disk_log_sup,start_link,[]}}, - {restart_type,permanent}, - {shutdown,1000}, - {child_type,supervisor}] + supervisor: {local,kernel_safe_sup} + started: [{pid,<0.74.0>}, + {id,disk_log_sup}, + {mfargs,{disk_log_sup,start_link,[]}}, + {restart_type,permanent}, + {shutdown,1000}, + {child_type,supervisor}] =PROGRESS REPORT==== 8-Jun-2018::16:54:19.926056 === - supervisor: {local,kernel_safe_sup} - started: [{pid,<0.75.0>}, - {id,disk_log_server}, - {mfargs,{disk_log_server,start_link,[]}}, - {restart_type,permanent}, - {shutdown,2000}, - {child_type,worker}] -Eshell V10.0 (abort with ^G) + supervisor: {local,kernel_safe_sup} + started: [{pid,<0.75.0>}, + {id,disk_log_server}, + {mfargs,{disk_log_server,start_link,[]}}, + {restart_type,permanent}, + {shutdown,2000}, + {child_type,worker}] +Eshell V10.0 (abort with ^G) 1>

    diff --git a/prs/9277/doc/system/errors.html b/prs/9277/doc/system/errors.html index c42237ee7e148..d54ea3f6efcee 100644 --- a/prs/9277/doc/system/errors.html +++ b/prs/9277/doc/system/errors.html @@ -155,14 +155,14 @@

    Exit Reason), and a stack trace (which aids in finding the code location of the exception).

    The stack trace can be bound to a variable from within a try expression for any exception class, or as part of the exit reason when a run-time error is -caught by a catch. Example:

    > {'EXIT',{test,Stacktrace}} = (catch error(test)), Stacktrace.
    -[{shell,apply_fun,3,[]},
    - {erl_eval,do_apply,6,[]},
    - ...]
    -> try throw(test) catch Class:Reason:Stacktrace -> Stacktrace end.
    -[{shell,apply_fun,3,[]},
    - {erl_eval,do_apply,6,[]},
    - ...]

    +caught by a catch. Example:

    > {'EXIT',{test,Stacktrace}} = (catch error(test)), Stacktrace.
    +[{shell,apply_fun,3,[]},
    + {erl_eval,do_apply,6,[]},
    + ...]
    +> try throw(test) catch Class:Reason:Stacktrace -> Stacktrace end.
    +[{shell,apply_fun,3,[]},
    + {erl_eval,do_apply,6,[]},
    + ...]

    diff --git a/prs/9277/doc/system/events.html b/prs/9277/doc/system/events.html index 4960f407659f5..366b4b80154ac 100644 --- a/prs/9277/doc/system/events.html +++ b/prs/9277/doc/system/events.html @@ -139,35 +139,35 @@

    Example

    The callback module for the event handler writing error messages to the terminal -can look as follows:

    -module(terminal_logger).
    --behaviour(gen_event).
    +can look as follows:

    -module(terminal_logger).
    +-behaviour(gen_event).
     
    --export([init/1, handle_event/2, terminate/2]).
    +-export([init/1, handle_event/2, terminate/2]).
     
    -init(_Args) ->
    -    {ok, []}.
    +init(_Args) ->
    +    {ok, []}.
     
    -handle_event(ErrorMsg, State) ->
    -    io:format("***Error*** ~p~n", [ErrorMsg]),
    -    {ok, State}.
    +handle_event(ErrorMsg, State) ->
    +    io:format("***Error*** ~p~n", [ErrorMsg]),
    +    {ok, State}.
     
    -terminate(_Args, _State) ->
    +terminate(_Args, _State) ->
         ok.

    The callback module for the event handler writing error messages to a file can -look as follows:

    -module(file_logger).
    --behaviour(gen_event).
    +look as follows:

    -module(file_logger).
    +-behaviour(gen_event).
     
    --export([init/1, handle_event/2, terminate/2]).
    +-export([init/1, handle_event/2, terminate/2]).
     
    -init(File) ->
    -    {ok, Fd} = file:open(File, read),
    -    {ok, Fd}.
    +init(File) ->
    +    {ok, Fd} = file:open(File, read),
    +    {ok, Fd}.
     
    -handle_event(ErrorMsg, Fd) ->
    -    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    -    {ok, Fd}.
    +handle_event(ErrorMsg, Fd) ->
    +    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    +    {ok, Fd}.
     
    -terminate(_Args, Fd) ->
    -    file:close(Fd).

    The code is explained in the next sections.

    +terminate(_Args, Fd) -> + file:close(Fd).

    The code is explained in the next sections.

    @@ -188,19 +188,19 @@

    Adding an Event Handler

    The following example shows how to start an event manager and add an event -handler to it by using the shell:

    1> gen_event:start({local, error_man}).
    -{ok,<0.31.0>}
    -2> gen_event:add_handler(error_man, terminal_logger, []).
    +handler to it by using the shell:

    1> gen_event:start({local, error_man}).
    +{ok,<0.31.0>}
    +2> gen_event:add_handler(error_man, terminal_logger, []).
     ok

    This function sends a message to the event manager registered as error_man, telling it to add the event handler terminal_logger. The event manager calls the callback function terminal_logger:init([]), where the argument [] is the third argument to add_handler. init/1 is expected to return {ok, State}, -where State is the internal state of the event handler.

    init(_Args) ->
    -    {ok, []}.

    Here, init/1 does not need any input data and ignores its argument. For +where State is the internal state of the event handler.

    init(_Args) ->
    +    {ok, []}.

    Here, init/1 does not need any input data and ignores its argument. For terminal_logger, the internal state is not used. For file_logger, the -internal state is used to save the open file descriptor.

    init(File) ->
    -    {ok, Fd} = file:open(File, read),
    -    {ok, Fd}.

    +internal state is used to save the open file descriptor.

    init(File) ->
    +    {ok, Fd} = file:open(File, read),
    +    {ok, Fd}.

    @@ -212,25 +212,25 @@

    is received, the event manager calls handle_event(Event, State) for each installed event handler, in the same order as they were added. The function is expected to return a tuple {ok,State1}, where State1 is a new value for the -state of the event handler.

    In terminal_logger:

    handle_event(ErrorMsg, State) ->
    -    io:format("***Error*** ~p~n", [ErrorMsg]),
    -    {ok, State}.

    In file_logger:

    handle_event(ErrorMsg, Fd) ->
    -    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    -    {ok, Fd}.

    +state of the event handler.

    In terminal_logger:

    handle_event(ErrorMsg, State) ->
    +    io:format("***Error*** ~p~n", [ErrorMsg]),
    +    {ok, State}.

    In file_logger:

    handle_event(ErrorMsg, Fd) ->
    +    io:format(Fd, "***Error*** ~p~n", [ErrorMsg]),
    +    {ok, Fd}.

    Deleting an Event Handler

    -
    4> gen_event:delete_handler(error_man, terminal_logger, []).
    +
    4> gen_event:delete_handler(error_man, terminal_logger, []).
     ok

    This function sends a message to the event manager registered as error_man, telling it to delete the event handler terminal_logger. The event manager calls the callback function terminal_logger:terminate([], State), where the argument [] is the third argument to delete_handler. terminate/2 is to be the opposite of init/1 and do any necessary cleaning up. Its return value is -ignored.

    For terminal_logger, no cleaning up is necessary:

    terminate(_Args, _State) ->
    -    ok.

    For file_logger, the file descriptor opened in init must be closed:

    terminate(_Args, Fd) ->
    -    file:close(Fd).

    +ignored.

    For terminal_logger, no cleaning up is necessary:

    terminate(_Args, _State) ->
    +    ok.

    For file_logger, the file descriptor opened in init must be closed:

    terminate(_Args, Fd) ->
    +    file:close(Fd).

    @@ -253,7 +253,7 @@

    Standalone Event Managers

    -

    An event manager can also be stopped by calling:

    1> gen_event:stop(error_man).
    +

    An event manager can also be stopped by calling:

    1> gen_event:stop(error_man).
     ok

    @@ -265,13 +265,13 @@

    implemented to handle them. Examples of other messages are exit messages if the event manager is linked to other processes than the supervisor (for example via gen_event:add_sup_handler/3) and is -trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
    +trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
         %% Code to handle exits here.
         ...
    -    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
    +    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
         %% Code to convert state (and more) during code change.
         ...
    -    {ok, NewState}.
    +
    {ok, NewState}.
    diff --git a/prs/9277/doc/system/example.html b/prs/9277/doc/system/example.html index 63dd4d4823f4e..0b90577d0842f 100644 --- a/prs/9277/doc/system/example.html +++ b/prs/9277/doc/system/example.html @@ -125,17 +125,17 @@

    code, solving a complex problem, in your Erlang program. Suppose for example, that you have the following C functions that you would like to call from Erlang:

    /* complex.c */
     
    -int foo(int x) {
    +int foo(int x) {
       return x+1;
    -}
    +}
     
    -int bar(int y) {
    +int bar(int y) {
       return y*2;
    -}

    The functions are deliberately kept as simple as possible, for readability +}

    The functions are deliberately kept as simple as possible, for readability reasons.

    From an Erlang perspective, it is preferable to be able to call foo and bar without having to bother about that they are C functions:

    % Erlang code
     ...
    -Res = complex:foo(X),
    +Res = complex:foo(X),
     ...

    Here, the communication with C is hidden in the implementation of complex.erl. In the following sections, it is shown how this module can be implemented using the different interoperability mechanisms.

    diff --git a/prs/9277/doc/system/expressions.html b/prs/9277/doc/system/expressions.html index 213e51c324d52..e6081fca469ac 100644 --- a/prs/9277/doc/system/expressions.html +++ b/prs/9277/doc/system/expressions.html @@ -155,12 +155,12 @@

    single assignment, that is, a variable can only be bound once.

    The anonymous variable is denoted by underscore (_) and can be used when a variable is required but its value can be ignored.

    Example:

    [H|_] = [1,2,3]

    Variables starting with underscore (_), for example, _Height, are normal variables, not anonymous. However, they are ignored by the compiler in the sense -that they do not generate warnings.

    Example:

    The following code:

    member(_, []) ->
    -    [].

    can be rewritten to be more readable:

    member(Elem, []) ->
    -    [].

    This causes a warning for an unused variable, Elem. To avoid the warning, -the code can be rewritten to:

    member(_Elem, []) ->
    -    [].

    Notice that since variables starting with an underscore are not anonymous, the -following example matches:

    {_,_} = {1,2}

    But this example fails:

    {_N,_N} = {1,2}

    The scope for a variable is its function clause. Variables bound in a branch of +that they do not generate warnings.

    Example:

    The following code:

    member(_, []) ->
    +    [].

    can be rewritten to be more readable:

    member(Elem, []) ->
    +    [].

    This causes a warning for an unused variable, Elem. To avoid the warning, +the code can be rewritten to:

    member(_Elem, []) ->
    +    [].

    Notice that since variables starting with an underscore are not anonymous, the +following example matches:

    {_,_} = {1,2}

    But this example fails:

    {_N,_N} = {1,2}

    The scope for a variable is its function clause. Variables bound in a branch of an if, case, or receive expression must be bound in all branches to have a value outside the expression. Otherwise they are regarded as unsafe outside the expression.

    For the try expression variable scoping is limited so that variables bound in @@ -171,8 +171,8 @@

    Patterns

    A pattern has the same structure as a term but can contain unbound variables.

    Example:

    Name1
    -[H|T]
    -{error,Reason}

    Patterns are allowed in clause heads, case expressions, +[H|T] +{error,Reason}

    Patterns are allowed in clause heads, case expressions, receive expressions, and match expressions.

    @@ -182,13 +182,13 @@

    If Pattern1 and Pattern2 are valid patterns, the following is also a valid pattern:

    Pattern1 = Pattern2

    When matched against a term, both Pattern1 and Pattern2 are matched against -the term. The idea behind this feature is to avoid reconstruction of terms.

    Example:

    f({connect,From,To,Number,Options}, To) ->
    -    Signal = {connect,From,To,Number,Options},
    +the term. The idea behind this feature is to avoid reconstruction of terms.

    Example:

    f({connect,From,To,Number,Options}, To) ->
    +    Signal = {connect,From,To,Number,Options},
         ...;
    -f(Signal, To) ->
    -    ignore.

    can instead be written as

    f({connect,_,To,_,_} = Signal, To) ->
    +f(Signal, To) ->
    +    ignore.

    can instead be written as

    f({connect,_,To,_,_} = Signal, To) ->
         ...;
    -f(Signal, To) ->
    +f(Signal, To) ->
         ignore.

    The compound pattern operator does not imply that its operands are matched in any particular order. That means that it is not legal to bind a variable in Pattern1 and use it in Pattern2, or vice versa.

    @@ -197,15 +197,15 @@

    String Prefix in Patterns

    -

    When matching strings, the following is a valid pattern:

    f("prefix" ++ Str) -> ...

    This is syntactic sugar for the equivalent, but harder to read:

    f([$p,$r,$e,$f,$i,$x | Str]) -> ...

    +

    When matching strings, the following is a valid pattern:

    f("prefix" ++ Str) -> ...

    This is syntactic sugar for the equivalent, but harder to read:

    f([$p,$r,$e,$f,$i,$x | Str]) -> ...

    Expressions in Patterns

    An arithmetic expression can be used within a pattern if it meets both of the -following two conditions:

    • It uses only numeric or bitwise operators.
    • Its value can be evaluated to a constant when complied.

    Example:

    case {Value, Result} of
    -    {?THRESHOLD+1, ok} -> ...

    +following two conditions:

    • It uses only numeric or bitwise operators.
    • Its value can be evaluated to a constant when complied.

    Example:

    case {Value, Result} of
    +    {?THRESHOLD+1, ok} -> ...

    @@ -213,15 +213,15 @@

    The following matches Pattern against Expr:

    Pattern = Expr

    If the matching succeeds, any unbound variable in the pattern becomes bound and the value of Expr is returned.

    If multiple match operators are applied in sequence, they will be evaluated from -right to left.

    If the matching fails, a badmatch run-time error occurs.

    Examples:

    1> {A, B} = T = {answer, 42}.
    -{answer,42}
    +right to left.

    If the matching fails, a badmatch run-time error occurs.

    Examples:

    1> {A, B} = T = {answer, 42}.
    +{answer,42}
     2> A.
     answer
     3> B.
     42
     4> T.
    -{answer,42}
    -5> {C, D} = [1, 2].
    +{answer,42}
    +5> {C, D} = [1, 2].
     ** exception error: no match of right-hand side value [1,2]

    Because multiple match operators are evaluated from right to left, it means that:

    Pattern1 = Pattern2 = . . . = PatternN = Expression

    is equivalent to:

    Temporary = Expression,
     PatternN = Temporary,
    @@ -243,20 +243,20 @@ 

    compound pattern matches if all of its constituent patterns match. It is not legal for a pattern that is part of a compound pattern to use variables (as keys in map patterns or sizes in binary patterns) bound in other sub patterns of the -same compound pattern.

    Examples:

    1> fun(#{Key := Value} = #{key := Key}) -> Value end.
    +same compound pattern.

    Examples:

    1> fun(#{Key := Value} = #{key := Key}) -> Value end.
     * 1:7: variable 'Key' is unbound
    -2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}).
    -{{1,2},3}
    -3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>).
    -{42,43,10795}

    The match operator is allowed everywhere an expression is allowed. It is used +2> F = fun({A, B} = E) -> {E, A + B} end, F({1,2}). +{{1,2},3} +3> G = fun(<<A:8,B:8>> = <<C:16>>) -> {A, B, C} end, G(<<42,43>>). +{42,43,10795}

    The match operator is allowed everywhere an expression is allowed. It is used to match the value of an expression to a pattern. If multiple match operators -are applied in sequence, they will be evaluated from right to left.

    Examples:

    1> M = #{key => key2, key2 => value}.
    -#{key => key2,key2 => value}
    -2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
    +are applied in sequence, they will be evaluated from right to left.

    Examples:

    1> M = #{key => key2, key2 => value}.
    +#{key => key2,key2 => value}
    +2> f(Key), #{Key := Value} = #{key := Key} = M, Value.
     value
    -3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
    +3> f(Key), #{Key := Value} = (#{key := Key} = M), Value.
     value
    -4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
    +4> f(Key), (#{Key := Value} = #{key := Key}) = M, Value.
     * 1:12: variable 'Key' is unbound
     5> <<X:Y>> = begin Y = 8, <<42:8>> end, X.
     42

    The expression at prompt 2> first matches the value of variable M against @@ -280,22 +280,22 @@

    Function Calls

    -
    ExprF(Expr1,...,ExprN)
    -ExprM:ExprF(Expr1,...,ExprN)

    In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of +

    ExprF(Expr1,...,ExprN)
    +ExprM:ExprF(Expr1,...,ExprN)

    In the first form of function calls, ExprM:ExprF(Expr1,...,ExprN), each of ExprM and ExprF must be an atom or an expression that evaluates to an atom. The function is said to be called by using the fully qualified function name. -This is often referred to as a remote or external function call.

    Example:

    lists:keyfind(Name, 1, List)

    In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be +This is often referred to as a remote or external function call.

    Example:

    lists:keyfind(Name, 1, List)

    In the second form of function calls, ExprF(Expr1,...,ExprN), ExprF must be an atom or evaluate to a fun.

    If ExprF is an atom, the function is said to be called by using the implicitly qualified function name. If the function ExprF is locally defined, it is called. Alternatively, if ExprF is explicitly imported from the M module, M:ExprF(Expr1,...,ExprN) is called. If ExprF is neither declared locally nor explicitly imported, ExprF must be the name of an automatically -imported BIF.

    Examples:

    handle(Msg, State)
    -spawn(m, init, [])

    Examples where ExprF is a fun:

    1> Fun1 = fun(X) -> X+1 end,
    -Fun1(3).
    +imported BIF.

    Examples:

    handle(Msg, State)
    +spawn(m, init, [])

    Examples where ExprF is a fun:

    1> Fun1 = fun(X) -> X+1 end,
    +Fun1(3).
     4
    -2> fun lists:append/2([1,2], [3,4]).
    -[1,2,3,4]
    +2> fun lists:append/2([1,2], [3,4]).
    +[1,2,3,4]
     3>

    Notice that when calling a local function, there is a difference between using the implicitly or fully qualified function name. The latter always refers to the latest version of the module. See @@ -320,32 +320,32 @@

    (ERTS version 5.8) and have an implicitly qualified call to that function in your code, you either need to explicitly remove the auto-import using a compiler directive, or replace the call with a fully qualified function call. Otherwise -you get a compilation error. See the following example:

    -export([length/1,f/1]).
    +you get a compilation error. See the following example:

    -export([length/1,f/1]).
     
    --compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
    +-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
     
    -length([]) ->
    +length([]) ->
         0;
    -length([H|T]) ->
    -    1 + length(T). %% Calls the local function length/1
    +length([H|T]) ->
    +    1 + length(T). %% Calls the local function length/1
     
    -f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
    +f(X) when erlang:length(X) > 3 -> %% Calls erlang:length/1,
                                       %% which is allowed in guards
         long.

    The same logic applies to explicitly imported functions from other modules, as to locally defined functions. It is not allowed to both import a function from -another module and have the function declared in the module at the same time:

    -export([f/1]).
    +another module and have the function declared in the module at the same time:

    -export([f/1]).
     
    --compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
    +-compile({no_auto_import,[length/1]}). % erlang:length/1 no longer autoimported
     
    --import(mod,[length/1]).
    +-import(mod,[length/1]).
     
    -f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
    +f(X) when erlang:length(X) > 33 -> %% Calls erlang:length/1,
                                        %% which is allowed in guards
     
    -    erlang:length(X);              %% Explicit call to erlang:length in body
    +    erlang:length(X);              %% Explicit call to erlang:length in body
     
    -f(X) ->
    -    length(X).                     %% mod:length/1 is called

    For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the +f(X) -> + length(X). %% mod:length/1 is called

    For auto-imported BIFs added in Erlang/OTP R14A and thereafter, overriding the name with a local function or explicit import is always allowed. However, if the -compile({no_auto_import,[F/A]) directive is not used, the compiler issues a warning whenever the function is called in the module using the implicitly @@ -365,7 +365,7 @@

    sequence GuardSeq that evaluates to true is found. Then the corresponding Body (a sequence of expressions separated by ,) is evaluated.

    The return value of Body is the return value of the if expression.

    If no guard sequence is evaluated as true, an if_clause run-time error occurs. If necessary, the guard expression true can be used in the last branch, as -that guard sequence is always true.

    Example:

    is_greater_than(X, Y) ->
    +that guard sequence is always true.

    Example:

    is_greater_than(X, Y) ->
         if
             X > Y ->
                 true;
    @@ -378,19 +378,19 @@ 

    Case

    case Expr of
    -    Pattern1 [when GuardSeq1] ->
    +    Pattern1 [when GuardSeq1] ->
             Body1;
         ...;
    -    PatternN [when GuardSeqN] ->
    +    PatternN [when GuardSeqN] ->
             BodyN
     end

    The expression Expr is evaluated and the patterns Pattern are sequentially matched against the result. If a match succeeds and the optional guard sequence GuardSeq is true, the corresponding Body is evaluated.

    The return value of Body is the return value of the case expression.

    If there is no matching pattern with a true guard sequence, a case_clause -run-time error occurs.

    Example:

    is_valid_signal(Signal) ->
    +run-time error occurs.

    Example:

    is_valid_signal(Signal) ->
         case Signal of
    -        {signal, _What, _From, _To} ->
    +        {signal, _What, _From, _To} ->
                 true;
    -        {signal, _What, _To} ->
    +        {signal, _What, _To} ->
                 true;
             _Else ->
                 false
    @@ -416,9 +416,9 @@ 

    expressions in the maybe block are skipped and the return value of the maybe block is Expr2.

    None of the variables bound in a maybe block must be used in the code that follows the block.

    Here is an example:

    maybe
    -    {ok, A} ?= a(),
    +    {ok, A} ?= a(),
         true = A >= 0,
    -    {ok, B} ?= b(),
    +    {ok, B} ?= b(),
         A + B
     end

    Let us first assume that a() returns {ok,42} and b() returns {ok,58}. With those return values, all of the match operators will succeed, and the @@ -427,11 +427,11 @@

    the value of the expression that failed to match, namely error. Similarly, if b() returns wrong, the return value of the maybe block is wrong.

    Finally, let us assume that a() returns {ok,-1}. Because true = A >= 0 uses the match operator =, a {badmatch,false} run-time error occurs when the -expression fails to match the pattern.

    The example can be written in a less succient way using nested case expressions:

    case a() of
    -    {ok, A} ->
    +expression fails to match the pattern.

    The example can be written in a less succient way using nested case expressions:

    case a() of
    +    {ok, A} ->
             true = A >= 0,
    -        case b() of
    -            {ok, B} ->
    +        case b() of
    +            {ok, B} ->
                     A + B;
                 Other1 ->
                     Other1
    @@ -443,10 +443,10 @@ 

    ..., ExprN else - Pattern1 [when GuardSeq1] -> + Pattern1 [when GuardSeq1] -> Body1; ...; - PatternN [when GuardSeqN] -> + PatternN [when GuardSeqN] -> BodyN end

    If a conditional match operator fails, the failed expression is matched against the patterns in all clauses between the else and end keywords. If a match @@ -456,9 +456,9 @@

    run-time error occurs.

    None of the variables bound in a maybe block must be used in the else clauses. None of the variables bound in the else clauses must be used in the code that follows the maybe block.

    Here is the previous example augmented with else clauses:

    maybe
    -    {ok, A} ?= a(),
    +    {ok, A} ?= a(),
         true = A >= 0,
    -    {ok, B} ?= b(),
    +    {ok, B} ?= b(),
         A + B
     else
         error -> error;
    @@ -485,10 +485,10 @@ 

    Receive

    receive
    -    Pattern1 [when GuardSeq1] ->
    +    Pattern1 [when GuardSeq1] ->
             Body1;
         ...;
    -    PatternN [when GuardSeqN] ->
    +    PatternN [when GuardSeqN] ->
             BodyN
     end

    Fetches a received message present in the message queue of the process. The first message in the message queue is matched sequentially against the patterns @@ -500,19 +500,19 @@

    corresponding Body is evaluated. All other messages in the message queue remain unchanged.

    The return value of Body is the return value of the receive expression.

    receive never fails. The execution is suspended, possibly indefinitely, until a message arrives that matches one of the patterns and with a true guard -sequence.

    Example:

    wait_for_onhook() ->
    +sequence.

    Example:

    wait_for_onhook() ->
         receive
             onhook ->
    -            disconnect(),
    -            idle();
    -        {connect, B} ->
    -            B ! {busy, self()},
    -            wait_for_onhook()
    +            disconnect(),
    +            idle();
    +        {connect, B} ->
    +            B ! {busy, self()},
    +            wait_for_onhook()
         end.

    The receive expression can be augmented with a timeout:

    receive
    -    Pattern1 [when GuardSeq1] ->
    +    Pattern1 [when GuardSeq1] ->
             Body1;
         ...;
    -    PatternN [when GuardSeqN] ->
    +    PatternN [when GuardSeqN] ->
             BodyN
     after
         ExprT ->
    @@ -525,27 +525,27 @@ 

    timeout is almost 50 days. With a zero value the timeout occurs immediately if there is no matching message in the message queue.

    The atom infinity will make the process wait indefinitely for a matching message. This is the same as not using a timeout. It can be useful for timeout -values that are calculated at runtime.

    Example:

    wait_for_onhook() ->
    +values that are calculated at runtime.

    Example:

    wait_for_onhook() ->
         receive
             onhook ->
    -            disconnect(),
    -            idle();
    -        {connect, B} ->
    -            B ! {busy, self()},
    -            wait_for_onhook()
    +            disconnect(),
    +            idle();
    +        {connect, B} ->
    +            B ! {busy, self()},
    +            wait_for_onhook()
         after
             60000 ->
    -            disconnect(),
    -            error()
    +            disconnect(),
    +            error()
         end.

    It is legal to use a receive...after expression with no branches:

    receive
     after
         ExprT ->
             BodyT
     end

    This construction does not consume any messages, only suspends execution in the -process for ExprT milliseconds. This can be used to implement simple timers.

    Example:

    timer() ->
    -    spawn(m, timer, [self()]).
    +process for ExprT milliseconds. This can be used to implement simple timers.

    Example:

    timer() ->
    +    spawn(m, timer, [self()]).
     
    -timer(Pid) ->
    +timer(Pid) ->
         receive
         after
             5000 ->
    @@ -595,9 +595,9 @@ 

    true 6> 1 > a. false -7> #{c => 3} > #{a => 1, b => 2}. +7> #{c => 3} > #{a => 1, b => 2}. false -8> #{a => 1, b => 2} == #{a => 1.0, b => 2.0}. +8> #{a => 1, b => 2} == #{a => 1.0, b => 2.0}. true 9> <<2:2>> < <<128>>. true @@ -635,7 +635,7 @@

    ** exception error: an error occurred when evaluating an arithmetic expression in operator +/2 called as a + 10 -10> 1 bsl (1 bsl 64). +10> 1 bsl (1 bsl 64). ** exception error: a system limit has been reached in operator bsl/2 called as 1 bsl 18446744073709551616

    @@ -662,12 +662,12 @@

    Expr1 orelse Expr2
     Expr1 andalso Expr2

    Expr2 is evaluated only if necessary. That is, Expr2 is evaluated only if:

    • Expr1 evaluates to false in an orelse expression.

    or

    • Expr1 evaluates to true in an andalso expression.

    Returns either the value of Expr1 (that is, true or false) or the value of -Expr2 (if Expr2 is evaluated).

    Example 1:

    case A >= -1.0 andalso math:sqrt(A+1) > B of

    This works even if A is less than -1.0, since in that case, math:sqrt/1 is -never evaluated.

    Example 2:

    OnlyOne = is_atom(L) orelse
    -         (is_list(L) andalso length(L) == 1),

    Expr2 is not required to evaluate to a Boolean value. Because of that, -andalso and orelse are tail-recursive.

    Example 3 (tail-recursive function):

    all(Pred, [Hd|Tail]) ->
    -    Pred(Hd) andalso all(Pred, Tail);
    -all(_, []) ->
    +Expr2 (if Expr2 is evaluated).

    Example 1:

    case A >= -1.0 andalso math:sqrt(A+1) > B of

    This works even if A is less than -1.0, since in that case, math:sqrt/1 is +never evaluated.

    Example 2:

    OnlyOne = is_atom(L) orelse
    +         (is_list(L) andalso length(L) == 1),

    Expr2 is not required to evaluate to a Boolean value. Because of that, +andalso and orelse are tail-recursive.

    Example 3 (tail-recursive function):

    all(Pred, [Hd|Tail]) ->
    +    Pred(Hd) andalso all(Pred, Tail);
    +all(_, []) ->
         true.

    Change

    Before Erlang/OTP R13A, Expr2 was required to evaluate to a Boolean value, and as consequence, andalso and orelse were not tail-recursive.

    @@ -679,10 +679,10 @@

    Expr1 -- Expr2

    The list concatenation operator ++ appends its second argument to its first and returns the resulting list.

    The list subtraction operator -- produces a list that is a copy of the first argument. The procedure is as follows: for each element in the second argument, -the first occurrence of this element (if any) is removed.

    Example:

    1> [1,2,3] ++ [4,5].
    -[1,2,3,4,5]
    -2> [1,2,3,2,1,2] -- [2,1,2].
    -[3,1,2]

    +the first occurrence of this element (if any) is removed.

    Example:

    1> [1,2,3] ++ [4,5].
    +[1,2,3,4,5]
    +2> [1,2,3,2,1,2] -- [2,1,2].
    +[3,1,2]

    @@ -695,18 +695,18 @@

    Creating Maps

    Constructing a new map is done by letting an expression K be associated with -another expression V:

    #{K => V}

    New maps can include multiple associations at construction by listing every -association:

    #{K1 => V1, ..., Kn => Vn}

    An empty map is constructed by not associating any terms with each other:

    #{}

    All keys and values in the map are terms. Any expression is first evaluated and +another expression V:

    #{K => V}

    New maps can include multiple associations at construction by listing every +association:

    #{K1 => V1, ..., Kn => Vn}

    An empty map is constructed by not associating any terms with each other:

    #{}

    All keys and values in the map are terms. Any expression is first evaluated and then the resulting terms are used as key and value respectively.

    Keys and values are separated by the => arrow and associations are separated -by a comma (,).

    Examples:

    M0 = #{},                 % empty map
    -M1 = #{a => <<"hello">>}, % single association with literals
    -M2 = #{1 => 2, b => b},   % multiple associations with literals
    -M3 = #{k => {A,B}},       % single association with variables
    -M4 = #{{"w", 1} => f()}.  % compound key associated with an evaluated expression

    Here, A and B are any expressions and M0 through M4 are the resulting -map terms.

    If two matching keys are declared, the latter key takes precedence.

    Example:

    1> #{1 => a, 1 => b}.
    -#{1 => b }
    -2> #{1.0 => a, 1 => b}.
    -#{1 => b, 1.0 => a}

    The order in which the expressions constructing the keys (and their associated +by a comma (,).

    Examples:

    M0 = #{},                 % empty map
    +M1 = #{a => <<"hello">>}, % single association with literals
    +M2 = #{1 => 2, b => b},   % multiple associations with literals
    +M3 = #{k => {A,B}},       % single association with variables
    +M4 = #{{"w", 1} => f()}.  % compound key associated with an evaluated expression

    Here, A and B are any expressions and M0 through M4 are the resulting +map terms.

    If two matching keys are declared, the latter key takes precedence.

    Example:

    1> #{1 => a, 1 => b}.
    +#{1 => b }
    +2> #{1.0 => a, 1 => b}.
    +#{1 => b, 1.0 => a}

    The order in which the expressions constructing the keys (and their associated values) are evaluated is not defined. The syntactic order of the key-value pairs in the construction is of no relevance, except in the recently mentioned case of two matching keys.

    @@ -716,24 +716,24 @@

    Updating Maps

    Updating a map has a similar syntax as constructing it.

    An expression defining the map to be updated is put in front of the expression -defining the keys to be updated and their respective values:

    M#{K => V}

    Here M is a term of type map and K and V are any expression.

    If key K does not match any existing key in the map, a new association is +defining the keys to be updated and their respective values:

    M#{K => V}

    Here M is a term of type map and K and V are any expression.

    If key K does not match any existing key in the map, a new association is created from key K to value V.

    If key K matches an existing key in map M, its associated value is replaced by the new value V. In both cases, the evaluated map expression returns a new -map.

    If M is not of type map, an exception of type badmap is raised.

    To only update an existing value, the following syntax is used:

    M#{K := V}

    Here M is a term of type map, V is an expression and K is an expression +map.

    If M is not of type map, an exception of type badmap is raised.

    To only update an existing value, the following syntax is used:

    M#{K := V}

    Here M is a term of type map, V is an expression and K is an expression that evaluates to an existing key in M.

    If key K does not match any existing keys in map M, an exception of type badkey is raised at runtime. If a matching key K is present in map M, its associated value is replaced by the new value V, and the evaluated map -expression returns a new map.

    If M is not of type map, an exception of type badmap is raised.

    Examples:

    M0 = #{},
    -M1 = M0#{a => 0},
    -M2 = M1#{a => 1, b => 2},
    -M3 = M2#{"function" => fun() -> f() end},
    -M4 = M3#{a := 2, b := 3}.  % 'a' and 'b' was added in `M1` and `M2`.

    Here M0 is any map. It follows that M1 through M4 are maps as well.

    More examples:

    1> M = #{1 => a}.
    -#{1 => a }
    -2> M#{1.0 => b}.
    -#{1 => a, 1.0 => b}.
    -3> M#{1 := b}.
    -#{1 => b}
    -4> M#{1.0 := b}.
    +expression returns a new map.

    If M is not of type map, an exception of type badmap is raised.

    Examples:

    M0 = #{},
    +M1 = M0#{a => 0},
    +M2 = M1#{a => 1, b => 2},
    +M3 = M2#{"function" => fun() -> f() end},
    +M4 = M3#{a := 2, b := 3}.  % 'a' and 'b' was added in `M1` and `M2`.

    Here M0 is any map. It follows that M1 through M4 are maps as well.

    More examples:

    1> M = #{1 => a}.
    +#{1 => a }
    +2> M#{1.0 => b}.
    +#{1 => a, 1.0 => b}.
    +3> M#{1 := b}.
    +#{1 => b}
    +4> M#{1.0 := b}.
     ** exception error: bad argument

    As in construction, the order in which the key and value expressions are evaluated is not defined. The syntactic order of the key-value pairs in the update is of no relevance, except in the case where two keys match. In that @@ -743,31 +743,31 @@

    Maps in Patterns

    -

    Matching of key-value associations from maps is done as follows:

    #{K := V} = M

    Here M is any map. The key K must be a +

    Matching of key-value associations from maps is done as follows:

    #{K := V} = M

    Here M is any map. The key K must be a guard expression, with all variables already bound. V can be any pattern with either bound or unbound variables.

    If the variable V is unbound, it becomes bound to the value associated with the key K, which must exist in the map M. If the variable V is bound, it must match the value associated with K in M.

    Change

    Before Erlang/OTP 23, the expression defining the key K was restricted to be -either a single variable or a literal.

    Example:

    1> M = #{"tuple" => {1,2}}.
    -#{"tuple" => {1,2}}
    -2> #{"tuple" := {1,B}} = M.
    -#{"tuple" => {1,2}}
    +either a single variable or a literal.

    Example:

    1> M = #{"tuple" => {1,2}}.
    +#{"tuple" => {1,2}}
    +2> #{"tuple" := {1,B}} = M.
    +#{"tuple" => {1,2}}
     3> B.
    -2.

    This binds variable B to integer 2.

    Similarly, multiple values from the map can be matched:

    #{K1 := V1, ..., Kn := Vn} = M

    Here keys K1 through Kn are any expressions with literals or bound +2.

    This binds variable B to integer 2.

    Similarly, multiple values from the map can be matched:

    #{K1 := V1, ..., Kn := Vn} = M

    Here keys K1 through Kn are any expressions with literals or bound variables. If all key expressions evaluate successfully and all keys exist in map M, all variables in V1 .. Vn is matched to the associated values of their respective keys.

    If the matching conditions are not met the match fails.

    Note that when matching a map, only the := operator (not the =>) is allowed as a delimiter for the associations.

    The order in which keys are declared in matching has no relevance.

    Duplicate keys are allowed in matching and match each pattern associated to the -keys:

    #{K := V1, K := V2} = M

    The empty map literal (#{}) matches any map when used as a pattern:

    #{} = Expr

    This expression matches if the expression Expr is of type map, otherwise it -fails with an exception badmatch.

    Here the key to be retrieved is constructed from an expression:

    #{{tag,length(List)} := V} = Map

    List must be an already bound variable.

    Matching Syntax

    Matching of literals as keys are allowed in function heads:

    %% only start if not_started
    -handle_call(start, From, #{state := not_started} = S) ->
    +keys:

    #{K := V1, K := V2} = M

    The empty map literal (#{}) matches any map when used as a pattern:

    #{} = Expr

    This expression matches if the expression Expr is of type map, otherwise it +fails with an exception badmatch.

    Here the key to be retrieved is constructed from an expression:

    #{{tag,length(List)} := V} = Map

    List must be an already bound variable.

    Matching Syntax

    Matching of literals as keys are allowed in function heads:

    %% only start if not_started
    +handle_call(start, From, #{state := not_started} = S) ->
     ...
    -    {reply, ok, S#{state := start}};
    +    {reply, ok, S#{state := start}};
     
     %% only change if started
    -handle_call(change, From, #{state := start} = S) ->
    +handle_call(change, From, #{state := start} = S) ->
     ...
    -    {reply, ok, S#{state := changed}};

    + {reply, ok, S#{state := changed}};

    @@ -854,17 +854,17 @@

    types binary, bitstring, bytes, and bits.

    See also the paragraphs about Binaries.

    When constructing binaries and no size is specified for a binary segment, the entire binary value is interpolated into the binary being constructed. However, the size in bits of the binary being interpolated must be evenly divisible by -the unit value for the segment; otherwise an exception is raised.

    For example, the following examples all succeed:

    1> <<(<<"abc">>)/bitstring>>.
    +the unit value for the segment; otherwise an exception is raised.

    For example, the following examples all succeed:

    1> <<(<<"abc">>)/bitstring>>.
     <<"abc">>
    -2> <<(<<"abc">>)/binary-unit:1>>.
    +2> <<(<<"abc">>)/binary-unit:1>>.
     <<"abc">>
    -3> <<(<<"abc">>)/binary>>.
    +3> <<(<<"abc">>)/binary>>.
     <<"abc">>

    The first two examples have a unit value of 1 for the segment, while the third segment has a unit value of 8.

    Attempting to interpolate a bit string of size 1 into a binary segment with unit -8 (the default unit for binary) fails as shown in this example:

    1> <<(<<1:1>>)/binary>>.
    -** exception error: bad argument

    For the construction to succeed, the unit value of the segment must be 1:

    2> <<(<<1:1>>)/bitstring>>.
    +8 (the default unit for binary) fails as shown in this example:

    1> <<(<<1:1>>)/binary>>.
    +** exception error: bad argument

    For the construction to succeed, the unit value of the segment must be 1:

    2> <<(<<1:1>>)/bitstring>>.
     <<1:1>>
    -3> <<(<<1:1>>)/binary-unit:1>>.
    +3> <<(<<1:1>>)/binary-unit:1>>.
     <<1:1>>

    Similarly, when matching a binary segment with no size specified, the match succeeds if and only if the size in bits of the rest of the binary is evenly divisible by the unit value:

    1> <<_/binary-unit:16>> = <<"">>.
    @@ -878,9 +878,9 @@ 

    5> <<_/binary-unit:16>> = <<"abcd">>. <<"abcd">>

    When a size is explicitly specified for a binary segment, the segment size in bits is the value of Size multiplied by the default or explicit unit value.

    When constructing binaries, the size of the binary being interpolated into the -constructed binary must be at least as large as the size of the binary segment.

    Examples:

    1> <<(<<"abc">>):2/binary>>.
    +constructed binary must be at least as large as the size of the binary segment.

    Examples:

    1> <<(<<"abc">>):2/binary>>.
     <<"ab">>
    -2> <<(<<"a">>):2/binary>>.
    +2> <<(<<"a">>):2/binary>>.
     ** exception error: construction of binary failed
             *** segment 1 of type 'binary': the value <<"a">> is shorter than the size of the segment

    @@ -944,30 +944,30 @@

    Fun Expressions

    fun
    -    [Name](Pattern11,...,Pattern1N) [when GuardSeq1] ->
    +    [Name](Pattern11,...,Pattern1N) [when GuardSeq1] ->
                   Body1;
         ...;
    -    [Name](PatternK1,...,PatternKN) [when GuardSeqK] ->
    +    [Name](PatternK1,...,PatternKN) [when GuardSeqK] ->
                   BodyK
     end

    A fun expression begins with the keyword fun and ends with the keyword end. Between them is to be a function declaration, similar to a regular function declaration, except that the function name is optional and is to be a variable, if any.

    Variables in a fun head shadow the function name and both shadow variables in the function clause surrounding the fun expression. Variables bound in a fun -body are local to the fun body.

    The return value of the expression is the resulting fun.

    Examples:

    1> Fun1 = fun (X) -> X+1 end.
    +body are local to the fun body.

    The return value of the expression is the resulting fun.

    Examples:

    1> Fun1 = fun (X) -> X+1 end.
     #Fun<erl_eval.6.39074546>
    -2> Fun1(2).
    +2> Fun1(2).
     3
    -3> Fun2 = fun (X) when X>=5 -> gt; (X) -> lt end.
    +3> Fun2 = fun (X) when X>=5 -> gt; (X) -> lt end.
     #Fun<erl_eval.6.39074546>
    -4> Fun2(7).
    +4> Fun2(7).
     gt
    -5> Fun3 = fun Fact(1) -> 1; Fact(X) when X > 1 -> X * Fact(X - 1) end.
    +5> Fun3 = fun Fact(1) -> 1; Fact(X) when X > 1 -> X * Fact(X - 1) end.
     #Fun<erl_eval.6.39074546>
    -6> Fun3(4).
    +6> Fun3(4).
     24

    The following fun expressions are also allowed:

    fun Name/Arity
     fun Module:Name/Arity

    In Name/Arity, Name is an atom and Arity is an integer. Name/Arity must -specify an existing local function. The expression is syntactic sugar for:

    fun (Arg1,...,ArgN) -> Name(Arg1,...,ArgN) end

    In Module:Name/Arity, Module, and Name are atoms and Arity is an +specify an existing local function. The expression is syntactic sugar for:

    fun (Arg1,...,ArgN) -> Name(Arg1,...,ArgN) end

    In Module:Name/Arity, Module, and Name are atoms and Arity is an integer. Module, Name, and Arity can also be variables. A fun defined in this way refers to the function Name with arity Arity in the latest version of module Module. A fun defined in this way is not dependent on the @@ -985,11 +985,11 @@

    recent function calls, see Exit Reasons.

    Examples:

    1> catch 1+2.
     3
     2> catch 1+a.
    -{'EXIT',{badarith,[...]}}

    The BIF throw(Any) can be used for non-local return from a -function. It must be evaluated within a catch, which returns the value Any.

    Example:

    3> catch throw(hello).
    +{'EXIT',{badarith,[...]}}

    The BIF throw(Any) can be used for non-local return from a +function. It must be evaluated within a catch, which returns the value Any.

    Example:

    3> catch throw(hello).
     hello

    If throw/1 is not evaluated within a catch, a nocatch run-time error occurs.

    Change

    Before Erlang/OTP 24, the catch operator had the lowest precedence, making -it necessary to add parentheses when combining it with the match operator:

    1> A = (catch 42).
    +it necessary to add parentheses when combining it with the match operator:

    1> A = (catch 42).
     42
     2> A.
     42

    Starting from Erlang/OTP 24, the parentheses can be omitted:

    1> A = catch 42.
    @@ -1003,9 +1003,9 @@ 

    try Exprs
     catch
    -    Class1:ExceptionPattern1[:Stacktrace] [when ExceptionGuardSeq1] ->
    +    Class1:ExceptionPattern1[:Stacktrace] [when ExceptionGuardSeq1] ->
             ExceptionBody1;
    -    ClassN:ExceptionPatternN[:Stacktrace] [when ExceptionGuardSeqN] ->
    +    ClassN:ExceptionPatternN[:Stacktrace] [when ExceptionGuardSeqN] ->
             ExceptionBodyN
     end

    This is an enhancement of catch. It gives the possibility to:

    Examples (using a guard expression as filter):

    1> List = [1,2,a,b,c,3,4].
    +[1,2,a,b,c,3,4]
    +2> [E || E <- List, E rem 2].
    +[]
    +3> [E || E <- List, E rem 2 =:= 0].
    +[2,4]

    Examples (using a non-guard expression as filter):

    1> List = [1,2,a,b,c,3,4].
    +[1,2,a,b,c,3,4]
    +2> FaultyIsEven = fun(E) -> E rem 2 end.
     #Fun<erl_eval.42.17316486>
    -3> [E || E <- List, FaultyIsEven(E)].
    +3> [E || E <- List, FaultyIsEven(E)].
     ** exception error: bad filter 1
    -4> IsEven = fun(E) -> E rem 2 =:= 0 end.
    +4> IsEven = fun(E) -> E rem 2 =:= 0 end.
     #Fun<erl_eval.42.17316486>
    -5> [E || E <- List, IsEven(E)].
    +5> [E || E <- List, IsEven(E)].
     ** exception error: an error occurred when evaluating an arithmetic expression
          in operator  rem/2
             called as a rem 2
    -6> [E || E <- List, is_integer(E), IsEven(E)].
    -[2,4]

    +6> [E || E <- List, is_integer(E), IsEven(E)]. +[2,4]

    diff --git a/prs/9277/doc/system/funs.html b/prs/9277/doc/system/funs.html index b62065a5c54e2..244da64826034 100644 --- a/prs/9277/doc/system/funs.html +++ b/prs/9277/doc/system/funs.html @@ -121,14 +121,14 @@

    map

    -

    The following function, double, doubles every element in a list:

    double([H|T]) -> [2*H|double(T)];
    -double([])    -> [].

    Hence, the argument entered as input is doubled as follows:

    > double([1,2,3,4]).
    -[2,4,6,8]

    The following function, add_one, adds one to every element in a list:

    add_one([H|T]) -> [H+1|add_one(T)];
    -add_one([])    -> [].

    The functions double and add_one have a similar structure. This can be used -by writing a function map that expresses this similarity:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    -map(F, [])    -> [].

    The functions double and add_one can now be expressed in terms of map as -follows:

    double(L)  -> map(fun(X) -> 2*X end, L).
    -add_one(L) -> map(fun(X) -> 1 + X end, L).

    map(F, List) is a function that takes a function F and a list L as +

    The following function, double, doubles every element in a list:

    double([H|T]) -> [2*H|double(T)];
    +double([])    -> [].

    Hence, the argument entered as input is doubled as follows:

    > double([1,2,3,4]).
    +[2,4,6,8]

    The following function, add_one, adds one to every element in a list:

    add_one([H|T]) -> [H+1|add_one(T)];
    +add_one([])    -> [].

    The functions double and add_one have a similar structure. This can be used +by writing a function map that expresses this similarity:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    +map(F, [])    -> [].

    The functions double and add_one can now be expressed in terms of map as +follows:

    double(L)  -> map(fun(X) -> 2*X end, L).
    +add_one(L) -> map(fun(X) -> 1 + X end, L).

    map(F, List) is a function that takes a function F and a list L as arguments and returns a new list, obtained by applying F to each of the elements in L.

    The process of abstracting out the common features of a number of different programs is called procedural abstraction. Procedural abstraction can be used @@ -142,21 +142,21 @@

    foreach

    This section illustrates procedural abstraction. Initially, the following two -examples are written as conventional functions.

    This function prints all elements of a list onto a stream:

    print_list(Stream, [H|T]) ->
    -    io:format(Stream, "~p~n", [H]),
    -    print_list(Stream, T);
    -print_list(Stream, []) ->
    -    true.

    This function broadcasts a message to a list of processes:

    broadcast(Msg, [Pid|Pids]) ->
    +examples are written as conventional functions.

    This function prints all elements of a list onto a stream:

    print_list(Stream, [H|T]) ->
    +    io:format(Stream, "~p~n", [H]),
    +    print_list(Stream, T);
    +print_list(Stream, []) ->
    +    true.

    This function broadcasts a message to a list of processes:

    broadcast(Msg, [Pid|Pids]) ->
         Pid ! Msg,
    -    broadcast(Msg, Pids);
    -broadcast(_, []) ->
    +    broadcast(Msg, Pids);
    +broadcast(_, []) ->
         true.

    These two functions have a similar structure. They both iterate over a list and do something to each element in the list. The "something" is passed on as an -extra argument to the function that does this.

    The function foreach expresses this similarity:

    foreach(F, [H|T]) ->
    -    F(H),
    -    foreach(F, T);
    -foreach(F, []) ->
    -    ok.

    Using the function foreach, the function print_list becomes:

    foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

    Using the function foreach, the function broadcast becomes:

    foreach(fun(Pid) -> Pid ! M end, L)

    foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) +extra argument to the function that does this.

    The function foreach expresses this similarity:

    foreach(F, [H|T]) ->
    +    F(H),
    +    foreach(F, T);
    +foreach(F, []) ->
    +    ok.

    Using the function foreach, the function print_list becomes:

    foreach(fun(H) -> io:format(S, "~p~n",[H]) end, L)

    Using the function foreach, the function broadcast becomes:

    foreach(fun(Pid) -> Pid ! M end, L)

    foreach is evaluated for its side-effect and not its value. foreach(Fun ,L) calls Fun(X) for each element X in L and the processing occurs in the order that the elements were defined in L. map does not define the order in which its elements are processed.

    @@ -166,24 +166,24 @@

    Syntax of Funs

    Funs are written with the following syntax (see -Fun Expressions for full description):

    F = fun (Arg1, Arg2, ... ArgN) ->
    +Fun Expressions for full description):

    F = fun (Arg1, Arg2, ... ArgN) ->
             ...
         end

    This creates an anonymous function of N arguments and binds it to the variable F.

    Another function, FunctionName, written in the same module, can be passed as an argument, using the following syntax:

    F = fun FunctionName/Arity

    With this form of function reference, the function that is referred to does not need to be exported from the module.

    It is also possible to refer to a function defined in a different module, with -the following syntax:

    F = fun Module:FunctionName/Arity

    In this case, the function must be exported from the module in question.

    The following program illustrates the different ways of creating funs:

    -module(fun_test).
    --export([t1/0, t2/0]).
    --import(lists, [map/2]).
    +the following syntax:

    F = fun Module:FunctionName/Arity

    In this case, the function must be exported from the module in question.

    The following program illustrates the different ways of creating funs:

    -module(fun_test).
    +-export([t1/0, t2/0]).
    +-import(lists, [map/2]).
     
    -t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
    +t1() -> map(fun(X) -> 2 * X end, [1,2,3,4,5]).
     
    -t2() -> map(fun double/1, [1,2,3,4,5]).
    +t2() -> map(fun double/1, [1,2,3,4,5]).
     
    -double(X) -> X * 2.

    The fun F can be evaluated with the following syntax:

    F(Arg1, Arg2, ..., Argn)

    To check whether a term is a fun, use the test -is_function/1 in a guard.

    Example:

    f(F, Args) when is_function(F) ->
    -   apply(F, Args);
    -f(N, _) when is_integer(N) ->
    +double(X) -> X * 2.

    The fun F can be evaluated with the following syntax:

    F(Arg1, Arg2, ..., Argn)

    To check whether a term is a fun, use the test +is_function/1 in a guard.

    Example:

    f(F, Args) when is_function(F) ->
    +   apply(F, Args);
    +f(N, _) when is_integer(N) ->
        N.

    Funs are a distinct type. The BIFs erlang:fun_info/1,2 can be used to retrieve information about a fun, and the BIF erlang:fun_to_list/1 returns a textual representation of a fun. The check_process_code/2 @@ -196,18 +196,18 @@

    The scope rules for variables that occur in funs are as follows:

    • All variables that occur in the head of a fun are assumed to be "fresh" variables.
    • Variables that are defined before the fun, and that occur in function calls or -guard tests within the fun, have the values they had outside the fun.
    • Variables cannot be exported from a fun.

    The following examples illustrate these rules:

    print_list(File, List) ->
    -    {ok, Stream} = file:open(File, write),
    -    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
    -    file:close(Stream).

    Here, the variable X, defined in the head of the fun, is a new variable. The +guard tests within the fun, have the values they had outside the fun.

  • Variables cannot be exported from a fun.
  • The following examples illustrate these rules:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(X) -> io:format(Stream,"~p~n",[X]) end, List),
    +    file:close(Stream).

    Here, the variable X, defined in the head of the fun, is a new variable. The variable Stream, which is used within the fun, gets its value from the file:open line.

    As any variable that occurs in the head of a fun is considered a new variable, -it is equally valid to write as follows:

    print_list(File, List) ->
    -    {ok, Stream} = file:open(File, write),
    -    foreach(fun(File) ->
    -                io:format(Stream,"~p~n",[File])
    -            end, List),
    -    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise +it is equally valid to write as follows:

    print_list(File, List) ->
    +    {ok, Stream} = file:open(File, write),
    +    foreach(fun(File) ->
    +                io:format(Stream,"~p~n",[File])
    +            end, List),
    +    file:close(Stream).

    Here, File is used as the new variable instead of X. This is not so wise because code in the fun body cannot refer to the variable File, which is defined outside of the fun. Compiling this example gives the following diagnostic:

    ./FileName.erl:Line: Warning: variable 'File'
    @@ -216,20 +216,20 @@ 

    pattern matching operations must be moved into guard expressions and cannot be written in the head of the fun. For example, you might write the following code if you intend the first clause of F to be evaluated when the value of its -argument is Y:

    f(...) ->
    +argument is Y:

    f(...) ->
         Y = ...
    -    map(fun(X) when X == Y ->
    +    map(fun(X) when X == Y ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    -    ...

    instead of writing the following code:

    f(...) ->
    +        end, ...)
    +    ...

    instead of writing the following code:

    f(...) ->
         Y = ...
    -    map(fun(Y) ->
    +    map(fun(Y) ->
                  ;
    -           (_) ->
    +           (_) ->
                  ...
    -        end, ...)
    +        end, ...)
         ...

    @@ -243,58 +243,58 @@

    map

    -

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    -map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the +

    lists:map/2 takes a function of one argument and a list of terms:

    map(F, [H|T]) -> [F(H)|map(F, T)];
    +map(F, [])    -> [].

    It returns the list obtained by applying the function to every argument in the list.

    When a new fun is defined in the shell, the value of the fun is printed as -Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
    +Fun#<erl_eval>:

    > Double = fun(X) -> 2 * X end.
     #Fun<erl_eval.6.72228031>
    -> lists:map(Double, [1,2,3,4,5]).
    -[2,4,6,8,10]

    +> lists:map(Double, [1,2,3,4,5]). +[2,4,6,8,10]

    any

    -

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    -    case Pred(H) of
    +

    lists:any/2 takes a predicate P of one argument and a list of terms:

    any(Pred, [H|T]) ->
    +    case Pred(H) of
             true  ->  true;
    -        false ->  any(Pred, T)
    +        false ->  any(Pred, T)
         end;
    -any(Pred, []) ->
    +any(Pred, []) ->
         false.

    A predicate is a function that returns true or false. any is true if there is a term X in the list such that P(X) is true.

    A predicate Big(X) is defined, which is true if its argument is greater that -10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
    +10:

    > Big =  fun(X) -> if X > 10 -> true; true -> false end end.
     #Fun<erl_eval.6.72228031>
    -> lists:any(Big, [1,2,3,4]).
    +> lists:any(Big, [1,2,3,4]).
     false
    -> lists:any(Big, [1,2,3,12,5]).
    +> lists:any(Big, [1,2,3,12,5]).
     true

    all

    -

    lists:all/2 has the same arguments as any:

    all(Pred, [H|T]) ->
    -    case Pred(H) of
    -        true  ->  all(Pred, T);
    +

    lists:all/2 has the same arguments as any:

    all(Pred, [H|T]) ->
    +    case Pred(H) of
    +        true  ->  all(Pred, T);
             false ->  false
         end;
    -all(Pred, []) ->
    -    true.

    It is true if the predicate applied to all elements in the list is true.

    > lists:all(Big, [1,2,3,4,12,6]).
    +all(Pred, []) ->
    +    true.

    It is true if the predicate applied to all elements in the list is true.

    > lists:all(Big, [1,2,3,4,12,6]).
     false
    -> lists:all(Big, [12,13,14,15]).
    +> lists:all(Big, [12,13,14,15]).
     true

    foreach

    -

    lists:foreach/2 takes a function of one argument and a list of terms:

    foreach(F, [H|T]) ->
    -    F(H),
    -    foreach(F, T);
    -foreach(F, []) ->
    +

    lists:foreach/2 takes a function of one argument and a list of terms:

    foreach(F, [H|T]) ->
    +    F(H),
    +    foreach(F, T);
    +foreach(F, []) ->
         ok.

    The function is applied to each argument in the list. foreach returns ok. It -is only used for its side-effect:

    > lists:foreach(fun(X) -> io:format("~w~n",[X]) end, [1,2,3,4]).
    +is only used for its side-effect:

    > lists:foreach(fun(X) -> io:format("~w~n",[X]) end, [1,2,3,4]).
     1
     2
     3
    @@ -305,106 +305,106 @@ 

    foldl

    -

    lists:foldl/3 takes a function of two arguments, an accumulator and a list:

    foldl(F, Accu, [Hd|Tail]) ->
    -    foldl(F, F(Hd, Accu), Tail);
    -foldl(F, Accu, []) -> Accu.

    The function is called with two arguments. The first argument is the successive +

    lists:foldl/3 takes a function of two arguments, an accumulator and a list:

    foldl(F, Accu, [Hd|Tail]) ->
    +    foldl(F, F(Hd, Accu), Tail);
    +foldl(F, Accu, []) -> Accu.

    The function is called with two arguments. The first argument is the successive elements in the list. The second argument is the accumulator. The function must return a new accumulator, which is used the next time the function is called.

    If you have a list of lists L = ["I","like","Erlang"], then you can sum the -lengths of all the strings in L as follows:

    > L = ["I","like","Erlang"].
    -["I","like","Erlang"]
    -10> lists:foldl(fun(X, Sum) -> length(X) + Sum end, 0, L).
    -11

    lists:foldl/3 works like a while loop in an imperative language:

    L =  ["I","like","Erlang"],
    +lengths of all the strings in L as follows:

    > L = ["I","like","Erlang"].
    +["I","like","Erlang"]
    +10> lists:foldl(fun(X, Sum) -> length(X) + Sum end, 0, L).
    +11

    lists:foldl/3 works like a while loop in an imperative language:

    L =  ["I","like","Erlang"],
     Sum = 0,
    -while( L != []){
    -    Sum += length(head(L)),
    -    L = tail(L)
    +while( L != []){
    +    Sum += length(head(L)),
    +    L = tail(L)
     end

    mapfoldl

    -

    lists:mapfoldl/3 simultaneously maps and folds over a list:

    mapfoldl(F, Accu0, [Hd|Tail]) ->
    -    {R,Accu1} = F(Hd, Accu0),
    -    {Rs,Accu2} = mapfoldl(F, Accu1, Tail),
    -    {[R|Rs], Accu2};
    -mapfoldl(F, Accu, []) -> {[], Accu}.

    The following example shows how to change all letters in L to upper case and -then count them.

    First the change to upper case:

    > Upcase =  fun(X) when $a =< X,  X =< $z -> X + $A - $a;
    -(X) -> X
    +

    lists:mapfoldl/3 simultaneously maps and folds over a list:

    mapfoldl(F, Accu0, [Hd|Tail]) ->
    +    {R,Accu1} = F(Hd, Accu0),
    +    {Rs,Accu2} = mapfoldl(F, Accu1, Tail),
    +    {[R|Rs], Accu2};
    +mapfoldl(F, Accu, []) -> {[], Accu}.

    The following example shows how to change all letters in L to upper case and +then count them.

    First the change to upper case:

    > Upcase =  fun(X) when $a =< X,  X =< $z -> X + $A - $a;
    +(X) -> X
     end.
     #Fun<erl_eval.6.72228031>
     > Upcase_word =
    -fun(X) ->
    -lists:map(Upcase, X)
    +fun(X) ->
    +lists:map(Upcase, X)
     end.
     #Fun<erl_eval.6.72228031>
    -> Upcase_word("Erlang").
    +> Upcase_word("Erlang").
     "ERLANG"
    -> lists:map(Upcase_word, L).
    -["I","LIKE","ERLANG"]

    Now, the fold and the map can be done at the same time:

    > lists:mapfoldl(fun(Word, Sum) ->
    -{Upcase_word(Word), Sum + length(Word)}
    -end, 0, L).
    -{["I","LIKE","ERLANG"],11}

    +> lists:map(Upcase_word, L). +["I","LIKE","ERLANG"]

    Now, the fold and the map can be done at the same time:

    > lists:mapfoldl(fun(Word, Sum) ->
    +{Upcase_word(Word), Sum + length(Word)}
    +end, 0, L).
    +{["I","LIKE","ERLANG"],11}

    filter

    lists:filter/2 takes a predicate of one argument and a list and returns all elements -in the list that satisfy the predicate:

    filter(F, [H|T]) ->
    -    case F(H) of
    -        true  -> [H|filter(F, T)];
    -        false -> filter(F, T)
    +in the list that satisfy the predicate:

    filter(F, [H|T]) ->
    +    case F(H) of
    +        true  -> [H|filter(F, T)];
    +        false -> filter(F, T)
         end;
    -filter(F, []) -> [].
    > lists:filter(Big, [500,12,2,45,6,7]).
    -[500,12,45]

    Combining maps and filters enables writing of very succinct code. For example, +filter(F, []) -> [].

    > lists:filter(Big, [500,12,2,45,6,7]).
    +[500,12,45]

    Combining maps and filters enables writing of very succinct code. For example, to define a set difference function diff(L1, L2) to be the difference between -the lists L1 and L2, the code can be written as follows:

    diff(L1, L2) ->
    -    filter(fun(X) -> not member(X, L2) end, L1).

    This gives the list of all elements in L1 that are not contained in L2.

    The AND intersection of the list L1 and L2 is also easily defined:

    intersection(L1,L2) -> filter(fun(X) -> member(X,L1) end, L2).

    +the lists L1 and L2, the code can be written as follows:

    diff(L1, L2) ->
    +    filter(fun(X) -> not member(X, L2) end, L1).

    This gives the list of all elements in L1 that are not contained in L2.

    The AND intersection of the list L1 and L2 is also easily defined:

    intersection(L1,L2) -> filter(fun(X) -> member(X,L1) end, L2).

    takewhile

    lists:takewhile/2 takes elements X from a list L as long as the predicate -P(X) is true:

    takewhile(Pred, [H|T]) ->
    -    case Pred(H) of
    -        true  -> [H|takewhile(Pred, T)];
    -        false -> []
    +P(X) is true:

    takewhile(Pred, [H|T]) ->
    +    case Pred(H) of
    +        true  -> [H|takewhile(Pred, T)];
    +        false -> []
         end;
    -takewhile(Pred, []) ->
    -    [].
    > lists:takewhile(Big, [200,500,45,5,3,45,6]).
    -[200,500,45]

    +takewhile(Pred, []) -> + [].

    > lists:takewhile(Big, [200,500,45,5,3,45,6]).
    +[200,500,45]

    dropwhile

    -

    lists:dropwhile/2 is the complement of takewhile:

    dropwhile(Pred, [H|T]) ->
    -    case Pred(H) of
    -        true  -> dropwhile(Pred, T);
    -        false -> [H|T]
    +

    lists:dropwhile/2 is the complement of takewhile:

    dropwhile(Pred, [H|T]) ->
    +    case Pred(H) of
    +        true  -> dropwhile(Pred, T);
    +        false -> [H|T]
         end;
    -dropwhile(Pred, []) ->
    -    [].
    > lists:dropwhile(Big, [200,500,45,5,3,45,6]).
    -[5,3,45,6]

    +dropwhile(Pred, []) -> + [].

    > lists:dropwhile(Big, [200,500,45,5,3,45,6]).
    +[5,3,45,6]

    splitwith

    lists:splitwith/2 splits the list L into the two sublists {L1, L2}, where -L = takewhile(P, L) and L2 = dropwhile(P, L):

    splitwith(Pred, L) ->
    -    splitwith(Pred, L, []).
    +L = takewhile(P, L) and L2 = dropwhile(P, L):

    splitwith(Pred, L) ->
    +    splitwith(Pred, L, []).
     
    -splitwith(Pred, [H|T], L) ->
    -    case Pred(H) of
    -        true  -> splitwith(Pred, T, [H|L]);
    -        false -> {reverse(L), [H|T]}
    +splitwith(Pred, [H|T], L) ->
    +    case Pred(H) of
    +        true  -> splitwith(Pred, T, [H|L]);
    +        false -> {reverse(L), [H|T]}
         end;
    -splitwith(Pred, [], L) ->
    -    {reverse(L), []}.
    > lists:splitwith(Big, [200,500,45,5,3,45,6]).
    -{[200,500,45],[5,3,45,6]}

    +splitwith(Pred, [], L) -> + {reverse(L), []}.

    > lists:splitwith(Big, [200,500,45,5,3,45,6]).
    +{[200,500,45],[5,3,45,6]}

    @@ -419,60 +419,60 @@

    Simple Higher Order Functions

    Adder(X) is a function that given X, returns a new function G such that -G(K) returns K + X:

    > Adder = fun(X) -> fun(Y) -> X + Y end end.
    +G(K) returns K + X:

    > Adder = fun(X) -> fun(Y) -> X + Y end end.
     #Fun<erl_eval.6.72228031>
    -> Add6 = Adder(6).
    +> Add6 = Adder(6).
     #Fun<erl_eval.6.72228031>
    -> Add6(10).
    +> Add6(10).
     16

    Infinite Lists

    -

    The idea is to write something like:

    -module(lazy).
    --export([ints_from/1]).
    -ints_from(N) ->
    -    fun() ->
    -            [N|ints_from(N+1)]
    -    end.

    Then proceed as follows:

    > XX = lazy:ints_from(1).
    +

    The idea is to write something like:

    -module(lazy).
    +-export([ints_from/1]).
    +ints_from(N) ->
    +    fun() ->
    +            [N|ints_from(N+1)]
    +    end.

    Then proceed as follows:

    > XX = lazy:ints_from(1).
     #Fun<lazy.0.29874839>
    -> XX().
    -[1|#Fun<lazy.0.29874839>]
    -> hd(XX()).
    +> XX().
    +[1|#Fun<lazy.0.29874839>]
    +> hd(XX()).
     1
    -> Y = tl(XX()).
    +> Y = tl(XX()).
     #Fun<lazy.0.29874839>
    -> hd(Y()).
    +> hd(Y()).
     2

    And so on. This is an example of "lazy embedding".

    Parsing

    -

    The following examples show parsers of the following type:

    Parser(Toks) -> {ok, Tree, Toks1} | fail

    Toks is the list of tokens to be parsed. A successful parse returns +

    The following examples show parsers of the following type:

    Parser(Toks) -> {ok, Tree, Toks1} | fail

    Toks is the list of tokens to be parsed. A successful parse returns {ok, Tree, Toks1}.

    • Tree is a parse tree.
    • Toks1 is a tail of Tree that contains symbols encountered after the structure that was correctly parsed.

    An unsuccessful parse returns fail.

    The following example illustrates a simple, functional parser that parses the grammar:

    (a | b) & (c | d)

    The following code defines a function pconst(X) in the module funparse, -which returns a fun that parses a list of tokens:

    pconst(X) ->
    -    fun (T) ->
    +which returns a fun that parses a list of tokens:

    pconst(X) ->
    +    fun (T) ->
            case T of
    -           [X|T1] -> {ok, {const, X}, T1};
    +           [X|T1] -> {ok, {const, X}, T1};
                _      -> fail
            end
    -    end.

    This function can be used as follows:

    > P1 = funparse:pconst(a).
    +    end.

    This function can be used as follows:

    > P1 = funparse:pconst(a).
     #Fun<funparse.0.22674075>
    -> P1([a,b,c]).
    -{ok,{const,a},[b,c]}
    -> P1([x,y,z]).
    +> P1([a,b,c]).
    +{ok,{const,a},[b,c]}
    +> P1([x,y,z]).
     fail

    Next, the two higher order functions pand and por are defined. They combine -primitive parsers to produce more complex parsers.

    First pand:

    pand(P1, P2) ->
    -    fun (T) ->
    -        case P1(T) of
    -            {ok, R1, T1} ->
    -                case P2(T1) of
    -                    {ok, R2, T2} ->
    -                        {ok, {'and', R1, R2}};
    +primitive parsers to produce more complex parsers.

    First pand:

    pand(P1, P2) ->
    +    fun (T) ->
    +        case P1(T) of
    +            {ok, R1, T1} ->
    +                case P2(T1) of
    +                    {ok, R2, T2} ->
    +                        {ok, {'and', R1, R2}};
                         fail ->
                             fail
                     end;
    @@ -482,33 +482,33 @@ 

    end.

    Given a parser P1 for grammar G1, and a parser P2 for grammar G2, pand(P1, P2) returns a parser for the grammar, which consists of sequences of tokens that satisfy G1, followed by sequences of tokens that satisfy G2.

    por(P1, P2) returns a parser for the language described by the grammar G1 or -G2:

    por(P1, P2) ->
    -    fun (T) ->
    -        case P1(T) of
    -            {ok, R, T1} ->
    -                {ok, {'or',1,R}, T1};
    +G2:

    por(P1, P2) ->
    +    fun (T) ->
    +        case P1(T) of
    +            {ok, R, T1} ->
    +                {ok, {'or',1,R}, T1};
                 fail ->
    -                case P2(T) of
    -                    {ok, R1, T1} ->
    -                        {ok, {'or',2,R1}, T1};
    +                case P2(T) of
    +                    {ok, R1, T1} ->
    +                        {ok, {'or',2,R1}, T1};
                         fail ->
                             fail
                     end
             end
         end.

    The original problem was to parse the grammar (a | b) & (c | d). The following -code addresses this problem:

    grammar() ->
    -    pand(
    -         por(pconst(a), pconst(b)),
    -         por(pconst(c), pconst(d))).

    The following code adds a parser interface to the grammar:

    parse(List) ->
    -    (grammar())(List).

    The parser can be tested as follows:

    > funparse:parse([a,c]).
    -{ok,{'and',{'or',1,{const,a}},{'or',1,{const,c}}}}
    -> funparse:parse([a,d]).
    -{ok,{'and',{'or',1,{const,a}},{'or',2,{const,d}}}}
    -> funparse:parse([b,c]).
    -{ok,{'and',{'or',2,{const,b}},{'or',1,{const,c}}}}
    -> funparse:parse([b,d]).
    -{ok,{'and',{'or',2,{const,b}},{'or',2,{const,d}}}}
    -> funparse:parse([a,b]).
    +code addresses this problem:

    grammar() ->
    +    pand(
    +         por(pconst(a), pconst(b)),
    +         por(pconst(c), pconst(d))).

    The following code adds a parser interface to the grammar:

    parse(List) ->
    +    (grammar())(List).

    The parser can be tested as follows:

    > funparse:parse([a,c]).
    +{ok,{'and',{'or',1,{const,a}},{'or',1,{const,c}}}}
    +> funparse:parse([a,d]).
    +{ok,{'and',{'or',1,{const,a}},{'or',2,{const,d}}}}
    +> funparse:parse([b,c]).
    +{ok,{'and',{'or',2,{const,b}},{'or',1,{const,c}}}}
    +> funparse:parse([b,d]).
    +{ok,{'and',{'or',2,{const,b}},{'or',2,{const,d}}}}
    +> funparse:parse([a,b]).
     fail
    diff --git a/prs/9277/doc/system/gen_server_concepts.html b/prs/9277/doc/system/gen_server_concepts.html index 05466dd7d1e96..e22f1e6870363 100644 --- a/prs/9277/doc/system/gen_server_concepts.html +++ b/prs/9277/doc/system/gen_server_concepts.html @@ -161,40 +161,40 @@

    An example of a simple server written in plain Erlang is provided in Overview. The server can be reimplemented using -gen_server, resulting in this callback module:

    -module(ch3).
    --behaviour(gen_server).
    +gen_server, resulting in this callback module:

    -module(ch3).
    +-behaviour(gen_server).
     
    --export([start_link/0]).
    --export([alloc/0, free/1]).
    --export([init/1, handle_call/3, handle_cast/2]).
    +-export([start_link/0]).
    +-export([alloc/0, free/1]).
    +-export([init/1, handle_call/3, handle_cast/2]).
     
    -start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []).
    +start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []).
     
    -alloc() ->
    -    gen_server:call(ch3, alloc).
    +alloc() ->
    +    gen_server:call(ch3, alloc).
     
    -free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).
    +free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).
     
    -init(_Args) ->
    -    {ok, channels()}.
    +init(_Args) ->
    +    {ok, channels()}.
     
    -handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.
    +handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.
     
    -handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    The code is explained in the next sections.

    +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

    The code is explained in the next sections.

    Starting a Gen_Server

    In the example in the previous section, gen_server is started by calling -ch3:start_link():

    start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function +ch3:start_link():

    start_link() ->
    +    gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

    start_link/0 calls function gen_server:start_link/4. This function spawns and links to a new process, a gen_server.

    • The first argument, {local, ch3}, specifies the name. The gen_server is then locally registered as ch3.

      If the name is omitted, the gen_server is not registered. Instead its pid must be used. The name can also be given as {global, Name}, in which case @@ -208,8 +208,8 @@

      for the available options.

    If name registration succeeds, the new gen_server process calls the callback function ch3:init([]). init is expected to return {ok, State}, where State is the internal state of the gen_server. In this case, the state is -the available channels.

    init(_Args) ->
    -    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the +the available channels.

    init(_Args) ->
    +    {ok, channels()}.

    gen_server:start_link/4 is synchronous. It does not return until the gen_server has been initialized and is ready to receive requests.

    gen_server:start_link/4 must be used if the gen_server is part of a supervision tree, meaning that it was started by a supervisor. There is another function, gen_server:start/4, to start a standalone @@ -225,9 +225,9 @@

    When the request is received, the gen_server calls handle_call(Request, From, State), which is expected to return a tuple {reply,Reply,State1}. Reply is the reply that is to be sent back -to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the +to the client, and State1 is a new value for the state of the gen_server.

    handle_call(alloc, _From, Chs) ->
    +    {Ch, Chs2} = alloc(Chs),
    +    {reply, Ch, Chs2}.

    In this case, the reply is the allocated channel Ch and the new state is the set of remaining available channels Chs2.

    Thus, the call ch3:alloc() returns the allocated channel Ch and the gen_server then waits for new requests, now with an updated list of available channels.

    @@ -236,13 +236,13 @@

    Asynchronous Requests - Cast

    -

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. +

    The asynchronous request free(Ch) is implemented using gen_server:cast/2:

    free(Ch) ->
    +    gen_server:cast(ch3, {free, Ch}).

    ch3 is the name of the gen_server. {free, Ch} is the actual request.

    The request is made into a message and sent to the gen_server. cast, and thus free, then returns ok.

    When the request is received, the gen_server calls handle_cast(Request, State), which is expected to return a tuple -{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. +{noreply,State1}. State1 is a new value for the state of the gen_server.

    handle_cast({free, Ch}, Chs) ->
    +    Chs2 = free(Ch, Chs),
    +    {noreply, Chs2}.

    In this case, the new state is the updated list of available channels Chs2. The gen_server is now ready for new requests.

    @@ -261,15 +261,15 @@

    set in the supervisor.

    If it is necessary to clean up before termination, the shutdown strategy must be a time-out value and the gen_server must be set to trap exit signals in function init. When ordered to shutdown, the gen_server then calls -the callback function terminate(shutdown, State):

    init(Args) ->
    +the callback function terminate(shutdown, State):

    init(Args) ->
         ...,
    -    process_flag(trap_exit, true),
    +    process_flag(trap_exit, true),
         ...,
    -    {ok, State}.
    +    {ok, State}.
     
     ...
     
    -terminate(shutdown, State) ->
    +terminate(shutdown, State) ->
         %% Code for cleaning up here
         ...
         ok.

    @@ -280,21 +280,21 @@

    If the gen_server is not part of a supervision tree, a stop function can be useful, for example:

    ...
    -export([stop/0]).
    +export([stop/0]).
     ...
     
    -stop() ->
    -    gen_server:cast(ch3, stop).
    +stop() ->
    +    gen_server:cast(ch3, stop).
     ...
     
    -handle_cast(stop, State) ->
    -    {stop, normal, State};
    -handle_cast({free, Ch}, State) ->
    +handle_cast(stop, State) ->
    +    {stop, normal, State};
    +handle_cast({free, Ch}, State) ->
         ...
     
     ...
     
    -terminate(normal, State) ->
    +terminate(normal, State) ->
         ok.

    The callback function handling the stop request returns a tuple {stop,normal,State1}, where normal specifies that it is a normal termination and State1 is a new value for the state @@ -309,13 +309,13 @@

    the callback function handle_info(Info, State) must be implemented to handle them. Examples of other messages are exit messages, if the gen_server is linked to other processes than the supervisor -and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
    +and it is trapping exit signals.

    handle_info({'EXIT', Pid, Reason}, State) ->
         %% Code to handle exits here.
         ...
    -    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
    +    {noreply, State1}.

    The final function to implement is code_change/3:

    code_change(OldVsn, State, Extra) ->
         %% Code to convert state (and more) during code change.
         ...
    -    {ok, NewState}.
    +
    {ok, NewState}.
    diff --git a/prs/9277/doc/system/included_applications.html b/prs/9277/doc/system/included_applications.html index 033f0d059405b..c4a0c3513b042 100644 --- a/prs/9277/doc/system/included_applications.html +++ b/prs/9277/doc/system/included_applications.html @@ -165,16 +165,16 @@

    Specifying Included Applications

    Which applications to include is defined by the included_applications key in -the .app file:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {prim_app_cb,[]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.

    +the .app file:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {prim_app_cb,[]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.

    @@ -188,27 +188,27 @@

    term.

    The value of the mod key of the including application must be set to {application_starter,[Module,StartArgs]}, where Module as usual is the application callback module. StartArgs is a term provided as argument to the -callback function Module:start/2:

    {application, prim_app,
    - [{description, "Tree application"},
    -  {vsn, "1"},
    -  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    -  {registered, [prim_app_server]},
    -  {included_applications, [incl_app]},
    -  {start_phases, [{init,[]}, {go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {application_starter,[prim_app_cb,[]]}},
    -  {env, [{file, "/usr/local/log"}]}
    - ]}.
    -
    -{application, incl_app,
    - [{description, "Included application"},
    -  {vsn, "1"},
    -  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
    -  {registered, []},
    -  {start_phases, [{go,[]}]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {incl_app_cb,[]}}
    - ]}.

    When starting a primary application with included applications, the primary +callback function Module:start/2:

    {application, prim_app,
    + [{description, "Tree application"},
    +  {vsn, "1"},
    +  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
    +  {registered, [prim_app_server]},
    +  {included_applications, [incl_app]},
    +  {start_phases, [{init,[]}, {go,[]}]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {application_starter,[prim_app_cb,[]]}},
    +  {env, [{file, "/usr/local/log"}]}
    + ]}.
    +
    +{application, incl_app,
    + [{description, "Included application"},
    +  {vsn, "1"},
    +  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
    +  {registered, []},
    +  {start_phases, [{go,[]}]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {incl_app_cb,[]}}
    + ]}.

    When starting a primary application with included applications, the primary application is started the normal way, that is:

    • The application controller creates an application master for the application
    • The application master calls Module:start(normal, StartArgs) to start the top supervisor.

    Then, for the primary application and each included application in top-down, left-to-right order, the application master calls @@ -221,11 +221,11 @@

    of specified phases must be a subset of the set of phases specified for the primary application.

    When starting prim_app as defined above, the application controller calls the following callback functions before application:start(prim_app) returns a -value:

    application:start(prim_app)
    - => prim_app_cb:start(normal, [])
    - => prim_app_cb:start_phase(init, normal, [])
    - => prim_app_cb:start_phase(go, normal, [])
    - => incl_app_cb:start_phase(go, normal, [])
    +value:

    application:start(prim_app)
    + => prim_app_cb:start(normal, [])
    + => prim_app_cb:start_phase(init, normal, [])
    + => prim_app_cb:start_phase(go, normal, [])
    + => incl_app_cb:start_phase(go, normal, [])
     ok

    diff --git a/prs/9277/doc/system/install-win32.html b/prs/9277/doc/system/install-win32.html index 69784041d3ab9..28bfc233d8a63 100644 --- a/prs/9277/doc/system/install-win32.html +++ b/prs/9277/doc/system/install-win32.html @@ -299,7 +299,7 @@

    and sometimes

    $ cd $ERL_TOP
     $ make local_setup
     

    So now when you run $ERL_TOP/erl.exe, you should have a debug compiled -emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you +emulator, which you will see if you do a:

    1> erlang:system_info(system_version).

    in the erlang shell. If the returned string contains [debug], you got a debug compiled emulator.

    To hack the erlang libraries, you simply do a make opt in the specific "applications" directory, like:

    $ cd $ERL_TOP/lib/stdlib
     $ make opt
    @@ -322,11 +322,11 @@ 

    Remember that:

    • Windows specific C-code goes in the $ERL_TOP/erts/emulator/sys/win32, $ERL_TOP/erts/emulator/drivers/win32 or $ERL_TOP/erts/etc/win32.

    • Windows specific erlang code should be used conditionally and the host OS tested in runtime, the exactly same beam files should be -distributed for every platform! So write code like:

      case os:type() of
      -    {win32,_} ->
      -        do_windows_specific();
      +distributed for every platform! So write code like:

      case os:type() of
      +    {win32,_} ->
      +        do_windows_specific();
           Other ->
      -        do_fallback_or_exit()
      +        do_fallback_or_exit()
       end,

    That's basically all you need to get going.

    diff --git a/prs/9277/doc/system/list_comprehensions.html b/prs/9277/doc/system/list_comprehensions.html index 2673d49f14b21..473cf9738222f 100644 --- a/prs/9277/doc/system/list_comprehensions.html +++ b/prs/9277/doc/system/list_comprehensions.html @@ -121,25 +121,25 @@

    Simple Examples

    -

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    -[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list +

    This section starts with a simple example, showing a generator and a filter:

    > [X || X <- [1,2,a,3,4,b,5,6], X > 3].
    +[a,4,b,5,6]

    This is read as follows: The list of X such that X is taken from the list [1,2,a,...] and X is greater than 3.

    The notation X <- [1,2,a,...] is a generator and the expression X > 3 is a filter.

    An additional filter, is_integer(X), can be added to -restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    -[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can -be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    -[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    +restrict the result to integers:

    > [X || X <- [1,2,a,3,4,b,5,6], is_integer(X), X > 3].
    +[4,5,6]

    Generators can be combined. For example, the Cartesian product of two lists can +be written as follows:

    > [{X, Y} || X <- [1,2,3], Y <- [a,b]].
    +[{1,a},{1,b},{2,a},{2,b},{3,a},{3,b}]

    Quick Sort

    -

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    -sort([_] = L) -> L;
    -sort([Pivot|T]) ->
    -    sort([ X || X <- T, X < Pivot]) ++
    -    [Pivot] ++
    -    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T +

    The well-known quick sort routine can be written as follows:

    sort([]) -> [];
    +sort([_] = L) -> L;
    +sort([Pivot|T]) ->
    +    sort([ X || X <- T, X < Pivot]) ++
    +    [Pivot] ++
    +    sort([ X || X <- T, X >= Pivot]).

    The expression [X || X <- T, X < Pivot] is the list of all elements in T that are less than Pivot.

    [X || X <- T, X >= Pivot] is the list of all elements in T that are greater than or equal to Pivot.

    With the algorithm above, a list is sorted as follows:

    • A list with zero or one element is trivially sorted.
    • For lists with more than one element:
      1. The first element in the list is isolated as the pivot element.
      2. The remaining list is partitioned into two sublists, such that:
      • The first sublist contains all elements that are smaller than the pivot element.
      • The second sublist contains all elements that are greater than or equal to @@ -155,11 +155,11 @@

        Permutations

        -

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        -perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists +

        The following example generates all permutations of the elements in a list:

        perms([]) -> [[]];
        +perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

        This takes H from L in all possible ways. The result is the set of all lists [H|T], where T is the set of all possible permutations of L, with H -removed:

        > perms([b,u,g]).
        -[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        +removed:

        > perms([b,u,g]).
        +[[b,u,g],[b,g,u],[u,b,g],[u,g,b],[g,b,u],[g,u,b]]

        @@ -168,47 +168,47 @@

        Pythagorean triplets are sets of integers {A,B,C} such that A**2 + B**2 = C**2.

        The function pyth(N) generates a list of all integers {A,B,C} such that A**2 + B**2 = C**2 and where the sum of the sides is equal to, or less than, -N:

        pyth(N) ->
        -    [ {A,B,C} ||
        -        A <- lists:seq(1,N),
        -        B <- lists:seq(1,N),
        -        C <- lists:seq(1,N),
        +N:

        pyth(N) ->
        +    [ {A,B,C} ||
        +        A <- lists:seq(1,N),
        +        B <- lists:seq(1,N),
        +        C <- lists:seq(1,N),
                 A+B+C =< N,
                 A*A+B*B == C*C
        -    ].
        > pyth(3).
        -[].
        -> pyth(11).
        -[].
        -> pyth(12).
        -[{3,4,5},{4,3,5}]
        -> pyth(50).
        -[{3,4,5},
        - {4,3,5},
        - {5,12,13},
        - {6,8,10},
        - {8,6,10},
        - {8,15,17},
        - {9,12,15},
        - {12,5,13},
        - {12,9,15},
        - {12,16,20},
        - {15,8,17},
        - {16,12,20}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        -   [{A,B,C} ||
        -       A <- lists:seq(1,N-2),
        -       B <- lists:seq(A+1,N-1),
        -       C <- lists:seq(B+1,N),
        +    ].
        > pyth(3).
        +[].
        +> pyth(11).
        +[].
        +> pyth(12).
        +[{3,4,5},{4,3,5}]
        +> pyth(50).
        +[{3,4,5},
        + {4,3,5},
        + {5,12,13},
        + {6,8,10},
        + {8,6,10},
        + {8,15,17},
        + {9,12,15},
        + {12,5,13},
        + {12,9,15},
        + {12,16,20},
        + {15,8,17},
        + {16,12,20}]

        The following code reduces the search space and is more efficient:

        pyth1(N) ->
        +   [{A,B,C} ||
        +       A <- lists:seq(1,N-2),
        +       B <- lists:seq(A+1,N-1),
        +       C <- lists:seq(B+1,N),
                A+B+C =< N,
        -       A*A+B*B == C*C ].

        + A*A+B*B == C*C ].

        Simplifications With List Comprehensions

        As an example, list comprehensions can be used to simplify some of the functions -in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        -map(Fun, L) -> [Fun(X) || X <- L].
        -filter(Pred, L) -> [X || X <- L, Pred(X)].

        +in lists.erl:

        append(L)   ->  [X || L1 <- L, X <- L1].
        +map(Fun, L) -> [Fun(X) || X <- L].
        +filter(Pred, L) -> [X || X <- L, Pred(X)].

        @@ -220,20 +220,20 @@

        which selects certain elements from a list of tuples. Suppose you write select(X, L) -> [Y || {X, Y} <- L]. with the intention of extracting all tuples from L, where the first item is X.

        Compiling this gives the following diagnostic:

        ./FileName.erl:Line: Warning: variable 'X' shadowed in generate

        This diagnostic warns that the variable X in the pattern is not the same as -the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be -written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into -the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        -[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the -same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        -[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is +the variable X that occurs in the function head.

        Evaluating select gives the following result:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[1,2,3,7]

        This is not the wanted result. To achieve the desired effect, select must be +written as follows:

        select(X, L) ->  [Y || {X1, Y} <- L, X == X1].

        The generator now contains unbound variables and the test has been moved into +the filter.

        This now works as expected:

        > select(b,[{a,1},{b,2},{c,3},{b,7}]).
        +[2,7]

        Also note that a variable in a generator pattern will shadow a variable with the +same name bound in a previous generator pattern. For example:

        > [{X,Y} || X <- [1,2,3], X=Y <- [a,b,c]].
        +[{a,a},{b,b},{c,c},{a,a},{b,b},{c,c},{a,a},{b,b},{c,c}]

        A consequence of the rules for importing variables into a list comprehensions is that certain pattern matching operations must be moved into the filters and -cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
        +cannot be written directly in the generators.

        To illustrate this, do not write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y  <- Expr, ...]
        -    ...

        Instead, write as follows:

        f(...) ->
        +    [ Expression || PatternInvolving Y  <- Expr, ...]
        +    ...

        Instead, write as follows:

        f(...) ->
             Y = ...
        -    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
        +    [ Expression || PatternInvolving Y1  <- Expr, Y == Y1, ...]
             ...
        diff --git a/prs/9277/doc/system/listhandling.html b/prs/9277/doc/system/listhandling.html index a8bbde90add83..b74de9294537c 100644 --- a/prs/9277/doc/system/listhandling.html +++ b/prs/9277/doc/system/listhandling.html @@ -124,47 +124,47 @@

        Lists can only be built starting from the end and attaching list elements at the beginning. If you use the ++ operator as follows, a new list is created that is a copy of the elements in List1, followed by List2:

        List1 ++ List2

        Looking at how lists:append/2 or ++ would be implemented in plain Erlang, -clearly the first list is copied:

        append([H|T], Tail) ->
        -    [H|append(T, Tail)];
        -append([], Tail) ->
        +clearly the first list is copied:

        append([H|T], Tail) ->
        +    [H|append(T, Tail)];
        +append([], Tail) ->
             Tail.

        When recursing and building a list, it is important to ensure that you attach the new elements to the beginning of the list. In this way, you will build one -list, not hundreds or thousands of copies of the growing result list.

        Let us first see how it is not to be done:

        DO NOT

        bad_fib(N) ->
        -    bad_fib(N, 0, 1, []).
        +list, not hundreds or thousands of copies of the growing result list.

        Let us first see how it is not to be done:

        DO NOT

        bad_fib(N) ->
        +    bad_fib(N, 0, 1, []).
         
        -bad_fib(0, _Current, _Next, Fibs) ->
        +bad_fib(0, _Current, _Next, Fibs) ->
             Fibs;
        -bad_fib(N, Current, Next, Fibs) ->
        -    bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

        Here more than one list is built. In each iteration step a new list is created +bad_fib(N, Current, Next, Fibs) -> + bad_fib(N - 1, Next, Current + Next, Fibs ++ [Current]).

        Here more than one list is built. In each iteration step a new list is created that is one element longer than the new previous list.

        To avoid copying the result in each iteration, build the list in reverse order -and reverse the list when you are done:

        DO

        tail_recursive_fib(N) ->
        -    tail_recursive_fib(N, 0, 1, []).
        +and reverse the list when you are done:

        DO

        tail_recursive_fib(N) ->
        +    tail_recursive_fib(N, 0, 1, []).
         
        -tail_recursive_fib(0, _Current, _Next, Fibs) ->
        -    lists:reverse(Fibs);
        -tail_recursive_fib(N, Current, Next, Fibs) ->
        -    tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

        +tail_recursive_fib(0, _Current, _Next, Fibs) -> + lists:reverse(Fibs); +tail_recursive_fib(N, Current, Next, Fibs) -> + tail_recursive_fib(N - 1, Next, Current + Next, [Current|Fibs]).

        List Comprehensions

        -

        A list comprehension:

        [Expr(E) || E <- List]

        is basically translated to a local function:

        'lc^0'([E|Tail], Expr) ->
        -    [Expr(E)|'lc^0'(Tail, Expr)];
        -'lc^0'([], _Expr) -> [].

        If the result of the list comprehension will obviously not be used, a list -will not be constructed. For example, in this code:

        [io:put_chars(E) || E <- List],
        +

        A list comprehension:

        [Expr(E) || E <- List]

        is basically translated to a local function:

        'lc^0'([E|Tail], Expr) ->
        +    [Expr(E)|'lc^0'(Tail, Expr)];
        +'lc^0'([], _Expr) -> [].

        If the result of the list comprehension will obviously not be used, a list +will not be constructed. For example, in this code:

        [io:put_chars(E) || E <- List],
         ok.

        or in this code:

        case Var of
             ... ->
        -        [io:put_chars(E) || E <- List];
        +        [io:put_chars(E) || E <- List];
             ... ->
         end,
        -some_function(...),

        the value is not assigned to a variable, not passed to another function, and not +some_function(...),

        the value is not assigned to a variable, not passed to another function, and not returned. This means that there is no need to construct a list and the compiler -will simplify the code for the list comprehension to:

        'lc^0'([E|Tail], Expr) ->
        -    Expr(E),
        -    'lc^0'(Tail, Expr);
        -'lc^0'([], _Expr) -> [].

        The compiler also understands that assigning to _ means that the value will -not be used. Therefore, the code in the following example will also be optimized:

        _ = [io:put_chars(E) || E <- List],
        +will simplify the code for the list comprehension to:

        'lc^0'([E|Tail], Expr) ->
        +    Expr(E),
        +    'lc^0'(Tail, Expr);
        +'lc^0'([], _Expr) -> [].

        The compiler also understands that assigning to _ means that the value will +not be used. Therefore, the code in the following example will also be optimized:

        _ = [io:put_chars(E) || E <- List],
         ok.

        @@ -177,11 +177,11 @@

        to flatten the list before sending it to the port.

      • When calling BIFs that accept deep lists, such as list_to_binary/1 or iolist_to_binary/1.
      • When you know that your list is only one level deep. Use lists:append/1 -instead.

      Examples:

      DO

      port_command(Port, DeepList)

      DO NOT

      port_command(Port, lists:flatten(DeepList))

      A common way to send a zero-terminated string to a port is the following:

      DO NOT

      TerminatedStr = String ++ [0],
      -port_command(Port, TerminatedStr)

      Instead:

      DO

      TerminatedStr = [String, 0],
      -port_command(Port, TerminatedStr)

      DO

      1> lists:append([[1], [2], [3]]).
      -[1,2,3]

      DO NOT

      1> lists:flatten([[1], [2], [3]]).
      -[1,2,3]

      +instead.

    Examples:

    DO

    port_command(Port, DeepList)

    DO NOT

    port_command(Port, lists:flatten(DeepList))

    A common way to send a zero-terminated string to a port is the following:

    DO NOT

    TerminatedStr = String ++ [0],
    +port_command(Port, TerminatedStr)

    Instead:

    DO

    TerminatedStr = [String, 0],
    +port_command(Port, TerminatedStr)

    DO

    1> lists:append([[1], [2], [3]]).
    +[1,2,3]

    DO NOT

    1> lists:flatten([[1], [2], [3]]).
    +[1,2,3]

    @@ -189,17 +189,17 @@

    There are two basic ways to write a function that traverses a list and produces a new list.

    The first way is writing a body-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_body([H|T]) ->
    -    [H + 42 | add_42_body(T)];
    -add_42_body([]) ->
    -    [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    -add_42_tail(List) ->
    -    add_42_tail(List, []).
    -
    -add_42_tail([H|T], Acc) ->
    -    add_42_tail(T, [H + 42 | Acc]);
    -add_42_tail([], Acc) ->
    -    lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically +add_42_body([H|T]) -> + [H + 42 | add_42_body(T)]; +add_42_body([]) -> + [].

    The second way is writing a tail-recursive function:

    %% Add 42 to each integer in the list.
    +add_42_tail(List) ->
    +    add_42_tail(List, []).
    +
    +add_42_tail([H|T], Acc) ->
    +    add_42_tail(T, [H + 42 | Acc]);
    +add_42_tail([], Acc) ->
    +    lists:reverse(Acc).

    In early version of Erlang the tail-recursive function would typically be more efficient. In modern versions of Erlang, there is usually not much difference in performance between a body-recursive list function and tail-recursive function that reverses the list at the end. Therefore, @@ -210,11 +210,11 @@

    function that does not construct a list runs in constant space, while the corresponding body-recursive function uses stack space proportional to the length of the list.

    For example, a function that sums a list of integers, is not to be written as -follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    -recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
    +follows:

    DO NOT

    recursive_sum([H|T]) -> H+recursive_sum(T);
    +recursive_sum([])    -> 0.

    Instead:

    DO

    sum(L) -> sum(L, 0).
     
    -sum([H|T], Sum) -> sum(T, Sum + H);
    -sum([], Sum)    -> Sum.
    +
    sum([H|T], Sum) -> sum(T, Sum + H); +sum([], Sum) -> Sum.
    diff --git a/prs/9277/doc/system/macros.html b/prs/9277/doc/system/macros.html index 1ab4125b8d9b4..010cb0666f37e 100644 --- a/prs/9277/doc/system/macros.html +++ b/prs/9277/doc/system/macros.html @@ -121,8 +121,8 @@

    File Inclusion

    -

    A file can be included as follows:

    -include(File).
    --include_lib(File).

    File, a string, is to point out a file. The contents of this file are included +

    A file can be included as follows:

    -include(File).
    +-include_lib(File).

    File, a string, is to point out a file. The contents of this file are included as is, at the position of the directive.

    Include files are typically used for record and macro definitions that are shared by several modules. It is recommended to use the file name extension .hrl for include files.

    File can start with a path component $VAR, for some string VAR. If that is @@ -131,12 +131,12 @@

    $VAR is left as is.

    If the filename File is absolute (possibly after variable substitution), the include file with that name is included. Otherwise, the specified file is searched for in the following directories, and in this order:

    1. The current working directory
    2. The directory where the module is being compiled
    3. The directories given by the include option

    For details, see erlc in ERTS and -compile in Compiler.

    Examples:

    -include("my_records.hrl").
    --include("incdir/my_records.hrl").
    --include("/home/user/proj/my_records.hrl").
    --include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. +compile in Compiler.

    Examples:

    -include("my_records.hrl").
    +-include("incdir/my_records.hrl").
    +-include("/home/user/proj/my_records.hrl").
    +-include("$PROJ_ROOT/my_records.hrl").

    include_lib is similar to include, but is not to point out an absolute file. Instead, the first path component (possibly after variable substitution) is -assumed to be the name of an application.

    Example:

    -include_lib("kernel/include/file.hrl").

    The code server uses code:lib_dir(kernel) to find the directory of the current +assumed to be the name of an application.

    Example:

    -include_lib("kernel/include/file.hrl").

    The code server uses code:lib_dir(kernel) to find the directory of the current (latest) version of Kernel, and then the subdirectory include is searched for the file file.hrl.

    @@ -144,25 +144,25 @@

    Defining and Using Macros

    -

    A macro is defined as follows:

    -define(Const, Replacement).
    --define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function +

    A macro is defined as follows:

    -define(Const, Replacement).
    +-define(Func(Var1,...,VarN), Replacement).

    A macro definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the macro.

    If a macro is used in several modules, it is recommended that the macro definition is placed in an include file.

    A macro is used as follows:

    ?Const
     ?Func(Arg1,...,ArgN)

    Macros are expanded during compilation. A simple macro ?Const is replaced with -Replacement.

    Example:

    -define(TIMEOUT, 200).
    +Replacement.

    Example:

    -define(TIMEOUT, 200).
     ...
    -call(Request) ->
    -    server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    -    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all +call(Request) -> + server:call(refserver, Request, ?TIMEOUT).

    This is expanded to:

    call(Request) ->
    +    server:call(refserver, Request, 200).

    A macro ?Func(Arg1,...,ArgN) is replaced with Replacement, where all occurrences of a variable Var from the macro definition are replaced with the -corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
    +corresponding argument Arg.

    Example:

    -define(MACRO1(X, Y), {a, X, b, Y}).
     ...
    -bar(X) ->
    -    ?MACRO1(a, b),
    -    ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    -    {a,a,b,b},
    -    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro +bar(X) -> + ?MACRO1(a, b), + ?MACRO1(X, 123)

    This is expanded to:

    bar(X) ->
    +    {a,a,b,b},
    +    {a,X,b,123}.

    It is good programming practice, but not mandatory, to ensure that a macro definition is a valid Erlang syntactic form.

    To view the result of macro expansion, a module can be compiled with the 'P' option. compile:file(File, ['P']). This produces a listing of the parsed code after preprocessing and parse transforms, in the file File.P.

    @@ -189,21 +189,21 @@

    It is possible to overload macros, except for predefined macros. An overloaded macro has more than one definition, each with a different number of arguments.

    Change

    Support for overloading of macros was added in Erlang 5.7.5/OTP R13B04.

    A macro ?Func(Arg1,...,ArgN) with a (possibly empty) list of arguments results in an error message if there is at least one definition of Func with -arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    --define(F1(A), A).
    --define(C, m:f).

    the following does not work:

    f0() ->
    +arguments, but none with N arguments.

    Assuming these definitions:

    -define(F0(), c).
    +-define(F1(A), A).
    +-define(C, m:f).

    the following does not work:

    f0() ->
         ?F0. % No, an empty list of arguments expected.
     
    -f1(A) ->
    -    ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    -    ?C().

    is expanded to

    f() ->
    -    m:f().

    +f1(A) -> + ?F1(A, A). % No, exactly one argument expected.

    On the other hand,

    f() ->
    +    ?C().

    is expanded to

    f() ->
    +    m:f().

    Removing a macro definition

    -

    A definition of macro can be removed as follows:

    -undef(Macro).

    +

    A definition of macro can be removed as follows:

    -undef(Macro).

    @@ -223,13 +223,13 @@

    elif also supports calling the psuedo-function defined(Name), which tests whether the Name argument is the name of a previously defined macro. defined(Name) evaluates to true if the macro is defined and false -otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
    +otherwise. An attempt to call other functions results in a compilation error.

    Example:

    -module(m).
     ...
     
    --ifdef(debug).
    --define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
    +-ifdef(debug).
    +-define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
     -else.
    --define(LOG(X), true).
    +-define(LOG(X), true).
     -endif.
     
     ...

    When trace output is desired, debug is to be defined when the module m is @@ -237,21 +237,21 @@

    or -1> c(m, {d, debug}). -{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user -with some simple trace output.

    Example:

    -module(m)
    +1> c(m, {d, debug}).
    +{ok,m}

    ?LOG(Arg) is then expanded to a call to io:format/2 and provide the user +with some simple trace output.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 25).
    +-if(?OTP_RELEASE >= 25).
     %% Code that will work in OTP 25 or higher
    --elif(?OTP_RELEASE >= 26).
    +-elif(?OTP_RELEASE >= 26).
     %% Code that will work in OTP 26 or higher
     -else.
     %% Code that will work in OTP 24 or lower.
     -endif.
     ...

    This code uses the OTP_RELEASE macro to conditionally select code depending on -release.

    Example:

    -module(m)
    +release.

    Example:

    -module(m)
     ...
    --if(?OTP_RELEASE >= 26 andalso defined(debug)).
    +-if(?OTP_RELEASE >= 26 andalso defined(debug)).
     %% Debugging code that requires OTP 26 or later.
     -else.
     %% Non-debug code that works in any release.
    @@ -274,23 +274,23 @@ 

    -error() and -warning() directives

    -

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    --export([version/0]).
    +

    The directive -error(Term) causes a compilation error.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifdef(VERSION).
    -version() -> ?VERSION.
    +-ifdef(VERSION).
    +version() -> ?VERSION.
     -else.
    --error("Macro VERSION must be defined.").
    -version() -> "".
    +-error("Macro VERSION must be defined.").
    +version() -> "".
     -endif.

    The error message will look like this:

    % erlc t.erl
    -t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    --export([version/0]).
    +t.erl:7: -error("Macro VERSION must be defined.").

    The directive -warning(Term) causes a compilation warning.

    Example:

    -module(t).
    +-export([version/0]).
     
    --ifndef(VERSION).
    --warning("Macro VERSION not defined -- using default version.").
    --define(VERSION, "0").
    +-ifndef(VERSION).
    +-warning("Macro VERSION not defined -- using default version.").
    +-define(VERSION, "0").
     -endif.
    -version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
    +version() -> ?VERSION.

    The warning message will look like this:

    % erlc t.erl
     t.erl:5: Warning: -warning("Macro VERSION not defined -- using default version.").

    Change

    The -error() and -warning() directives were added in Erlang/OTP 19.

    @@ -299,11 +299,11 @@

    The construction ??Arg, where Arg is a macro argument, is expanded to a string containing the tokens of the argument. This is similar to the #arg -stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
    +stringifying construction in C.

    Example:

    -define(TESTCALL(Call), io:format("Call ~s: ~w~n", [??Call, Call])).
     
    -?TESTCALL(myfunction(1,2)),
    -?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    -io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    +
    ?TESTCALL(myfunction(1,2)), +?TESTCALL(you:function(2,1)).

    results in

    io:format("Call ~s: ~w~n",["myfunction ( 1 , 2 )",myfunction(1,2)]),
    +io:format("Call ~s: ~w~n",["you : function ( 2 , 1 )",you:function(2,1)]).

    That is, a trace output, with both the function called and the resulting value.

    diff --git a/prs/9277/doc/system/maps.html b/prs/9277/doc/system/maps.html index a1f85fdaf1f5f..0ad44a821f4ca 100644 --- a/prs/9277/doc/system/maps.html +++ b/prs/9277/doc/system/maps.html @@ -152,8 +152,8 @@

    values, sharing of keys between different instances of the map will be less effective, and it is not possible to match multiple elements having default values in one go.

  • To avoid having to deal with a map that may lack some keys, maps:merge/2 can -efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)
  • +efficiently add multiple default values. For example:

    DefaultMap = #{shoe_size => 42, editor => emacs},
    +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

    @@ -171,10 +171,10 @@

    Using Maps as Sets

    Starting in OTP 24, the sets module has an option to represent sets as maps. -Examples:

    1> sets:new([{version,2}]).
    -#{}
    -2> sets:from_list([x,y,z], [{version,2}]).
    -#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a +Examples:

    1> sets:new([{version,2}]).
    +#{}
    +2> sets:from_list([x,y,z], [{version,2}]).
    +#{x => [],y => [],z => []}

    sets backed by maps is generally the most efficient set representation, with a few possible exceptions:

    • ordsets:intersection/2 can be more efficient than sets:intersection/2. If the intersection operation is frequently used and operations that operate on a single element in a set (such as is_element/2) are avoided, ordsets can @@ -207,10 +207,10 @@

      allowing the key tuple to be shared with other instances of the map that have the same keys. In fact, the key tuple can be shared between all maps with the same keys with some care. To arrange that, define a function that returns a map. -For example:

      new() ->
      -    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure +For example:

      new() ->
      +    #{a => default, b => default, c => default}.

      Defined like this, the key tuple {a,b,c} will be a global literal. To ensure that the key tuple is shared when creating an instance of the map, always call -new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the +new() and modify the returned map:

          (SOME_MODULE:new())#{a := 42}.

      Using the map syntax with small maps is particularly efficient. As long as the keys are known at compile-time, the map is updated in one go, making the time to update a map essentially constant regardless of the number of keys updated. The same goes for matching. (When the keys are variables, one or more of the keys @@ -245,13 +245,13 @@

      Using the map syntax is usually slightly more efficient than using the corresponding function in the maps module.

      The gain in efficiency for the map syntax is more noticeable for the following -operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#{x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      -Map3 = maps:update(y, Y, Map2),
      -Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to -right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from -left to right:

      Map2 = Map1#{Key1 := X},
      -Map3 = Map2#{Key2 := Y},
      -Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more +operations that can only be achieved using the map syntax:

      • Matching multiple literal keys
      • Updating multiple literal keys
      • Adding multiple literal keys to a map

      For example:

      DO

      Map = Map1#{x := X, y := Y, z := Z}

      DO NOT

      Map2 = maps:update(x, X, Map1),
      +Map3 = maps:update(y, Y, Map2),
      +Map = maps:update(z, Z, Map3)

      If the map is a small map, the first example runs roughly three times as fast.

      Note that for variable keys, the elements are updated sequentially from left to +right. For example, given the following update with variable keys:

      Map = Map1#{Key1 := X, Key2 := Y, Key3 := Z}

      the compiler rewrites it like this to ensure that the updates are applied from +left to right:

      Map2 = Map1#{Key1 := X},
      +Map3 = Map2#{Key2 := Y},
      +Map = Map3#{Key3 := Z}

      If a key is known to exist in a map, using the := operator is slightly more efficient than using the => operator for a small map.

      @@ -310,15 +310,15 @@

      As an optimization, the compiler will rewrite a call to maps:get/3 to Erlang code similar to the following:

      Result = case Map of
      -             #{Key := Value} -> Value;
      -             #{} -> Default
      +             #{Key := Value} -> Value;
      +             #{} -> Default
                end

      This is reasonably efficient, but if a small map is used as an alternative to using a record it is often better not to rely on default values as it prevents sharing of keys, which may in the end use more memory than what you save from not storing default values in the map.

      If default values are nevertheless required, instead of calling maps:get/3 multiple times, consider putting the default values in a map and merging that -map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      -MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults +map with the other map:

      DefaultMap = #{Key1 => Value2, Key2 => Value2, ..., KeyN => ValueN},
      +MapWithDefaultsApplied = maps:merge(DefaultMap, OtherMap)

      This helps share keys between the default map and the one you applied defaults to, as long as the default map contains all the keys that will ever be used and not just the ones with default values. Whether this is faster than calling maps:get/3 multiple times depends on the size of the map and the number of diff --git a/prs/9277/doc/system/modules.html b/prs/9277/doc/system/modules.html index dca3f777291aa..212e188a213f0 100644 --- a/prs/9277/doc/system/modules.html +++ b/prs/9277/doc/system/modules.html @@ -122,12 +122,12 @@

      Module Syntax

      Erlang code is divided into modules. A module consists of a sequence of -attributes and function declarations, each terminated by a period (.).

      Example:

      -module(m).          % module attribute
      --export([fact/1]).   % module attribute
      +attributes and function declarations, each terminated by a period (.).

      Example:

      -module(m).          % module attribute
      +-export([fact/1]).   % module attribute
       
      -fact(N) when N>0 ->  % beginning of function declaration
      -    N * fact(N-1);   %  |
      -fact(0) ->           %  |
      +fact(N) when N>0 ->  % beginning of function declaration
      +    N * fact(N-1);   %  |
      +fact(0) ->           %  |
           1.               % end of function declaration

      For a description of function declarations, see Function Declaration Syntax.

      @@ -180,9 +180,9 @@

      Behaviour Module Attribute

      It is possible to specify that the module is the callback module for a -behaviour:

      -behaviour(Behaviour).

      The atom Behaviour gives the name of the behaviour, which can be a +behaviour:

      -behaviour(Behaviour).

      The atom Behaviour gives the name of the behaviour, which can be a user-defined behaviour or one of the following OTP standard behaviours:

      • gen_server
      • gen_statem
      • gen_event
      • supervisor

      The spelling behavior is also accepted.

      The callback functions of the module can be specified either directly by the -exported function behaviour_info/1:

      behaviour_info(callbacks) -> Callbacks.

      or by a -callback attribute for each callback function:

      -callback Name(Arguments) -> Result.

      Here, Arguments is a list of zero or more arguments. The -callback attribute +exported function behaviour_info/1:

      behaviour_info(callbacks) -> Callbacks.

      or by a -callback attribute for each callback function:

      -callback Name(Arguments) -> Result.

      Here, Arguments is a list of zero or more arguments. The -callback attribute is to be preferred since the extra type information can be used by tools to produce documentation or find discrepancies.

      Read more about behaviours and callback modules in OTP Design Principles.

      @@ -191,7 +191,7 @@

      Record Definitions

      -

      The same syntax as for module attributes is used for record definitions:

      -record(Record, Fields).

      Record definitions are allowed anywhere in a module, also among the function +

      The same syntax as for module attributes is used for record definitions:

      -record(Record, Fields).

      Record definitions are allowed anywhere in a module, also among the function declarations. Read more in Records.

      @@ -199,15 +199,15 @@

      Preprocessor

      The same syntax as for module attributes is used by the preprocessor, which -supports file inclusion, macros, and conditional compilation:

      -include("SomeFile.hrl").
      --define(Macro, Replacement).

      Read more in Preprocessor.

      +supports file inclusion, macros, and conditional compilation:

      -include("SomeFile.hrl").
      +-define(Macro, Replacement).

      Read more in Preprocessor.

      Setting File and Line

      The same syntax as for module attributes is used for changing the pre-defined -macros ?FILE and ?LINE:

      -file(File, Line).

      This attribute is used by tools, such as Yecc, to inform the compiler that the +macros ?FILE and ?LINE:

      -file(File, Line).

      This attribute is used by tools, such as Yecc, to inform the compiler that the source program is generated by another tool. It also indicates the correspondence of source files to lines of the original user-written file, from which the source program is produced.

      @@ -217,8 +217,8 @@

      Types and function specifications

      A similar syntax as for module attributes is used for specifying types and -function specifications:

      -type my_type() :: atom() | integer().
      --spec my_function(integer()) -> integer().

      Read more in Types and Function specifications.

      The description is based on +function specifications:

      -type my_type() :: atom() | integer().
      +-spec my_function(integer()) -> integer().

      Read more in Types and Function specifications.

      The description is based on EEP8 - Types and function specifications, which is not to be further updated.

      @@ -227,16 +227,16 @@

      Documentation attributes

      The module attribute -doc(Documentation) is used to provide user documentation -for a function/type/callback:

      -doc("Example documentation").
      -example() -> ok.

      The attribute should be placed just before the entity it documents.The +for a function/type/callback:

      -doc("Example documentation").
      +example() -> ok.

      The attribute should be placed just before the entity it documents.The parenthesis are optional around Documentation. The allowed values for Documentation are:

      • literal string or utf-8 encoded binary string - The string documenting the entity. Any literal string is allowed, so both triple quoted strings and sigils that translate to literal strings can be used. -The following examples are equivalent:

        -doc("Example \"docs\"").
        --doc(<<"Example \"docs\""/utf8>>).
        +The following examples are equivalent:

        -doc("Example \"docs\"").
        +-doc(<<"Example \"docs\""/utf8>>).
         -doc ~S/Example "docs"/.
         -doc """
            Example "docs"
        @@ -257,7 +257,7 @@ 

        While not a module attribute, but rather a directive (since it might affect syntax), there is the -feature(..) directive used for enabling and disabling -features.

        The syntax is similar to that of an attribute, but has two arguments:

        -feature(FeatureName, enable | disable).

        Note that the feature directive can only appear +features.

        The syntax is similar to that of an attribute, but has two arguments:

        -feature(FeatureName, enable | disable).

        Note that the feature directive can only appear in a prefix of the module.

        diff --git a/prs/9277/doc/system/nif.html b/prs/9277/doc/system/nif.html index 1508eb85de6a7..72ae51412acb4 100644 --- a/prs/9277/doc/system/nif.html +++ b/prs/9277/doc/system/nif.html @@ -137,18 +137,18 @@

        they can also be used as fallback implementations for functions that do not have native implementations on some architectures.

        NIF libraries are loaded by calling erlang:load_nif/2, with the name of the shared library as argument. The second argument can be any term that will be -passed on to the library and used for initialization:

        -module(complex6).
        --export([foo/1, bar/1]).
        --nifs([foo/1, bar/1]).
        --on_load(init/0).
        -
        -init() ->
        -    ok = erlang:load_nif("./complex6_nif", 0).
        -
        -foo(_X) ->
        -    erlang:nif_error(nif_library_not_loaded).
        -bar(_Y) ->
        -    erlang:nif_error(nif_library_not_loaded).

        Here, the directive on_load is used to get function init to be automatically +passed on to the library and used for initialization:

        -module(complex6).
        +-export([foo/1, bar/1]).
        +-nifs([foo/1, bar/1]).
        +-on_load(init/0).
        +
        +init() ->
        +    ok = erlang:load_nif("./complex6_nif", 0).
        +
        +foo(_X) ->
        +    erlang:nif_error(nif_library_not_loaded).
        +bar(_Y) ->
        +    erlang:nif_error(nif_library_not_loaded).

        Here, the directive on_load is used to get function init to be automatically called when the module is loaded. If init returns anything other than ok, such when the loading of the NIF library fails in this example, the module is unloaded and calls to functions within it, fail.

        Loading the NIF library overrides the stub implementations and cause calls to @@ -169,35 +169,35 @@

        API functions. The environment contains information about the calling Erlang process:

        #include <erl_nif.h>
         
        -extern int foo(int x);
        -extern int bar(int y);
        +extern int foo(int x);
        +extern int bar(int y);
         
        -static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        -{
        +static ERL_NIF_TERM foo_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        +{
             int x, ret;
        -    if (!enif_get_int(env, argv[0], &x)) {
        -	return enif_make_badarg(env);
        -    }
        -    ret = foo(x);
        -    return enif_make_int(env, ret);
        -}
        -
        -static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        -{
        +    if (!enif_get_int(env, argv[0], &x)) {
        +	return enif_make_badarg(env);
        +    }
        +    ret = foo(x);
        +    return enif_make_int(env, ret);
        +}
        +
        +static ERL_NIF_TERM bar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
        +{
             int y, ret;
        -    if (!enif_get_int(env, argv[0], &y)) {
        -	return enif_make_badarg(env);
        -    }
        -    ret = bar(y);
        -    return enif_make_int(env, ret);
        -}
        -
        -static ErlNifFunc nif_funcs[] = {
        -    {"foo", 1, foo_nif},
        -    {"bar", 1, bar_nif}
        -};
        -
        -ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

        Here, ERL_NIF_INIT has the following arguments:

        • The first argument must be the name of the Erlang module as a C-identifier. It + if (!enif_get_int(env, argv[0], &y)) { + return enif_make_badarg(env); + } + ret = bar(y); + return enif_make_int(env, ret); +} + +static ErlNifFunc nif_funcs[] = { + {"foo", 1, foo_nif}, + {"bar", 1, bar_nif} +}; + +ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)

        Here, ERL_NIF_INIT has the following arguments:

        • The first argument must be the name of the Erlang module as a C-identifier. It will be stringified by the macro.
        • The second argument is the array of ErlNifFunc structures containing name, arity, and function pointer of each NIF.
        • The remaining arguments are pointers to callback functions that can be used to initialize the library. They are not used in this simple example, hence they @@ -213,15 +213,15 @@

          Step 1. Compile the C code:

          unix> gcc -o complex6_nif.so -fpic -shared complex.c complex6_nif.c
           windows> cl -LD -MD -Fe complex6_nif.dll complex.c complex6_nif.c

          Step 2: Start Erlang and compile the Erlang code:

          > erl
          -Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
          +Erlang R13B04 (erts-5.7.5) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
           
          -Eshell V5.7.5  (abort with ^G)
          -1> c(complex6).
          -{ok,complex6}

          Step 3: Run the example:

          3> complex6:foo(3).
          +Eshell V5.7.5  (abort with ^G)
          +1> c(complex6).
          +{ok,complex6}

          Step 3: Run the example:

          3> complex6:foo(3).
           4
          -4> complex6:bar(5).
          +4> complex6:bar(5).
           10
          -5> complex6:foo("not an integer").
          +5> complex6:foo("not an integer").
           ** exception error: bad argument
                in function  complex6:foo/1
                   called as comlpex6:foo("not an integer")
          diff --git a/prs/9277/doc/system/opaques.html b/prs/9277/doc/system/opaques.html index d9f2b3a551650..403a44526b366 100644 --- a/prs/9277/doc/system/opaques.html +++ b/prs/9277/doc/system/opaques.html @@ -126,16 +126,16 @@

          The runtime does not check opacity. Dialyzer provides some opacity-checking, but the rest is up to convention.

          This document explains what Erlang opacity is (and the trade-offs involved) via the example of the sets:set() data type. This type was -defined in the sets module like this:

          -opaque set(Element) :: #set{segs :: segs(Element)}.

          OTP 24 changed the definition to the following in -this commit.

          -opaque set(Element) :: #set{segs :: segs(Element)} | #{Element => ?VALUE}.

          And this change was safer and more backwards-compatible than if the type had +defined in the sets module like this:

          -opaque set(Element) :: #set{segs :: segs(Element)}.

          OTP 24 changed the definition to the following in +this commit.

          -opaque set(Element) :: #set{segs :: segs(Element)} | #{Element => ?VALUE}.

          And this change was safer and more backwards-compatible than if the type had been defined with -type instead of -opaque. Here is why: when a module defines an -opaque, the contract is that only the defining module should rely on the definition of the type: no other modules should rely on the definition.

          This means that code that pattern-matched on set as a record/tuple technically broke the contract, and opted in to being potentially broken when the definition of set() changed. Before OTP 24, this code printed ok. In OTP 24 it may -error:

          case sets:new() of
          -    Set when is_tuple(Set) ->
          -        io:format("ok")
          +error:

          case sets:new() of
          +    Set when is_tuple(Set) ->
          +        io:format("ok")
           end.

          When working with an opaque defined in another module, here are some recommendations:

          • Don't examine the underlying type using pattern-matching, guards, or functions that reveal the type, such as tuple_size/1 .
          • Instead, use functions provided by the module for working with the type. For diff --git a/prs/9277/doc/system/otp-patch-apply.html b/prs/9277/doc/system/otp-patch-apply.html index 4feb9e2908e19..71b7e87af939d 100644 --- a/prs/9277/doc/system/otp-patch-apply.html +++ b/prs/9277/doc/system/otp-patch-apply.html @@ -205,7 +205,7 @@

            Application dependencies are verified among installed applications by otp_patch_apply, but these are not necessarily those actually loaded. By calling system_information:sanity_check() one can validate -dependencies among applications actually loaded.

            1> system_information:sanity_check().
            +dependencies among applications actually loaded.

            1> system_information:sanity_check().
             ok

            Please take a look at the reference of sanity_check() for more information.

    diff --git a/prs/9277/doc/system/patterns.html b/prs/9277/doc/system/patterns.html index 2bdfb56823536..1fe23b25c77c0 100644 --- a/prs/9277/doc/system/patterns.html +++ b/prs/9277/doc/system/patterns.html @@ -132,10 +132,10 @@

    2 3> X + 1. 3 -4> {X, Y} = {1, 2}. +4> {X, Y} = {1, 2}. ** exception error: no match of right hand side value {1,2} -5> {X, Y} = {2, 3}. -{2,3} +5> {X, Y} = {2, 3}. +{2,3} 6> Y. 3

    diff --git a/prs/9277/doc/system/prog_ex_records.html b/prs/9277/doc/system/prog_ex_records.html index 92c6d48f8c7fd..25c435973244a 100644 --- a/prs/9277/doc/system/prog_ex_records.html +++ b/prs/9277/doc/system/prog_ex_records.html @@ -126,17 +126,17 @@

    To illustrate these differences, suppose that you want to represent a person with the tuple {Name, Address, Phone}.

    To write functions that manipulate this data, remember the following:

    • The Name field is the first element of the tuple.
    • The Address field is the second element.
    • The Phone field is the third element.

    For example, to extract data from a variable P that contains such a tuple, you can write the following code and then use pattern matching to extract the -relevant fields:

    Name = element(1, P),
    -Address = element(2, P),
    +relevant fields:

    Name = element(1, P),
    +Address = element(2, P),
     ...

    Such code is difficult to read and understand, and errors occur if the numbering of the elements in the tuple is wrong. If the data representation of the fields is changed, by re-ordering, adding, or removing fields, all references to the person tuple must be checked and possibly modified.

    Records allow references to the fields by name, instead of by position. In the -following example, a record instead of a tuple is used to store the data:

    -record(person, {name, phone, address}).

    This enables references to the fields of the record by name. For example, if P +following example, a record instead of a tuple is used to store the data:

    -record(person, {name, phone, address}).

    This enables references to the fields of the record by name. For example, if P is a variable whose value is a person record, the following code access the name and address fields of the records:

    Name = P#person.name,
     Address = P#person.address,
    -...

    Internally, records are represented using tagged tuples:

    {person, Name, Phone, Address}

    +...

    Internally, records are represented using tagged tuples:

    {person, Name, Phone, Address}

    @@ -146,8 +146,8 @@

    section. Three fields are included, name, phone, and address. The default values for name and phone is "" and [], respectively. The default value for address is the atom undefined, since no default value is supplied for this -field:

    -record(person, {name = "", phone = [], address}).

    The record must be defined in the shell to enable use of the record syntax in -the examples:

    > rd(person, {name = "", phone = [], address}).
    +field:

    -record(person, {name = "", phone = [], address}).

    The record must be defined in the shell to enable use of the record syntax in +the examples:

    > rd(person, {name = "", phone = [], address}).
     person

    This is because record definitions are only available at compile time, not at runtime. For details on records in the shell, see the shell manual page in STDLIB.

    @@ -156,10 +156,10 @@

    Creating a Record

    -

    A new person record is created as follows:

    > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
    -#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

    As the address field was omitted, its default value is used.

    From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the -special field _. _ means "all fields not explicitly specified".

    Example:

    > #person{name = "Jakob", _ = '_'}.
    -#person{name = "Jakob",phone = '_',address = '_'}

    It is primarily intended to be used in ets:match/2 and +

    A new person record is created as follows:

    > #person{phone=[0,8,2,3,4,3,1,2], name="Robert"}.
    +#person{name = "Robert",phone = [0,8,2,3,4,3,1,2],address = undefined}

    As the address field was omitted, its default value is used.

    From Erlang 5.1/OTP R8B, a value to all fields in a record can be set with the +special field _. _ means "all fields not explicitly specified".

    Example:

    > #person{name = "Jakob", _ = '_'}.
    +#person{name = "Jakob",phone = '_',address = '_'}

    It is primarily intended to be used in ets:match/2 and mnesia:match_object/3, to set record fields to the atom '_'. (This is a wildcard in ets:match/2.)

    @@ -167,8 +167,8 @@

    Accessing a Record Field

    -

    The following example shows how to access a record field:

    > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
    -#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
    +

    The following example shows how to access a record field:

    > P = #person{name = "Joe", phone = [0,8,2,3,4,3,1,2]}.
    +#person{name = "Joe",phone = [0,8,2,3,4,3,1,2],address = undefined}
     > P#person.name.
     "Joe"

    @@ -176,33 +176,33 @@

    Updating a Record

    -

    The following example shows how to update a record:

    > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
    -#person{name = "Joe",phone = [1,2,3],address = "A street"}
    -> P2 = P1#person{name="Robert"}.
    -#person{name = "Robert",phone = [1,2,3],address = "A street"}

    +

    The following example shows how to update a record:

    > P1 = #person{name="Joe", phone=[1,2,3], address="A street"}.
    +#person{name = "Joe",phone = [1,2,3],address = "A street"}
    +> P2 = P1#person{name="Robert"}.
    +#person{name = "Robert",phone = [1,2,3],address = "A street"}

    Type Testing

    The following example shows that the guard succeeds if P is record of type -person:

    foo(P) when is_record(P, person) -> a_person;
    -foo(_) -> not_a_person.

    +person:

    foo(P) when is_record(P, person) -> a_person;
    +foo(_) -> not_a_person.

    Pattern Matching

    Matching can be used in combination with records, as shown in the following -example:

    > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
    -#person{name = "Joe",phone = [0,0,7],address = "A street"}
    -> #person{name = Name} = P3, Name.
    +example:

    > P3 = #person{name="Joe", phone=[0,0,7], address="A street"}.
    +#person{name = "Joe",phone = [0,0,7],address = "A street"}
    +> #person{name = Name} = P3, Name.
     "Joe"

    The following function takes a list of person records and searches for the -phone number of a person with a particular name:

    find_phone([#person{name=Name, phone=Phone} | _], Name) ->
    -    {found,  Phone};
    -find_phone([_| T], Name) ->
    -    find_phone(T, Name);
    -find_phone([], Name) ->
    +phone number of a person with a particular name:

    find_phone([#person{name=Name, phone=Phone} | _], Name) ->
    +    {found,  Phone};
    +find_phone([_| T], Name) ->
    +    find_phone(T, Name);
    +find_phone([], Name) ->
         not_found.

    The fields referred to in the pattern can be given in any order.

    @@ -211,12 +211,12 @@

    The value of a field in a record can be an instance of a record. Retrieval of nested data can be done stepwise, or in a single step, as shown in the following -example:

    -record(name, {first = "Robert", last = "Ericsson"}).
    --record(person, {name = #name{}, phone}).
    +example:

    -record(name, {first = "Robert", last = "Ericsson"}).
    +-record(person, {name = #name{}, phone}).
     
    -demo() ->
    -  P = #person{name= #name{first="Robert",last="Virding"}, phone=123},
    -  First = (P#person.name)#name.first.

    Here, demo() evaluates to "Robert".

    +demo() -> + P = #person{name= #name{first="Robert",last="Virding"}, phone=123}, + First = (P#person.name)#name.first.

    Here, demo() evaluates to "Robert".

    @@ -234,40 +234,40 @@

    %% about the person. %% A {Key, Value} list (default is the empty list). %%------------------------------------------------------------ --record(person, {name, age, phone = [], dict = []}).

    -module(person).
    --include("person.hrl").
    --compile(export_all). % For test purposes only.
    +-record(person, {name, age, phone = [], dict = []}).
    -module(person).
    +-include("person.hrl").
    +-compile(export_all). % For test purposes only.
     
     %% This creates an instance of a person.
     %%   Note: The phone number is not supplied so the
     %%         default value [] will be used.
     
    -make_hacker_without_phone(Name, Age) ->
    -   #person{name = Name, age = Age,
    -           dict = [{computer_knowledge, excellent},
    -                   {drinks, coke}]}.
    +make_hacker_without_phone(Name, Age) ->
    +   #person{name = Name, age = Age,
    +           dict = [{computer_knowledge, excellent},
    +                   {drinks, coke}]}.
     
     %% This demonstrates matching in arguments
     
    -print(#person{name = Name, age = Age,
    -              phone = Phone, dict = Dict}) ->
    -  io:format("Name: ~s, Age: ~w, Phone: ~w ~n"
    -            "Dictionary: ~w.~n", [Name, Age, Phone, Dict]).
    +print(#person{name = Name, age = Age,
    +              phone = Phone, dict = Dict}) ->
    +  io:format("Name: ~s, Age: ~w, Phone: ~w ~n"
    +            "Dictionary: ~w.~n", [Name, Age, Phone, Dict]).
     
     %% Demonstrates type testing, selector, updating.
     
    -birthday(P) when is_record(P, person) ->
    -   P#person{age = P#person.age + 1}.
    +birthday(P) when is_record(P, person) ->
    +   P#person{age = P#person.age + 1}.
     
    -register_two_hackers() ->
    -   Hacker1 = make_hacker_without_phone("Joe", 29),
    -   OldHacker = birthday(Hacker1),
    +register_two_hackers() ->
    +   Hacker1 = make_hacker_without_phone("Joe", 29),
    +   OldHacker = birthday(Hacker1),
        % The central_register_server should have
        % an interface function for this.
    -   central_register_server ! {register_person, Hacker1},
    -   central_register_server ! {register_person,
    -             OldHacker#person{name = "Robert",
    -                              phone = [0,8,3,2,4,5,3,1]}}.
    +
    central_register_server ! {register_person, Hacker1}, + central_register_server ! {register_person, + OldHacker#person{name = "Robert", + phone = [0,8,3,2,4,5,3,1]}}.
    diff --git a/prs/9277/doc/system/records_macros.html b/prs/9277/doc/system/records_macros.html index 8c64ef7fc2d9f..f097010170311 100644 --- a/prs/9277/doc/system/records_macros.html +++ b/prs/9277/doc/system/records_macros.html @@ -128,7 +128,7 @@

    introduced:

    %%%----FILE mess_config.hrl----
     
     %%% Configure the location of the server node,
    --define(server_node, messenger@super).
    +-define(server_node, messenger@super).
     
     %%%----END FILE----
    %%%----FILE mess_interface.hrl----
     
    @@ -136,24 +136,24 @@ 

    %%% messenger program %%%Messages from Client to server received in server/1 function. --record(logon,{client_pid, username}). --record(message,{client_pid, to_name, message}). +-record(logon,{client_pid, username}). +-record(message,{client_pid, to_name, message}). %%% {'EXIT', ClientPid, Reason} (client terminated or unreachable. %%% Messages from Server to Client, received in await_result/0 function --record(abort_client,{message}). +-record(abort_client,{message}). %%% Messages are: user_exists_at_other_node, %%% you_are_not_logged_on --record(server_reply,{message}). +-record(server_reply,{message}). %%% Messages are: logged_on %%% receiver_not_found %%% sent (Message has been sent (no guarantee) %%% Messages from Server to Client received in client/1 function --record(message_from,{from_name, message}). +-record(message_from,{from_name, message}). %%% Messages from shell to Client received in client/1 function %%% spawn(mess_client, client, [server_node(), Name]) --record(message_to,{to_name, message}). +-record(message_to,{to_name, message}). %%% logoff %%%----END FILE----

    %%%----FILE user_interface.erl----
    @@ -174,27 +174,27 @@ 

    %%% function is not logged on or if ToName is not logged on at %%% any node. --module(user_interface). --export([logon/1, logoff/0, message/2]). --include("mess_interface.hrl"). --include("mess_config.hrl"). +-module(user_interface). +-export([logon/1, logoff/0, message/2]). +-include("mess_interface.hrl"). +-include("mess_config.hrl"). -logon(Name) -> - case whereis(mess_client) of +logon(Name) -> + case whereis(mess_client) of undefined -> - register(mess_client, - spawn(mess_client, client, [?server_node, Name])); + register(mess_client, + spawn(mess_client, client, [?server_node, Name])); _ -> already_logged_on end. -logoff() -> +logoff() -> mess_client ! logoff. -message(ToName, Message) -> - case whereis(mess_client) of % Test if the client is running +message(ToName, Message) -> + case whereis(mess_client) of % Test if the client is running undefined -> not_logged_on; - _ -> mess_client ! #message_to{to_name=ToName, message=Message}, + _ -> mess_client ! #message_to{to_name=ToName, message=Message}, ok end. @@ -202,107 +202,107 @@

    %%% The client process which runs on each user node --module(mess_client). --export([client/2]). --include("mess_interface.hrl"). +-module(mess_client). +-export([client/2]). +-include("mess_interface.hrl"). -client(Server_Node, Name) -> - {messenger, Server_Node} ! #logon{client_pid=self(), username=Name}, - await_result(), - client(Server_Node). +client(Server_Node, Name) -> + {messenger, Server_Node} ! #logon{client_pid=self(), username=Name}, + await_result(), + client(Server_Node). -client(Server_Node) -> +client(Server_Node) -> receive logoff -> - exit(normal); - #message_to{to_name=ToName, message=Message} -> - {messenger, Server_Node} ! - #message{client_pid=self(), to_name=ToName, message=Message}, - await_result(); - {message_from, FromName, Message} -> - io:format("Message from ~p: ~p~n", [FromName, Message]) + exit(normal); + #message_to{to_name=ToName, message=Message} -> + {messenger, Server_Node} ! + #message{client_pid=self(), to_name=ToName, message=Message}, + await_result(); + {message_from, FromName, Message} -> + io:format("Message from ~p: ~p~n", [FromName, Message]) end, - client(Server_Node). + client(Server_Node). %%% wait for a response from the server -await_result() -> +await_result() -> receive - #abort_client{message=Why} -> - io:format("~p~n", [Why]), - exit(normal); - #server_reply{message=What} -> - io:format("~p~n", [What]) + #abort_client{message=Why} -> + io:format("~p~n", [Why]), + exit(normal); + #server_reply{message=What} -> + io:format("~p~n", [What]) after 5000 -> - io:format("No response from server~n", []), - exit(timeout) + io:format("No response from server~n", []), + exit(timeout) end. %%%----END FILE---

    %%%----FILE mess_server.erl----
     
     %%% This is the server process of the messenger service
     
    --module(mess_server).
    --export([start_server/0, server/0]).
    --include("mess_interface.hrl").
    +-module(mess_server).
    +-export([start_server/0, server/0]).
    +-include("mess_interface.hrl").
     
    -server() ->
    -    process_flag(trap_exit, true),
    -    server([]).
    +server() ->
    +    process_flag(trap_exit, true),
    +    server([]).
     
     %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...]
    -server(User_List) ->
    -    io:format("User list = ~p~n", [User_List]),
    +server(User_List) ->
    +    io:format("User list = ~p~n", [User_List]),
         receive
    -        #logon{client_pid=From, username=Name} ->
    -            New_User_List = server_logon(From, Name, User_List),
    -            server(New_User_List);
    -        {'EXIT', From, _} ->
    -            New_User_List = server_logoff(From, User_List),
    -            server(New_User_List);
    -        #message{client_pid=From, to_name=To, message=Message} ->
    -            server_transfer(From, To, Message, User_List),
    -            server(User_List)
    +        #logon{client_pid=From, username=Name} ->
    +            New_User_List = server_logon(From, Name, User_List),
    +            server(New_User_List);
    +        {'EXIT', From, _} ->
    +            New_User_List = server_logoff(From, User_List),
    +            server(New_User_List);
    +        #message{client_pid=From, to_name=To, message=Message} ->
    +            server_transfer(From, To, Message, User_List),
    +            server(User_List)
         end.
     
     %%% Start the server
    -start_server() ->
    -    register(messenger, spawn(?MODULE, server, [])).
    +start_server() ->
    +    register(messenger, spawn(?MODULE, server, [])).
     
     %%% Server adds a new user to the user list
    -server_logon(From, Name, User_List) ->
    +server_logon(From, Name, User_List) ->
         %% check if logged on anywhere else
    -    case lists:keymember(Name, 2, User_List) of
    +    case lists:keymember(Name, 2, User_List) of
             true ->
    -            From ! #abort_client{message=user_exists_at_other_node},
    +            From ! #abort_client{message=user_exists_at_other_node},
                 User_List;
             false ->
    -            From ! #server_reply{message=logged_on},
    -            link(From),
    -            [{From, Name} | User_List]        %add user to the list
    +            From ! #server_reply{message=logged_on},
    +            link(From),
    +            [{From, Name} | User_List]        %add user to the list
         end.
     
     %%% Server deletes a user from the user list
    -server_logoff(From, User_List) ->
    -    lists:keydelete(From, 1, User_List).
    +server_logoff(From, User_List) ->
    +    lists:keydelete(From, 1, User_List).
     
     %%% Server transfers a message between user
    -server_transfer(From, To, Message, User_List) ->
    +server_transfer(From, To, Message, User_List) ->
         %% check that the user is logged on and who he is
    -    case lists:keysearch(From, 1, User_List) of
    +    case lists:keysearch(From, 1, User_List) of
             false ->
    -            From ! #abort_client{message=you_are_not_logged_on};
    -        {value, {_, Name}} ->
    -            server_transfer(From, Name, To, Message, User_List)
    +            From ! #abort_client{message=you_are_not_logged_on};
    +        {value, {_, Name}} ->
    +            server_transfer(From, Name, To, Message, User_List)
         end.
     %%% If the user exists, send the message
    -server_transfer(From, Name, To, Message, User_List) ->
    +server_transfer(From, Name, To, Message, User_List) ->
         %% Find the receiver and send the message
    -    case lists:keysearch(To, 2, User_List) of
    +    case lists:keysearch(To, 2, User_List) of
             false ->
    -            From ! #server_reply{message=receiver_not_found};
    -        {value, {ToPid, To}} ->
    -            ToPid ! #message_from{from_name=Name, message=Message},
    -            From !  #server_reply{message=sent}
    +            From ! #server_reply{message=receiver_not_found};
    +        {value, {ToPid, To}} ->
    +            ToPid ! #message_from{from_name=Name, message=Message},
    +            From !  #server_reply{message=sent}
         end.
     
     %%%----END FILE---

    @@ -312,7 +312,7 @@

    Header Files

    As shown above, some files have extension .hrl. These are header files that -are included in the .erl files by:

    -include("File_Name").

    for example:

    -include("mess_interface.hrl").

    In the case above the file is fetched from the same directory as all the other +are included in the .erl files by:

    -include("File_Name").

    for example:

    -include("mess_interface.hrl").

    In the case above the file is fetched from the same directory as all the other files in the messenger example. (manual).

    .hrl files can contain any valid Erlang code but are most often used for record and macro definitions.

    @@ -320,14 +320,14 @@

    Records

    -

    A record is defined as:

    -record(name_of_record,{field_name1, field_name2, field_name3, ......}).

    For example:

    -record(message_to,{to_name, message}).

    This is equivalent to:

    {message_to, To_Name, Message}

    Creating a record is best illustrated by an example:

    #message_to{message="hello", to_name=fred)

    This creates:

    {message_to, fred, "hello"}

    Notice that you do not have to worry about the order you assign values to the +

    A record is defined as:

    -record(name_of_record,{field_name1, field_name2, field_name3, ......}).

    For example:

    -record(message_to,{to_name, message}).

    This is equivalent to:

    {message_to, To_Name, Message}

    Creating a record is best illustrated by an example:

    #message_to{message="hello", to_name=fred)

    This creates:

    {message_to, fred, "hello"}

    Notice that you do not have to worry about the order you assign values to the various parts of the records when you create it. The advantage of using records is that by placing their definitions in header files you can conveniently define interfaces that are easy to change. For example, if you want to add a new field to the record, you only have to change the code where the new field is used and not at every place the record is referred to. If you leave out a field when creating a record, it gets the value of the atom undefined. (manual)

    Pattern matching with records is very similar to creating records. For example, -inside a case or receive:

    #message_to{to_name=ToName, message=Message} ->

    This is the same as:

    {message_to, ToName, Message}

    +inside a case or receive:

    #message_to{to_name=ToName, message=Message} ->

    This is the same as:

    {message_to, ToName, Message}

    @@ -335,8 +335,8 @@

    Another thing that has been added to the messenger is a macro. The file mess_config.hrl contains the definition:

    %%% Configure the location of the server node,
    --define(server_node, messenger@super).

    This file is included in mess_server.erl:

    -include("mess_config.hrl").

    Every occurrence of ?server_node in mess_server.erl is now replaced by -messenger@super.

    A macro is also used when spawning the server process:

    spawn(?MODULE, server, [])

    This is a standard macro (that is, defined by the system, not by the user). +-define(server_node, messenger@super).

    This file is included in mess_server.erl:

    -include("mess_config.hrl").

    Every occurrence of ?server_node in mess_server.erl is now replaced by +messenger@super.

    A macro is also used when spawning the server process:

    spawn(?MODULE, server, [])

    This is a standard macro (that is, defined by the system, not by the user). ?MODULE is always replaced by the name of the current module (that is, the -module definition near the start of the file). There are more advanced ways of using macros with, for example, parameters.

    The three Erlang (.erl) files in the messenger example are individually diff --git a/prs/9277/doc/system/ref_man_functions.html b/prs/9277/doc/system/ref_man_functions.html index 1a7c705b3d67f..e957451adc073 100644 --- a/prs/9277/doc/system/ref_man_functions.html +++ b/prs/9277/doc/system/ref_man_functions.html @@ -124,10 +124,10 @@

    A function declaration is a sequence of function clauses separated by semicolons, and terminated by a period (.).

    A function clause consists of a clause head and a clause body, separated by ->.

    A clause head consists of the function name, an argument list, and an optional -guard sequence beginning with the keyword when:

    Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
    +guard sequence beginning with the keyword when:

    Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
         Body1;
     ...;
    -Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
    +Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
         BodyK.

    The function name is an atom. Each argument is a pattern.

    The number of arguments N is the arity of the function. A function is uniquely defined by the module name, function name, and arity. That is, two functions with the same name and in the same module, but with different arities @@ -135,10 +135,10 @@

    mod:f/N.

    A clause body consists of a sequence of expressions separated by comma (,):

    Expr1,
     ...,
     ExprN

    Valid Erlang expressions and guard sequences are described in -Expressions.

    Example:

    fact(N) when N > 0 ->  % first clause head
    -    N * fact(N-1);     % first clause body
    +Expressions.

    Example:

    fact(N) when N > 0 ->  % first clause head
    +    N * fact(N-1);     % first clause body
     
    -fact(0) ->             % second clause head
    +fact(0) ->             % second clause head
         1.                 % second clause body

    @@ -151,16 +151,16 @@

    clause is found that fulfills both of the following two conditions:

    1. The patterns in the clause head can be successfully matched against the given arguments.
    2. The guard sequence, if any, is true.

    If such a clause cannot be found, a function_clause runtime error occurs.

    If such a clause is found, the corresponding clause body is evaluated. That is, the expressions in the body are evaluated sequentially and the value of the last -expression is returned.

    Consider the function fact:

    -module(mod).
    --export([fact/1]).
    +expression is returned.

    Consider the function fact:

    -module(mod).
    +-export([fact/1]).
     
    -fact(N) when N > 0 ->
    -    N * fact(N - 1);
    -fact(0) ->
    +fact(N) when N > 0 ->
    +    N * fact(N - 1);
    +fact(0) ->
         1.

    Assume that you want to calculate the factorial for 1:

    1> mod:fact(1).

    Evaluation starts at the first clause. The pattern N is matched against argument 1. The matching succeeds and the guard (N > 0) is true, thus N is -bound to 1, and the corresponding body is evaluated:

    N * fact(N-1) => (N is bound to 1)
    -1 * fact(0)

    Now, fact(0) is called, and the function clauses are scanned +bound to 1, and the corresponding body is evaluated:

    N * fact(N-1) => (N is bound to 1)
    +1 * fact(0)

    Now, fact(0) is called, and the function clauses are scanned sequentially again. First, the pattern N is matched against 0. The matching succeeds, but the guard (N > 0) is false. Second, the pattern 0 is matched against the argument 0. The matching succeeds @@ -177,9 +177,9 @@

    tail-recursive call is done. This is to ensure that no system resources, for example, call stack, are consumed. This means that an infinite loop using tail-recursive calls will not exhaust the call -stack and can (in principle) run forever.

    Example:

    loop(N) ->
    -    io:format("~w~n", [N]),
    -    loop(N+1).

    The earlier factorial example is a counter-example. It is not +stack and can (in principle) run forever.

    Example:

    loop(N) ->
    +    io:format("~w~n", [N]),
    +    loop(N+1).

    The earlier factorial example is a counter-example. It is not tail-recursive, since a multiplication is done on the result of the recursive call to fact(N-1).

    @@ -195,9 +195,9 @@

    not need to be prefixed with the module name. Which BIFs that are auto-imported is specified in the erlang module in ERTS. For example, standard-type conversion BIFs like atom_to_list and BIFs allowed in guards can be called -without specifying the module name.

    Examples:

    1> tuple_size({a,b,c}).
    +without specifying the module name.

    Examples:

    1> tuple_size({a,b,c}).
     3
    -2> atom_to_list('Erlang').
    +2> atom_to_list('Erlang').
     "Erlang"
    diff --git a/prs/9277/doc/system/ref_man_processes.html b/prs/9277/doc/system/ref_man_processes.html index 9b631fa3af3f2..2ef23d4eb05ef 100644 --- a/prs/9277/doc/system/ref_man_processes.html +++ b/prs/9277/doc/system/ref_man_processes.html @@ -129,10 +129,10 @@

    Process Creation

    -

    A process is created by calling spawn():

    spawn(Module, Name, Args) -> pid()
    -  Module = Name = atom()
    -  Args = [Arg1,...,ArgN]
    -    ArgI = term()

    spawn() creates a new process and returns the pid.

    The new process starts executing in Module:Name(Arg1,...,ArgN) where the +

    A process is created by calling spawn():

    spawn(Module, Name, Args) -> pid()
    +  Module = Name = atom()
    +  Args = [Arg1,...,ArgN]
    +    ArgI = term()

    spawn() creates a new process and returns the pid.

    The new process starts executing in Module:Name(Arg1,...,ArgN) where the arguments are the elements of the (possible empty) Args argument list.

    There exist a number of different spawn BIFs:

    diff --git a/prs/9277/doc/system/ref_man_records.html b/prs/9277/doc/system/ref_man_records.html index 7a0e351f34904..21acf0889a117 100644 --- a/prs/9277/doc/system/ref_man_records.html +++ b/prs/9277/doc/system/ref_man_records.html @@ -127,9 +127,9 @@

    A record definition consists of the name of the record, followed by the field names of the record. Record and field names must be atoms. Each field can be given an optional default value. If no default value is supplied, undefined is -used.

    -record(Name, {Field1 [= Expr1],
    +used.

    -record(Name, {Field1 [= Expr1],
                    ...
    -               FieldN [= ExprN]}).

    The default value for a field is an arbitrary expression, except that it must + FieldN [= ExprN]}).

    The default value for a field is an arbitrary expression, except that it must not use any variables.

    A record definition can be placed anywhere among the attributes and function declarations of a module, but the definition must come before any usage of the record.

    If a record is used in several modules, it is recommended that the record @@ -147,24 +147,24 @@

    default value instead.

    If several fields are to be assigned the same value, the following construction can be used:

    #Name{Field1=Expr1, ..., FieldK=ExprK, _=ExprL}

    Omitted fields then get the value of evaluating ExprL instead of their default values. This feature is primarily intended to be used to create patterns for ETS -and Mnesia match functions.

    Example:

    -record(person, {name, phone, address}).
    +and Mnesia match functions.

    Example:

    -record(person, {name, phone, address}).
     
    -lookup(Name, Tab) ->
    -    ets:match_object(Tab, #person{name=Name, _='_'}).

    +lookup(Name, Tab) -> + ets:match_object(Tab, #person{name=Name, _='_'}).

    Accessing Record Fields

    Expr#Name.Field

    Returns the value of the specified field. Expr is to evaluate to a Name -record.

    Example:

    -record(person, {name, phone, address}).
    +record.

    Example:

    -record(person, {name, phone, address}).
     
    -get_person_name(Person) ->
    +get_person_name(Person) ->
         Person#person.name.

    The following expression returns the position of the specified field in the -tuple representation of the record:

    #Name.Field

    Example:

    -record(person, {name, phone, address}).
    +tuple representation of the record:

    #Name.Field

    Example:

    -record(person, {name, phone, address}).
     
    -lookup(Name, List) ->
    -    lists:keyfind(Name, #person.name, List).

    +lookup(Name, List) -> + lists:keyfind(Name, #person.name, List).

    @@ -182,13 +182,13 @@

    Since record expressions are expanded to tuple expressions, creating records and accessing record fields are allowed in guards. However, all subexpressions (for initializing fields), must be valid guard -expressions as well.

    Examples:

    handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
    +expressions as well.

    Examples:

    handle(Msg, State) when Msg =:= #msg{to=void, no=3} ->
         ...
     
    -handle(Msg, State) when State#state.running =:= true ->
    -    ...

    There is also a type test BIF is_record(Term, RecordTag).

    Example:

    is_person(P) when is_record(P, person) ->
    +handle(Msg, State) when State#state.running =:= true ->
    +    ...

    There is also a type test BIF is_record(Term, RecordTag).

    Example:

    is_person(P) when is_record(P, person) ->
         true;
    -is_person(_P) ->
    +is_person(_P) ->
         false.

    @@ -202,11 +202,11 @@

    Nested Records

    -

    Assume the following record definitions:

    -record(nrec0, {name = "nested0"}).
    --record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
    --record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
    +

    Assume the following record definitions:

    -record(nrec0, {name = "nested0"}).
    +-record(nrec1, {name = "nested1", nrec0=#nrec0{}}).
    +-record(nrec2, {name = "nested2", nrec1=#nrec1{}}).
     
    -N2 = #nrec2{},

    Accessing or updating nested records can be written without parentheses:

    "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
    +N2 = #nrec2{},

    Accessing or updating nested records can be written without parentheses:

    "nested0" = N2#nrec2.nrec1#nrec1.nrec0#nrec0.name,
         N0n = N2#nrec2.nrec1#nrec1.nrec0#nrec0{name = "nested0a"},

    which is equivalent to:

    "nested0" = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0.name,
     N0n = ((N2#nrec2.nrec1)#nrec1.nrec0)#nrec0{name = "nested0a"},

    Change

    Before Erlang/OTP R14, parentheses were necessary when accessing or updating nested records.

    @@ -216,9 +216,9 @@

    Internal Representation of Records

    Record expressions are translated to tuple expressions during compilation. A -record defined as:

    -record(Name, {Field1, ..., FieldN}).

    is internally represented by the tuple:

    {Name, Value1, ..., ValueN}

    Here each ValueI is the default value for FieldI.

    To each module using records, a pseudo function is added during compilation to -obtain information about records:

    record_info(fields, Record) -> [Field]
    -record_info(size, Record) -> Size

    Size is the size of the tuple representation, that is, one more than the +record defined as:

    -record(Name, {Field1, ..., FieldN}).

    is internally represented by the tuple:

    {Name, Value1, ..., ValueN}

    Here each ValueI is the default value for FieldI.

    To each module using records, a pseudo function is added during compilation to +obtain information about records:

    record_info(fields, Record) -> [Field]
    +record_info(size, Record) -> Size

    Size is the size of the tuple representation, that is, one more than the number of fields.

    diff --git a/prs/9277/doc/system/release_handling.html b/prs/9277/doc/system/release_handling.html index 54956e6806570..29833114a6a6d 100644 --- a/prs/9277/doc/system/release_handling.html +++ b/prs/9277/doc/system/release_handling.html @@ -227,15 +227,15 @@

    Instead, it is necessary to:

    • Suspend the processes using the module (to avoid that they try to handle any requests before the code replacement is completed).
    • Ask them to transform the internal state format and switch to the new version of the module.
    • Remove the old version.
    • Resume the processes.

    This is called synchronized code replacement and for this the following -instructions are used:

    {update, Module, {advanced, Extra}}
    -{update, Module, supervisor}

    update with argument {advanced,Extra} is used when changing the internal +instructions are used:

    {update, Module, {advanced, Extra}}
    +{update, Module, supervisor}

    update with argument {advanced,Extra} is used when changing the internal state of a behaviour as described above. It causes behaviour processes to call the callback function code_change/3, passing the term Extra and some other information as arguments. See the manual pages for the respective behaviours and Appup Cookbook.

    update with argument supervisor is used when changing the start specification of a supervisor. See Appup Cookbook.

    When a module is to be updated, the release handler finds which processes that are using the module by traversing the supervision tree of each running -application and checking all the child specifications:

    {Id, StartFunc, Restart, Shutdown, Type, Modules}

    A process uses a module if the name is listed in Modules in the child +application and checking all the child specifications:

    {Id, StartFunc, Restart, Shutdown, Type, Modules}

    A process uses a module if the name is listed in Modules in the child specification for the process.

    If Modules=dynamic, which is the case for event managers, the event manager process informs the release handler about the list of currently installed event handlers (gen_event), and it is checked if the module name is in this list @@ -247,10 +247,10 @@

    add_module and delete_module

    -

    If a new module is introduced, the following instruction is used:

    {add_module, Module}

    This instruction loads module Module. When running Erlang in +

    If a new module is introduced, the following instruction is used:

    {add_module, Module}

    This instruction loads module Module. When running Erlang in embedded mode it is necessary to use this this instruction. It is not strictly required when running Erlang in interactive mode, since the -code server automatically searches for and loads unloaded modules.

    The opposite of add_module is delete_module, which unloads a module:

    {delete_module, Module}

    Any process, in any application, with Module as residence module, is +code server automatically searches for and loads unloaded modules.

    The opposite of add_module is delete_module, which unloads a module:

    {delete_module, Module}

    Any process, in any application, with Module as residence module, is killed when the instruction is evaluated. Therefore, the user must ensure that all such processes are terminated before deleting module Module to avoid a situation with failing supervisor restarts.

    @@ -331,13 +331,13 @@

    To define how to upgrade/downgrade between the current version and previous versions of an application, an application upgrade file, or in short .appup file is created. The file is to be called Application.appup, where -Application is the application name:

    {Vsn,
    - [{UpFromVsn1, InstructionsU1},
    +Application is the application name:

    {Vsn,
    + [{UpFromVsn1, InstructionsU1},
       ...,
    -  {UpFromVsnK, InstructionsUK}],
    - [{DownToVsn1, InstructionsD1},
    +  {UpFromVsnK, InstructionsUK}],
    + [{DownToVsn1, InstructionsD1},
       ...,
    -  {DownToVsnK, InstructionsDK}]}.
    • Vsn, a string, is the current version of the application, as defined in the + {DownToVsnK, InstructionsDK}]}.
    • Vsn, a string, is the current version of the application, as defined in the .app file.
    • Each UpFromVsn is a previous version of the application to upgrade from.
    • Each DownToVsn is a previous version of the application to downgrade to.
    • Each Instructions is a list of release handling instructions.

    UpFromVsn and DownToVsn can also be specified as regular expressions. For more information about the syntax and contents of the .appup file, see appup in SASL.

    Appup Cookbook includes examples of .appup files for @@ -345,52 +345,52 @@

    Releases. Assume you want to add a function available/0 to server ch3, which returns the number of available channels (when trying out the example, make the change in a copy of the original -directory, to ensure that the first version is still available):

    -module(ch3).
    --behaviour(gen_server).
    +directory, to ensure that the first version is still available):

    -module(ch3).
    +-behaviour(gen_server).
     
    --export([start_link/0]).
    --export([alloc/0, free/1]).
    --export([available/0]).
    --export([init/1, handle_call/3, handle_cast/2]).
    -
    -start_link() ->
    -    gen_server:start_link({local, ch3}, ch3, [], []).
    -
    -alloc() ->
    -    gen_server:call(ch3, alloc).
    -
    -free(Ch) ->
    -    gen_server:cast(ch3, {free, Ch}).
    -
    -available() ->
    -    gen_server:call(ch3, available).
    -
    -init(_Args) ->
    -    {ok, channels()}.
    -
    -handle_call(alloc, _From, Chs) ->
    -    {Ch, Chs2} = alloc(Chs),
    -    {reply, Ch, Chs2};
    -handle_call(available, _From, Chs) ->
    -    N = available(Chs),
    -    {reply, N, Chs}.
    -
    -handle_cast({free, Ch}, Chs) ->
    -    Chs2 = free(Ch, Chs),
    -    {noreply, Chs2}.

    A new version of the ch_app.app file must now be created, where the version is -updated:

    {application, ch_app,
    - [{description, "Channel allocator"},
    -  {vsn, "2"},
    -  {modules, [ch_app, ch_sup, ch3]},
    -  {registered, [ch3]},
    -  {applications, [kernel, stdlib, sasl]},
    -  {mod, {ch_app,[]}}
    - ]}.

    To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), +-export([start_link/0]). +-export([alloc/0, free/1]). +-export([available/0]). +-export([init/1, handle_call/3, handle_cast/2]). + +start_link() -> + gen_server:start_link({local, ch3}, ch3, [], []). + +alloc() -> + gen_server:call(ch3, alloc). + +free(Ch) -> + gen_server:cast(ch3, {free, Ch}). + +available() -> + gen_server:call(ch3, available). + +init(_Args) -> + {ok, channels()}. + +handle_call(alloc, _From, Chs) -> + {Ch, Chs2} = alloc(Chs), + {reply, Ch, Chs2}; +handle_call(available, _From, Chs) -> + N = available(Chs), + {reply, N, Chs}. + +handle_cast({free, Ch}, Chs) -> + Chs2 = free(Ch, Chs), + {noreply, Chs2}.

    A new version of the ch_app.app file must now be created, where the version is +updated:

    {application, ch_app,
    + [{description, "Channel allocator"},
    +  {vsn, "2"},
    +  {modules, [ch_app, ch_sup, ch3]},
    +  {registered, [ch3]},
    +  {applications, [kernel, stdlib, sasl]},
    +  {mod, {ch_app,[]}}
    + ]}.

    To upgrade ch_app from "1" to "2" (and to downgrade from "2" to "1"), you only need to load the new (old) version of the ch3 callback module. Create -the application upgrade file ch_app.appup in the ebin directory:

    {"2",
    - [{"1", [{load_module, ch3}]}],
    - [{"1", [{load_module, ch3}]}]
    -}.

    +the application upgrade file ch_app.appup in the ebin directory:

    {"2",
    + [{"1", [{load_module, ch3}]}],
    + [{"1", [{load_module, ch3}]}]
    +}.

    @@ -409,14 +409,14 @@

    relup in SASL.

    Example, continued from the previous section: You have a new version "2" of ch_app and an .appup file. A new version of the .rel file is also needed. This time the file is called ch_rel-2.rel and the release version string is -changed from "A" to "B":

    {release,
    - {"ch_rel", "B"},
    - {erts, "14.2.5"},
    - [{kernel, "9.2.4"},
    -  {stdlib, "5.2.3"},
    -  {sasl, "4.2.1"},
    -  {ch_app, "2"}]
    -}.

    Now the relup file can be generated:

    1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
    +changed from "A" to "B":

    {release,
    + {"ch_rel", "B"},
    + {erts, "14.2.5"},
    + [{kernel, "9.2.4"},
    +  {stdlib, "5.2.3"},
    +  {sasl, "4.2.1"},
    +  {ch_app, "2"}]
    +}.

    Now the relup file can be generated:

    1> systools:make_relup("ch_rel-2", ["ch_rel-1"], ["ch_rel-1"]).
     ok

    This generates a relup file with instructions for how to upgrade from version "A" ("ch_rel-1") to version "B" ("ch_rel-2") and how to downgrade from version "B" to version "A".

    Both the old and new versions of the .app and .rel files must be in the code @@ -437,17 +437,17 @@

    packages. The release_handler module communicates with this process.

    Assuming there is an operational target system with installation root directory $ROOT, the release package with the new version of the release is to be copied to $ROOT/releases.

    First, unpack the release package. The files are then extracted from the -package:

    release_handler:unpack_release(ReleaseName) => {ok, Vsn}
    • ReleaseName is the name of the release package except the .tar.gz +package:

      release_handler:unpack_release(ReleaseName) => {ok, Vsn}
      • ReleaseName is the name of the release package except the .tar.gz extension.
      • Vsn is the version of the unpacked release, as defined in its .rel file.

      A directory $ROOT/lib/releases/Vsn is created, where the .rel file, the boot script start.boot, the system configuration file sys.config, and relup are placed. For applications with new version numbers, the application directories are placed under $ROOT/lib. Unchanged applications are not affected.

      An unpacked release can be installed. The release handler then evaluates the -instructions in relup, step by step:

      release_handler:install_release(Vsn) => {ok, FromVsn, []}

      If an error occurs during the installation, the system is rebooted using the old +instructions in relup, step by step:

      release_handler:install_release(Vsn) => {ok, FromVsn, []}

      If an error occurs during the installation, the system is rebooted using the old version of the release. If installation succeeds, the system is afterwards using the new version of the release, but if anything happens and the system is rebooted, it starts using the previous version again.

      To be made the default version, the newly installed release must be made permanent, which means the previous version becomes old:

      release_handler:make_permanent(Vsn) => ok

      The system keeps information about which versions are old and permanent in the -files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

      To downgrade from Vsn to FromVsn, install_release must be called again:

      release_handler:install_release(FromVsn) => {ok, Vsn, []}

      An installed, but not permanent, release can be removed. Information about the +files $ROOT/releases/RELEASES and $ROOT/releases/start_erl.data.

      To downgrade from Vsn to FromVsn, install_release must be called again:

      release_handler:install_release(FromVsn) => {ok, Vsn, []}

      An installed, but not permanent, release can be removed. Information about the release is then deleted from $ROOT/releases/RELEASES and the release-specific code, that is, the new application directories and the $ROOT/releases/Vsn directory, are removed.

      release_handler:remove_release(Vsn) => ok

      @@ -466,9 +466,9 @@

      ...

    $ROOT is the installation directory of the target system.

    Step 3) In another Erlang shell, generate start scripts and create a release package for the new version "B". Remember to include (a possible updated) sys.config and the relup file. For more information, see -Release Upgrade File.

    1> systools:make_script("ch_rel-2").
    +Release Upgrade File.

    1> systools:make_script("ch_rel-2").
     ok
    -2> systools:make_tar("ch_rel-2").
    +2> systools:make_tar("ch_rel-2").
     ok

    The new release package now also contains version "2" of ch_app and the relup file:

    % tar tf ch_rel-2.tar
     lib/kernel-9.2.4/ebin/kernel.app
    @@ -489,23 +489,23 @@ 

    releases/B/sys.config releases/B/ch_rel-2.rel releases/ch_rel-2.rel

    Step 4) Copy the release package ch_rel-2.tar.gz to the $ROOT/releases -directory.

    Step 5) In the running target system, unpack the release package:

    1> release_handler:unpack_release("ch_rel-2").
    -{ok,"B"}

    The new application version ch_app-2 is installed under $ROOT/lib next to +directory.

    Step 5) In the running target system, unpack the release package:

    1> release_handler:unpack_release("ch_rel-2").
    +{ok,"B"}

    The new application version ch_app-2 is installed under $ROOT/lib next to ch_app-1. The kernel, stdlib, and sasl directories are not affected, as they have not changed.

    Under $ROOT/releases, a new directory B is created, containing -ch_rel-2.rel, start.boot, sys.config, and relup.

    Step 6) Check if the function ch3:available/0 is available:

    2> ch3:available().
    +ch_rel-2.rel, start.boot, sys.config, and relup.

    Step 6) Check if the function ch3:available/0 is available:

    2> ch3:available().
     ** exception error: undefined function ch3:available/0

    Step 7) Install the new release. The instructions in $ROOT/releases/B/relup are executed one by one, resulting in the new version of ch3 being loaded. The -function ch3:available/0 is now available:

    3> release_handler:install_release("B").
    -{ok,"A",[]}
    -4> ch3:available().
    +function ch3:available/0 is now available:

    3> release_handler:install_release("B").
    +{ok,"A",[]}
    +4> ch3:available().
     3
    -5> code:which(ch3).
    +5> code:which(ch3).
     ".../lib/ch_app-2/ebin/ch3.beam"
    -6> code:which(ch_sup).
    +6> code:which(ch_sup).
     ".../lib/ch_app-1/ebin/ch_sup.beam"

    Processes in ch_app for which code have not been updated, for example, the supervisor, are still evaluating code from ch_app-1.

    Step 8) If the target system is now rebooted, it uses version "A" again. The -"B" version must be made permanent, to be used when the system is rebooted.

    7> release_handler:make_permanent("B").
    +"B" version must be made permanent, to be used when the system is rebooted.

    7> release_handler:make_permanent("B").
     ok

    @@ -522,7 +522,7 @@

    values set using application:set_env/3 are disregarded.

    When an installed release is made permanent, the system process init is set to point out the new sys.config.

    After the installation, the application controller compares the old and new configuration parameters for all running applications and call the callback -function:

    Module:config_change(Changed, New, Removed)
    • Module is the application callback module as defined by the mod key in the +function:

      Module:config_change(Changed, New, Removed)
      • Module is the application callback module as defined by the mod key in the .app file.
      • Changed and New are lists of {Par,Val} for all changed and added configuration parameters, respectively.
      • Removed is a list of all parameters Par that have been removed.

      The function is optional and can be omitted when implementing an application callback module.

      diff --git a/prs/9277/doc/system/release_structure.html b/prs/9277/doc/system/release_structure.html index 88c78db31c8bd..26d04f59a4905 100644 --- a/prs/9277/doc/system/release_structure.html +++ b/prs/9277/doc/system/release_structure.html @@ -140,29 +140,29 @@

      To define a release, create a release resource file, or in short a .rel file. In the file, specify the name and version of the release, which ERTS -version it is based on, and which applications it consists of:

      {release, {Name,Vsn}, {erts, EVsn},
      - [{Application1, AppVsn1},
      +version it is based on, and which applications it consists of:

      {release, {Name,Vsn}, {erts, EVsn},
      + [{Application1, AppVsn1},
          ...
      -  {ApplicationN, AppVsnN}]}.

      Name, Vsn, EVsn, and AppVsn are strings.

      The file must be named Rel.rel, where Rel is a unique name.

      Each Application (atom) and AppVsn is the name and version of an application + {ApplicationN, AppVsnN}]}.

      Name, Vsn, EVsn, and AppVsn are strings.

      The file must be named Rel.rel, where Rel is a unique name.

      Each Application (atom) and AppVsn is the name and version of an application included in the release. The minimal release based on Erlang/OTP consists of the Kernel and STDLIB applications, so these applications must be included in the list.

      If the release is to be upgraded, it must also include the SASL application.

      Here is an example showing the .app file for a release of ch_app from -the Applications section:

      {application, ch_app,
      - [{description, "Channel allocator"},
      -  {vsn, "1"},
      -  {modules, [ch_app, ch_sup, ch3]},
      -  {registered, [ch3]},
      -  {applications, [kernel, stdlib, sasl]},
      -  {mod, {ch_app,[]}}
      - ]}.

      The .rel file must also contain kernel, stdlib, and sasl, as these -applications are required by ch_app. The file is called ch_rel-1.rel:

      {release,
      - {"ch_rel", "A"},
      - {erts, "14.2.5"},
      - [{kernel, "9.2.4"},
      -  {stdlib, "5.2.3"},
      -  {sasl, "4.2.1"},
      -  {ch_app, "1"}]
      -}.

      +the Applications section:

      {application, ch_app,
      + [{description, "Channel allocator"},
      +  {vsn, "1"},
      +  {modules, [ch_app, ch_sup, ch3]},
      +  {registered, [ch3]},
      +  {applications, [kernel, stdlib, sasl]},
      +  {mod, {ch_app,[]}}
      + ]}.

      The .rel file must also contain kernel, stdlib, and sasl, as these +applications are required by ch_app. The file is called ch_rel-1.rel:

      {release,
      + {"ch_rel", "A"},
      + {erts, "14.2.5"},
      + [{kernel, "9.2.4"},
      +  {stdlib, "5.2.3"},
      +  {sasl, "4.2.1"},
      +  {ch_app, "1"}]
      +}.

      @@ -194,9 +194,9 @@

      The systools:make_tar/1,2 function takes a .rel file as input and creates a zipped tar file with the code for -the specified applications, a release package:

      1> systools:make_script("ch_rel-1").
      +the specified applications, a release package:

      1> systools:make_script("ch_rel-1").
       ok
      -2> systools:make_tar("ch_rel-1").
      +2> systools:make_tar("ch_rel-1").
       ok

      The release package by default contains:

      • The .app files
      • The .rel file
      • The object code for all applications, structured according to the application directory structure
      • The binary boot script renamed to start.boot
      % tar tf ch_rel-1.tar
       lib/kernel-9.2.4/ebin/kernel.app
      diff --git a/prs/9277/doc/system/robustness.html b/prs/9277/doc/system/robustness.html
      index 7a638a57efac0..306ba622b3e54 100644
      --- a/prs/9277/doc/system/robustness.html
      +++ b/prs/9277/doc/system/robustness.html
      @@ -132,36 +132,36 @@ 

      "pong" so that "pong" can also finish. Another way to let "pong" finish is to make "pong" exit if it does not receive a message from ping within a certain time. This can be done by adding a time-out to pong as shown in the -following example:

      -module(tut19).
      +following example:

      -module(tut19).
       
      --export([start_ping/1, start_pong/0,  ping/2, pong/0]).
      +-export([start_ping/1, start_pong/0,  ping/2, pong/0]).
       
      -ping(0, Pong_Node) ->
      -    io:format("ping finished~n", []);
      +ping(0, Pong_Node) ->
      +    io:format("ping finished~n", []);
       
      -ping(N, Pong_Node) ->
      -    {pong, Pong_Node} ! {ping, self()},
      +ping(N, Pong_Node) ->
      +    {pong, Pong_Node} ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping(N - 1, Pong_Node).
      +    ping(N - 1, Pong_Node).
       
      -pong() ->
      +pong() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           after 5000 ->
      -            io:format("Pong timed out~n", [])
      +            io:format("Pong timed out~n", [])
           end.
       
      -start_pong() ->
      -    register(pong, spawn(tut19, pong, [])).
      +start_pong() ->
      +    register(pong, spawn(tut19, pong, [])).
       
      -start_ping(Pong_Node) ->
      -    spawn(tut19, ping, [3, Pong_Node]).

      After this is compiled and the file tut19.beam is copied to the necessary +start_ping(Pong_Node) -> + spawn(tut19, ping, [3, Pong_Node]).

      After this is compiled and the file tut19.beam is copied to the necessary directories, the following is seen on (pong@kosken):

      (pong@kosken)1> tut19:start_pong().
       true
       Pong received ping
      @@ -172,20 +172,20 @@ 

      Ping received pong Ping received pong Ping received pong -ping finished

      The time-out is set in:

      pong() ->
      +ping finished

      The time-out is set in:

      pong() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           after 5000 ->
      -            io:format("Pong timed out~n", [])
      +            io:format("Pong timed out~n", [])
           end.

      The time-out (after 5000) is started when receive is entered. The time-out is canceled if {ping,Ping_PID} is received. If {ping,Ping_PID} is not received, the actions following the time-out are done after 5000 milliseconds. after must be last in the receive, that is, preceded by all other message reception specifications in the receive. It is also possible to call a -function that returned an integer for the time-out:

      after pong_timeout() ->

      In general, there are better ways than using time-outs to supervise parts of a +function that returned an integer for the time-out:

      after pong_timeout() ->

      In general, there are better ways than using time-outs to supervise parts of a distributed Erlang system. Time-outs are usually appropriate to supervise external events, for example, if you have expected a message from some external system within a specified time. For example, a time-out can be used to log a @@ -213,36 +213,36 @@

      If one of the processes exits abnormally, all the processes in the transaction are killed. As it is often wanted to create a process and link to it at the same time, there is a special BIF, spawn_link that does the -same as spawn, but also creates a link to the spawned process.

      Now an example of the ping pong example using links to terminate "pong":

      -module(tut20).
      +same as spawn, but also creates a link to the spawned process.

      Now an example of the ping pong example using links to terminate "pong":

      -module(tut20).
       
      --export([start/1,  ping/2, pong/0]).
      +-export([start/1,  ping/2, pong/0]).
       
      -ping(N, Pong_Pid) ->
      -    link(Pong_Pid),
      -    ping1(N, Pong_Pid).
      +ping(N, Pong_Pid) ->
      +    link(Pong_Pid),
      +    ping1(N, Pong_Pid).
       
      -ping1(0, _) ->
      -    exit(ping);
      +ping1(0, _) ->
      +    exit(ping);
       
      -ping1(N, Pong_Pid) ->
      -    Pong_Pid ! {ping, self()},
      +ping1(N, Pong_Pid) ->
      +    Pong_Pid ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping1(N - 1, Pong_Pid).
      +    ping1(N - 1, Pong_Pid).
       
      -pong() ->
      +pong() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong()
      +            pong()
           end.
       
      -start(Ping_Node) ->
      -    PongPID = spawn(tut20, pong, []),
      -    spawn(Ping_Node, tut20, ping, [3, PongPID]).
      (s1@bill)3> tut20:start(s2@kosken).
      +start(Ping_Node) ->
      +    PongPID = spawn(tut20, pong, []),
      +    spawn(Ping_Node, tut20, ping, [3, PongPID]).
      (s1@bill)3> tut20:start(s2@kosken).
       Pong received ping
       <3820.41.0>
       Ping received pong
      @@ -256,45 +256,45 @@ 

      sent to "pong", which also terminates.

      It is possible to modify the default behaviour of a process so that it does not get killed when it receives abnormal exit signals. Instead, all signals are turned into normal messages on the format {'EXIT',FromPID,Reason} and added to -the end of the receiving process' message queue. This behaviour is set by:

      process_flag(trap_exit, true)

      There are several other process flags, see erlang(3). +the end of the receiving process' message queue. This behaviour is set by:

      process_flag(trap_exit, true)

      There are several other process flags, see erlang(3). Changing the default behaviour of a process in this way is usually not done in standard user programs, but is left to the supervisory programs in OTP. However, -the ping pong program is modified to illustrate exit trapping.

      -module(tut21).
      +the ping pong program is modified to illustrate exit trapping.

      -module(tut21).
       
      --export([start/1,  ping/2, pong/0]).
      +-export([start/1,  ping/2, pong/0]).
       
      -ping(N, Pong_Pid) ->
      -    link(Pong_Pid),
      -    ping1(N, Pong_Pid).
      +ping(N, Pong_Pid) ->
      +    link(Pong_Pid),
      +    ping1(N, Pong_Pid).
       
      -ping1(0, _) ->
      -    exit(ping);
      +ping1(0, _) ->
      +    exit(ping);
       
      -ping1(N, Pong_Pid) ->
      -    Pong_Pid ! {ping, self()},
      +ping1(N, Pong_Pid) ->
      +    Pong_Pid ! {ping, self()},
           receive
               pong ->
      -            io:format("Ping received pong~n", [])
      +            io:format("Ping received pong~n", [])
           end,
      -    ping1(N - 1, Pong_Pid).
      +    ping1(N - 1, Pong_Pid).
       
      -pong() ->
      -    process_flag(trap_exit, true),
      -    pong1().
      +pong() ->
      +    process_flag(trap_exit, true),
      +    pong1().
       
      -pong1() ->
      +pong1() ->
           receive
      -        {ping, Ping_PID} ->
      -            io:format("Pong received ping~n", []),
      +        {ping, Ping_PID} ->
      +            io:format("Pong received ping~n", []),
                   Ping_PID ! pong,
      -            pong1();
      -        {'EXIT', From, Reason} ->
      -            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
      +            pong1();
      +        {'EXIT', From, Reason} ->
      +            io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
           end.
       
      -start(Ping_Node) ->
      -    PongPID = spawn(tut21, pong, []),
      -    spawn(Ping_Node, tut21, ping, [3, PongPID]).
      (s1@bill)1> tut21:start(s2@gollum).
      +start(Ping_Node) ->
      +    PongPID = spawn(tut21, pong, []),
      +    spawn(Ping_Node, tut21, ping, [3, PongPID]).
      (s1@bill)1> tut21:start(s2@gollum).
       <3820.39.0>
       Pong received ping
       Ping received pong
      @@ -355,127 +355,127 @@ 

      %%% Configuration: change the server_node() function to return the %%% name of the node where the messenger server runs --module(messenger). --export([start_server/0, server/0, - logon/1, logoff/0, message/2, client/2]). +-module(messenger). +-export([start_server/0, server/0, + logon/1, logoff/0, message/2, client/2]). %%% Change the function below to return the name of the node where the %%% messenger server runs -server_node() -> +server_node() -> messenger@super. %%% This is the server process for the "messenger" %%% the user list has the format [{ClientPid1, Name1},{ClientPid22, Name2},...] -server() -> - process_flag(trap_exit, true), - server([]). +server() -> + process_flag(trap_exit, true), + server([]). -server(User_List) -> +server(User_List) -> receive - {From, logon, Name} -> - New_User_List = server_logon(From, Name, User_List), - server(New_User_List); - {'EXIT', From, _} -> - New_User_List = server_logoff(From, User_List), - server(New_User_List); - {From, message_to, To, Message} -> - server_transfer(From, To, Message, User_List), - io:format("list is now: ~p~n", [User_List]), - server(User_List) + {From, logon, Name} -> + New_User_List = server_logon(From, Name, User_List), + server(New_User_List); + {'EXIT', From, _} -> + New_User_List = server_logoff(From, User_List), + server(New_User_List); + {From, message_to, To, Message} -> + server_transfer(From, To, Message, User_List), + io:format("list is now: ~p~n", [User_List]), + server(User_List) end. %%% Start the server -start_server() -> - register(messenger, spawn(messenger, server, [])). +start_server() -> + register(messenger, spawn(messenger, server, [])). %%% Server adds a new user to the user list -server_logon(From, Name, User_List) -> +server_logon(From, Name, User_List) -> %% check if logged on anywhere else - case lists:keymember(Name, 2, User_List) of + case lists:keymember(Name, 2, User_List) of true -> - From ! {messenger, stop, user_exists_at_other_node}, %reject logon + From ! {messenger, stop, user_exists_at_other_node}, %reject logon User_List; false -> - From ! {messenger, logged_on}, - link(From), - [{From, Name} | User_List] %add user to the list + From ! {messenger, logged_on}, + link(From), + [{From, Name} | User_List] %add user to the list end. %%% Server deletes a user from the user list -server_logoff(From, User_List) -> - lists:keydelete(From, 1, User_List). +server_logoff(From, User_List) -> + lists:keydelete(From, 1, User_List). %%% Server transfers a message between user -server_transfer(From, To, Message, User_List) -> +server_transfer(From, To, Message, User_List) -> %% check that the user is logged on and who he is - case lists:keysearch(From, 1, User_List) of + case lists:keysearch(From, 1, User_List) of false -> - From ! {messenger, stop, you_are_not_logged_on}; - {value, {_, Name}} -> - server_transfer(From, Name, To, Message, User_List) + From ! {messenger, stop, you_are_not_logged_on}; + {value, {_, Name}} -> + server_transfer(From, Name, To, Message, User_List) end. %%% If the user exists, send the message -server_transfer(From, Name, To, Message, User_List) -> +server_transfer(From, Name, To, Message, User_List) -> %% Find the receiver and send the message - case lists:keysearch(To, 2, User_List) of + case lists:keysearch(To, 2, User_List) of false -> - From ! {messenger, receiver_not_found}; - {value, {ToPid, To}} -> - ToPid ! {message_from, Name, Message}, - From ! {messenger, sent} + From ! {messenger, receiver_not_found}; + {value, {ToPid, To}} -> + ToPid ! {message_from, Name, Message}, + From ! {messenger, sent} end. %%% User Commands -logon(Name) -> - case whereis(mess_client) of +logon(Name) -> + case whereis(mess_client) of undefined -> - register(mess_client, - spawn(messenger, client, [server_node(), Name])); + register(mess_client, + spawn(messenger, client, [server_node(), Name])); _ -> already_logged_on end. -logoff() -> +logoff() -> mess_client ! logoff. -message(ToName, Message) -> - case whereis(mess_client) of % Test if the client is running +message(ToName, Message) -> + case whereis(mess_client) of % Test if the client is running undefined -> not_logged_on; - _ -> mess_client ! {message_to, ToName, Message}, + _ -> mess_client ! {message_to, ToName, Message}, ok end. %%% The client process which runs on each user node -client(Server_Node, Name) -> - {messenger, Server_Node} ! {self(), logon, Name}, - await_result(), - client(Server_Node). +client(Server_Node, Name) -> + {messenger, Server_Node} ! {self(), logon, Name}, + await_result(), + client(Server_Node). -client(Server_Node) -> +client(Server_Node) -> receive logoff -> - exit(normal); - {message_to, ToName, Message} -> - {messenger, Server_Node} ! {self(), message_to, ToName, Message}, - await_result(); - {message_from, FromName, Message} -> - io:format("Message from ~p: ~p~n", [FromName, Message]) + exit(normal); + {message_to, ToName, Message} -> + {messenger, Server_Node} ! {self(), message_to, ToName, Message}, + await_result(); + {message_from, FromName, Message} -> + io:format("Message from ~p: ~p~n", [FromName, Message]) end, - client(Server_Node). + client(Server_Node). %%% wait for a response from the server -await_result() -> +await_result() -> receive - {messenger, stop, Why} -> % Stop the client - io:format("~p~n", [Why]), - exit(normal); - {messenger, What} -> % Normal response - io:format("~p~n", [What]) + {messenger, stop, Why} -> % Stop the client + io:format("~p~n", [Why]), + exit(normal); + {messenger, What} -> % Normal response + io:format("~p~n", [What]) after 5000 -> - io:format("No response from server~n", []), - exit(timeout) + io:format("No response from server~n", []), + exit(timeout) end.

      The following changes are added:

      The messenger server traps exits. If it receives an exit signal, {'EXIT',From,Reason}, this means that a client process has terminated or is unreachable for one of the following reasons:

      • The user has logged off (the "logoff" message is removed).
      • The network connection to the client is broken.
      • The node on which the client process resides has gone down.
      • The client processes has done some illegal operation.

      If an exit signal is received as above, the tuple {From,Name} is deleted from diff --git a/prs/9277/doc/system/seq_prog.html b/prs/9277/doc/system/seq_prog.html index 0eda5c0bc93a0..cf3e5e234caba 100644 --- a/prs/9277/doc/system/seq_prog.html +++ b/prs/9277/doc/system/seq_prog.html @@ -140,13 +140,13 @@

      more editing commands in the shell (see tty - A command line interface in ERTS User's Guide).

      (Notice that many line numbers given by the shell in the following examples are out of sequence. This is because this tutorial was written and code-tested in -separate sessions).

      Here is a bit more complex calculation:

      2> (42 + 77) * 66 / 3.
      +separate sessions).

      Here is a bit more complex calculation:

      2> (42 + 77) * 66 / 3.
       2618.0

      Notice the use of brackets, the multiplication operator *, and the division operator /, as in normal arithmetic (see Expressions).

      Press Control-C to shut down the Erlang system and the Erlang shell.

      The following output is shown:

      BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
              (v)ersion (k)ill (D)b-tables (d)istribution
       a
      -$

      Type a to leave the Erlang system.

      Another way to shut down the Erlang system is by entering halt/0:

      3> halt().
      +$

      Type a to leave the Erlang system.

      Another way to shut down the Erlang system is by entering halt/0:

      3> halt().
       $

      @@ -160,55 +160,55 @@

      editor has an Erlang mode that makes it easier for you to enter and format your code nicely (see The Erlang mode for Emacs in Tools User's Guide), but you can manage perfectly well without. Here is the -code to enter:

      -module(tut).
      --export([double/1]).
      +code to enter:

      -module(tut).
      +-export([double/1]).
       
      -double(X) ->
      +double(X) ->
           2 * X.

      It is not hard to guess that this program doubles the value of numbers. The first two lines of the code are described later. Let us compile the program. -This can be done in an Erlang shell as follows, where c means compile:

      3> c(tut).
      -{ok,tut}

      The {ok,tut} means that the compilation is OK. If it says error it means +This can be done in an Erlang shell as follows, where c means compile:

      3> c(tut).
      +{ok,tut}

      The {ok,tut} means that the compilation is OK. If it says error it means that there is some mistake in the text that you entered. Additional error messages gives an idea to what is wrong so you can modify the text and then try -to compile the program again.

      Now run the program:

      4> tut:double(10).
      +to compile the program again.

      Now run the program:

      4> tut:double(10).
       20

      As expected, double of 10 is 20.

      Now let us get back to the first two lines of the code. Erlang programs are written in files. Each file contains an Erlang module. The first line of code -in the module is the module name (see Modules):

      -module(tut).

      Thus, the module is called tut. Notice the full stop . at the end of the +in the module is the module name (see Modules):

      -module(tut).

      Thus, the module is called tut. Notice the full stop . at the end of the line. The files which are used to store the module must have the same name as the module but with the extension .erl. In this case the file name is tut.erl. When using a function in another module, the syntax module_name:function_name(arguments) is used. So the following means call -function double in module tut with argument 10.

      4> tut:double(10).

      The second line says that the module tut contains a function called double, -which takes one argument (X in our example):

      -export([double/1]).

      The second line also says that this function can be called from outside the +function double in module tut with argument 10.

      4> tut:double(10).

      The second line says that the module tut contains a function called double, +which takes one argument (X in our example):

      -export([double/1]).

      The second line also says that this function can be called from outside the module tut. More about this later. Again, notice the . at the end of the line.

      Now for a more complicated example, the factorial of a number. For example, the -factorial of 4 is 4 3 2 * 1, which equals 24.

      Enter the following code in a file named tut1.erl:

      -module(tut1).
      --export([fac/1]).
      +factorial of 4 is 4  3  2 * 1, which equals 24.

      Enter the following code in a file named tut1.erl:

      -module(tut1).
      +-export([fac/1]).
       
      -fac(1) ->
      +fac(1) ->
           1;
      -fac(N) ->
      -    N * fac(N - 1).

      So this is a module, called tut1 that contains a function called fac>, which -takes one argument, N.

      The first part says that the factorial of 1 is 1.:

      fac(1) ->
      +fac(N) ->
      +    N * fac(N - 1).

      So this is a module, called tut1 that contains a function called fac>, which +takes one argument, N.

      The first part says that the factorial of 1 is 1.:

      fac(1) ->
           1;

      Notice that this part ends with a semicolon ; that indicates that there is more of the function fac> to come.

      The second part says that the factorial of N is N multiplied by the factorial of -N - 1:

      fac(N) ->
      -    N * fac(N - 1).

      Notice that this part ends with a . saying that there are no more parts of -this function.

      Compile the file:

      5> c(tut1).
      -{ok,tut1}

      And now calculate the factorial of 4.

      6> tut1:fac(4).
      +N - 1:

      fac(N) ->
      +    N * fac(N - 1).

      Notice that this part ends with a . saying that there are no more parts of +this function.

      Compile the file:

      5> c(tut1).
      +{ok,tut1}

      And now calculate the factorial of 4.

      6> tut1:fac(4).
       24

      Here the function fac> in module tut1 is called with argument 4.

      A function can have many arguments. Let us expand the module tut1 with the -function to multiply two numbers:

      -module(tut1).
      --export([fac/1, mult/2]).
      +function to multiply two numbers:

      -module(tut1).
      +-export([fac/1, mult/2]).
       
      -fac(1) ->
      +fac(1) ->
           1;
      -fac(N) ->
      -    N * fac(N - 1).
      +fac(N) ->
      +    N * fac(N - 1).
       
      -mult(X, Y) ->
      +mult(X, Y) ->
           X * Y.

      Notice that it is also required to expand the -export line with the -information that there is another function mult with two arguments.

      Compile:

      7> c(tut1).
      -{ok,tut1}

      Try out the new function mult:

      8> tut1:mult(3,4).
      +information that there is another function mult with two arguments.

      Compile:

      7> c(tut1).
      +{ok,tut1}

      Try out the new function mult:

      8> tut1:mult(3,4).
       12

      In this example the numbers are integers and the arguments in the functions in the code N, X, and Y are called variables. Variables must start with a capital letter (see Variables). Examples of @@ -222,56 +222,56 @@

      Atom), for example, charles, centimeter, and inch. Atoms are simply names, nothing else. They are not like variables, which can have a value.

      Enter the next program in a file named tut2.erl). It can be useful for -converting from inches to centimeters and conversely:

      -module(tut2).
      --export([convert/2]).
      +converting from inches to centimeters and conversely:

      -module(tut2).
      +-export([convert/2]).
       
      -convert(M, inch) ->
      +convert(M, inch) ->
           M / 2.54;
       
      -convert(N, centimeter) ->
      -    N * 2.54.

      Compile:

      9> c(tut2).
      -{ok,tut2}

      Test:

      10> tut2:convert(3, inch).
      +convert(N, centimeter) ->
      +    N * 2.54.

      Compile:

      9> c(tut2).
      +{ok,tut2}

      Test:

      10> tut2:convert(3, inch).
       1.1811023622047243
      -11> tut2:convert(7, centimeter).
      +11> tut2:convert(7, centimeter).
       17.78

      Notice the introduction of decimals (floating point numbers) without any explanation. Hopefully you can cope with that.

      Let us see what happens if something other than centimeter or inch is -entered in the convert function:

      12> tut2:convert(3, miles).
      +entered in the convert function:

      12> tut2:convert(3, miles).
       ** exception error: no function clause matching tut2:convert(3,miles) (tut2.erl, line 4)

      The two parts of the convert function are called its clauses. As shown, miles is not part of either of the clauses. The Erlang system cannot match either of the clauses so an error message function_clause is returned. The shell formats the error message nicely, but the error tuple is saved in the -shell's history list and can be output by the shell command v/1:

      13> v(12).
      -{'EXIT',{function_clause,[{tut2,convert,
      -                                [3,miles],
      -                                [{file,"tut2.erl"},{line,4}]},
      -                          {erl_eval,do_apply,6,
      -                                    [{file,"erl_eval.erl"},{line,677}]},
      -                          {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
      -                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
      -                          {shell,eval_loop,3,
      -                                 [{file,"shell.erl"},{line,627}]}]}}

      +shell's history list and can be output by the shell command v/1:

      13> v(12).
      +{'EXIT',{function_clause,[{tut2,convert,
      +                                [3,miles],
      +                                [{file,"tut2.erl"},{line,4}]},
      +                          {erl_eval,do_apply,6,
      +                                    [{file,"erl_eval.erl"},{line,677}]},
      +                          {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
      +                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
      +                          {shell,eval_loop,3,
      +                                 [{file,"shell.erl"},{line,627}]}]}}

      Tuples

      -

      Now the tut2 program is hardly good programming style. Consider:

      tut2:convert(3, inch).

      Does this mean that 3 is in inches? Or does it mean that 3 is in centimeters and +

      Now the tut2 program is hardly good programming style. Consider:

      tut2:convert(3, inch).

      Does this mean that 3 is in inches? Or does it mean that 3 is in centimeters and is to be converted to inches? Erlang has a way to group things together to make things more understandable. These are called tuples and are surrounded by curly brackets, { and }.

      So, {inch,3} denotes 3 inches and {centimeter,5} denotes 5 centimeters. Now let us write a new program that converts centimeters to inches and conversely. -Enter the following code in a file called tut3.erl):

      -module(tut3).
      --export([convert_length/1]).
      -
      -convert_length({centimeter, X}) ->
      -    {inch, X / 2.54};
      -convert_length({inch, Y}) ->
      -    {centimeter, Y * 2.54}.

      Compile and test:

      14> c(tut3).
      -{ok,tut3}
      -15> tut3:convert_length({inch, 5}).
      -{centimeter,12.7}
      -16> tut3:convert_length(tut3:convert_length({inch, 5})).
      -{inch,5.0}

      Notice on line 16 that 5 inches is converted to centimeters and back again and +Enter the following code in a file called tut3.erl):

      -module(tut3).
      +-export([convert_length/1]).
      +
      +convert_length({centimeter, X}) ->
      +    {inch, X / 2.54};
      +convert_length({inch, Y}) ->
      +    {centimeter, Y * 2.54}.

      Compile and test:

      14> c(tut3).
      +{ok,tut3}
      +15> tut3:convert_length({inch, 5}).
      +{centimeter,12.7}
      +16> tut3:convert_length(tut3:convert_length({inch, 5})).
      +{inch,5.0}

      Notice on line 16 that 5 inches is converted to centimeters and back again and reassuringly get back to the original value. That is, the argument to a function can be the result of another function. Consider how line 16 (above) works. The argument given to the function {inch,5} is first matched against the first @@ -280,9 +280,9 @@

      before the ->). This having failed, let us try the head of the next clause that is, convert_length({inch,Y}). This matches, and Y gets the value 5.

      Tuples can have more than two parts, in fact as many parts as you want, and contain any valid Erlang term. For example, to represent the temperature of -various cities of the world:

      {moscow, {c, -10}}
      -{cape_town, {f, 70}}
      -{paris, {f, 28}}

      Tuples have a fixed number of items in them. Each item in a tuple is called an +various cities of the world:

      {moscow, {c, -10}}
      +{cape_town, {f, 70}}
      +{paris, {f, 28}}

      Tuples have a fixed number of items in them. Each item in a tuple is called an element. In the tuple {moscow,{c,-10}}, element 1 is moscow and element 2 is {c,-10}. Here c represents Celsius and f Fahrenheit.

      @@ -292,57 +292,57 @@

      Whereas tuples group things together, it is also needed to represent lists of things. Lists in Erlang are surrounded by square brackets, [ and ]. For -example, a list of the temperatures of various cities in the world can be:

      [{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}},
      - {paris, {f, 28}}, {london, {f, 36}}]

      Notice that this list was so long that it did not fit on one line. This does not +example, a list of the temperatures of various cities in the world can be:

      [{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}},
      + {paris, {f, 28}}, {london, {f, 36}}]

      Notice that this list was so long that it did not fit on one line. This does not matter, Erlang allows line breaks at all "sensible places" but not, for example, in the middle of atoms, integers, and others.

      A useful way of looking at parts of lists, is by using |. This is best -explained by an example using the shell:

      17> [First |TheRest] = [1,2,3,4,5].
      -[1,2,3,4,5]
      +explained by an example using the shell:

      17> [First |TheRest] = [1,2,3,4,5].
      +[1,2,3,4,5]
       18> First.
       1
       19> TheRest.
      -[2,3,4,5]

      To separate the first elements of the list from the rest of the list, | is -used. First has got value 1 and TheRest has got the value [2,3,4,5].

      Another example:

      20> [E1, E2 | R] = [1,2,3,4,5,6,7].
      -[1,2,3,4,5,6,7]
      +[2,3,4,5]

      To separate the first elements of the list from the rest of the list, | is +used. First has got value 1 and TheRest has got the value [2,3,4,5].

      Another example:

      20> [E1, E2 | R] = [1,2,3,4,5,6,7].
      +[1,2,3,4,5,6,7]
       21> E1.
       1
       22> E2.
       2
       23> R.
      -[3,4,5,6,7]

      Here you see the use of | to get the first two elements from the list. If you +[3,4,5,6,7]

      Here you see the use of | to get the first two elements from the list. If you try to get more elements from the list than there are elements in the list, an error is returned. Notice also the special case of the list with no elements, -[]:

      24> [A, B | C] = [1, 2].
      -[1,2]
      +[]:

      24> [A, B | C] = [1, 2].
      +[1,2]
       25> A.
       1
       26> B.
       2
       27> C.
      -[]

      In the previous examples, new variable names are used, instead of reusing the +[]

      In the previous examples, new variable names are used, instead of reusing the old ones: First, TheRest, E1, E2, R, A, B, and C. The reason for this is that a variable can only be given a value once in its context (scope). More about this later.

      The following example shows how to find the length of a list. Enter the -following code in a file named tut4.erl:

      -module(tut4).
      +following code in a file named tut4.erl:

      -module(tut4).
       
      --export([list_length/1]).
      +-export([list_length/1]).
       
      -list_length([]) ->
      +list_length([]) ->
           0;
      -list_length([First | Rest]) ->
      -    1 + list_length(Rest).

      Compile and test:

      28> c(tut4).
      -{ok,tut4}
      -29> tut4:list_length([1,2,3,4,5,6,7]).
      -7

      Explanation:

      list_length([]) ->
      -    0;

      The length of an empty list is obviously 0.

      list_length([First | Rest]) ->
      -    1 + list_length(Rest).

      The length of a list with the first element First and the remaining elements +list_length([First | Rest]) -> + 1 + list_length(Rest).

      Compile and test:

      28> c(tut4).
      +{ok,tut4}
      +29> tut4:list_length([1,2,3,4,5,6,7]).
      +7

      Explanation:

      list_length([]) ->
      +    0;

      The length of an empty list is obviously 0.

      list_length([First | Rest]) ->
      +    1 + list_length(Rest).

      The length of a list with the first element First and the remaining elements Rest is 1 + the length of Rest.

      (Advanced readers only: This is not tail recursive, there is a better way to write this function.)

      In general, tuples are used where "records" or "structs" are used in other languages. Also, lists are used when representing things with varying sizes, that is, where linked lists are used in other languages.

      Erlang does not have a string data type. Instead, strings can be represented by lists of Unicode characters. This implies for example that the list [97,98,99] is equivalent to "abc". The Erlang shell is "clever" and guesses what list you -mean and outputs it in what it thinks is the most appropriate form, for example:

      30> [97,98,99].
      +mean and outputs it in what it thinks is the most appropriate form, for example:

      30> [97,98,99].
       "abc"

      @@ -350,75 +350,75 @@

      Maps

      Maps are a set of key to value associations. These associations are encapsulated -with #{ and }. To create an association from "key" to value 42:

      > #{ "key" => 42 }.
      -#{"key" => 42}

      Let us jump straight into the deep end with an example using some interesting +with #{ and }. To create an association from "key" to value 42:

      > #{ "key" => 42 }.
      +#{"key" => 42}

      Let us jump straight into the deep end with an example using some interesting features.

      The following example shows how to calculate alpha blending using maps to -reference color and alpha channels. Enter the code in a file named color.erl):

      -module(color).
      +reference color and alpha channels. Enter the code in a file named color.erl):

      -module(color).
       
      --export([new/4, blend/2]).
      +-export([new/4, blend/2]).
       
      --define(is_channel(V), (is_float(V) andalso V >= 0.0 andalso V =< 1.0)).
      +-define(is_channel(V), (is_float(V) andalso V >= 0.0 andalso V =< 1.0)).
       
      -new(R,G,B,A) when ?is_channel(R), ?is_channel(G),
      -                  ?is_channel(B), ?is_channel(A) ->
      -    #{red => R, green => G, blue => B, alpha => A}.
      +new(R,G,B,A) when ?is_channel(R), ?is_channel(G),
      +                  ?is_channel(B), ?is_channel(A) ->
      +    #{red => R, green => G, blue => B, alpha => A}.
       
      -blend(Src,Dst) ->
      -    blend(Src,Dst,alpha(Src,Dst)).
      +blend(Src,Dst) ->
      +    blend(Src,Dst,alpha(Src,Dst)).
       
      -blend(Src,Dst,Alpha) when Alpha > 0.0 ->
      -    Dst#{
      -        red   := red(Src,Dst) / Alpha,
      -        green := green(Src,Dst) / Alpha,
      -        blue  := blue(Src,Dst) / Alpha,
      +blend(Src,Dst,Alpha) when Alpha > 0.0 ->
      +    Dst#{
      +        red   := red(Src,Dst) / Alpha,
      +        green := green(Src,Dst) / Alpha,
      +        blue  := blue(Src,Dst) / Alpha,
               alpha := Alpha
      -    };
      -blend(_,Dst,_) ->
      -    Dst#{
      +    };
      +blend(_,Dst,_) ->
      +    Dst#{
               red   := 0.0,
               green := 0.0,
               blue  := 0.0,
               alpha := 0.0
      -    }.
      -
      -alpha(#{alpha := SA}, #{alpha := DA}) ->
      -    SA + DA*(1.0 - SA).
      -
      -red(#{red := SV, alpha := SA}, #{red := DV, alpha := DA}) ->
      -    SV*SA + DV*DA*(1.0 - SA).
      -green(#{green := SV, alpha := SA}, #{green := DV, alpha := DA}) ->
      -    SV*SA + DV*DA*(1.0 - SA).
      -blue(#{blue := SV, alpha := SA}, #{blue := DV, alpha := DA}) ->
      -    SV*SA + DV*DA*(1.0 - SA).

      Compile and test:

      > c(color).
      -{ok,color}
      -> C1 = color:new(0.3,0.4,0.5,1.0).
      -#{alpha => 1.0,blue => 0.5,green => 0.4,red => 0.3}
      -> C2 = color:new(1.0,0.8,0.1,0.3).
      -#{alpha => 0.3,blue => 0.1,green => 0.8,red => 1.0}
      -> color:blend(C1,C2).
      -#{alpha => 1.0,blue => 0.5,green => 0.4,red => 0.3}
      -> color:blend(C2,C1).
      -#{alpha => 1.0,blue => 0.38,green => 0.52,red => 0.51}

      This example warrants some explanation:

      -define(is_channel(V), (is_float(V) andalso V >= 0.0 andalso V =< 1.0)).

      First a macro is_channel is defined to help with the guard tests. This is only + }. + +alpha(#{alpha := SA}, #{alpha := DA}) -> + SA + DA*(1.0 - SA). + +red(#{red := SV, alpha := SA}, #{red := DV, alpha := DA}) -> + SV*SA + DV*DA*(1.0 - SA). +green(#{green := SV, alpha := SA}, #{green := DV, alpha := DA}) -> + SV*SA + DV*DA*(1.0 - SA). +blue(#{blue := SV, alpha := SA}, #{blue := DV, alpha := DA}) -> + SV*SA + DV*DA*(1.0 - SA).

      Compile and test:

      > c(color).
      +{ok,color}
      +> C1 = color:new(0.3,0.4,0.5,1.0).
      +#{alpha => 1.0,blue => 0.5,green => 0.4,red => 0.3}
      +> C2 = color:new(1.0,0.8,0.1,0.3).
      +#{alpha => 0.3,blue => 0.1,green => 0.8,red => 1.0}
      +> color:blend(C1,C2).
      +#{alpha => 1.0,blue => 0.5,green => 0.4,red => 0.3}
      +> color:blend(C2,C1).
      +#{alpha => 1.0,blue => 0.38,green => 0.52,red => 0.51}

      This example warrants some explanation:

      -define(is_channel(V), (is_float(V) andalso V >= 0.0 andalso V =< 1.0)).

      First a macro is_channel is defined to help with the guard tests. This is only here for convenience and to reduce syntax cluttering. For more information about -macros, see The Preprocessor.

      new(R,G,B,A) when ?is_channel(R), ?is_channel(G),
      -                  ?is_channel(B), ?is_channel(A) ->
      -    #{red => R, green => G, blue => B, alpha => A}.

      The function new/4 creates a new map term and lets the keys red, green, +macros, see The Preprocessor.

      new(R,G,B,A) when ?is_channel(R), ?is_channel(G),
      +                  ?is_channel(B), ?is_channel(A) ->
      +    #{red => R, green => G, blue => B, alpha => A}.

      The function new/4 creates a new map term and lets the keys red, green, blue, and alpha be associated with an initial value. In this case, only float values between and including 0.0 and 1.0 are allowed, as ensured by the ?is_channel/1 macro for each argument. Only the => operator is allowed when creating a new map.

      By calling blend/2 on any color term created by new/4, the resulting color -can be calculated as determined by the two map terms.

      The first thing blend/2 does is to calculate the resulting alpha channel:

      alpha(#{alpha := SA}, #{alpha := DA}) ->
      -    SA + DA*(1.0 - SA).

      The value associated with key alpha is fetched for both arguments using the +can be calculated as determined by the two map terms.

      The first thing blend/2 does is to calculate the resulting alpha channel:

      alpha(#{alpha := SA}, #{alpha := DA}) ->
      +    SA + DA*(1.0 - SA).

      The value associated with key alpha is fetched for both arguments using the := operator. The other keys in the map are ignored, only the key alpha is -required and checked for.

      This is also the case for functions red/2, blue/2, and green/2.

      red(#{red := SV, alpha := SA}, #{red := DV, alpha := DA}) ->
      -    SV*SA + DV*DA*(1.0 - SA).

      The difference here is that a check is made for two keys in each map argument. -The other keys are ignored.

      Finally, let us return the resulting color in blend/3:

      blend(Src,Dst,Alpha) when Alpha > 0.0 ->
      -    Dst#{
      -        red   := red(Src,Dst) / Alpha,
      -        green := green(Src,Dst) / Alpha,
      -        blue  := blue(Src,Dst) / Alpha,
      +required and checked for.

      This is also the case for functions red/2, blue/2, and green/2.

      red(#{red := SV, alpha := SA}, #{red := DV, alpha := DA}) ->
      +    SV*SA + DV*DA*(1.0 - SA).

      The difference here is that a check is made for two keys in each map argument. +The other keys are ignored.

      Finally, let us return the resulting color in blend/3:

      blend(Src,Dst,Alpha) when Alpha > 0.0 ->
      +    Dst#{
      +        red   := red(Src,Dst) / Alpha,
      +        green := green(Src,Dst) / Alpha,
      +        blue  := blue(Src,Dst) / Alpha,
               alpha := Alpha
      -    };

      The Dst map is updated with new channel values. The syntax for updating an + };

      The Dst map is updated with new channel values. The syntax for updating an existing key with a new value is with the := operator.

      @@ -446,16 +446,16 @@

      It is nice to be able to do formatted output in examples, so the next example shows a simple way to use the io:format/2 function. Like all other exported -functions, you can test the io:format/2 function in the shell:

      31> io:format("hello world~n", []).
      +functions, you can test the io:format/2 function in the shell:

      31> io:format("hello world~n", []).
       hello world
       ok
      -32> io:format("this outputs one Erlang term: ~w~n", [hello]).
      +32> io:format("this outputs one Erlang term: ~w~n", [hello]).
       this outputs one Erlang term: hello
       ok
      -33> io:format("this outputs two Erlang terms: ~w~w~n", [hello, world]).
      +33> io:format("this outputs two Erlang terms: ~w~w~n", [hello, world]).
       this outputs two Erlang terms: helloworld
       ok
      -34> io:format("this outputs two Erlang terms: ~w ~w~n", [hello, world]).
      +34> io:format("this outputs two Erlang terms: ~w ~w~n", [hello, world]).
       this outputs two Erlang terms: hello world
       ok

      The function io:format/2 (that is, format with two arguments) takes two lists. The first one is nearly always a list written between " ". This list is printed @@ -477,26 +477,26 @@

      Some of them are in Celsius and some in Fahrenheit (as in the previous list). First let us convert them all to Celsius, then let us print the data neatly.

      %% This module is in file tut5.erl
       
      --module(tut5).
      --export([format_temps/1]).
      +-module(tut5).
      +-export([format_temps/1]).
       
       %% Only this function is exported
      -format_temps([])->                        % No output for an empty list
      +format_temps([])->                        % No output for an empty list
           ok;
      -format_temps([City | Rest]) ->
      -    print_temp(convert_to_celsius(City)),
      -    format_temps(Rest).
      -
      -convert_to_celsius({Name, {c, Temp}}) ->  % No conversion needed
      -    {Name, {c, Temp}};
      -convert_to_celsius({Name, {f, Temp}}) ->  % Do the conversion
      -    {Name, {c, (Temp - 32) * 5 / 9}}.
      -
      -print_temp({Name, {c, Temp}}) ->
      -    io:format("~-15w ~w c~n", [Name, Temp]).
      35> c(tut5).
      -{ok,tut5}
      -36> tut5:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      -{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      +format_temps([City | Rest]) ->
      +    print_temp(convert_to_celsius(City)),
      +    format_temps(Rest).
      +
      +convert_to_celsius({Name, {c, Temp}}) ->  % No conversion needed
      +    {Name, {c, Temp}};
      +convert_to_celsius({Name, {f, Temp}}) ->  % Do the conversion
      +    {Name, {c, (Temp - 32) * 5 / 9}}.
      +
      +print_temp({Name, {c, Temp}}) ->
      +    io:format("~-15w ~w c~n", [Name, Temp]).
      35> c(tut5).
      +{ok,tut5}
      +36> tut5:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      +{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
       moscow          -10 c
       cape_town       21.11111111111111 c
       stockholm       -4 c
      @@ -532,20 +532,20 @@ 

      It can be useful to find the maximum and minimum temperature in lists like this. Before extending the program to do this, let us look at functions for finding -the maximum value of the elements in a list:

      -module(tut6).
      --export([list_max/1]).
      +the maximum value of the elements in a list:

      -module(tut6).
      +-export([list_max/1]).
       
      -list_max([Head|Rest]) ->
      -   list_max(Rest, Head).
      +list_max([Head|Rest]) ->
      +   list_max(Rest, Head).
       
      -list_max([], Res) ->
      +list_max([], Res) ->
           Res;
      -list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->
      -    list_max(Rest, Head);
      -list_max([Head|Rest], Result_so_far)  ->
      -    list_max(Rest, Result_so_far).
      37> c(tut6).
      -{ok,tut6}
      -38> tut6:list_max([1,2,3,4,5,7,4,3,2,1]).
      +list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->
      +    list_max(Rest, Head);
      +list_max([Head|Rest], Result_so_far)  ->
      +    list_max(Rest, Result_so_far).
      37> c(tut6).
      +{ok,tut6}
      +38> tut6:list_max([1,2,3,4,5,7,4,3,2,1]).
       7

      First notice that two functions have the same name, list_max. However, each of these takes a different number of arguments (parameters). In Erlang these are regarded as completely different functions. Where you need to distinguish @@ -582,109 +582,109 @@

      ** exception error: no match of right hand side value 6 42> N = M + 1. 6

      The use of the match operator is particularly useful for pulling apart Erlang -terms and creating new ones.

      43> {X, Y} = {paris, {f, 28}}.
      -{paris,{f,28}}
      +terms and creating new ones.

      43> {X, Y} = {paris, {f, 28}}.
      +{paris,{f,28}}
       44> X.
       paris
       45> Y.
      -{f,28}

      Here X gets the value paris and Y the value {f,28}.

      If you try to do the same again with another city, an error is returned:

      46> {X, Y} = {london, {f, 36}}.
      +{f,28}

      Here X gets the value paris and Y the value {f,28}.

      If you try to do the same again with another city, an error is returned:

      46> {X, Y} = {london, {f, 36}}.
       ** exception error: no match of right hand side value {london,{f,36}}

      Variables can also be used to improve the readability of programs. For example, -in function list_max/2 above, you can write:

      list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->
      +in function list_max/2 above, you can write:

      list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->
           New_result_far = Head,
      -    list_max(Rest, New_result_far);

      This is possibly a little clearer.

      + list_max(Rest, New_result_far);

      This is possibly a little clearer.

      More About Lists

      -

      Remember that the | operator can be used to get the head of a list:

      47> [M1|T1] = [paris, london, rome].
      -[paris,london,rome]
      +

      Remember that the | operator can be used to get the head of a list:

      47> [M1|T1] = [paris, london, rome].
      +[paris,london,rome]
       48> M1.
       paris
       49> T1.
      -[london,rome]

      The | operator can also be used to add a head to a list:

      50> L1 = [madrid | T1].
      -[madrid,london,rome]
      +[london,rome]

      The | operator can also be used to add a head to a list:

      50> L1 = [madrid | T1].
      +[madrid,london,rome]
       51> L1.
      -[madrid,london,rome]

      Now an example of this when working with lists - reversing the order of a list:

      -module(tut8).
      +[madrid,london,rome]

      Now an example of this when working with lists - reversing the order of a list:

      -module(tut8).
       
      --export([reverse/1]).
      -
      -reverse(List) ->
      -    reverse(List, []).
      -
      -reverse([Head | Rest], Reversed_List) ->
      -    reverse(Rest, [Head | Reversed_List]);
      -reverse([], Reversed_List) ->
      -    Reversed_List.
      52> c(tut8).
      -{ok,tut8}
      -53> tut8:reverse([1,2,3]).
      -[3,2,1]

      Consider how Reversed_List is built. It starts as [], then successively the +-export([reverse/1]). + +reverse(List) -> + reverse(List, []). + +reverse([Head | Rest], Reversed_List) -> + reverse(Rest, [Head | Reversed_List]); +reverse([], Reversed_List) -> + Reversed_List.

      52> c(tut8).
      +{ok,tut8}
      +53> tut8:reverse([1,2,3]).
      +[3,2,1]

      Consider how Reversed_List is built. It starts as [], then successively the heads are taken off of the list to be reversed and added to the the -Reversed_List, as shown in the following:

      reverse([1|2,3], []) =>
      -    reverse([2,3], [1|[]])
      +Reversed_List, as shown in the following:

      reverse([1|2,3], []) =>
      +    reverse([2,3], [1|[]])
       
      -reverse([2|3], [1]) =>
      -    reverse([3], [2|[1])
      +reverse([2|3], [1]) =>
      +    reverse([3], [2|[1])
       
      -reverse([3|[]], [2,1]) =>
      -    reverse([], [3|[2,1]])
      +reverse([3|[]], [2,1]) =>
      +    reverse([], [3|[2,1]])
       
      -reverse([], [3,2,1]) =>
      -    [3,2,1]

      The module lists contains many functions for manipulating lists, for example, +reverse([], [3,2,1]) => + [3,2,1]

      The module lists contains many functions for manipulating lists, for example, for reversing them. So before writing a list-manipulating function it is a good idea to check if one not already is written for you (see the lists manual page in STDLIB).

      Now let us get back to the cities and temperatures, but take a more structured -approach this time. First let us convert the whole list to Celsius as follows:

      -module(tut7).
      --export([format_temps/1]).
      -
      -format_temps(List_of_cities) ->
      -    convert_list_to_c(List_of_cities).
      -
      -convert_list_to_c([{Name, {f, F}} | Rest]) ->
      -    Converted_City = {Name, {c, (F -32)* 5 / 9}},
      -    [Converted_City | convert_list_to_c(Rest)];
      -
      -convert_list_to_c([City | Rest]) ->
      -    [City | convert_list_to_c(Rest)];
      -
      -convert_list_to_c([]) ->
      -    [].

      Test the function:

      54> c(tut7).
      -{ok, tut7}.
      -55> tut7:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      -{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      -[{moscow,{c,-10}},
      - {cape_town,{c,21.11111111111111}},
      - {stockholm,{c,-4}},
      - {paris,{c,-2.2222222222222223}},
      - {london,{c,2.2222222222222223}}]

      Explanation:

      format_temps(List_of_cities) ->
      -    convert_list_to_c(List_of_cities).

      Here format_temps/1 calls convert_list_to_c/1. convert_list_to_c/1 takes +approach this time. First let us convert the whole list to Celsius as follows:

      -module(tut7).
      +-export([format_temps/1]).
      +
      +format_temps(List_of_cities) ->
      +    convert_list_to_c(List_of_cities).
      +
      +convert_list_to_c([{Name, {f, F}} | Rest]) ->
      +    Converted_City = {Name, {c, (F -32)* 5 / 9}},
      +    [Converted_City | convert_list_to_c(Rest)];
      +
      +convert_list_to_c([City | Rest]) ->
      +    [City | convert_list_to_c(Rest)];
      +
      +convert_list_to_c([]) ->
      +    [].

      Test the function:

      54> c(tut7).
      +{ok, tut7}.
      +55> tut7:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      +{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      +[{moscow,{c,-10}},
      + {cape_town,{c,21.11111111111111}},
      + {stockholm,{c,-4}},
      + {paris,{c,-2.2222222222222223}},
      + {london,{c,2.2222222222222223}}]

      Explanation:

      format_temps(List_of_cities) ->
      +    convert_list_to_c(List_of_cities).

      Here format_temps/1 calls convert_list_to_c/1. convert_list_to_c/1 takes off the head of the List_of_cities, converts it to Celsius if needed. The | -operator is used to add the (maybe) converted to the converted rest of the list:

      [Converted_City | convert_list_to_c(Rest)];

      or:

      [City | convert_list_to_c(Rest)];

      This is done until the end of the list is reached, that is, the list is empty:

      convert_list_to_c([]) ->
      -    [].

      Now when the list is converted, a function to print it is added:

      -module(tut7).
      --export([format_temps/1]).
      -
      -format_temps(List_of_cities) ->
      -    Converted_List = convert_list_to_c(List_of_cities),
      -    print_temp(Converted_List).
      -
      -convert_list_to_c([{Name, {f, F}} | Rest]) ->
      -    Converted_City = {Name, {c, (F -32)* 5 / 9}},
      -    [Converted_City | convert_list_to_c(Rest)];
      -
      -convert_list_to_c([City | Rest]) ->
      -    [City | convert_list_to_c(Rest)];
      -
      -convert_list_to_c([]) ->
      -    [].
      -
      -print_temp([{Name, {c, Temp}} | Rest]) ->
      -    io:format("~-15w ~w c~n", [Name, Temp]),
      -    print_temp(Rest);
      -print_temp([]) ->
      -    ok.
      56> c(tut7).
      -{ok,tut7}
      -57> tut7:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      -{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      +operator is used to add the (maybe) converted to the converted rest of the list:

      [Converted_City | convert_list_to_c(Rest)];

      or:

      [City | convert_list_to_c(Rest)];

      This is done until the end of the list is reached, that is, the list is empty:

      convert_list_to_c([]) ->
      +    [].

      Now when the list is converted, a function to print it is added:

      -module(tut7).
      +-export([format_temps/1]).
      +
      +format_temps(List_of_cities) ->
      +    Converted_List = convert_list_to_c(List_of_cities),
      +    print_temp(Converted_List).
      +
      +convert_list_to_c([{Name, {f, F}} | Rest]) ->
      +    Converted_City = {Name, {c, (F -32)* 5 / 9}},
      +    [Converted_City | convert_list_to_c(Rest)];
      +
      +convert_list_to_c([City | Rest]) ->
      +    [City | convert_list_to_c(Rest)];
      +
      +convert_list_to_c([]) ->
      +    [].
      +
      +print_temp([{Name, {c, Temp}} | Rest]) ->
      +    io:format("~-15w ~w c~n", [Name, Temp]),
      +    print_temp(Rest);
      +print_temp([]) ->
      +    ok.
      56> c(tut7).
      +{ok,tut7}
      +57> tut7:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      +{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
       moscow          -10 c
       cape_town       21.11111111111111 c
       stockholm       -4 c
      @@ -694,60 +694,60 @@ 

      temperatures. The following program is not the most efficient way of doing this as you walk through the list of cities four times. But it is better to first strive for clarity and correctness and to make programs efficient only if -needed.

      -module(tut7).
      --export([format_temps/1]).
      +needed.

      -module(tut7).
      +-export([format_temps/1]).
       
      -format_temps(List_of_cities) ->
      -    Converted_List = convert_list_to_c(List_of_cities),
      -    print_temp(Converted_List),
      -    {Max_city, Min_city} = find_max_and_min(Converted_List),
      -    print_max_and_min(Max_city, Min_city).
      +format_temps(List_of_cities) ->
      +    Converted_List = convert_list_to_c(List_of_cities),
      +    print_temp(Converted_List),
      +    {Max_city, Min_city} = find_max_and_min(Converted_List),
      +    print_max_and_min(Max_city, Min_city).
       
      -convert_list_to_c([{Name, {f, Temp}} | Rest]) ->
      -    Converted_City = {Name, {c, (Temp -32)* 5 / 9}},
      -    [Converted_City | convert_list_to_c(Rest)];
      +convert_list_to_c([{Name, {f, Temp}} | Rest]) ->
      +    Converted_City = {Name, {c, (Temp -32)* 5 / 9}},
      +    [Converted_City | convert_list_to_c(Rest)];
       
      -convert_list_to_c([City | Rest]) ->
      -    [City | convert_list_to_c(Rest)];
      +convert_list_to_c([City | Rest]) ->
      +    [City | convert_list_to_c(Rest)];
       
      -convert_list_to_c([]) ->
      -    [].
      +convert_list_to_c([]) ->
      +    [].
       
      -print_temp([{Name, {c, Temp}} | Rest]) ->
      -    io:format("~-15w ~w c~n", [Name, Temp]),
      -    print_temp(Rest);
      -print_temp([]) ->
      +print_temp([{Name, {c, Temp}} | Rest]) ->
      +    io:format("~-15w ~w c~n", [Name, Temp]),
      +    print_temp(Rest);
      +print_temp([]) ->
           ok.
       
      -find_max_and_min([City | Rest]) ->
      -    find_max_and_min(Rest, City, City).
      +find_max_and_min([City | Rest]) ->
      +    find_max_and_min(Rest, City, City).
       
      -find_max_and_min([{Name, {c, Temp}} | Rest],
      -         {Max_Name, {c, Max_Temp}},
      -         {Min_Name, {c, Min_Temp}}) ->
      +find_max_and_min([{Name, {c, Temp}} | Rest],
      +         {Max_Name, {c, Max_Temp}},
      +         {Min_Name, {c, Min_Temp}}) ->
           if
               Temp > Max_Temp ->
      -            Max_City = {Name, {c, Temp}};           % Change
      +            Max_City = {Name, {c, Temp}};           % Change
               true ->
      -            Max_City = {Max_Name, {c, Max_Temp}} % Unchanged
      +            Max_City = {Max_Name, {c, Max_Temp}} % Unchanged
           end,
           if
                Temp < Min_Temp ->
      -            Min_City = {Name, {c, Temp}};           % Change
      +            Min_City = {Name, {c, Temp}};           % Change
               true ->
      -            Min_City = {Min_Name, {c, Min_Temp}} % Unchanged
      +            Min_City = {Min_Name, {c, Min_Temp}} % Unchanged
           end,
      -    find_max_and_min(Rest, Max_City, Min_City);
      +    find_max_and_min(Rest, Max_City, Min_City);
       
      -find_max_and_min([], Max_City, Min_City) ->
      -    {Max_City, Min_City}.
      +find_max_and_min([], Max_City, Min_City) ->
      +    {Max_City, Min_City}.
       
      -print_max_and_min({Max_name, {c, Max_temp}}, {Min_name, {c, Min_temp}}) ->
      -    io:format("Max temperature was ~w c in ~w~n", [Max_temp, Max_name]),
      -    io:format("Min temperature was ~w c in ~w~n", [Min_temp, Min_name]).
      58> c(tut7).
      -{ok, tut7}
      -59> tut7:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      -{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      +print_max_and_min({Max_name, {c, Max_temp}}, {Min_name, {c, Min_temp}}) ->
      +    io:format("Max temperature was ~w c in ~w~n", [Max_temp, Max_name]),
      +    io:format("Min temperature was ~w c in ~w~n", [Min_temp, Min_name]).
      58> c(tut7).
      +{ok, tut7}
      +59> tut7:format_temps([{moscow, {c, -10}}, {cape_town, {f, 70}},
      +{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
       moscow          -10 c
       cape_town       21.11111111111111 c
       stockholm       -4 c
      @@ -777,80 +777,80 @@ 

      following the condition and ignores all other conditions and actions before the end. If no condition matches, a run-time failure occurs. A condition that always succeeds is the atom true. This is often used last in an if, meaning, -do the action following the true if all other conditions have failed.

      The following is a short program to show the workings of if.

      -module(tut9).
      --export([test_if/2]).
      +do the action following the true if all other conditions have failed.

      The following is a short program to show the workings of if.

      -module(tut9).
      +-export([test_if/2]).
       
      -test_if(A, B) ->
      +test_if(A, B) ->
           if
               A == 5 ->
      -            io:format("A == 5~n", []),
      +            io:format("A == 5~n", []),
                   a_equals_5;
               B == 6 ->
      -            io:format("B == 6~n", []),
      +            io:format("B == 6~n", []),
                   b_equals_6;
               A == 2, B == 3 ->                      %That is A equals 2 and B equals 3
      -            io:format("A == 2, B == 3~n", []),
      +            io:format("A == 2, B == 3~n", []),
                   a_equals_2_b_equals_3;
               A == 1 ; B == 7 ->                     %That is A equals 1 or B equals 7
      -            io:format("A == 1 ; B == 7~n", []),
      +            io:format("A == 1 ; B == 7~n", []),
                   a_equals_1_or_b_equals_7
      -    end.

      Testing this program gives:

      60> c(tut9).
      -{ok,tut9}
      -61> tut9:test_if(5,33).
      +    end.

      Testing this program gives:

      60> c(tut9).
      +{ok,tut9}
      +61> tut9:test_if(5,33).
       A == 5
       a_equals_5
      -62> tut9:test_if(33,6).
      +62> tut9:test_if(33,6).
       B == 6
       b_equals_6
      -63> tut9:test_if(2, 3).
      +63> tut9:test_if(2, 3).
       A == 2, B == 3
       a_equals_2_b_equals_3
      -64> tut9:test_if(1, 33).
      +64> tut9:test_if(1, 33).
       A == 1 ; B == 7
       a_equals_1_or_b_equals_7
      -65> tut9:test_if(33, 7).
      +65> tut9:test_if(33, 7).
       A == 1 ; B == 7
       a_equals_1_or_b_equals_7
      -66> tut9:test_if(33, 33).
      +66> tut9:test_if(33, 33).
       ** exception error: no true branch found when evaluating an if expression
            in function  tut9:test_if/2 (tut9.erl, line 5)

      Notice that tut9:test_if(33,33) does not cause any condition to succeed. This leads to the run time error if_clause, here nicely formatted by the shell. See Guard Sequences for details of the many guard tests available.

      case is another construct in Erlang. Recall that the convert_length function -was written as:

      convert_length({centimeter, X}) ->
      -    {inch, X / 2.54};
      -convert_length({inch, Y}) ->
      -    {centimeter, Y * 2.54}.

      The same program can also be written as:

      -module(tut10).
      --export([convert_length/1]).
      +was written as:

      convert_length({centimeter, X}) ->
      +    {inch, X / 2.54};
      +convert_length({inch, Y}) ->
      +    {centimeter, Y * 2.54}.

      The same program can also be written as:

      -module(tut10).
      +-export([convert_length/1]).
       
      -convert_length(Length) ->
      +convert_length(Length) ->
           case Length of
      -        {centimeter, X} ->
      -            {inch, X / 2.54};
      -        {inch, Y} ->
      -            {centimeter, Y * 2.54}
      -    end.
      67> c(tut10).
      -{ok,tut10}
      -68> tut10:convert_length({inch, 6}).
      -{centimeter,15.24}
      -69> tut10:convert_length({centimeter, 2.5}).
      -{inch,0.984251968503937}

      Both case and if have return values, that is, in the above example case + {centimeter, X} -> + {inch, X / 2.54}; + {inch, Y} -> + {centimeter, Y * 2.54} + end.

      67> c(tut10).
      +{ok,tut10}
      +68> tut10:convert_length({inch, 6}).
      +{centimeter,15.24}
      +69> tut10:convert_length({centimeter, 2.5}).
      +{inch,0.984251968503937}

      Both case and if have return values, that is, in the above example case returned either {inch,X/2.54} or {centimeter,Y*2.54}. The behaviour of case can also be modified by using guards. The following example clarifies this. It tells us the length of a month, given the year. The year must be known, -since February has 29 days in a leap year.

      -module(tut11).
      --export([month_length/2]).
      +since February has 29 days in a leap year.

      -module(tut11).
      +-export([month_length/2]).
       
      -month_length(Year, Month) ->
      +month_length(Year, Month) ->
           %% All years divisible by 400 are leap
           %% Years divisible by 100 are not leap (except the 400 rule above)
           %% Years divisible by 4 are leap (except the 100 rule above)
           Leap = if
      -        trunc(Year / 400) * 400 == Year ->
      +        trunc(Year / 400) * 400 == Year ->
                   leap;
      -        trunc(Year / 100) * 100 == Year ->
      +        trunc(Year / 100) * 100 == Year ->
                   not_leap;
      -        trunc(Year / 4) * 4 == Year ->
      +        trunc(Year / 4) * 4 == Year ->
                   leap;
               true ->
                   not_leap
      @@ -869,13 +869,13 @@ 

      aug -> 31; oct -> 31; dec -> 31 - end.

      70> c(tut11).
      -{ok,tut11}
      -71> tut11:month_length(2004, feb).
      +    end.
      70> c(tut11).
      +{ok,tut11}
      +71> tut11:month_length(2004, feb).
       29
      -72> tut11:month_length(2003, feb).
      +72> tut11:month_length(2003, feb).
       28
      -73> tut11:month_length(1947, aug).
      +73> tut11:month_length(1947, aug).
       31

      @@ -890,41 +890,41 @@

      it is a leap year. To determine this, first divide the year by 400 and use the BIF trunc (more about this later) to cut off any decimals. Then multiply by 400 again and see if the same value is returned again. For example, year 2004:

      2004 / 400 = 5.01
      -trunc(5.01) = 5
      +trunc(5.01) = 5
       5 * 400 = 2000

      2000 is not the same as 2004, so 2004 is not divisible by 400. Year 2000:

      2000 / 400 = 5.0
      -trunc(5.0) = 5
      +trunc(5.0) = 5
       5 * 400 = 2000

      That is, a leap year. The next two trunc-tests evaluate if the year is divisible by 100 or 4 in the same way. The first if returns leap or not_leap, which lands up in the variable Leap. This variable is used in the guard for feb in the following case that tells us how long the month is.

      This example showed the use of trunc. It is easier to use the Erlang operator rem that gives the remainder after division, for example:

      74> 2004 rem 400.
      -4

      So instead of writing:

      trunc(Year / 400) * 400 == Year ->
      +4

      So instead of writing:

      trunc(Year / 400) * 400 == Year ->
           leap;

      it can be written:

      Year rem 400 == 0 ->
           leap;

      There are many other BIFs such as trunc. Only a few BIFs can be used in guards, and you cannot use functions you have defined yourself in guards. (see Guard Sequences) (For advanced readers: This is to ensure that guards do not have side effects.) Let us play with a few of these -functions in the shell:

      75> trunc(5.6).
      +functions in the shell:

      75> trunc(5.6).
       5
      -76> round(5.6).
      +76> round(5.6).
       6
      -77> length([a,b,c,d]).
      +77> length([a,b,c,d]).
       4
      -78> float(5).
      +78> float(5).
       5.0
      -79> is_atom(hello).
      +79> is_atom(hello).
       true
      -80> is_atom("hello").
      +80> is_atom("hello").
       false
      -81> is_tuple({paris, {c, 30}}).
      +81> is_tuple({paris, {c, 30}}).
       true
      -82> is_tuple([paris, {c, 30}]).
      +82> is_tuple([paris, {c, 30}]).
       false

      All of these can be used in guards. Now for some BIFs that cannot be used in -guards:

      83> atom_to_list(hello).
      +guards:

      83> atom_to_list(hello).
       "hello"
      -84> list_to_atom("goodbye").
      +84> list_to_atom("goodbye").
       goodbye
      -85> integer_to_list(22).
      +85> integer_to_list(22).
       "22"

      These three BIFs do conversions that would be difficult (or impossible) to do in Erlang.

      @@ -933,80 +933,80 @@

      Higher-Order Functions (Funs)

      Erlang, like most modern functional programming languages, has higher-order -functions. Here is an example using the shell:

      86> Xf = fun(X) -> X * 2 end.
      +functions. Here is an example using the shell:

      86> Xf = fun(X) -> X * 2 end.
       #Fun<erl_eval.5.123085357>
      -87> Xf(5).
      +87> Xf(5).
       10

      Here is defined a function that doubles the value of a number and assigned this function to a variable. Thus Xf(5) returns value 10. Two useful functions when -working with lists are foreach and map, which are defined as follows:

      foreach(Fun, [First|Rest]) ->
      -    Fun(First),
      -    foreach(Fun, Rest);
      -foreach(Fun, []) ->
      +working with lists are foreach and map, which are defined as follows:

      foreach(Fun, [First|Rest]) ->
      +    Fun(First),
      +    foreach(Fun, Rest);
      +foreach(Fun, []) ->
           ok.
       
      -map(Fun, [First|Rest]) ->
      -    [Fun(First)|map(Fun,Rest)];
      -map(Fun, []) ->
      -    [].

      These two functions are provided in the standard module lists. foreach takes +map(Fun, [First|Rest]) -> + [Fun(First)|map(Fun,Rest)]; +map(Fun, []) -> + [].

      These two functions are provided in the standard module lists. foreach takes a list and applies a fun to every element in the list. map creates a new list by applying a fun to every element in a list. Going back to the shell, map is -used and a fun to add 3 to every element of a list:

      88> Add_3 = fun(X) -> X + 3 end.
      +used and a fun to add 3 to every element of a list:

      88> Add_3 = fun(X) -> X + 3 end.
       #Fun<erl_eval.5.123085357>
      -89> lists:map(Add_3, [1,2,3]).
      -[4,5,6]

      Let us (again) print the temperatures in a list of cities:

      90> Print_City = fun({City, {X, Temp}}) -> io:format("~-15w ~w ~w~n",
      -[City, X, Temp]) end.
      +89> lists:map(Add_3, [1,2,3]).
      +[4,5,6]

      Let us (again) print the temperatures in a list of cities:

      90> Print_City = fun({City, {X, Temp}}) -> io:format("~-15w ~w ~w~n",
      +[City, X, Temp]) end.
       #Fun<erl_eval.5.123085357>
      -91> lists:foreach(Print_City, [{moscow, {c, -10}}, {cape_town, {f, 70}},
      -{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      +91> lists:foreach(Print_City, [{moscow, {c, -10}}, {cape_town, {f, 70}},
      +{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
       moscow          c -10
       cape_town       f 70
       stockholm       c -4
       paris           f 28
       london          f 36
       ok

      Let us now define a fun that can be used to go through a list of cities and -temperatures and transform them all to Celsius.

      -module(tut13).
      +temperatures and transform them all to Celsius.

      -module(tut13).
       
      --export([convert_list_to_c/1]).
      -
      -convert_to_c({Name, {f, Temp}}) ->
      -    {Name, {c, trunc((Temp - 32) * 5 / 9)}};
      -convert_to_c({Name, {c, Temp}}) ->
      -    {Name, {c, Temp}}.
      -
      -convert_list_to_c(List) ->
      -    lists:map(fun convert_to_c/1, List).
      92> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}},
      -{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      -[{moscow,{c,-10}},
      - {cape_town,{c,21}},
      - {stockholm,{c,-4}},
      - {paris,{c,-2}},
      - {london,{c,2}}]

      The convert_to_c function is the same as before, but here it is used as a fun:

      lists:map(fun convert_to_c/1, List)

      When a function defined elsewhere is used as a fun, it can be referred to as +-export([convert_list_to_c/1]). + +convert_to_c({Name, {f, Temp}}) -> + {Name, {c, trunc((Temp - 32) * 5 / 9)}}; +convert_to_c({Name, {c, Temp}}) -> + {Name, {c, Temp}}. + +convert_list_to_c(List) -> + lists:map(fun convert_to_c/1, List).

      92> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}},
      +{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      +[{moscow,{c,-10}},
      + {cape_town,{c,21}},
      + {stockholm,{c,-4}},
      + {paris,{c,-2}},
      + {london,{c,2}}]

      The convert_to_c function is the same as before, but here it is used as a fun:

      lists:map(fun convert_to_c/1, List)

      When a function defined elsewhere is used as a fun, it can be referred to as Function/Arity (remember that Arity = number of arguments). So in the map-call lists:map(fun convert_to_c/1, List) is written. As shown, convert_list_to_c becomes much shorter and easier to understand.

      The standard module lists also contains a function sort(Fun, List) where Fun is a fun with two arguments. This fun returns true if the first argument is less than the second argument, or else false. Sorting is added to the -convert_list_to_c:

      -module(tut13).
      +convert_list_to_c:

      -module(tut13).
       
      --export([convert_list_to_c/1]).
      -
      -convert_to_c({Name, {f, Temp}}) ->
      -    {Name, {c, trunc((Temp - 32) * 5 / 9)}};
      -convert_to_c({Name, {c, Temp}}) ->
      -    {Name, {c, Temp}}.
      -
      -convert_list_to_c(List) ->
      -    New_list = lists:map(fun convert_to_c/1, List),
      -    lists:sort(fun({_, {c, Temp1}}, {_, {c, Temp2}}) ->
      -                       Temp1 < Temp2 end, New_list).
      93> c(tut13).
      -{ok,tut13}
      -94> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}},
      -{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      -[{moscow,{c,-10}},
      - {stockholm,{c,-4}},
      - {paris,{c,-2}},
      - {london,{c,2}},
      - {cape_town,{c,21}}]

      In sort the fun is used:

      fun({_, {c, Temp1}}, {_, {c, Temp2}}) -> Temp1 < Temp2 end,

      Here the concept of an anonymous variable _ is introduced. This is simply +-export([convert_list_to_c/1]). + +convert_to_c({Name, {f, Temp}}) -> + {Name, {c, trunc((Temp - 32) * 5 / 9)}}; +convert_to_c({Name, {c, Temp}}) -> + {Name, {c, Temp}}. + +convert_list_to_c(List) -> + New_list = lists:map(fun convert_to_c/1, List), + lists:sort(fun({_, {c, Temp1}}, {_, {c, Temp2}}) -> + Temp1 < Temp2 end, New_list).

      93> c(tut13).
      +{ok,tut13}
      +94> tut13:convert_list_to_c([{moscow, {c, -10}}, {cape_town, {f, 70}},
      +{stockholm, {c, -4}}, {paris, {f, 28}}, {london, {f, 36}}]).
      +[{moscow,{c,-10}},
      + {stockholm,{c,-4}},
      + {paris,{c,-2}},
      + {london,{c,2}},
      + {cape_town,{c,21}}]

      In sort the fun is used:

      fun({_, {c, Temp1}}, {_, {c, Temp2}}) -> Temp1 < Temp2 end,

      Here the concept of an anonymous variable _ is introduced. This is simply shorthand for a variable that gets a value, but the value is ignored. This can be used anywhere suitable, not just in funs. Temp1 < Temp2 returns true if Temp1 is less than Temp2.

      diff --git a/prs/9277/doc/system/spec_proc.html b/prs/9277/doc/system/spec_proc.html index 56fcbe3164f5a..520c200d133e9 100644 --- a/prs/9277/doc/system/spec_proc.html +++ b/prs/9277/doc/system/spec_proc.html @@ -127,64 +127,64 @@

      The sys module has functions for simple debugging of processes implemented using behaviours. The code_lock example from -gen_statem Behaviour is used to illustrate this:

      Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
      +gen_statem Behaviour is used to illustrate this:

      Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
       
      -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
      -1> code_lock:start_link([1,2,3,4]).
      +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
      +1> code_lock:start_link([1,2,3,4]).
       Lock
      -{ok,<0.90.0>}
      -2> sys:statistics(code_lock, true).
      +{ok,<0.90.0>}
      +2> sys:statistics(code_lock, true).
       ok
      -3> sys:trace(code_lock, true).
      +3> sys:trace(code_lock, true).
       ok
      -4> code_lock:button(1).
      -*DBG* code_lock receive cast {button,1} in state locked
      +4> code_lock:button(1).
      +*DBG* code_lock receive cast {button,1} in state locked
       ok
      -*DBG* code_lock consume cast {button,1} in state locked
      -5> code_lock:button(2).
      -*DBG* code_lock receive cast {button,2} in state locked
      +*DBG* code_lock consume cast {button,1} in state locked
      +5> code_lock:button(2).
      +*DBG* code_lock receive cast {button,2} in state locked
       ok
      -*DBG* code_lock consume cast {button,2} in state locked
      -6> code_lock:button(3).
      -*DBG* code_lock receive cast {button,3} in state locked
      +*DBG* code_lock consume cast {button,2} in state locked
      +6> code_lock:button(3).
      +*DBG* code_lock receive cast {button,3} in state locked
       ok
      -*DBG* code_lock consume cast {button,3} in state locked
      -7> code_lock:button(4).
      -*DBG* code_lock receive cast {button,4} in state locked
      +*DBG* code_lock consume cast {button,3} in state locked
      +7> code_lock:button(4).
      +*DBG* code_lock receive cast {button,4} in state locked
       ok
       Unlock
      -*DBG* code_lock consume cast {button,4} in state locked => open
      -*DBG* code_lock start_timer {state_timeout,10000,lock,[]} in state open
      +*DBG* code_lock consume cast {button,4} in state locked => open
      +*DBG* code_lock start_timer {state_timeout,10000,lock,[]} in state open
       *DBG* code_lock receive state_timeout lock in state open
       Lock
       *DBG* code_lock consume state_timeout lock in state open => locked
      -8> sys:statistics(code_lock, get).
      -{ok,[{start_time,{{2024,5,3},{8,11,1}}},
      -     {current_time,{{2024,5,3},{8,11,48}}},
      -     {reductions,4098},
      -     {messages_in,5},
      -     {messages_out,0}]}
      -9> sys:statistics(code_lock, false).
      +8> sys:statistics(code_lock, get).
      +{ok,[{start_time,{{2024,5,3},{8,11,1}}},
      +     {current_time,{{2024,5,3},{8,11,48}}},
      +     {reductions,4098},
      +     {messages_in,5},
      +     {messages_out,0}]}
      +9> sys:statistics(code_lock, false).
       ok
      -10> sys:trace(code_lock, false).
      +10> sys:trace(code_lock, false).
       ok
      -11> sys:get_status(code_lock).
      -{status,<0.90.0>,
      -        {module,gen_statem},
      -        [[{'$initial_call',{code_lock,init,1}},
      -          {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>,
      -                         <0.64.0>,kernel_sup,<0.47.0>]}],
      -         running,<0.88.0>,[],
      -         [{header,"Status for state machine code_lock"},
      -          {data,[{"Status",running},
      -                 {"Parent",<0.88.0>},
      -                 {"Modules",[code_lock]},
      -                 {"Time-outs",{0,[]}},
      -                 {"Logged Events",[]},
      -                 {"Postponed",[]}]},
      -          {data,[{"State",
      -                  {locked,#{code => [1,2,3,4],
      -                            length => 4,buttons => []}}}]}]]}

      +11> sys:get_status(code_lock). +{status,<0.90.0>, + {module,gen_statem}, + [[{'$initial_call',{code_lock,init,1}}, + {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>, + <0.64.0>,kernel_sup,<0.47.0>]}], + running,<0.88.0>,[], + [{header,"Status for state machine code_lock"}, + {data,[{"Status",running}, + {"Parent",<0.88.0>}, + {"Modules",[code_lock]}, + {"Time-outs",{0,[]}}, + {"Logged Events",[]}, + {"Postponed",[]}]}, + {data,[{"State", + {locked,#{code => [1,2,3,4], + length => 4,buttons => []}}}]}]]}

      @@ -202,109 +202,109 @@

      Here follows the simple server from Overview, -implemented using sys and proc_lib to fit into a supervision tree:

      -module(ch4).
      --export([start_link/0]).
      --export([alloc/0, free/1]).
      --export([init/1]).
      --export([system_continue/3, system_terminate/4,
      +implemented using sys and proc_lib to fit into a supervision tree:

      -module(ch4).
      +-export([start_link/0]).
      +-export([alloc/0, free/1]).
      +-export([init/1]).
      +-export([system_continue/3, system_terminate/4,
                write_debug/3,
      -         system_get_state/1, system_replace_state/2]).
      +         system_get_state/1, system_replace_state/2]).
       
      -start_link() ->
      -    proc_lib:start_link(ch4, init, [self()]).
      +start_link() ->
      +    proc_lib:start_link(ch4, init, [self()]).
       
      -alloc() ->
      -    ch4 ! {self(), alloc},
      +alloc() ->
      +    ch4 ! {self(), alloc},
           receive
      -        {ch4, Res} ->
      +        {ch4, Res} ->
                   Res
           end.
       
      -free(Ch) ->
      -    ch4 ! {free, Ch},
      +free(Ch) ->
      +    ch4 ! {free, Ch},
           ok.
       
      -init(Parent) ->
      -    register(ch4, self()),
      -    Chs = channels(),
      -    Deb = sys:debug_options([]),
      -    proc_lib:init_ack(Parent, {ok, self()}),
      -    loop(Chs, Parent, Deb).
      +init(Parent) ->
      +    register(ch4, self()),
      +    Chs = channels(),
      +    Deb = sys:debug_options([]),
      +    proc_lib:init_ack(Parent, {ok, self()}),
      +    loop(Chs, Parent, Deb).
       
      -loop(Chs, Parent, Deb) ->
      +loop(Chs, Parent, Deb) ->
           receive
      -        {From, alloc} ->
      -            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
      -                                    ch4, {in, alloc, From}),
      -            {Ch, Chs2} = alloc(Chs),
      -            From ! {ch4, Ch},
      -            Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
      -                                    ch4, {out, {ch4, Ch}, From}),
      -            loop(Chs2, Parent, Deb3);
      -        {free, Ch} ->
      -            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
      -                                    ch4, {in, {free, Ch}}),
      -            Chs2 = free(Ch, Chs),
      -            loop(Chs2, Parent, Deb2);
      -
      -        {system, From, Request} ->
      -            sys:handle_system_msg(Request, From, Parent,
      -                                  ch4, Deb, Chs)
      +        {From, alloc} ->
      +            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
      +                                    ch4, {in, alloc, From}),
      +            {Ch, Chs2} = alloc(Chs),
      +            From ! {ch4, Ch},
      +            Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
      +                                    ch4, {out, {ch4, Ch}, From}),
      +            loop(Chs2, Parent, Deb3);
      +        {free, Ch} ->
      +            Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
      +                                    ch4, {in, {free, Ch}}),
      +            Chs2 = free(Ch, Chs),
      +            loop(Chs2, Parent, Deb2);
      +
      +        {system, From, Request} ->
      +            sys:handle_system_msg(Request, From, Parent,
      +                                  ch4, Deb, Chs)
           end.
       
      -system_continue(Parent, Deb, Chs) ->
      -    loop(Chs, Parent, Deb).
      +system_continue(Parent, Deb, Chs) ->
      +    loop(Chs, Parent, Deb).
       
      -system_terminate(Reason, _Parent, _Deb, _Chs) ->
      -    exit(Reason).
      +system_terminate(Reason, _Parent, _Deb, _Chs) ->
      +    exit(Reason).
       
      -system_get_state(Chs) ->
      -    {ok, Chs}.
      +system_get_state(Chs) ->
      +    {ok, Chs}.
       
      -system_replace_state(StateFun, Chs) ->
      -    NChs = StateFun(Chs),
      -    {ok, NChs, NChs}.
      +system_replace_state(StateFun, Chs) ->
      +    NChs = StateFun(Chs),
      +    {ok, NChs, NChs}.
       
      -write_debug(Dev, Event, Name) ->
      -    io:format(Dev, "~p event = ~p~n", [Name, Event]).

      As it is not relevant to the example, the channel handling functions have been +write_debug(Dev, Event, Name) -> + io:format(Dev, "~p event = ~p~n", [Name, Event]).

      As it is not relevant to the example, the channel handling functions have been omitted. To compile this example, the implementation of channel handling needs to be added to the module.

      Here is an example showing how the debugging functions in the sys module can be used for ch4:

      % erl
      -Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
      +Erlang/OTP 27 [erts-15.0] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
       
      -Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
      -1> ch4:start_link().
      -{ok,<0.90.0>}
      -2> sys:statistics(ch4, true).
      +Eshell V15.0 (press Ctrl+G to abort, type help(). for help)
      +1> ch4:start_link().
      +{ok,<0.90.0>}
      +2> sys:statistics(ch4, true).
       ok
      -3> sys:trace(ch4, true).
      +3> sys:trace(ch4, true).
       ok
      -4> ch4:alloc().
      -ch4 event = {in,alloc,<0.88.0>}
      -ch4 event = {out,{ch4,1},<0.88.0>}
      +4> ch4:alloc().
      +ch4 event = {in,alloc,<0.88.0>}
      +ch4 event = {out,{ch4,1},<0.88.0>}
       1
      -5> ch4:free(ch1).
      -ch4 event = {in,{free,ch1}}
      +5> ch4:free(ch1).
      +ch4 event = {in,{free,ch1}}
       ok
      -6> sys:statistics(ch4, get).
      -{ok,[{start_time,{{2024,5,3},{8,26,13}}},
      -     {current_time,{{2024,5,3},{8,26,49}}},
      -     {reductions,202},
      -     {messages_in,2},
      -     {messages_out,1}]}
      -7> sys:statistics(ch4, false).
      +6> sys:statistics(ch4, get).
      +{ok,[{start_time,{{2024,5,3},{8,26,13}}},
      +     {current_time,{{2024,5,3},{8,26,49}}},
      +     {reductions,202},
      +     {messages_in,2},
      +     {messages_out,1}]}
      +7> sys:statistics(ch4, false).
       ok
      -8> sys:trace(ch4, false).
      +8> sys:trace(ch4, false).
       ok
      -9> sys:get_status(ch4).
      -{status,<0.90.0>,
      -        {module,ch4},
      -        [[{'$initial_call',{ch4,init,1}},
      -          {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>,
      -                         <0.64.0>,kernel_sup,<0.47.0>]}],
      -         running,<0.88.0>,[],
      -         {[1],[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19|...]}]}

      +9> sys:get_status(ch4). +{status,<0.90.0>, + {module,ch4}, + [[{'$initial_call',{ch4,init,1}}, + {'$ancestors',[<0.88.0>,<0.87.0>,<0.70.0>,<0.65.0>,<0.69.0>, + <0.64.0>,kernel_sup,<0.47.0>]}], + running,<0.88.0>,[], + {[1],[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19|...]}]}

      @@ -319,17 +319,17 @@

      is started through one of these functions.

      If the process terminates with a reason other than normal or shutdown, a crash report is generated. For more information about the crash report, see Logging in Kernel User's Guide.

      In the example, synchronous start is used. The process starts by calling -ch4:start_link():

      start_link() ->
      -    proc_lib:start_link(ch4, init, [self()]).

      ch4:start_link/0 calls proc_lib:start_link/3, which takes a module +ch4:start_link():

      start_link() ->
      +    proc_lib:start_link(ch4, init, [self()]).

      ch4:start_link/0 calls proc_lib:start_link/3, which takes a module name, a function name, and an argument list as arguments. It then spawns a new process and establishes a link. The new process starts by executing the given function, here ch4:init(Pid), where Pid is the pid of the parent process (obtained by the call to self() in the call to proc_lib:start_link/3).

      All initialization, including name registration, is done in init/1. The new -process has to acknowledge that it has been started to the parent:

      init(Parent) ->
      +process has to acknowledge that it has been started to the parent:

      init(Parent) ->
           ...
      -    proc_lib:init_ack(Parent, {ok, self()}),
      -    loop(...).

      proc_lib:start_link/3 is synchronous and does not return until + proc_lib:init_ack(Parent, {ok, self()}), + loop(...).

      proc_lib:start_link/3 is synchronous and does not return until proc_lib:init_ack/1,2 or proc_lib:init_fail/2,3 has been called, or the process has exited.

      @@ -339,14 +339,14 @@

      Debugging

      To support the debug facilities in sys, a debug structure is needed. The -Deb term is initialized using sys:debug_options/1:

      init(Parent) ->
      +Deb term is initialized using sys:debug_options/1:

      init(Parent) ->
           ...
      -    Deb = sys:debug_options([]),
      +    Deb = sys:debug_options([]),
           ...
      -    loop(Chs, Parent, Deb).

      sys:debug_options/1 takes a list of options. Given an empty list as in this + loop(Chs, Parent, Deb).

      sys:debug_options/1 takes a list of options. Given an empty list as in this example means that debugging is initially disabled. For information about the possible options, see sys in STDLIB.

      For each system event to be logged or traced, the following function -is to be called:

      sys:handle_debug(Deb, Func, Info, Event) => Deb1

      The arguments have the follow meaning:

      Now let's look at the implementation of move_xx:

      OpCase(move_xx):
      +{
      +  Eterm tmp_packed1 = BeamExtraData(I[0]);
      +  BeamInstr next_pf = BeamCodeAddr(I[1]);
      +  xb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
         I += 1;
      -  ASSERT(VALID_INSTR(next_pf));
      -  GotoPF(next_pf);
      -}

      We will go through the lines that are new or have changed compared to + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

      We will go through the lines that are new or have changed compared to move_cx.

      • Eterm tmp_packed1 = BeamExtraData(I[0]); picks up both X register numbers packed into the upper 32 bits of the instruction word.

      • BeamInstr next_pf = BeamCodeAddr(I[1]); pre-fetches the address of the next instruction. Note that because both X registers operands fits @@ -246,15 +246,15 @@

        copies the source to the destination. (For a 64-bit architecture, BEAM_TIGHT_SHIFT is 16 and BEAM_TIGHT_MASK is 0xFFFF.)

      • I += 1; advances the instruction pointer to the next instruction.

      move_xy is almost identical to move_xx. The only difference is the use of the yb() macro instead of xb() to reference the -destination register:

      OpCase(move_xy):
      -{
      -  Eterm tmp_packed1 = BeamExtraData(I[0]);
      -  BeamInstr next_pf = BeamCodeAddr(I[1]);
      -  yb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
      +destination register:

      OpCase(move_xy):
      +{
      +  Eterm tmp_packed1 = BeamExtraData(I[0]);
      +  BeamInstr next_pf = BeamCodeAddr(I[1]);
      +  yb((tmp_packed1>>BEAM_TIGHT_SHIFT)) = xb(tmp_packed1&BEAM_TIGHT_MASK);
         I += 1;
      -  ASSERT(VALID_INSTR(next_pf));
      -  GotoPF(next_pf);
      -}

      + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

      @@ -275,13 +275,13 @@

      move2 x y x y // In instrs.tab -move2(S1, D1, S2, D2) { +move2(S1, D1, S2, D2) { Eterm V1, V2; V1 = $S1; V2 = $S2; $D1 = V1; $D2 = V2; -}

      When the loader has found a match and replaced the matched instructions, +}

      When the loader has found a match and replaced the matched instructions, it will match the new instructions against the transformation rules. Because of that, we can define the rule for a move3/6 instruction as follows:

      move2 X1=x Y1=y X2=x Y2=y | move X3=x Y3=y =>
      @@ -437,21 +437,21 @@ 

      i_fcheckerror fclearerror %endif

      It is also possible to add an %else clause:

      %if ARCH_64
      -BS_SAFE_MUL(A, B, Fail, Dst) {
      -    Uint64 res = ($A) * ($B);
      -    if (res / $B != $A) {
      +BS_SAFE_MUL(A, B, Fail, Dst) {
      +    Uint64 res = ($A) * ($B);
      +    if (res / $B != $A) {
               $Fail;
      -    }
      +    }
           $Dst = res;
      -}
      +}
       %else
      -BS_SAFE_MUL(A, B, Fail, Dst) {
      -    Uint64 res = (Uint64)($A) * (Uint64)($B);
      -    if ((res >> (8*sizeof(Uint))) != 0) {
      +BS_SAFE_MUL(A, B, Fail, Dst) {
      +    Uint64 res = (Uint64)($A) * (Uint64)($B);
      +    if ((res >> (8*sizeof(Uint))) != 0) {
               $Fail;
      -    }
      +    }
           $Dst = res;
      -}
      +}
       %endif

      Symbols that are defined in directives

      The following symbols are always defined.

      • ARCH_64 - is 1 for a 64-bit machine, and 0 otherwise.
      • ARCH_32 - is 1 for 32-bit machine, and 0 otherwise.

      The Makefile for building the emulator currently defines the following symbols by using the -D option on the command line for beam_makeops.

      • USE_VM_PROBES - 1 if the runtime system is compiled to use VM @@ -680,7 +680,7 @@

        a non-zero value, the matching of the rule will continue, otherwise the match will fail. Such guard functions are hereafter called predicates.

        The most commonly used guard constraints is equal(). It can be used -to remove a redundant move instructio like this:

        move R1 R2 | equal(R1, R2) => _

        or remove a redundant is_eq_exact instruction like this:

        is_eq_exact Lbl Src1 Src2 | equal(Src1, Src2) => _

        At the time of writing, all predicates are defined in files named +to remove a redundant move instructio like this:

        move R1 R2 | equal(R1, R2) => _

        or remove a redundant is_eq_exact instruction like this:

        is_eq_exact Lbl Src1 Src2 | equal(Src1, Src2) => _

        At the time of writing, all predicates are defined in files named predicates.tab in several directories. In predicates.tab directly in $ERL_TOP/erts/emulator/beam, predicates that are used by both the traditinal emulator and the JIT implementations are contained. @@ -696,33 +696,33 @@

        internal loader data structures, but here is quick look at the implementation of a simple predicate called literal_is_map().

        Here is first an example how it is used:

        ismap Fail Lit=q | literal_is_map(Lit) =>

        If the Lit operand is a literal, then the literal_is_map() predicate is called to determine whether it is a map literal. -If it is, the instruction is not needed and can be removed.

        literal_is_map() is implemented like this (in emu/predicates.tab):

        pred.literal_is_map(Lit) {
        +If it is, the instruction is not needed and can be removed.

        literal_is_map() is implemented like this (in emu/predicates.tab):

        pred.literal_is_map(Lit) {
             Eterm term;
         
        -    ASSERT(Lit.type == TAG_q);
        -    term = beamfile_get_literal(&S->beam, Lit.val);
        -    return is_map(term);
        -}

        The pred. prefix tells beam_makeops that this function is a + ASSERT(Lit.type == TAG_q); + term = beamfile_get_literal(&S->beam, Lit.val); + return is_map(term); +}

        The pred. prefix tells beam_makeops that this function is a predicate. Without the prefix, it would have been interpreted as the implementation of an instruction (described in Defining the implementation).

        Predicate functions have a magic variabled called S, which is a pointer to a state struct. In the example, beamfile_get_literal(&S->beam, Lit.val); is used to retrieve the actual term for the literal.

        At the time of writing, the expanded C code generated by -beam_makeops looks like this:

        static int literal_is_map(LoaderState* S, BeamOpArg Lit) {
        +beam_makeops looks like this:

        static int literal_is_map(LoaderState* S, BeamOpArg Lit) {
           Eterm term;
         
        -  ASSERT(Lit.type == TAG_q);
        -  term = S->literals[Lit.val].term;
        -  return is_map(term);;
        -}

        Handling instructions with variable number of operands

        Some instructions, such as select_val/3, essentially has a variable + ASSERT(Lit.type == TAG_q); + term = S->literals[Lit.val].term; + return is_map(term);; +}

        Handling instructions with variable number of operands

        Some instructions, such as select_val/3, essentially has a variable number of operands. Such instructions have a {list,[...]} operand -as their last operand in the BEAM assembly code. For example:

        {select_val,{x,0},
        -            {f,1},
        -            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

        The loader will convert a {list,[...]} operand to an u operand whose +as their last operand in the BEAM assembly code. For example:

        {select_val,{x,0},
        +            {f,1},
        +            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

        The loader will convert a {list,[...]} operand to an u operand whose value is the number of elements in the list, followed by each element in the list. The instruction above would be translated to the following -generic instruction:

        {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

        To match a variable number of arguments we need to use the special +generic instruction:

        {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

        To match a variable number of arguments we need to use the special operand type * like this:

        select_val Src=aiq Fail=f Size=u List=* =>
             i_const_select_val Src Fail Size List

        This transformation renames a select_val/3 instruction with a constant source operand to i_const_select_val/3.

        Constructing new instructions on the right-hand side

        The most common operand on the right-hand side is a variable that was @@ -750,7 +750,7 @@

        side of the transformation will perform the match and bind operands to variables. The variables can then be passed to a generator function on the right-hand side. For example:

        bif2 Fail=j u$bif:erlang:element/2 Index=s Tuple=xy Dst=d =>
        -    element(Jump, Index, Tuple, Dst)

        This transformation rule matches a call to the BIF element/2. + element(Jump, Index, Tuple, Dst)

      This transformation rule matches a call to the BIF element/2. The operands will be captured and the generator function element() will be called.

      The element() generator will produce one of two instructions depending on Index. If Index is an integer in the range from 1 up @@ -765,30 +765,30 @@

      named generators.tab in several directories (in the same directories as the predicates.tab files).

      It is outside the scope of this document to describe in detail how generator functions are written, but here is the implementation of -element():

      gen.element(Fail, Index, Tuple, Dst) {
      +element():

      gen.element(Fail, Index, Tuple, Dst) {
           BeamOp* op;
       
      -    $NewBeamOp(S, op);
      +    $NewBeamOp(S, op);
       
      -    if (Index.type == TAG_i && Index.val > 0 &&
      +    if (Index.type == TAG_i && Index.val > 0 &&
               Index.val <= ERTS_MAX_TUPLE_SIZE &&
      -        (Tuple.type == TAG_x || Tuple.type == TAG_y)) {
      -        $BeamOpNameArity(op, i_fast_element, 4);
      -        op->a[0] = Tuple;
      -        op->a[1] = Fail;
      -        op->a[2].type = TAG_u;
      -        op->a[2].val = Index.val;
      -        op->a[3] = Dst;
      -    } else {
      -        $BeamOpNameArity(op, i_element, 4);
      -        op->a[0] = Tuple;
      -        op->a[1] = Fail;
      -        op->a[2] = Index;
      -        op->a[3] = Dst;
      -    }
      +        (Tuple.type == TAG_x || Tuple.type == TAG_y)) {
      +        $BeamOpNameArity(op, i_fast_element, 4);
      +        op->a[0] = Tuple;
      +        op->a[1] = Fail;
      +        op->a[2].type = TAG_u;
      +        op->a[2].val = Index.val;
      +        op->a[3] = Dst;
      +    } else {
      +        $BeamOpNameArity(op, i_element, 4);
      +        op->a[0] = Tuple;
      +        op->a[1] = Fail;
      +        op->a[2] = Index;
      +        op->a[3] = Dst;
      +    }
       
           return op;
      -}

      The gen. prefix tells beam_makeops that this function is a +}

      The gen. prefix tells beam_makeops that this function is a generator. Without the prefix, it would have been interpreted as the implementation of an instruction (described in Defining the implementation).

      Generator functions have a magic variabled called S, which is a @@ -818,9 +818,9 @@

      following line:

      // -*- c -*-

      To avoid messing up the indentation, all comments are written as C++ style comments (//) instead of #. Note that a comment must start at the beginning of a line.

      The meat of an instruction definition file are macro definitions. -We have seen this macro definition before:

      move(Src, Dst) {
      +We have seen this macro definition before:

      move(Src, Dst) {
           $Dst = $Src;
      -}

      A macro definitions must start at the beginning of the line (no spaces +}

      A macro definitions must start at the beginning of the line (no spaces allowed), the opening curly bracket must be on the same line, and the finishing curly bracket must be at the beginning of a line. It is recommended that the macro body is properly indented.

      As a convention, the macro arguments in the head all start with an @@ -829,103 +829,103 @@

      specific instructions is assumed to be the implementation of that instruction.

      A macro can also be invoked from within another macro. For example, move_deallocate_return/2 avoids repeating code by invoking -$deallocate_return() as a macro:

      move_deallocate_return(Src, Deallocate) {
      -    x(0) = $Src;
      -    $deallocate_return($Deallocate);
      -}

      Here is the definition of deallocate_return/1:

      deallocate_return(Deallocate) {
      +$deallocate_return() as a macro:

      move_deallocate_return(Src, Deallocate) {
      +    x(0) = $Src;
      +    $deallocate_return($Deallocate);
      +}

      Here is the definition of deallocate_return/1:

      deallocate_return(Deallocate) {
           //| -no_next
           int words_to_pop = $Deallocate;
      -    SET_I((BeamInstr *) cp_val(*E));
      -    E = ADD_BYTE_OFFSET(E, words_to_pop);
      -    CHECK_TERM(x(0));
      +    SET_I((BeamInstr *) cp_val(*E));
      +    E = ADD_BYTE_OFFSET(E, words_to_pop);
      +    CHECK_TERM(x(0));
           DispatchReturn;
      -}

      The expanded code for move_deallocate_return will look this:

      OpCase(move_deallocate_return_cQ):
      -{
      -  x(0) = I[1];
      -  do {
      -    int words_to_pop = Qb(BeamExtraData(I[0]));
      -    SET_I((BeamInstr *) cp_val(*E));
      -    E = ADD_BYTE_OFFSET(E, words_to_pop);
      -    CHECK_TERM(x(0));
      +}

      The expanded code for move_deallocate_return will look this:

      OpCase(move_deallocate_return_cQ):
      +{
      +  x(0) = I[1];
      +  do {
      +    int words_to_pop = Qb(BeamExtraData(I[0]));
      +    SET_I((BeamInstr *) cp_val(*E));
      +    E = ADD_BYTE_OFFSET(E, words_to_pop);
      +    CHECK_TERM(x(0));
           DispatchReturn;
      -  } while (0);
      -}

      When expanding macros, beam_makeops wraps the expansion in a + } while (0); +}

      When expanding macros, beam_makeops wraps the expansion in a do/while wrapper unless beam_makeops can clearly see that no wrapper is needed. In this case, the wrapper is needed.

      Note that arguments for macros cannot be complex expressions, because the arguments are split on ,. For example, the following would not work because beam_makeops would split the expression into -two arguments:

      $deallocate_return(get_deallocation(y, $Deallocate));

      Code generation directives

      Within macro definitions, // comments are in general not treated +two arguments:

      $deallocate_return(get_deallocation(y, $Deallocate));

      Code generation directives

      Within macro definitions, // comments are in general not treated specially. They will be copied to the file with the generated code along with the rest of code in the body.

      However, there is an exception. Within a macro definition, a line that starts with whitespace followed by //| is treated specially. The rest of the line is assumed to contain directives to control code generation.

      Currently, two code generation directives are recognized:

      • -no_prefetch
      • -no_next
      The -no_prefetch directive

      To see what -no_prefetch does, let's first look at the default code -generation. Here is the code generated for move_cx:

      OpCase(move_cx):
      -{
      -  BeamInstr next_pf = BeamCodeAddr(I[2]);
      -  xb(BeamExtraData(I[0])) = I[1];
      +generation.  Here is the code generated for move_cx:

      OpCase(move_cx):
      +{
      +  BeamInstr next_pf = BeamCodeAddr(I[2]);
      +  xb(BeamExtraData(I[0])) = I[1];
         I += 2;
      -  ASSERT(VALID_INSTR(next_pf));
      -  GotoPF(next_pf);
      -}

      Note that the very first thing done is to fetch the address to the + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

      Note that the very first thing done is to fetch the address to the next instruction. The reason is that it usually improves performance.

      Just as a demonstration, we can add a -no_prefetch directive to -the move/2 instruction:

      move(Src, Dst) {
      +the move/2 instruction:

      move(Src, Dst) {
           //| -no_prefetch
           $Dst = $Src;
      -}

      We can see that the prefetch is no longer done:

      OpCase(move_cx):
      -{
      -  xb(BeamExtraData(I[0])) = I[1];
      +}

      We can see that the prefetch is no longer done:

      OpCase(move_cx):
      +{
      +  xb(BeamExtraData(I[0])) = I[1];
         I += 2;
      -  ASSERT(VALID_INSTR(*I));
      -  Goto(*I);
      -}

      When would we want to turn off the prefetch in practice?

      In instructions that will not always execute the next instruction. -For example:

      is_atom(Fail, Src) {
      -    if (is_not_atom($Src)) {
      -        $FAIL($Fail);
      -    }
      -}
      +  ASSERT(VALID_INSTR(*I));
      +  Goto(*I);
      +}

      When would we want to turn off the prefetch in practice?

      In instructions that will not always execute the next instruction. +For example:

      is_atom(Fail, Src) {
      +    if (is_not_atom($Src)) {
      +        $FAIL($Fail);
      +    }
      +}
       
       // From macros.tab
      -FAIL(Fail) {
      +FAIL(Fail) {
           //| -no_prefetch
      -    $SET_I_REL($Fail);
      -    Goto(*I);
      -}

      is_atom/2 may either execute the next instruction (if the second -operand is an atom) or branch to the failure label.

      The generated code looks like this:

      OpCase(is_atom_fx):
      -{
      -  if (is_not_atom(xb(I[1]))) {
      -    ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
      -    I += fb(BeamExtraData(I[0])) + 0;;
      -    Goto(*I);;
      -  }
      +    $SET_I_REL($Fail);
      +    Goto(*I);
      +}

      is_atom/2 may either execute the next instruction (if the second +operand is an atom) or branch to the failure label.

      The generated code looks like this:

      OpCase(is_atom_fx):
      +{
      +  if (is_not_atom(xb(I[1]))) {
      +    ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
      +    I += fb(BeamExtraData(I[0])) + 0;;
      +    Goto(*I);;
      +  }
         I += 2;
      -  ASSERT(VALID_INSTR(*I));
      -  Goto(*I);
      -}
      The -no_next directive

      Next we will look at when the -no_next directive can be used. Here -is the jump/1 instruction:

      jump(Fail) {
      -    $JUMP($Fail);
      -}
      +  ASSERT(VALID_INSTR(*I));
      +  Goto(*I);
      +}
      The -no_next directive

      Next we will look at when the -no_next directive can be used. Here +is the jump/1 instruction:

      jump(Fail) {
      +    $JUMP($Fail);
      +}
       
       // From macros.tab
      -JUMP(Fail) {
      +JUMP(Fail) {
           //| -no_next
      -    $SET_I_REL($Fail);
      -    Goto(*I);
      -}

      The generated code looks like this:

      OpCase(jump_f):
      -{
      -  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
      -  I += fb(BeamExtraData(I[0])) + 0;;
      -  Goto(*I);;
      -}

      If we remove the -no_next directive, the code would look like this:

      OpCase(jump_f):
      -{
      -  BeamInstr next_pf = BeamCodeAddr(I[1]);
      -  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
      -  I += fb(BeamExtraData(I[0])) + 0;;
      -  Goto(*I);;
      +    $SET_I_REL($Fail);
      +    Goto(*I);
      +}

      The generated code looks like this:

      OpCase(jump_f):
      +{
      +  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
      +  I += fb(BeamExtraData(I[0])) + 0;;
      +  Goto(*I);;
      +}

      If we remove the -no_next directive, the code would look like this:

      OpCase(jump_f):
      +{
      +  BeamInstr next_pf = BeamCodeAddr(I[1]);
      +  ASSERT(VALID_INSTR(*(I + (fb(BeamExtraData(I[0]))) + 0)));
      +  I += fb(BeamExtraData(I[0])) + 0;;
      +  Goto(*I);;
         I += 1;
      -  ASSERT(VALID_INSTR(next_pf));
      -  GotoPF(next_pf);
      -}

      In the end, the C compiler will probably optimize this code to the + ASSERT(VALID_INSTR(next_pf)); + GotoPF(next_pf); +}

      In the end, the C compiler will probably optimize this code to the same native code as the first version, but the first version is certainly much easier to read for human readers.

      Macros in the macros.tab file

      The file macros.tab contains many useful macros. When implementing new instructions it is good practice to look through macros.tab to @@ -936,61 +936,61 @@

      $REFRESH_GEN_DEST() macro.

      If you need to define a new function that does garbage collection, you should give it the prefix erts_gc_. If that is not possible you should update the regular expression so that it will match your -new function.

      FAIL(Fail)

      Branch to $Fail. Will suppress prefetch (-no_prefetch). Typical use:

      is_nonempty_list(Fail, Src) {
      -    if (is_not_list($Src)) {
      -        $FAIL($Fail);
      -    }
      -}
      JUMP(Fail)

      Branch to $Fail. Suppresses generation of dispatch of the next -instruction (-no_next). Typical use:

      jump(Fail) {
      -    $JUMP($Fail);
      -}
      GC_TEST(NeedStack, NeedHeap, Live)

      $GC_TEST(NeedStack, NeedHeap, Live) tests that given amount of +new function.

      FAIL(Fail)

      Branch to $Fail. Will suppress prefetch (-no_prefetch). Typical use:

      is_nonempty_list(Fail, Src) {
      +    if (is_not_list($Src)) {
      +        $FAIL($Fail);
      +    }
      +}
      JUMP(Fail)

      Branch to $Fail. Suppresses generation of dispatch of the next +instruction (-no_next). Typical use:

      jump(Fail) {
      +    $JUMP($Fail);
      +}
      GC_TEST(NeedStack, NeedHeap, Live)

      $GC_TEST(NeedStack, NeedHeap, Live) tests that given amount of stack space and heap space is available. If not it will do a -garbage collection. Typical use:

      test_heap(Nh, Live) {
      -    $GC_TEST(0, $Nh, $Live);
      -}
      AH(NeedStack, NeedHeap, Live)

      AH(NeedStack, NeedHeap, Live) allocates a stack frame and +garbage collection. Typical use:

      test_heap(Nh, Live) {
      +    $GC_TEST(0, $Nh, $Live);
      +}
      AH(NeedStack, NeedHeap, Live)

      AH(NeedStack, NeedHeap, Live) allocates a stack frame and optionally additional heap space.

      Pre-defined macros and variables

      beam_makeops defines several built-in macros and pre-bound variables.

      The NEXT_INSTRUCTION pre-bound variable

      The NEXT_INSTRUCTION is a pre-bound variable that is available in -all instructions. It expands to the address of the next instruction.

      Here is an example:

      i_call(CallDest) {
      +all instructions.  It expands to the address of the next instruction.

      Here is an example:

      i_call(CallDest) {
           //| -no_next
      -    $SAVE_CONTINUATION_POINTER($NEXT_INSTRUCTION);
      -    $DISPATCH_REL($CallDest);
      -}

      When calling a function, the return address is first stored in E[0] + $SAVE_CONTINUATION_POINTER($NEXT_INSTRUCTION); + $DISPATCH_REL($CallDest); +}

      When calling a function, the return address is first stored in E[0] (using the $SAVE_CONTINUATION_POINTER() macro), and then control is -transferred to the callee. Here is the generated code:

      OpCase(i_call_f):
      -{
      -    ASSERT(VALID_INSTR(*(I+2)));
      -    *E = (BeamInstr) (I+2);;
      +transferred to the callee.  Here is the generated code:

      OpCase(i_call_f):
      +{
      +    ASSERT(VALID_INSTR(*(I+2)));
      +    *E = (BeamInstr) (I+2);;
       
           /* ... dispatch code intentionally left out ... */
      -}

      We can see that that $NEXT_INSTRUCTION has been expanded to I+2. +}

      We can see that that $NEXT_INSTRUCTION has been expanded to I+2. That makes sense since the size of the i_call_f/1 instruction is two words.

      The IP_ADJUSTMENT pre-bound variable

      $IP_ADJUSTMENT is usually 0. In a few combined instructions (described below) it can be non-zero. It is used like this -in macros.tab:

      SET_I_REL(Offset) {
      -    ASSERT(VALID_INSTR(*(I + ($Offset) + $IP_ADJUSTMENT)));
      +in macros.tab:

      SET_I_REL(Offset) {
      +    ASSERT(VALID_INSTR(*(I + ($Offset) + $IP_ADJUSTMENT)));
           I += $Offset + $IP_ADJUSTMENT;
      -}

      Avoid using IP_ADJUSTMENT directly. Use SET_I_REL() or +}

      Avoid using IP_ADJUSTMENT directly. Use SET_I_REL() or one of the macros that invoke such as FAIL() or JUMP() defined in macros.tab.

      Pre-defined macro functions

      The IF() macro

      $IF(Expr, IfTrue, IfFalse) evaluates Expr, which must be a valid Perl expression (which for simple numeric expressions have the same syntax as C). If Expr evaluates to 0, the entire IF() expression will be replaced with IfFalse, otherwise it will be replaced with IfTrue.

      See the description of OPERAND_POSITION() for an example.

      The OPERAND_POSITION() macro

      $OPERAND_POSITION(Expr) returns the position for Expr, if Expr is an operand that is not packed. The first operand is -at position 1.

      Returns 0 otherwise.

      This macro could be used like this in order to share code:

      FAIL(Fail) {
      +at position 1.

      Returns 0 otherwise.

      This macro could be used like this in order to share code:

      FAIL(Fail) {
           //| -no_prefetch
      -    $IF($OPERAND_POSITION($Fail) == 1 && $IP_ADJUSTMENT == 0,
      +    $IF($OPERAND_POSITION($Fail) == 1 && $IP_ADJUSTMENT == 0,
               goto common_jump,
      -        $DO_JUMP($Fail));
      -}
      +        $DO_JUMP($Fail));
      +}
       
      -DO_JUMP(Fail) {
      -    $SET_I_REL($Fail);
      -    Goto(*I));
      -}
      +DO_JUMP(Fail) {
      +    $SET_I_REL($Fail);
      +    Goto(*I));
      +}
       
       // In beam_emu.c:
       common_jump:
      -   I += I[1];
      -   Goto(*I));

      The $REFRESH_GEN_DEST() macro

      When a specific instruction has a d operand, early during execution + I += I[1]; + Goto(*I));

      The $REFRESH_GEN_DEST() macro

      When a specific instruction has a d operand, early during execution of the instruction, a pointer will be initialized to point to the X or Y register in question.

      If there is a garbage collection before the result is stored, the stack will move and if the d operand referred to a Y @@ -999,29 +999,29 @@

      to set up the pointer again. beam_makeops will notice if there is a call to a function that does a garbage collection and $REFRESH_GEN_DEST() is not called.

      Here is a complete example. The new_map instruction is defined -like this:

      new_map d t I

      It is implemented like this:

      new_map(Dst, Live, N) {
      +like this:

      new_map d t I

      It is implemented like this:

      new_map(Dst, Live, N) {
           Eterm res;
       
           HEAVY_SWAPOUT;
      -    res = erts_gc_new_map(c_p, reg, $Live, $N, $NEXT_INSTRUCTION);
      +    res = erts_gc_new_map(c_p, reg, $Live, $N, $NEXT_INSTRUCTION);
           HEAVY_SWAPIN;
      -    $REFRESH_GEN_DEST();
      +    $REFRESH_GEN_DEST();
           $Dst = res;
      -    $NEXT($NEXT_INSTRUCTION+$N);
      -}

      If we have forgotten the $REFRESH_GEN_DEST() there would be a message -similar to this:

      pointer to destination register is invalid after GC -- use $REFRESH_GEN_DEST()
      -... from the body of new_map at beam/map_instrs.tab(30)

      Variable number of operands

      Here follows an example of how to handle an instruction with a variable number + $NEXT($NEXT_INSTRUCTION+$N); +}

      If we have forgotten the $REFRESH_GEN_DEST() there would be a message +similar to this:

      pointer to destination register is invalid after GC -- use $REFRESH_GEN_DEST()
      +... from the body of new_map at beam/map_instrs.tab(30)

      Variable number of operands

      Here follows an example of how to handle an instruction with a variable number of operands for the interpreter. Here is the instruction definition in emu/ops.tab:

      put_tuple2 xy I *

      For the interpreter, the * is optional, because it does not effect code generation in any way. However, it is recommended to include it to make it clear for human readers that there is a variable number of operands.

      Use the $NEXT_INSTRUCTION macro to obtain a pointer to the first of the variable -operands.

      Here is the implementation:

      put_tuple2(Dst, Arity) {
      +operands.

      Here is the implementation:

      put_tuple2(Dst, Arity) {
       Eterm* hp = HTOP;
       Eterm arity = $Arity;
      -Eterm* dst_ptr = &($Dst);
      +Eterm* dst_ptr = &($Dst);
       
       //| -no_next
      -ASSERT(arity != 0);
      -*hp++ = make_arityval(arity);
      +ASSERT(arity != 0);
      +*hp++ = make_arityval(arity);
       
       /*
        * The $NEXT_INSTRUCTION macro points just beyond the fixed
      @@ -1029,58 +1029,58 @@ 

      * the first element to be put into the tuple. */ I = $NEXT_INSTRUCTION; -do { +do { Eterm term = *I++; - switch (loader_tag(term)) { + switch (loader_tag(term)) { case LOADER_X_REG: - *hp++ = x(loader_x_reg_index(term)); + *hp++ = x(loader_x_reg_index(term)); break; case LOADER_Y_REG: - *hp++ = y(loader_y_reg_index(term)); + *hp++ = y(loader_y_reg_index(term)); break; default: *hp++ = term; break; - } -} while (--arity != 0); -*dst_ptr = make_tuple(HTOP); + } +} while (--arity != 0); +*dst_ptr = make_tuple(HTOP); HTOP = hp; -ASSERT(VALID_INSTR(* (Eterm *)I)); -Goto(*I); -}

      Combined instructions

      Problem: For frequently executed instructions we want to use +ASSERT(VALID_INSTR(* (Eterm *)I)); +Goto(*I); +}

      Combined instructions

      Problem: For frequently executed instructions we want to use "fast" operands types such as x and y, as opposed to s or S. To avoid an explosion in code size, we want to share most of the implementation between the instructions. Here are the specific instructions for i_increment/5:

      i_increment r W t d
       i_increment x W t d
      -i_increment y W t d

      The i_increment instruction is implemented like this:

      i_increment(Source, IncrementVal, Live, Dst) {
      +i_increment y W t d

      The i_increment instruction is implemented like this:

      i_increment(Source, IncrementVal, Live, Dst) {
           Eterm increment_reg_source = $Source;
           Eterm increment_val = $IncrementVal;
           Uint live;
           Eterm result;
       
      -    if (ERTS_LIKELY(is_small(increment_reg_val))) {
      -        Sint i = signed_val(increment_reg_val) + increment_val;
      -        if (ERTS_LIKELY(IS_SSMALL(i))) {
      -            $Dst = make_small(i);
      -            $NEXT0();
      -        }
      -    }
      +    if (ERTS_LIKELY(is_small(increment_reg_val))) {
      +        Sint i = signed_val(increment_reg_val) + increment_val;
      +        if (ERTS_LIKELY(IS_SSMALL(i))) {
      +            $Dst = make_small(i);
      +            $NEXT0();
      +        }
      +    }
           live = $Live;
           HEAVY_SWAPOUT;
      -    reg[live] = increment_reg_val;
      -    reg[live+1] = make_small(increment_val);
      -    result = erts_gc_mixed_plus(c_p, reg, live);
      +    reg[live] = increment_reg_val;
      +    reg[live+1] = make_small(increment_val);
      +    result = erts_gc_mixed_plus(c_p, reg, live);
           HEAVY_SWAPIN;
      -    ERTS_HOLE_CHECK(c_p);
      -    if (ERTS_LIKELY(is_value(result))) {
      -        $REFRESH_GEN_DEST();
      +    ERTS_HOLE_CHECK(c_p);
      +    if (ERTS_LIKELY(is_value(result))) {
      +        $REFRESH_GEN_DEST();
               $Dst = result;
      -        $NEXT0();
      -    }
      -    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
      +        $NEXT0();
      +    }
      +    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
           goto find_func_info;
      -}

      There will be three almost identical copies of the code. Given the +}

      There will be three almost identical copies of the code. Given the size of the code, that could be too high cost to pay.

      To avoid the three copies of the code, we could use only one specific instruction:

      i_increment S W t d

      (The same implementation as above will work.)

      That reduces the code size, but is slower because S means that there will be extra code to test whether the operand refers to an X @@ -1089,44 +1089,44 @@

      bulk of the code can be shared.

      Here we will show how i_increment can be implemented as a combined instruction. We will show each individual fragment first, and then show how to connect them together. First we will need a variable that -we can store the value fetched from the register in:

      increment.head() {
      +we can store the value fetched from the register in:

      increment.head() {
           Eterm increment_reg_val;
      -}

      The name increment is the name of the group that the fragment +}

      The name increment is the name of the group that the fragment belongs to. Note that it does not need to have the same name as the instruction. The group name is followed by . and the name of the fragment. The name head is pre-defined. The code in it will be placed at the beginning of a block, so that all fragments in the group can access it.

      Next we define the fragment that will pick up the value from the -register from the first operand:

      increment.fetch(Src) {
      +register from the first operand:

      increment.fetch(Src) {
           increment_reg_val = $Src;
      -}

      We call this fragment fetch. This fragment will be duplicated three -times, one for each value of the first operand (r, x, and y).

      Next we define the main part of the code that do the actual incrementing.

      increment.execute(IncrementVal, Live, Dst) {
      +}

      We call this fragment fetch. This fragment will be duplicated three +times, one for each value of the first operand (r, x, and y).

      Next we define the main part of the code that do the actual incrementing.

      increment.execute(IncrementVal, Live, Dst) {
           Eterm increment_val = $IncrementVal;
           Uint live;
           Eterm result;
       
      -    if (ERTS_LIKELY(is_small(increment_reg_val))) {
      -        Sint i = signed_val(increment_reg_val) + increment_val;
      -        if (ERTS_LIKELY(IS_SSMALL(i))) {
      -            $Dst = make_small(i);
      -            $NEXT0();
      -        }
      -    }
      +    if (ERTS_LIKELY(is_small(increment_reg_val))) {
      +        Sint i = signed_val(increment_reg_val) + increment_val;
      +        if (ERTS_LIKELY(IS_SSMALL(i))) {
      +            $Dst = make_small(i);
      +            $NEXT0();
      +        }
      +    }
           live = $Live;
           HEAVY_SWAPOUT;
      -    reg[live] = increment_reg_val;
      -    reg[live+1] = make_small(increment_val);
      -    result = erts_gc_mixed_plus(c_p, reg, live);
      +    reg[live] = increment_reg_val;
      +    reg[live+1] = make_small(increment_val);
      +    result = erts_gc_mixed_plus(c_p, reg, live);
           HEAVY_SWAPIN;
      -    ERTS_HOLE_CHECK(c_p);
      -    if (ERTS_LIKELY(is_value(result))) {
      -        $REFRESH_GEN_DEST();
      +    ERTS_HOLE_CHECK(c_p);
      +    if (ERTS_LIKELY(is_value(result))) {
      +        $REFRESH_GEN_DEST();
               $Dst = result;
      -        $NEXT0();
      -    }
      -    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
      +        $NEXT0();
      +    }
      +    ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
           goto find_func_info;
      -}

      We call this fragment execute. It will handle the three remaining +}

      We call this fragment execute. It will handle the three remaining operands (W t d). There will only be one copy of this fragment.

      Now that we have defined the fragments, we need to inform beam_makeops how they should be connected:

      i_increment := increment.fetch.execute;

      To the left of the := is the name of the specific instruction that should be implemented by the fragments, in this case i_increment. @@ -1134,33 +1134,33 @@

      followed by a .. Then the name of the fragments in the group are listed in the order they should be executed. Note that the head fragment is not listed.

      The line ends in ; (to avoid messing up the indentation in Emacs).

      (Note that in practice the := line is usually placed before the -fragments.)

      The generated code looks like this:

      {
      +fragments.)

      The generated code looks like this:

      {
         Eterm increment_reg_val;
      -  OpCase(i_increment_rWtd):
      -  {
      -    increment_reg_val = r(0);
      -  }
      +  OpCase(i_increment_rWtd):
      +  {
      +    increment_reg_val = r(0);
      +  }
         goto increment__execute;
       
      -  OpCase(i_increment_xWtd):
      -  {
      -    increment_reg_val = xb(BeamExtraData(I[0]));
      -  }
      +  OpCase(i_increment_xWtd):
      +  {
      +    increment_reg_val = xb(BeamExtraData(I[0]));
      +  }
         goto increment__execute;
       
      -  OpCase(i_increment_yWtd):
      -  {
      -    increment_reg_val = yb(BeamExtraData(I[0]));
      -  }
      +  OpCase(i_increment_yWtd):
      +  {
      +    increment_reg_val = yb(BeamExtraData(I[0]));
      +  }
         goto increment__execute;
       
         increment__execute:
      -  {
      -    // Here follows the code from increment.execute()
      +  {
      +    // Here follows the code from increment.execute()
           .
           .
           .
      -}
      Some notes about combined instructions

      The operands that are different must be at +}

      Some notes about combined instructions

      The operands that are different must be at the beginning of the instruction. All operands in the last fragment must have the same operands in all variants of the specific instruction.

      As an example, the following specific instructions cannot be @@ -1171,21 +1171,21 @@

      i_times x y j? t d i_times s s j? t d

      We can then define:

      i_times := times.fetch.execute;
       
      -times.head {
      +times.head {
           Eterm op1, op2;
      -}
      +}
       
      -times.fetch(Src1, Src2) {
      +times.fetch(Src1, Src2) {
           op1 = $Src1;
           op2 = $Src2;
      -}
      +}
       
      -times.execute(Fail, Live, Dst) {
      +times.execute(Fail, Live, Dst) {
           // Multiply op1 and op2.
           .
           .
           .
      -}

      Several instructions can share a group. As an example, the following +}

      Several instructions can share a group. As an example, the following instructions have different names, but in the end they all create a binary. The last two operands are common for all of them:

      i_bs_init_fail       xy j? t? x
       i_bs_init_fail_heap s I j? t? x
      @@ -1195,46 +1195,46 @@ 

      i_bs_init_fail := bs_init . fail . verify . execute; i_bs_init := bs_init . . plain . execute; i_bs_init_heap := bs_init . heap . execute;

      Note that the first two instruction have three fragments, while the -other two only have two fragments. Here are the fragments:

      bs_init_bits.head() {
      +other two only have two fragments.  Here are the fragments:

      bs_init_bits.head() {
           Eterm num_bits_term;
           Uint num_bits;
           Uint alloc;
      -}
      +}
       
      -bs_init_bits.plain(NumBits) {
      +bs_init_bits.plain(NumBits) {
           num_bits = $NumBits;
           alloc = 0;
      -}
      +}
       
      -bs_init_bits.heap(NumBits, Alloc) {
      +bs_init_bits.heap(NumBits, Alloc) {
           num_bits = $NumBits;
           alloc = $Alloc;
      -}
      +}
       
      -bs_init_bits.fail(NumBitsTerm) {
      +bs_init_bits.fail(NumBitsTerm) {
           num_bits_term = $NumBitsTerm;
           alloc = 0;
      -}
      +}
       
      -bs_init_bits.fail_heap(NumBitsTerm, Alloc) {
      +bs_init_bits.fail_heap(NumBitsTerm, Alloc) {
           num_bits_term = $NumBitsTerm;
           alloc = $Alloc;
      -}
      +}
       
      -bs_init_bits.verify(Fail) {
      +bs_init_bits.verify(Fail) {
           // Verify the num_bits_term, fail using $FAIL
           // if there is a problem.
       .
       .
       .
      -}
      +}
       
      -bs_init_bits.execute(Live, Dst) {
      +bs_init_bits.execute(Live, Dst) {
          // Long complicated code to a create a binary.
          .
          .
          .
      -}

      The full definitions of those instructions can be found in bs_instrs.tab. +}

      The full definitions of those instructions can be found in bs_instrs.tab. The generated code can be found in beam_warm.h.

      @@ -1244,39 +1244,39 @@

      For the BeamAsm runtime system, the implementation of each instruction is defined by emitter functions written in C++ that emit the assembly code for each instruction. There is one emitter function for each family of specific instructions.

      Take for example the move instruction. In beam/asm/ops.tab there is a -single specific instruction for move defined like this:

      move s d

      The implementation is found in beam/asm/instr_common.cpp:

      void BeamModuleAssembler::emit_move(const ArgVal &Src, const ArgVal &Dst) {
      -    mov_arg(Dst, Src);
      -}

      The mov_arg() helper function will handle all combinations of source and destination -operands. For example, the instruction {move,{x,1},{y,1}} will be translated like this:

      mov rdi, qword [rbx+8]
      -mov qword [rsp+8], rdi

      while {move,{integer,42},{x,0}} will be translated like this:

      mov qword [rbx], 687

      It is possible to define more than one specific instruction, but there will still be +single specific instruction for move defined like this:

      move s d

      The implementation is found in beam/asm/instr_common.cpp:

      void BeamModuleAssembler::emit_move(const ArgVal &Src, const ArgVal &Dst) {
      +    mov_arg(Dst, Src);
      +}

      The mov_arg() helper function will handle all combinations of source and destination +operands. For example, the instruction {move,{x,1},{y,1}} will be translated like this:

      mov rdi, qword [rbx+8]
      +mov qword [rsp+8], rdi

      while {move,{integer,42},{x,0}} will be translated like this:

      mov qword [rbx], 687

      It is possible to define more than one specific instruction, but there will still be only one emitter function. For example:

      fload S l
       fload q l

      By defining fload like this, the source operand must be a X register, Y register, or a literal. If not, the loading will be aborted. If the instruction instead had been defined like this:

      fload s l

      attempting to load an invalid instruction such as {fload,{atom,clearly_bad},{fr,0}} would cause a crash (either at load time or when the instruction was executed).

      Regardless on how many specific instructions there are in the family, -only a single emit_fload() function is allowed:

      void BeamModuleAssembler::emit_fload(const ArgVal &Src, const ArgVal &Dst) {
      +only a single emit_fload() function is allowed:

      void BeamModuleAssembler::emit_fload(const ArgVal &Src, const ArgVal &Dst) {
           .
           .
           .
      -}

      Handling a variable number of operands

      Here follows an example of how an instruction with a variable number +}

      Handling a variable number of operands

      Here follows an example of how an instruction with a variable number of operands could be handled. One such instructions is -select_val/3. Here is an example how it can look like in BEAM code:

      {select_val,{x,0},
      -            {f,1},
      -            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

      The loader will convert a {list,[...]} operand to an u operand whose +select_val/3. Here is an example how it can look like in BEAM code:

      {select_val,{x,0},
      +            {f,1},
      +            {list,[{atom,b},{f,4},{atom,a},{f,5}]}}.

      The loader will convert a {list,[...]} operand to an u operand whose value is the number of elements in the list, followed by each element in the list. The instruction above would be translated to the following -instruction:

      {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

      A definition of a specific instruction for that instruction would look +instruction:

      {select_val,{x,0},{f,1},{u,4},{atom,b},{f,4},{atom,a},{f,5}}

      A definition of a specific instruction for that instruction would look like this:

      select_val s f I *

      The * as the last operand will make sure that the variable operands are passed in as a Span of ArgVal (will be std::span in C++20 onwards). -Here is the emitter function:

      void BeamModuleAssembler::emit_select_val(const ArgVal &Src,
      +Here is the emitter function:

      void BeamModuleAssembler::emit_select_val(const ArgVal &Src,
                                                 const ArgVal &Fail,
                                                 const ArgVal &Size,
      -                                          const Span<ArgVal> &args) {
      -    ASSERT(Size.getValue() == args.size());
      +                                          const Span<ArgVal> &args) {
      +    ASSERT(Size.getValue() == args.size());
              .
              .
              .
      -}
      +
      }
      diff --git a/prs/9277/erts-15.2/doc/html/beamasm.html b/prs/9277/erts-15.2/doc/html/beamasm.html index 406bb7c877d38..d967ae32092e2 100644 --- a/prs/9277/erts-15.2/doc/html/beamasm.html +++ b/prs/9277/erts-15.2/doc/html/beamasm.html @@ -149,10 +149,10 @@

      used in BeamAsm are much simpler than the interpreter's, as most of the transformations for the interpreter are done only to eliminate the instruction dispatch overhead.

      Then each instruction is encoded using the C++ functions in the -jit/$ARCH/instr_*.cpp files. For example:

      void BeamModuleAssembler::emit_is_nonempty_list(const ArgVal &Fail, const ArgVal &Src) {
      -  a.test(getArgRef(Src), imm(_TAG_PRIMARY_MASK - TAG_PRIMARY_LIST));
      -  a.jne(labels[Fail.getLabel()]);
      -}

      asmjit provides a fairly straightforward +jit/$ARCH/instr_*.cpp files. For example:

      void BeamModuleAssembler::emit_is_nonempty_list(const ArgVal &Fail, const ArgVal &Src) {
      +  a.test(getArgRef(Src), imm(_TAG_PRIMARY_MASK - TAG_PRIMARY_LIST));
      +  a.jne(labels[Fail.getLabel()]);
      +}

      asmjit provides a fairly straightforward mapping from a C++ function call to the x86 assembly instruction. The above instruction tests if the value in the Src register is a non-empty list and if it is not then it jumps to the fail label.

      For comparison, the interpreter has 8 combinations and specializations of @@ -160,7 +160,7 @@

      common patterns.

      The original register allocation done by the Erlang compiler is used to manage the liveness of values and the physical registers are statically allocated to keep the necessary process state. At the moment this is the static register -allocation on x86-64:

      rbx: ErtsSchedulerRegisters struct (contains x/float registers and some metadata)
      +allocation on x86-64:

      rbx: ErtsSchedulerRegisters struct (contains x/float registers and some metadata)
       rbp: Current frame pointer when `perf` support is enabled, otherwise this
            is an optional save slot for the Erlang stack pointer when executing C
            code.
      @@ -187,13 +187,13 @@ 

      used about double the amount of memory for code as the interpreter, while current versions use about 10% more. How was this achieved?

      In BeamAsm we heavily use shared code fragments to try to emit as much code as possible as global shared fragments instead of duplicating the code unnecessarily. -For instance, the return instruction looks something like this:

      Label yield = a.newLabel();
      +For instance, the return instruction looks something like this:

      Label yield = a.newLabel();
       
       /* Decrement reduction counter */
      -a.dec(FCALLS);
      +a.dec(FCALLS);
       /* If FCALLS < 0, jump to the yield-on-return fragment */
      -a.jl(resolve_fragment(ga->get_dispatch_return()));
      -a.ret();

      The code above is not exactly what is emitted, but close enough. The thing to note +a.jl(resolve_fragment(ga->get_dispatch_return())); +a.ret();

      The code above is not exactly what is emitted, but close enough. The thing to note is that the code for doing the context switch is never emitted. Instead, we jump to a global fragment that all return instructions share. This greatly reduces the amount of code that has to be emitted for each module.

      @@ -243,24 +243,24 @@

      As Erlang stacks can be very small, we have to switch over to a different stack when we need to execute C code (which may expect a much larger stack). This is -done through emit_enter_runtime and emit_leave_runtime, for example:

      mov_arg(ARG4, NumFree);
      +done through emit_enter_runtime and emit_leave_runtime, for example:

      mov_arg(ARG4, NumFree);
       
       /* Move to the C stack and swap out our current reductions, stack-, and
        * heap pointer to the process structure. */
      -emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
      +emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
       
      -a.mov(ARG1, c_p);
      -load_x_reg_array(ARG2);
      -make_move_patch(ARG3, lambdas[Fun.getValue()].patches);
      +a.mov(ARG1, c_p);
      +load_x_reg_array(ARG2);
      +make_move_patch(ARG3, lambdas[Fun.getValue()].patches);
       
       /* Call `new_fun`, asserting that we're on the C stack. */
      -runtime_call<4>(new_fun);
      +runtime_call<4>(new_fun);
       
       /* Move back to the C stack, and read the updated values from the process
        * structure */
      -emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
      +emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
       
      -a.mov(getXRef(0), RET);

      All combinations of the Update constants are legal, but the ones given to +a.mov(getXRef(0), RET);

      All combinations of the Update constants are legal, but the ones given to emit_leave_runtime must be the same as those given to emit_enter_runtime.

      @@ -271,7 +271,7 @@

      any function call. In the interpreter, this is done by rewriting the loaded BEAM code, but this is more complicated in BeamAsm as we want to have a fast and compact way to do this. This is solved by emitting the code below at the -start of each function (x86 variant below):

        0x0: short jmp 6 (address 0x8)
      +start of each function (x86 variant below):

        0x0: short jmp 6 (address 0x8)
         0x2: nop
         0x3: relative near call to shared breakpoint fragment
         0x8: actual code for function

      When code starts to execute it will simply see the short jmp 6 instruction @@ -293,23 +293,23 @@

      executable page and once with a writable page. Since they're backed by the same memory, writes to the writable page appear magically in the executable one.

      The erts_writable_code_ptr function can be used to get writable pointers -given a module instance, provided that it has been unsealed first:

      for (i = 0; i < n; i++) {
      +given a module instance, provided that it has been unsealed first:

      for (i = 0; i < n; i++) {
           const ErtsCodeInfo* ci_exec;
           ErtsCodeInfo* ci_rw;
           void *w_ptr;
       
      -    erts_unseal_module(&modp->curr);
      +    erts_unseal_module(&modp->curr);
       
      -    ci_exec = code_hdr->functions[i];
      -    w_ptr = erts_writable_code_ptr(&modp->curr, ci_exec);
      -    ci_rw = (ErtsCodeInfo*)w_ptr;
      +    ci_exec = code_hdr->functions[i];
      +    w_ptr = erts_writable_code_ptr(&modp->curr, ci_exec);
      +    ci_rw = (ErtsCodeInfo*)w_ptr;
       
      -    uninstall_breakpoint(ci_rw, ci_exec);
      -    consolidate_bp_data(modp, ci_rw, 1);
      -    ASSERT(ci_rw->gen_bp == NULL);
      +    uninstall_breakpoint(ci_rw, ci_exec);
      +    consolidate_bp_data(modp, ci_rw, 1);
      +    ASSERT(ci_rw->gen_bp == NULL);
       
      -    erts_seal_module(&modp->curr);
      -}

      Without the module instance there's no reliable way to figure out the writable + erts_seal_module(&modp->curr); +}

      Without the module instance there's no reliable way to figure out the writable address of a code page, and we rely on address space layout randomization (ASLR) to make it difficult to guess. On some platforms, security is further enhanced by protecting the writable area from writes until the module has been @@ -397,7 +397,7 @@

      flamegraph.pl out.folded > out.svg

      We get a graph that would look something like this:

      Linux Perf FlameGraph: dialyzer PLT build

      You can view a larger version here. It contains the same information, but it is easier to share with others as it does not need the symbols in the executable.

      Using the same data we can also produce a graph where the scheduler profile data -has been merged by using sed:

      ## Strip [0-9]+_ and/or _[0-9]+ from all scheduler names
      +has been merged by using sed:

      ## Strip [0-9]+_ and/or _[0-9]+ from all scheduler names
       ## scheduler names changed in OTP26, hence two expressions
       sed -e 's/^[0-9]\+_//' -e 's/^erts_\([^_]\+\)_[0-9]\+/erts_\1/' out.folded > out.folded_sched
       ## Create the svg
      diff --git a/prs/9277/erts-15.2/doc/html/codeloading.html b/prs/9277/erts-15.2/doc/html/codeloading.html
      index 3d2cf5cfc4515..a3fb042a7d583 100644
      --- a/prs/9277/erts-15.2/doc/html/codeloading.html
      +++ b/prs/9277/erts-15.2/doc/html/codeloading.html
      @@ -167,8 +167,8 @@ 

      erts_try_seize_code_load_permission and erts_release_code_load_permission).

      The ability to prepare several modules in parallel is not currently used as almost all code loading is serialized by the code_server -process. The BIF interface is however prepared for this.

        erlang:prepare_loading(Module, Code) -> LoaderState
      -  erlang:finish_loading([LoaderState])

      The idea is that prepare_loading could be called in parallel for +process. The BIF interface is however prepared for this.

        erlang:prepare_loading(Module, Code) -> LoaderState
      +  erlang:finish_loading([LoaderState])

      The idea is that prepare_loading could be called in parallel for different modules and returns a "magic binary" containing the internal state of each prepared module. Function finish_loading could take a list of such states and do the finishing of all of them in one go.

      Currently we use the legacy BIF erlang:load_module which is now diff --git a/prs/9277/erts-15.2/doc/html/crash_dump.html b/prs/9277/erts-15.2/doc/html/crash_dump.html index 259359f67acb0..ac43936aa0578 100644 --- a/prs/9277/erts-15.2/doc/html/crash_dump.html +++ b/prs/9277/erts-15.2/doc/html/crash_dump.html @@ -405,13 +405,13 @@

      interesting. One has to "guess" what is what, but as the information is symbolic, thorough reading of this information can be useful. As an example, we can find the state variable of the Erlang primitive loader online (5) and -(6) in the following example:

      (1)  3cac44   Return addr 0x13BF58 (<terminate process normally>)
      -(2)  y(0)     ["/view/siri_r10_dev/clearcase/otp/erts/lib/kernel/ebin",
      -(3)            "/view/siri_r10_dev/clearcase/otp/erts/lib/stdlib/ebin"]
      -(4)  y(1)     <0.1.0>
      -(5)  y(2)     {state,[],none,#Fun<erl_prim_loader.6.7085890>,undefined,#Fun<erl_prim_loader.7.9000327>,
      -(6)            #Fun<erl_prim_loader.8.116480692>,#Port<0.2>,infinity,#Fun<erl_prim_loader.9.10708760>}
      -(7)  y(3)     infinity

      When interpreting the data for a process, it is helpful to know that anonymous +(6) in the following example:

      (1)  3cac44   Return addr 0x13BF58 (<terminate process normally>)
      +(2)  y(0)     ["/view/siri_r10_dev/clearcase/otp/erts/lib/kernel/ebin",
      +(3)            "/view/siri_r10_dev/clearcase/otp/erts/lib/stdlib/ebin"]
      +(4)  y(1)     <0.1.0>
      +(5)  y(2)     {state,[],none,#Fun<erl_prim_loader.6.7085890>,undefined,#Fun<erl_prim_loader.7.9000327>,
      +(6)            #Fun<erl_prim_loader.8.116480692>,#Port<0.2>,infinity,#Fun<erl_prim_loader.9.10708760>}
      +(7)  y(3)     infinity

      When interpreting the data for a process, it is helpful to know that anonymous function objects (funs) are given the following:

      • A name constructed from the name of the function in which they are created
      • A number (starting with 0) indicating the number of that fun within that function

      diff --git a/prs/9277/erts-15.2/doc/html/driver.html b/prs/9277/erts-15.2/doc/html/driver.html index 321d6f2c51106..531024fe267f2 100644 --- a/prs/9277/erts-15.2/doc/html/driver.html +++ b/prs/9277/erts-15.2/doc/html/driver.html @@ -180,12 +180,12 @@

      terms, so binary_to_term is called in Erlang to convert the result to term form.

      The code is available in pg_sync.c in the sample directory of erts.

      The driver entry contains the functions that will be called by the emulator. In this example, only start, stop, and control are provided:

      /* Driver interface declarations */
      -static ErlDrvData start(ErlDrvPort port, char *command);
      -static void stop(ErlDrvData drv_data);
      -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      -                   int len, char **rbuf, int rlen);
      +static ErlDrvData start(ErlDrvPort port, char *command);
      +static void stop(ErlDrvData drv_data);
      +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      +                   int len, char **rbuf, int rlen);
       
      -static ErlDrvEntry pq_driver_entry = {
      +static ErlDrvEntry pq_driver_entry = {
           NULL,                        /* init */
           start,
           stop,
      @@ -202,10 +202,10 @@ 

      NULL, /* flush */ NULL, /* call */ NULL /* event */ -};

      We have a structure to store state needed by the driver, in this case we only -need to keep the database connection:

      typedef struct our_data_s {
      +};

      We have a structure to store state needed by the driver, in this case we only +need to keep the database connection:

      typedef struct our_data_s {
           PGconn* conn;
      -} our_data_t;

      The control codes that we have defined are as follows:

      /* Keep the following definitions in alignment with the
      +} our_data_t;

      The control codes that we have defined are as follows:

      /* Keep the following definitions in alignment with the
        * defines in erl_pq_sync.erl
        */
       
      @@ -221,130 +221,130 @@ 

      * the driver entry. */ -DRIVER_INIT(pq_drv) -{ +DRIVER_INIT(pq_drv) +{ return &pq_driver_entry; -}

      Here some initialization is done, start is called from open_port/2. The data +}

      Here some initialization is done, start is called from open_port/2. The data will be passed to control and stop.

      /* DRIVER INTERFACE */
      -static ErlDrvData start(ErlDrvPort port, char *command)
      -{
      +static ErlDrvData start(ErlDrvPort port, char *command)
      +{
           our_data_t* data;
       
      -    data = (our_data_t*)driver_alloc(sizeof(our_data_t));
      +    data = (our_data_t*)driver_alloc(sizeof(our_data_t));
           data->conn = NULL;
      -    set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
      -    return (ErlDrvData)data;
      -}

      We call disconnect to log out from the database. (This should have been done -from Erlang, but just in case.)

      static int do_disconnect(our_data_t* data, ei_x_buff* x);
      -
      -static void stop(ErlDrvData drv_data)
      -{
      -    our_data_t* data = (our_data_t*)drv_data;
      -
      -    do_disconnect(data, NULL);
      -    driver_free(data);
      -}

      We use the binary format only to return data to the emulator; input data is a + set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY); + return (ErlDrvData)data; +}

      We call disconnect to log out from the database. (This should have been done +from Erlang, but just in case.)

      static int do_disconnect(our_data_t* data, ei_x_buff* x);
      +
      +static void stop(ErlDrvData drv_data)
      +{
      +    our_data_t* data = (our_data_t*)drv_data;
      +
      +    do_disconnect(data, NULL);
      +    driver_free(data);
      +}

      We use the binary format only to return data to the emulator; input data is a string parameter for connect and select. The returned data consists of Erlang terms.

      The functions get_s and ei_x_to_new_binary are utilities that are used to make the code shorter. get_s duplicates the string and zero-terminates it, as the postgres client library wants that. ei_x_to_new_binary takes an ei_x_buff buffer, allocates a binary, and copies the data there. This binary is returned in *rbuf. (Notice that this binary is freed by the emulator, not -by us.)

      static char* get_s(const char* buf, int len);
      -static int do_connect(const char *s, our_data_t* data, ei_x_buff* x);
      -static int do_select(const char* s, our_data_t* data, ei_x_buff* x);
      +by us.)

      static char* get_s(const char* buf, int len);
      +static int do_connect(const char *s, our_data_t* data, ei_x_buff* x);
      +static int do_select(const char* s, our_data_t* data, ei_x_buff* x);
       
       /* As we are operating in binary mode, the return value from control
        * is irrelevant, as long as it is not negative.
        */
      -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      -                   int len, char **rbuf, int rlen)
      -{
      +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      +                   int len, char **rbuf, int rlen)
      +{
           int r;
           ei_x_buff x;
      -    our_data_t* data = (our_data_t*)drv_data;
      -    char* s = get_s(buf, len);
      -    ei_x_new_with_version(&x);
      -    switch (command) {
      -        case DRV_CONNECT:    r = do_connect(s, data, &x);  break;
      -        case DRV_DISCONNECT: r = do_disconnect(data, &x);  break;
      -        case DRV_SELECT:     r = do_select(s, data, &x);   break;
      +    our_data_t* data = (our_data_t*)drv_data;
      +    char* s = get_s(buf, len);
      +    ei_x_new_with_version(&x);
      +    switch (command) {
      +        case DRV_CONNECT:    r = do_connect(s, data, &x);  break;
      +        case DRV_DISCONNECT: r = do_disconnect(data, &x);  break;
      +        case DRV_SELECT:     r = do_select(s, data, &x);   break;
               default:             r = -1;        break;
      -    }
      -    *rbuf = (char*)ei_x_to_new_binary(&x);
      -    ei_x_free(&x);
      -    driver_free(s);
      +    }
      +    *rbuf = (char*)ei_x_to_new_binary(&x);
      +    ei_x_free(&x);
      +    driver_free(s);
           return r;
      -}

      do_connect is where we log in to the database. If the connection was +}

      do_connect is where we log in to the database. If the connection was successful, we store the connection handle in the driver data, and return 'ok'. Otherwise, we return the error message from postgres and store NULL in -the driver data.

      static int do_connect(const char *s, our_data_t* data, ei_x_buff* x)
      -{
      -    PGconn* conn = PQconnectdb(s);
      -    if (PQstatus(conn) != CONNECTION_OK) {
      -        encode_error(x, conn);
      -        PQfinish(conn);
      +the driver data.

      static int do_connect(const char *s, our_data_t* data, ei_x_buff* x)
      +{
      +    PGconn* conn = PQconnectdb(s);
      +    if (PQstatus(conn) != CONNECTION_OK) {
      +        encode_error(x, conn);
      +        PQfinish(conn);
               conn = NULL;
      -    } else {
      -        encode_ok(x);
      -    }
      +    } else {
      +        encode_ok(x);
      +    }
           data->conn = conn;
           return 0;
      -}

      If we are connected (and if the connection handle is not NULL), we log out +}

      If we are connected (and if the connection handle is not NULL), we log out from the database. We need to check if we should encode an 'ok', as we can get -here from function stop, which does not return data to the emulator:

      static int do_disconnect(our_data_t* data, ei_x_buff* x)
      -{
      -    if (data->conn == NULL)
      +here from function stop, which does not return data to the emulator:

      static int do_disconnect(our_data_t* data, ei_x_buff* x)
      +{
      +    if (data->conn == NULL)
               return 0;
      -    PQfinish(data->conn);
      +    PQfinish(data->conn);
           data->conn = NULL;
      -    if (x != NULL)
      -        encode_ok(x);
      +    if (x != NULL)
      +        encode_ok(x);
           return 0;
      -}

      We execute a query and encode the result. Encoding is done in another C module, -pg_encode.c, which is also provided as sample code.

      static int do_select(const char* s, our_data_t* data, ei_x_buff* x)
      -{
      -   PGresult* res = PQexec(data->conn, s);
      -    encode_result(x, res, data->conn);
      -    PQclear(res);
      +}

      We execute a query and encode the result. Encoding is done in another C module, +pg_encode.c, which is also provided as sample code.

      static int do_select(const char* s, our_data_t* data, ei_x_buff* x)
      +{
      +   PGresult* res = PQexec(data->conn, s);
      +    encode_result(x, res, data->conn);
      +    PQclear(res);
           return 0;
      -}

      Here we check the result from postgres. If it is data, we encode it as lists of +}

      Here we check the result from postgres. If it is data, we encode it as lists of lists with column data. Everything from postgres is C strings, so we use ei_x_encode_string to send the result as strings to Erlang. (The head of the -list contains the column names.)

      void encode_result(ei_x_buff* x, PGresult* res, PGconn* conn)
      -{
      +list contains the column names.)

      void encode_result(ei_x_buff* x, PGresult* res, PGconn* conn)
      +{
           int row, n_rows, col, n_cols;
      -    switch (PQresultStatus(res)) {
      +    switch (PQresultStatus(res)) {
           case PGRES_TUPLES_OK:
      -        n_rows = PQntuples(res);
      -        n_cols = PQnfields(res);
      -        ei_x_encode_tuple_header(x, 2);
      -        encode_ok(x);
      -        ei_x_encode_list_header(x, n_rows+1);
      -        ei_x_encode_list_header(x, n_cols);
      -        for (col = 0; col < n_cols; ++col) {
      -            ei_x_encode_string(x, PQfname(res, col));
      -        }
      -        ei_x_encode_empty_list(x);
      -        for (row = 0; row < n_rows; ++row) {
      -            ei_x_encode_list_header(x, n_cols);
      -            for (col = 0; col < n_cols; ++col) {
      -                ei_x_encode_string(x, PQgetvalue(res, row, col));
      -            }
      -            ei_x_encode_empty_list(x);
      -        }
      -        ei_x_encode_empty_list(x);
      +        n_rows = PQntuples(res);
      +        n_cols = PQnfields(res);
      +        ei_x_encode_tuple_header(x, 2);
      +        encode_ok(x);
      +        ei_x_encode_list_header(x, n_rows+1);
      +        ei_x_encode_list_header(x, n_cols);
      +        for (col = 0; col < n_cols; ++col) {
      +            ei_x_encode_string(x, PQfname(res, col));
      +        }
      +        ei_x_encode_empty_list(x);
      +        for (row = 0; row < n_rows; ++row) {
      +            ei_x_encode_list_header(x, n_cols);
      +            for (col = 0; col < n_cols; ++col) {
      +                ei_x_encode_string(x, PQgetvalue(res, row, col));
      +            }
      +            ei_x_encode_empty_list(x);
      +        }
      +        ei_x_encode_empty_list(x);
               break;
           case PGRES_COMMAND_OK:
      -        ei_x_encode_tuple_header(x, 2);
      -        encode_ok(x);
      -        ei_x_encode_string(x, PQcmdTuples(res));
      +        ei_x_encode_tuple_header(x, 2);
      +        encode_ok(x);
      +        ei_x_encode_string(x, PQcmdTuples(res));
               break;
           default:
      -        encode_error(x, conn);
      +        encode_error(x, conn);
               break;
      -    }
      -}

      + } +}

      @@ -368,33 +368,33 @@

      the shared library and the name in the driver entry structure.

      When the port has been opened, the driver can be called. In the pg_sync example, we do not have any data from the port, only the return value from the port_control/3.

      The following code is the Erlang part of the synchronous postgres driver, -pg_sync.erl:

      -module(pg_sync).
      +pg_sync.erl:

      -module(pg_sync).
       
      --define(DRV_CONNECT, 1).
      --define(DRV_DISCONNECT, 2).
      --define(DRV_SELECT, 3).
      +-define(DRV_CONNECT, 1).
      +-define(DRV_DISCONNECT, 2).
      +-define(DRV_SELECT, 3).
       
      --export([connect/1, disconnect/1, select/2]).
      +-export([connect/1, disconnect/1, select/2]).
       
      -connect(ConnectStr) ->
      -    case erl_ddll:load_driver(".", "pg_sync") of
      +connect(ConnectStr) ->
      +    case erl_ddll:load_driver(".", "pg_sync") of
               ok -> ok;
      -        {error, already_loaded} -> ok;
      -        E -> exit({error, E})
      +        {error, already_loaded} -> ok;
      +        E -> exit({error, E})
           end,
      -    Port = open_port({spawn, ?MODULE}, []),
      -    case binary_to_term(port_control(Port, ?DRV_CONNECT, ConnectStr)) of
      -        ok -> {ok, Port};
      +    Port = open_port({spawn, ?MODULE}, []),
      +    case binary_to_term(port_control(Port, ?DRV_CONNECT, ConnectStr)) of
      +        ok -> {ok, Port};
               Error -> Error
           end.
       
      -disconnect(Port) ->
      -    R = binary_to_term(port_control(Port, ?DRV_DISCONNECT, "")),
      -    port_close(Port),
      +disconnect(Port) ->
      +    R = binary_to_term(port_control(Port, ?DRV_DISCONNECT, "")),
      +    port_close(Port),
           R.
       
      -select(Port, Query) ->
      -    binary_to_term(port_control(Port, ?DRV_SELECT, Query)).

      The API is simple:

      • connect/1 loads the driver, opens it, and logs on to the database, returning +select(Port, Query) -> + binary_to_term(port_control(Port, ?DRV_SELECT, Query)).

      The API is simple:

      • connect/1 loads the driver, opens it, and logs on to the database, returning the Erlang port if successful.
      • select/2 sends a query to the driver and returns the result.
      • disconnect/1 closes the database connection and the driver. (However, it does not unload it.)

      The connection string is to be a connection string for postgres.

      The driver is loaded with erl_ddll:load_driver/2. If this is successful, or if it is already loaded, it is opened. This will call the start function in the @@ -414,13 +414,13 @@

      on our postgres driver, we re-implement it using the asynchronous calls in LibPQ.

      The asynchronous version of the driver is in the sample files pg_async.c and pg_asyng.erl.

      /* Driver interface declarations */
      -static ErlDrvData start(ErlDrvPort port, char *command);
      -static void stop(ErlDrvData drv_data);
      -static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      -                   int len, char **rbuf, int rlen);
      -static void ready_io(ErlDrvData drv_data, ErlDrvEvent event);
      +static ErlDrvData start(ErlDrvPort port, char *command);
      +static void stop(ErlDrvData drv_data);
      +static int control(ErlDrvData drv_data, unsigned int command, char *buf,
      +                   int len, char **rbuf, int rlen);
      +static void ready_io(ErlDrvData drv_data, ErlDrvEvent event);
       
      -static ErlDrvEntry pq_driver_entry = {
      +static ErlDrvEntry pq_driver_entry = {
           NULL,                     /* init */
           start,
           stop,
      @@ -437,14 +437,14 @@ 

      NULL, /* flush */ NULL, /* call */ NULL /* event */ -}; +}; -typedef struct our_data_t { +typedef struct our_data_t { PGconn* conn; ErlDrvPort port; int socket; int connecting; -} our_data_t;

      Some things have changed from pg_sync.c: we use the entry ready_io for +} our_data_t;

      Some things have changed from pg_sync.c: we use the entry ready_io for ready_input and ready_output, which is called from the emulator only when there is input to be read from the socket. (Actually, the socket is used in a select function inside the emulator, and when the socket is signaled, @@ -454,83 +454,83 @@

      data to the port with driver_output. We have a flag connecting to tell whether the driver is waiting for a connection or waiting for the result of a query. (This is needed, as the entry ready_io is called both when connecting -and when there is a query result.)

      static int do_connect(const char *s, our_data_t* data)
      -{
      -    PGconn* conn = PQconnectStart(s);
      -    if (PQstatus(conn) == CONNECTION_BAD) {
      +and when there is a query result.)

      static int do_connect(const char *s, our_data_t* data)
      +{
      +    PGconn* conn = PQconnectStart(s);
      +    if (PQstatus(conn) == CONNECTION_BAD) {
               ei_x_buff x;
      -        ei_x_new_with_version(&x);
      -        encode_error(&x, conn);
      -        PQfinish(conn);
      +        ei_x_new_with_version(&x);
      +        encode_error(&x, conn);
      +        PQfinish(conn);
               conn = NULL;
      -        driver_output(data->port, x.buff, x.index);
      -        ei_x_free(&x);
      -    }
      -    PQconnectPoll(conn);
      -    int socket = PQsocket(conn);
      +        driver_output(data->port, x.buff, x.index);
      +        ei_x_free(&x);
      +    }
      +    PQconnectPoll(conn);
      +    int socket = PQsocket(conn);
           data->socket = socket;
      -    driver_select(data->port, (ErlDrvEvent)socket, DO_READ, 1);
      -    driver_select(data->port, (ErlDrvEvent)socket, DO_WRITE, 1);
      +    driver_select(data->port, (ErlDrvEvent)socket, DO_READ, 1);
      +    driver_select(data->port, (ErlDrvEvent)socket, DO_WRITE, 1);
           data->conn = conn;
           data->connecting = 1;
           return 0;
      -}

      The connect function looks a bit different too. We connect using the +}

      The connect function looks a bit different too. We connect using the asynchronous PQconnectStart function. After the connection is started, we retrieve the socket for the connection with PQsocket. This socket is used with the driver_select function to wait for connection. When the socket is ready for input or for output, the ready_io function is called.

      Notice that we only return data (with driver_output) if there is an error here, otherwise we wait for the connection to be completed, in which case our -ready_io function is called.

      static int do_select(const char* s, our_data_t* data)
      -{
      +ready_io function is called.

      static int do_select(const char* s, our_data_t* data)
      +{
           data->connecting = 0;
           PGconn* conn = data->conn;
           /* if there's an error return it now */
      -    if (PQsendQuery(conn, s) == 0) {
      +    if (PQsendQuery(conn, s) == 0) {
               ei_x_buff x;
      -        ei_x_new_with_version(&x);
      -        encode_error(&x, conn);
      -        driver_output(data->port, x.buff, x.index);
      -        ei_x_free(&x);
      -    }
      +        ei_x_new_with_version(&x);
      +        encode_error(&x, conn);
      +        driver_output(data->port, x.buff, x.index);
      +        ei_x_free(&x);
      +    }
           /* else wait for ready_output to get results */
           return 0;
      -}

      The do_select function initiates a select, and returns if there is no -immediate error. The result is returned when ready_io is called.

      static void ready_io(ErlDrvData drv_data, ErlDrvEvent event)
      -{
      +}

      The do_select function initiates a select, and returns if there is no +immediate error. The result is returned when ready_io is called.

      static void ready_io(ErlDrvData drv_data, ErlDrvEvent event)
      +{
           PGresult* res = NULL;
      -    our_data_t* data = (our_data_t*)drv_data;
      +    our_data_t* data = (our_data_t*)drv_data;
           PGconn* conn = data->conn;
           ei_x_buff x;
      -    ei_x_new_with_version(&x);
      -    if (data->connecting) {
      +    ei_x_new_with_version(&x);
      +    if (data->connecting) {
               ConnStatusType status;
      -        PQconnectPoll(conn);
      -        status = PQstatus(conn);
      -        if (status == CONNECTION_OK)
      -            encode_ok(&x);
      -        else if (status == CONNECTION_BAD)
      -            encode_error(&x, conn);
      -    } else {
      -        PQconsumeInput(conn);
      -        if (PQisBusy(conn))
      +        PQconnectPoll(conn);
      +        status = PQstatus(conn);
      +        if (status == CONNECTION_OK)
      +            encode_ok(&x);
      +        else if (status == CONNECTION_BAD)
      +            encode_error(&x, conn);
      +    } else {
      +        PQconsumeInput(conn);
      +        if (PQisBusy(conn))
                   return;
      -        res = PQgetResult(conn);
      -        encode_result(&x, res, conn);
      -        PQclear(res);
      -        for (;;) {
      -            res = PQgetResult(conn);
      -            if (res == NULL)
      +        res = PQgetResult(conn);
      +        encode_result(&x, res, conn);
      +        PQclear(res);
      +        for (;;) {
      +            res = PQgetResult(conn);
      +            if (res == NULL)
                       break;
      -            PQclear(res);
      -        }
      -    }
      -    if (x.index > 1) {
      -        driver_output(data->port, x.buff, x.index);
      -        if (data->connecting)
      -            driver_select(data->port, (ErlDrvEvent)data->socket, DO_WRITE, 0);
      -    }
      -    ei_x_free(&x);
      -}

      The ready_io function is called when the socket we got from postgres is ready + PQclear(res); + } + } + if (x.index > 1) { + driver_output(data->port, x.buff, x.index); + if (data->connecting) + driver_select(data->port, (ErlDrvEvent)data->socket, DO_WRITE, 0); + } + ei_x_free(&x); +}

      The ready_io function is called when the socket we got from postgres is ready for input or output. Here we first check if we are connecting to the database. In that case, we check connection status and return OK if the connection is successful, or error if it is not. If the connection is not yet established, we @@ -540,43 +540,43 @@

      the result and return it. The encoding is done with the same functions as in the earlier example.

      Error handling is to be added here, for example, checking that the socket is still open, but this is only a simple example.

      The Erlang part of the asynchronous driver consists of the sample file -pg_async.erl.

      -module(pg_async).
      +pg_async.erl.

      -module(pg_async).
       
      --define(DRV_CONNECT, $C).
      --define(DRV_DISCONNECT, $D).
      --define(DRV_SELECT, $S).
      +-define(DRV_CONNECT, $C).
      +-define(DRV_DISCONNECT, $D).
      +-define(DRV_SELECT, $S).
       
      --export([connect/1, disconnect/1, select/2]).
      +-export([connect/1, disconnect/1, select/2]).
       
      -connect(ConnectStr) ->
      -    case erl_ddll:load_driver(".", "pg_async") of
      +connect(ConnectStr) ->
      +    case erl_ddll:load_driver(".", "pg_async") of
               ok -> ok;
      -        {error, already_loaded} -> ok;
      -        _ -> exit({error, could_not_load_driver})
      +        {error, already_loaded} -> ok;
      +        _ -> exit({error, could_not_load_driver})
           end,
      -    Port = open_port({spawn, ?MODULE}, [binary]),
      -    port_control(Port, ?DRV_CONNECT, ConnectStr),
      -    case return_port_data(Port) of
      +    Port = open_port({spawn, ?MODULE}, [binary]),
      +    port_control(Port, ?DRV_CONNECT, ConnectStr),
      +    case return_port_data(Port) of
               ok ->
      -            {ok, Port};
      +            {ok, Port};
               Error ->
                   Error
           end.
       
      -disconnect(Port) ->
      -    port_control(Port, ?DRV_DISCONNECT, ""),
      -    R = return_port_data(Port),
      -    port_close(Port),
      +disconnect(Port) ->
      +    port_control(Port, ?DRV_DISCONNECT, ""),
      +    R = return_port_data(Port),
      +    port_close(Port),
           R.
       
      -select(Port, Query) ->
      -    port_control(Port, ?DRV_SELECT, Query),
      -    return_port_data(Port).
      +select(Port, Query) ->
      +    port_control(Port, ?DRV_SELECT, Query),
      +    return_port_data(Port).
       
      -return_port_data(Port) ->
      +return_port_data(Port) ->
           receive
      -        {Port, {data, Data}} ->
      -            binary_to_term(Data)
      +        {Port, {data, Data}} ->
      +            binary_to_term(Data)
           end.

      The Erlang code is slightly different, as we do not return the result synchronously from port_control/3, instead we get it from driver_output as data in the message queue. The function return_port_data above receives data @@ -606,7 +606,7 @@

      callback ready_async is called from the main emulator thread, this is where we return the result to Erlang. (We cannot return the result from within the asynchronous function, as we cannot call the driver functions.)

      The following code is from the sample file next_perm.cc. The driver entry -looks like before, but also contains the callback ready_async.

      static ErlDrvEntry next_perm_driver_entry = {
      +looks like before, but also contains the callback ready_async.

      static ErlDrvEntry next_perm_driver_entry = {
           NULL,                        /* init */
           start,
           NULL,                        /* stop */
      @@ -623,109 +623,109 @@ 

      NULL, /* flush */ NULL, /* call */ NULL /* event */ -};

      The output function allocates the work area of the asynchronous function. As +};

      The output function allocates the work area of the asynchronous function. As we use C++, we use a struct, and stuff the data in it. We must copy the original data, it is not valid after we have returned from the output function, and the do_perm function is called later, and from another thread. We return no data here, instead it is sent later from the ready_async callback.

      The async_data is passed to the do_perm function. We do not use a async_free function (the last argument to driver_async), it is only used if -the task is cancelled programmatically.

      struct our_async_data {
      +the task is cancelled programmatically.

      struct our_async_data {
           bool prev;
           vector<int> data;
      -    our_async_data(ErlDrvPort p, int command, const char* buf, int len);
      -};
      -
      -our_async_data::our_async_data(ErlDrvPort p, int command,
      -                               const char* buf, int len)
      -    : prev(command == 2),
      -      data((int*)buf, (int*)buf + len / sizeof(int))
      -{
      -}
      -
      -static void do_perm(void* async_data);
      -
      -static void output(ErlDrvData drv_data, char *buf, int len)
      -{
      -    if (*buf < 1 || *buf > 2) return;
      -    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
      -    void* async_data = new our_async_data(port, *buf, buf+1, len);
      -    driver_async(port, NULL, do_perm, async_data, do_free);
      -}

      In the do_perm we do the work, operating on the structure that was allocated -in output.

      static void do_perm(void* async_data)
      -{
      -    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
      -    if (d->prev)
      -        prev_permutation(d->data.begin(), d->data.end());
      +    our_async_data(ErlDrvPort p, int command, const char* buf, int len);
      +};
      +
      +our_async_data::our_async_data(ErlDrvPort p, int command,
      +                               const char* buf, int len)
      +    : prev(command == 2),
      +      data((int*)buf, (int*)buf + len / sizeof(int))
      +{
      +}
      +
      +static void do_perm(void* async_data);
      +
      +static void output(ErlDrvData drv_data, char *buf, int len)
      +{
      +    if (*buf < 1 || *buf > 2) return;
      +    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
      +    void* async_data = new our_async_data(port, *buf, buf+1, len);
      +    driver_async(port, NULL, do_perm, async_data, do_free);
      +}

      In the do_perm we do the work, operating on the structure that was allocated +in output.

      static void do_perm(void* async_data)
      +{
      +    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
      +    if (d->prev)
      +        prev_permutation(d->data.begin(), d->data.end());
           else
      -        next_permutation(d->data.begin(), d->data.end());
      -}

      In the ready_async function the output is sent back to the emulator. We use + next_permutation(d->data.begin(), d->data.end()); +}

      In the ready_async function the output is sent back to the emulator. We use the driver term format instead of ei. This is the only way to send Erlang terms directly to a driver, without having the Erlang code to call binary_to_term/1. In the simple example this works well, -and we do not need to use ei to handle the binary term format.

      When the data is returned, we deallocate our data.

      static void ready_async(ErlDrvData drv_data, ErlDrvThreadData async_data)
      -{
      -    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
      -    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
      -    int n = d->data.size(), result_n = n*2 + 3;
      -    ErlDrvTermData *result = new ErlDrvTermData[result_n], *rp = result;
      -    for (vector<int>::iterator i = d->data.begin();
      -         i != d->data.end(); ++i) {
      +and we do not need to use ei to handle the binary term format.

      When the data is returned, we deallocate our data.

      static void ready_async(ErlDrvData drv_data, ErlDrvThreadData async_data)
      +{
      +    ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
      +    our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
      +    int n = d->data.size(), result_n = n*2 + 3;
      +    ErlDrvTermData *result = new ErlDrvTermData[result_n], *rp = result;
      +    for (vector<int>::iterator i = d->data.begin();
      +         i != d->data.end(); ++i) {
               *rp++ = ERL_DRV_INT;
               *rp++ = *i;
      -    }
      +    }
           *rp++ = ERL_DRV_NIL;
           *rp++ = ERL_DRV_LIST;
           *rp++ = n+1;
      -    driver_output_term(port, result, result_n);
      -    delete[] result;
      +    driver_output_term(port, result, result_n);
      +    delete[] result;
           delete d;
      -}

      This driver is called like the others from Erlang. However, as we use +}

      This driver is called like the others from Erlang. However, as we use driver_output_term, there is no need to call binary_to_term/1. The Erlang code -is in the sample file next_perm.erl.

      The input is changed into a list of integers and sent to the driver.

      -module(next_perm).
      +is in the sample file next_perm.erl.

      The input is changed into a list of integers and sent to the driver.

      -module(next_perm).
       
      --export([next_perm/1, prev_perm/1, load/0, all_perm/1]).
      +-export([next_perm/1, prev_perm/1, load/0, all_perm/1]).
       
      -load() ->
      -    case whereis(next_perm) of
      +load() ->
      +    case whereis(next_perm) of
               undefined ->
      -            case erl_ddll:load_driver(".", "next_perm") of
      +            case erl_ddll:load_driver(".", "next_perm") of
                       ok -> ok;
      -                {error, already_loaded} -> ok;
      -                E -> exit(E)
      +                {error, already_loaded} -> ok;
      +                E -> exit(E)
                   end,
      -            Port = open_port({spawn, "next_perm"}, []),
      -            register(next_perm, Port);
      +            Port = open_port({spawn, "next_perm"}, []),
      +            register(next_perm, Port);
               _ ->
                   ok
           end.
       
      -list_to_integer_binaries(L) ->
      -    [<<I:32/integer-native>> || I <- L].
      +list_to_integer_binaries(L) ->
      +    [<<I:32/integer-native>> || I <- L].
       
      -next_perm(L) ->
      -    next_perm(L, 1).
      +next_perm(L) ->
      +    next_perm(L, 1).
       
      -prev_perm(L) ->
      -    next_perm(L, 2).
      +prev_perm(L) ->
      +    next_perm(L, 2).
       
      -next_perm(L, Nxt) ->
      -    load(),
      -    B = list_to_integer_binaries(L),
      -    port_control(next_perm, Nxt, B),
      +next_perm(L, Nxt) ->
      +    load(),
      +    B = list_to_integer_binaries(L),
      +    port_control(next_perm, Nxt, B),
           receive
               Result ->
                   Result
           end.
       
      -all_perm(L) ->
      -    New = prev_perm(L),
      -    all_perm(New, L, [New]).
      +all_perm(L) ->
      +    New = prev_perm(L),
      +    all_perm(New, L, [New]).
       
      -all_perm(L, L, Acc) ->
      +all_perm(L, L, Acc) ->
           Acc;
      -all_perm(L, Orig, Acc) ->
      -    New = prev_perm(L),
      -    all_perm(New, Orig, [New | Acc]).
      +
      all_perm(L, Orig, Acc) -> + New = prev_perm(L), + all_perm(New, Orig, [New | Acc]).

      diff --git a/prs/9277/erts-15.2/doc/html/driver_entry.html b/prs/9277/erts-15.2/doc/html/driver_entry.html index 11fa714726132..48c2d6aeebb50 100644 --- a/prs/9277/erts-15.2/doc/html/driver_entry.html +++ b/prs/9277/erts-15.2/doc/html/driver_entry.html @@ -176,54 +176,54 @@

      Data Types

      -

      ErlDrvEntry

      typedef struct erl_drv_entry {
      -    int (*init)(void);          /* Called at system startup for statically
      +

      ErlDrvEntry

      typedef struct erl_drv_entry {
      +    int (*init)(void);          /* Called at system startup for statically
                                          linked drivers, and after loading for
                                          dynamically loaded drivers */
       #ifndef ERL_SYS_DRV
      -    ErlDrvData (*start)(ErlDrvPort port, char *command);
      +    ErlDrvData (*start)(ErlDrvPort port, char *command);
                                       /* Called when open_port/2 is invoked,
                                          return value -1 means failure */
       #else
      -    ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
      +    ErlDrvData (*start)(ErlDrvPort port, char *command, SysDriverOpts* opts);
                                       /* Special options, only for system driver */
       #endif
      -    void (*stop)(ErlDrvData drv_data);
      +    void (*stop)(ErlDrvData drv_data);
                                       /* Called when port is closed, and when the
                                          emulator is halted */
      -    void (*output)(ErlDrvData drv_data, char *buf, ErlDrvSizeT len);
      +    void (*output)(ErlDrvData drv_data, char *buf, ErlDrvSizeT len);
                                       /* Called when we have output from Erlang to
                                          the port */
      -    void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
      +    void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
                                       /* Called when we have input from one of
                                          the driver's handles */
      -    void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
      +    void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
                                       /* Called when output is possible to one of
                                          the driver's handles */
           char *driver_name;          /* Name supplied as command in
                                          erlang:open_port/2 */
      -    void (*finish)(void);       /* Called before unloading the driver -
      +    void (*finish)(void);       /* Called before unloading the driver -
                                          dynamic drivers only */
           void *handle;               /* Reserved, used by emulator internally */
      -    ErlDrvSSizeT (*control)(ErlDrvData drv_data, unsigned int command,
      +    ErlDrvSSizeT (*control)(ErlDrvData drv_data, unsigned int command,
                                   char *buf, ErlDrvSizeT len,
      -			    char **rbuf, ErlDrvSizeT rlen);
      +			    char **rbuf, ErlDrvSizeT rlen);
                                       /* "ioctl" for drivers - invoked by
                                          port_control/3 */
      -    void (*timeout)(ErlDrvData drv_data);
      +    void (*timeout)(ErlDrvData drv_data);
                                       /* Handling of time-out in driver */
      -    void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
      +    void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
                                       /* Called when we have output from Erlang
                                          to the port */
      -    void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data);
      -    void (*flush)(ErlDrvData drv_data);
      +    void (*ready_async)(ErlDrvData drv_data, ErlDrvThreadData thread_data);
      +    void (*flush)(ErlDrvData drv_data);
                                       /* Called when the port is about to be
                                          closed, and there is data in the
                                          driver queue that must be flushed
                                          before 'stop' can be called */
      -    ErlDrvSSizeT (*call)(ErlDrvData drv_data, unsigned int command,
      +    ErlDrvSSizeT (*call)(ErlDrvData drv_data, unsigned int command,
                                char *buf, ErlDrvSizeT len,
      -			 char **rbuf, ErlDrvSizeT rlen, unsigned int *flags);
      +			 char **rbuf, ErlDrvSizeT rlen, unsigned int *flags);
                                       /* Works mostly like 'control', a synchronous
                                          call into the driver */
           void* unused_event_callback;
      @@ -232,11 +232,11 @@ 

      int minor_version; /* ERL_DRV_EXTENDED_MINOR_VERSION */ int driver_flags; /* ERL_DRV_FLAGs */ void *handle2; /* Reserved, used by emulator internally */ - void (*process_exit)(ErlDrvData drv_data, ErlDrvMonitor *monitor); + void (*process_exit)(ErlDrvData drv_data, ErlDrvMonitor *monitor); /* Called when a process monitor fires */ - void (*stop_select)(ErlDrvEvent event, void* reserved); + void (*stop_select)(ErlDrvEvent event, void* reserved); /* Called to close an event object */ - } ErlDrvEntry;

      • int (*init)(void) - Called directly after the driver has been + } ErlDrvEntry;

      • int (*init)(void) - Called directly after the driver has been loaded by erl_ddll:load_driver/2 (actually when the driver is added to the driver list). The driver is to return 0, or, if the driver cannot initialize, -1.

      • ErlDrvData (*start)(ErlDrvPort port, char* command) - Called diff --git a/prs/9277/erts-15.2/doc/html/erl_cmd.html b/prs/9277/erts-15.2/doc/html/erl_cmd.html index 381aeb990dd96..f3bcfeb3e007c 100644 --- a/prs/9277/erts-15.2/doc/html/erl_cmd.html +++ b/prs/9277/erts-15.2/doc/html/erl_cmd.html @@ -153,18 +153,18 @@

        init process and can be retrieved by calling init:get_plain_arguments/0. Plain arguments can occur before the first flag, or after a -- flag. Also, the -extra flag causes everything that follows to become plain arguments.

      Examples:

      % erl +W w -sname arnie +R 9 -s my_init -extra +bertie
      -(arnie@host)1> init:get_argument(sname).
      -{ok,[["arnie"]]}
      -(arnie@host)2> init:get_plain_arguments().
      -["+bertie"]

      Here +W w and +R 9 are emulator flags. -s my_init is an init flag, +(arnie@host)1> init:get_argument(sname). +{ok,[["arnie"]]} +(arnie@host)2> init:get_plain_arguments(). +["+bertie"]

      Here +W w and +R 9 are emulator flags. -s my_init is an init flag, interpreted by init. -sname arnie is a user flag, stored by init. It is read by Kernel and causes the Erlang runtime system to become distributed. Finally, everything after -extra (that is, +bertie) is considered as plain arguments.

      % erl -myflag 1
      -1> init:get_argument(myflag).
      -{ok,[["1"]]}
      -2> init:get_plain_arguments().
      -[]

      Here the user flag -myflag 1 is passed to and stored by the init process. It +1> init:get_argument(myflag). +{ok,[["1"]]} +2> init:get_plain_arguments(). +[]

      Here the user flag -myflag 1 is passed to and stored by the init process. It is a user-defined flag, presumably used by some user-defined application.

      @@ -704,7 +704,7 @@

      The user-defined CPU topology overrides any automatically detected CPU topology. The CPU topology is used when binding schedulers to logical processors. This option must be before -+sbt on the command-line.

      <Id> = integer(); when 0 =< <Id> =< 65535
      ++sbt on the command-line.

      <Id> = integer(); when 0 =< <Id> =< 65535
       <IdRange> = <Id>-<Id>
       <IdOrIdRange> = <Id> | <IdRange>
       <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange>
      @@ -737,22 +737,22 @@ 

      NUMA node. If <ProcessorIds> is omitted, its default position is before <NodeIds>. That is, the default is processor external NUMA nodes.

      If a list of identifiers is used in an <IdDefs>:

      • <LogicalIds> must be a list of identifiers.
      • At least one other identifier type besides <LogicalIds> must also have a list of identifiers.
      • All lists of identifiers must produce the same number of identifiers.

      A simple example. A single quad core processor can be described as follows:

      % erl +sct L0-3c0-3
      -1> erlang:system_info(cpu_topology).
      -[{processor,[{core,{logical,0}},
      -             {core,{logical,1}},
      -             {core,{logical,2}},
      -             {core,{logical,3}}]}]

      A more complicated example with two quad core processors, each processor in +1> erlang:system_info(cpu_topology). +[{processor,[{core,{logical,0}}, + {core,{logical,1}}, + {core,{logical,2}}, + {core,{logical,3}}]}]

      A more complicated example with two quad core processors, each processor in its own NUMA node. The ordering of logical processors is a bit weird. This to give a better example of identifier lists:

      % erl +sct L0-1,3-2c0-3p0N0:L7,4,6-5c0-3p1N1
      -1> erlang:system_info(cpu_topology).
      -[{node,[{processor,[{core,{logical,0}},
      -                    {core,{logical,1}},
      -                    {core,{logical,3}},
      -                    {core,{logical,2}}]}]},
      - {node,[{processor,[{core,{logical,7}},
      -                    {core,{logical,4}},
      -                    {core,{logical,6}},
      -                    {core,{logical,5}}]}]}]

      As long as real identifiers are correct, it is OK to pass a CPU topology +1> erlang:system_info(cpu_topology). +[{node,[{processor,[{core,{logical,0}}, + {core,{logical,1}}, + {core,{logical,3}}, + {core,{logical,2}}]}]}, + {node,[{processor,[{core,{logical,7}}, + {core,{logical,4}}, + {core,{logical,6}}, + {core,{logical,5}}]}]}]

      As long as real identifiers are correct, it is OK to pass a CPU topology that is not a correct description of the CPU topology. When used with care this can be very useful. This to trick the emulator to bind its schedulers as you want. For example, if you want to run multiple Erlang runtime systems @@ -927,10 +927,10 @@

      user's home directory and then filename:basedir(user_config, "erlang").

      If an .erlang file is found, it is assumed to contain valid Erlang expressions. These expressions are evaluated as if they were input to the -shell.

      A typical .erlang file contains a set of search paths, for example:

      io:format("executing user profile in $HOME/.erlang\n",[]).
      -code:add_path("/home/calvin/test/ebin").
      -code:add_path("/home/hobbes/bigappl-1.2/ebin").
      -io:format(".erlang rc finished\n",[]).

    • user_default and shell_default - Functions in the shell that are not +shell.

      A typical .erlang file contains a set of search paths, for example:

      io:format("executing user profile in $HOME/.erlang\n",[]).
      +code:add_path("/home/calvin/test/ebin").
      +code:add_path("/home/hobbes/bigappl-1.2/ebin").
      +io:format(".erlang rc finished\n",[]).
    • user_default and shell_default - Functions in the shell that are not prefixed by a module name are assumed to be functional objects (funs), built-in functions (BIFs), or belong to the module user_default or shell_default.

      To include private shell commands, define them in a module user_default and diff --git a/prs/9277/erts-15.2/doc/html/erl_dist_protocol.html b/prs/9277/erts-15.2/doc/html/erl_dist_protocol.html index 1f3d40af5d766..80cbc1a111517 100644 --- a/prs/9277/erts-15.2/doc/html/erl_dist_protocol.html +++ b/prs/9277/erts-15.2/doc/html/erl_dist_protocol.html @@ -256,7 +256,7 @@

      client ->> EPMD: NAMES_REQ EPMD -->> client: NAMES_RESP

    1
    110

    Table: NAMES_REQ (110)

    The response for a NAMES_REQ is as follows:

    4
    EPMDPortNoNodeInfo*

    Table: NAMES_RESP

    NodeInfo is a string written for each active node. When all NodeInfo has -been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("name ~ts at port ~p~n", [NodeName, Port]).

    +been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("name ~ts at port ~p~n", [NodeName, Port]).

    @@ -271,9 +271,9 @@

    client ->> EPMD: DUMP_REQ EPMD -->> client: DUMP_RESP

    1
    100

    Table: DUMP_REQ

    The response for a DUMP_REQ is as follows:

    4
    EPMDPortNoNodeInfo*

    Table: DUMP_RESP

    NodeInfo is a string written for each node kept in the EPMD. When all -NodeInfo has been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("active name     ~ts at port ~p, fd = ~p~n",
    -          [NodeName, Port, Fd]).

    or

    io:format("old/unused name ~ts at port ~p, fd = ~p ~n",
    -          [NodeName, Port, Fd]).

    +NodeInfo has been written the connection is closed by the EPMD.

    NodeInfo is, as expressed in Erlang:

    io:format("active name     ~ts at port ~p, fd = ~p~n",
    +          [NodeName, Port, Fd]).

    or

    io:format("old/unused name ~ts at port ~p, fd = ~p ~n",
    +          [NodeName, Port, Fd]).

    @@ -411,7 +411,7 @@

    Semigraphic View

    -
    A (initiator)                                      B (acceptor)
    +
    A (initiator)                                      B (acceptor)
     
     TCP connect ------------------------------------>
                                                        TCP accept
    @@ -421,36 +421,36 @@ 

    <---------------------------------------------- send_status recv_status -(if status was 'alive' +(if status was 'alive' send_status - - - - - - - - - - - - - - - - - -> - recv_status) + recv_status) - (ChB) ChB = gen_challenge() + (ChB) ChB = gen_challenge() <---------------------------------------------- send_challenge recv_challenge -(if old send_name +(if old send_name send_complement - - - - - - - - - - - - - - - -> - recv_complement) + recv_complement) -ChA = gen_challenge(), -OCA = out_cookie(B), -DiA = gen_digest(ChB, OCA) - (ChA, DiA) +ChA = gen_challenge(), +OCA = out_cookie(B), +DiA = gen_digest(ChB, OCA) + (ChA, DiA) send_challenge_reply ---------------------------> recv_challenge_reply - ICB = in_cookie(A), + ICB = in_cookie(A), check: - DiA == gen_digest (ChB, ICB)? + DiA == gen_digest (ChB, ICB)? - if OK: - OCB = out_cookie(A), - DiB = gen_digest (ChA, OCB) - (DiB) + OCB = out_cookie(A), + DiB = gen_digest (ChA, OCB) + (DiB) <----------------------------------------------- send_challenge_ack recv_challenge_ack DONE -ICA = in_cookie(B), - else: +ICA = in_cookie(B), - else: check: CLOSE -DiB == gen_digest(ChA, ICA)? +DiB == gen_digest(ChA, ICA)? - if OK: DONE - else: diff --git a/prs/9277/erts-15.2/doc/html/erl_driver.html b/prs/9277/erts-15.2/doc/html/erl_driver.html index fd75049503bb1..f47ad90688c68 100644 --- a/prs/9277/erts-15.2/doc/html/erl_driver.html +++ b/prs/9277/erts-15.2/doc/html/erl_driver.html @@ -333,7 +333,7 @@

    • ErlDrvSizeT - An unsigned integer type to be used as size_t.

    • ErlDrvSSizeT - A signed integer type, the size of -ErlDrvSizeT.

    • ErlDrvSysInfo

      typedef struct ErlDrvSysInfo {
      +ErlDrvSizeT.

    • ErlDrvSysInfo

      typedef struct ErlDrvSysInfo {
          int driver_major_version;
          int driver_minor_version;
          char *erts_version;
      @@ -345,7 +345,7 @@ 

      int nif_major_version; int nif_minor_version; int dirty_scheduler_support; -} ErlDrvSysInfo;

      The ErlDrvSysInfo structure is used for storage of information about the +} ErlDrvSysInfo;

    The ErlDrvSysInfo structure is used for storage of information about the Erlang runtime system. driver_system_info writes the system information when passed a reference to a ErlDrvSysInfo structure. The fields @@ -401,12 +401,12 @@

    aligned for storage of an array of doubles (usually 8-byte aligned).

  • ErlDrvData - A handle to driver-specific data, passed to the driver callbacks. It is a pointer, and is most often type cast to a specific pointer in the driver.

  • SysIOVec - A system I/O vector, as used by writev on Unix and -WSASend on Win32. It is used in ErlIOVec.

  • ErlIOVec

    typedef struct ErlIOVec {
    +WSASend on Win32. It is used in ErlIOVec.

  • ErlIOVec

    typedef struct ErlIOVec {
       int vsize;
       ErlDrvSizeT size;
       SysIOVec* iov;
       ErlDrvBinary** binv;
    -} ErlIOVec;

    The I/O vector used by the emulator and drivers is a list of binaries, with a +} ErlIOVec;

  • The I/O vector used by the emulator and drivers is a list of binaries, with a SysIOVec pointing to the buffers of the binaries. It is used in driver_outputv and the outputv driver callback. Also, the driver queue is an ErlIOVec.

  • ErlDrvMonitor - When a driver creates a monitor for a process, a @@ -485,8 +485,8 @@

    add_driver_entry()

    -
    void add_driver_entry(ErlDrvEntry
    -        *de);

    Adds a driver entry to the list of drivers known by Erlang. The +

    void add_driver_entry(ErlDrvEntry
    +        *de);

    Adds a driver entry to the list of drivers known by Erlang. The init function of parameter de is called.

    Note

    To use this function for adding drivers residing in dynamically loaded code is dangerous. If the driver code for the added driver resides in the same dynamically loaded module (that is, .so file) as a normal dynamically loaded @@ -498,7 +498,7 @@

    driver_alloc()

    -
    void * driver_alloc(ErlDrvSizeT size);

    Allocates a memory block of the size specified in size, and returns it. This +

    void * driver_alloc(ErlDrvSizeT size);

    Allocates a memory block of the size specified in size, and returns it. This fails only on out of memory, in which case NULL is returned. (This is most often a wrapper for malloc).

    Memory allocated must be explicitly freed with a corresponding call to driver_free (unless otherwise stated).

    This function is thread-safe.

    @@ -507,7 +507,7 @@

    driver_alloc_binary()

    -
    ErlDrvBinary * driver_alloc_binary(ErlDrvSizeT size);

    Allocates a driver binary with a memory block of at least size bytes, and +

    ErlDrvBinary * driver_alloc_binary(ErlDrvSizeT size);

    Allocates a driver binary with a memory block of at least size bytes, and returns a pointer to it, or NULL on failure (out of memory). When a driver binary has been sent to the emulator, it must not be changed. Every allocated binary is to be freed by a corresponding call to @@ -521,9 +521,9 @@

    driver_async()

    -
    long driver_async(ErlDrvPort port, unsigned
    -        int* key, void (*async_invoke)(void*), void* async_data, void
    -        (*async_free)(void*));

    Performs an asynchronous call. The function async_invoke is invoked in a +

    long driver_async(ErlDrvPort port, unsigned
    +        int* key, void (*async_invoke)(void*), void* async_data, void
    +        (*async_free)(void*));

    Performs an asynchronous call. The function async_invoke is invoked in a thread separate from the emulator thread. This enables the driver to perform time-consuming, blocking operations without blocking the emulator.

    The async thread pool size can be set with command-line argument +A in erl(1). If an async @@ -555,7 +555,7 @@

    driver_async_port_key()

    -
    unsigned int driver_async_port_key(ErlDrvPort port);

    Calculates a key for later use in driver_async. +

    unsigned int driver_async_port_key(ErlDrvPort port);

    Calculates a key for later use in driver_async. The keys are evenly distributed so that a fair mapping between port IDs and async thread IDs is achieved.

    Note

    Before Erlang/OTP R16, the port ID could be used as a key with proper casting, but after the rewrite of the port subsystem, this is no longer the case. With @@ -566,7 +566,7 @@

    driver_binary_dec_refc()

    -
    long driver_binary_dec_refc(ErlDrvBinary *bin);

    Decrements the reference count on bin and returns the reference count reached +

    long driver_binary_dec_refc(ErlDrvBinary *bin);

    Decrements the reference count on bin and returns the reference count reached after the decrement.

    This function is thread-safe.

    Note

    The reference count of driver binary is normally to be decremented by calling driver_free_binary.

    driver_binary_dec_refc does not free the binary if the reference count reaches zero. Only use driver_binary_dec_refc when you are sure not to @@ -576,21 +576,21 @@

    driver_binary_get_refc()

    -
    long driver_binary_get_refc(ErlDrvBinary *bin);

    Returns the current reference count on bin.

    This function is thread-safe.

    +
    long driver_binary_get_refc(ErlDrvBinary *bin);

    Returns the current reference count on bin.

    This function is thread-safe.

    driver_binary_inc_refc()

    -
    long driver_binary_inc_refc(ErlDrvBinary *bin);

    Increments the reference count on bin and returns the reference count reached +

    long driver_binary_inc_refc(ErlDrvBinary *bin);

    Increments the reference count on bin and returns the reference count reached after the increment.

    This function is thread-safe.

    driver_caller()

    -
    ErlDrvTermData driver_caller(ErlDrvPort
    -        port);

    Returns the process ID of the process that made the current call to the driver. +

    ErlDrvTermData driver_caller(ErlDrvPort
    +        port);

    Returns the process ID of the process that made the current call to the driver. The process ID can be used with driver_send_term to send back data to the caller. driver_caller only returns valid data when currently executing in one @@ -603,14 +603,14 @@

    driver_cancel_timer()

    -
    int driver_cancel_timer(ErlDrvPort port);

    Cancels a timer set with driver_set_timer.

    The return value is 0.

    +
    int driver_cancel_timer(ErlDrvPort port);

    Cancels a timer set with driver_set_timer.

    The return value is 0.

    driver_compare_monitors()

    -
    int driver_compare_monitors(const ErlDrvMonitor
    -        *monitor1, const ErlDrvMonitor *monitor2);

    Compares two ErlDrvMonitors. Can also be used to imply some artificial order +

    int driver_compare_monitors(const ErlDrvMonitor
    +        *monitor1, const ErlDrvMonitor *monitor2);

    Compares two ErlDrvMonitors. Can also be used to imply some artificial order on monitors, for whatever reason.

    Returns 0 if monitor1 and monitor2 are equal, < 0 if monitor1 < monitor2, and > 0 if monitor1 > monitor2.

    @@ -618,16 +618,16 @@

    driver_connected()

    -
    ErlDrvTermData driver_connected(ErlDrvPort
    -        port);

    Returns the port owner process.

    Notice that this function is not thread-safe.

    +
    ErlDrvTermData driver_connected(ErlDrvPort
    +        port);

    Returns the port owner process.

    Notice that this function is not thread-safe.

    driver_create_port()

    -
    ErlDrvPort driver_create_port(ErlDrvPort port,
    +
    ErlDrvPort driver_create_port(ErlDrvPort port,
             ErlDrvTermData owner_pid, char* name,
    -        ErlDrvData drv_data);

    Creates a new port executing the same driver code as the port creating the new + ErlDrvData drv_data);

    Creates a new port executing the same driver code as the port creating the new port.

    • port - The port handle of the port (driver instance) creating the new port.

    • owner_pid - The process ID of the Erlang process to become owner of the new port. This process will be linked to the new port. You usually want to use @@ -648,15 +648,15 @@

      driver_demonitor_process()

      -
      int driver_demonitor_process(ErlDrvPort port,
      -        const ErlDrvMonitor *monitor);

      Cancels a monitor created earlier.

      Returns 0 if a monitor was removed and > 0 if the monitor no longer exists.

      +
      int driver_demonitor_process(ErlDrvPort port,
      +        const ErlDrvMonitor *monitor);

      Cancels a monitor created earlier.

      Returns 0 if a monitor was removed and > 0 if the monitor no longer exists.

      driver_deq()

      -
      ErlDrvSizeT driver_deq(ErlDrvPort port,
      -        ErlDrvSizeT size);

      Dequeues data by moving the head pointer forward in the driver queue by size +

      ErlDrvSizeT driver_deq(ErlDrvPort port,
      +        ErlDrvSizeT size);

      Dequeues data by moving the head pointer forward in the driver queue by size bytes. The data in the queue is deallocated.

      Returns the number of bytes remaining in the queue on success, otherwise -1.

      This function can be called from any thread if a port data lock associated with the port is locked by the calling thread during the call.

      @@ -665,8 +665,8 @@

      driver_enq()

      -
      int driver_enq(ErlDrvPort port, char* buf,
      -        ErlDrvSizeT len);

      Enqueues data in the driver queue. The data in buf is copied (len bytes) and +

      int driver_enq(ErlDrvPort port, char* buf,
      +        ErlDrvSizeT len);

      Enqueues data in the driver queue. The data in buf is copied (len bytes) and placed at the end of the driver queue. The driver queue is normally used in a FIFO way.

      The driver queue is available to queue output from the emulator to the driver (data from the driver to the emulator is queued by the emulator in normal Erlang @@ -681,8 +681,8 @@

      driver_enq_bin()

      -
      int driver_enq_bin(ErlDrvPort port,
      -        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Enqueues a driver binary in the driver queue. The data in bin at offset with +

      int driver_enq_bin(ErlDrvPort port,
      +        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Enqueues a driver binary in the driver queue. The data in bin at offset with length len is placed at the end of the queue. This function is most often faster than driver_enq, because no data must be copied.

      This function can be called from any thread if a @@ -693,8 +693,8 @@

      driver_enqv()

      -
      int driver_enqv(ErlDrvPort port, ErlIOVec *ev,
      -        ErlDrvSizeT skip);

      Enqueues the data in ev, skipping the first skip bytes of it, at the end of +

      int driver_enqv(ErlDrvPort port, ErlIOVec *ev,
      +        ErlDrvSizeT skip);

      Enqueues the data in ev, skipping the first skip bytes of it, at the end of the driver queue. It is faster than driver_enq, because no data must be copied.

      The return value is 0.

      This function can be called from any thread if a port data lock associated with the port is locked @@ -716,10 +716,10 @@

      driver_failure_posix()

      -
      int driver_failure(ErlDrvPort port, int
      -        error);
      int driver_failure_atom(ErlDrvPort port, char
      -        *string);
      int driver_failure_posix(ErlDrvPort port, int
      -        error);

      Signals to Erlang that the driver has encountered an error and is to be closed. +

      int driver_failure(ErlDrvPort port, int
      +        error);
      int driver_failure_atom(ErlDrvPort port, char
      +        *string);
      int driver_failure_posix(ErlDrvPort port, int
      +        error);

      Signals to Erlang that the driver has encountered an error and is to be closed. The port is closed and the tuple {'EXIT', error, Err} is sent to the port owner process, where error is an error atom (driver_failure_atom and driver_failure_posix) or an integer (driver_failure).

      The driver is to fail only when in severe error situations, when the driver @@ -731,8 +731,8 @@

      driver_failure_eof()

      -
      int driver_failure_eof(ErlDrvPort
      -        port);

      Signals to Erlang that the driver has encountered an EOF and is to be closed, +

      int driver_failure_eof(ErlDrvPort
      +        port);

      Signals to Erlang that the driver has encountered an EOF and is to be closed, unless the port was opened with option eof, in which case eof is sent to the port. Otherwise the port is closed and an 'EXIT' message is sent to the port owner process.

      The return value is 0.

      @@ -741,7 +741,7 @@

      driver_free()

      -
      void driver_free(void *ptr);

      Frees the memory pointed to by ptr. The memory is to have been allocated with +

      void driver_free(void *ptr);

      Frees the memory pointed to by ptr. The memory is to have been allocated with driver_alloc. All allocated memory is to be deallocated, only once. There is no garbage collection in drivers.

      This function is thread-safe.

      @@ -749,7 +749,7 @@

      driver_free_binary()

      -
      void driver_free_binary(ErlDrvBinary *bin);

      Frees a driver binary bin, allocated previously with +

      void driver_free_binary(ErlDrvBinary *bin);

      Frees a driver binary bin, allocated previously with driver_alloc_binary. As binaries in Erlang are reference counted, the binary can still be around.

      This function is thread-safe.

      @@ -757,8 +757,8 @@

      driver_get_monitored_process()

      -
      ErlDrvTermData driver_get_monitored_process(ErlDrvPort port, const
      -        ErlDrvMonitor *monitor);

      Returns the process ID associated with a living monitor. It can be used in the +

      ErlDrvTermData driver_get_monitored_process(ErlDrvPort port, const
      +        ErlDrvMonitor *monitor);

      Returns the process ID associated with a living monitor. It can be used in the process_exit callback to get the process identification for the exiting process.

      Returns driver_term_nil if the monitor no longer exists.

      @@ -766,7 +766,7 @@

      driver_get_now()

      -
      int driver_get_now(ErlDrvNowData *now);

      Warning

      This function is deprecated. Do not use it. Use +

      int driver_get_now(ErlDrvNowData *now);

      Warning

      This function is deprecated. Do not use it. Use erl_drv_monotonic_time (perhaps in combination with erl_drv_time_offset) instead.

      Reads a time stamp into the memory pointed to by parameter now. For @@ -778,8 +778,8 @@

      driver_lock_driver()

      -
      int driver_lock_driver(ErlDrvPort
      -        port);

      Locks the driver used by the port port in memory for the rest of the emulator +

      int driver_lock_driver(ErlDrvPort
      +        port);

      Locks the driver used by the port port in memory for the rest of the emulator process' lifetime. After this call, the driver behaves as one of Erlang's statically linked-in drivers.

      @@ -787,8 +787,8 @@

      driver_mk_atom()

      -
      ErlDrvTermData driver_mk_atom(char*
      -        string);

      Returns an atom given a name string. The atom is created and does not change, +

      ErlDrvTermData driver_mk_atom(char*
      +        string);

      Returns an atom given a name string. The atom is created and does not change, so the return value can be saved and reused, which is faster than looking up the atom several times.

      Notice that this function is not thread-safe.

      @@ -796,8 +796,8 @@

      driver_mk_port()

      -
      ErlDrvTermData driver_mk_port(ErlDrvPort
      -        port);

      Converts a port handle to the Erlang term format, usable in +

      ErlDrvTermData driver_mk_port(ErlDrvPort
      +        port);

      Converts a port handle to the Erlang term format, usable in erl_drv_output_term and erl_drv_send_term.

      Notice that this function is not thread-safe.

      @@ -805,8 +805,8 @@

      driver_monitor_process()

      -
      int driver_monitor_process(ErlDrvPort port,
      -        ErlDrvTermData process, ErlDrvMonitor *monitor);

      Starts monitoring a process from a driver. When a process is monitored, a +

      int driver_monitor_process(ErlDrvPort port,
      +        ErlDrvTermData process, ErlDrvMonitor *monitor);

      Starts monitoring a process from a driver. When a process is monitored, a process exit results in a call to the provided process_exit callback in the ErlDrvEntry structure. The ErlDrvMonitor structure is @@ -819,8 +819,8 @@

      driver_output()

      -
      int driver_output(ErlDrvPort port, char *buf,
      -        ErlDrvSizeT len);

      Sends data from the driver up to the emulator. The data is received as terms or +

      int driver_output(ErlDrvPort port, char *buf,
      +        ErlDrvSizeT len);

      Sends data from the driver up to the emulator. The data is received as terms or binary data, depending on how the driver port was opened.

      The data is queued in the port owner process' message queue. Notice that this does not yield to the emulator (as the driver and the emulator run in the same thread).

      Parameter buf points to the data to send, and len is the number of bytes.

      The return value for all output functions is 0 for normal use. If the driver @@ -830,9 +830,9 @@

      driver_output_binary()

      -
      int driver_output_binary(ErlDrvPort port, char
      +
      int driver_output_binary(ErlDrvPort port, char
               *hbuf, ErlDrvSizeT hlen, ErlDrvBinary* bin, ErlDrvSizeT offset,
      -        ErlDrvSizeT len);

      Sends data to a port owner process from a driver binary. It has a header buffer + ErlDrvSizeT len);

      Sends data to a port owner process from a driver binary. It has a header buffer (hbuf and hlen) just like driver_output2. Parameter hbuf can be NULL.

      Parameter offset is an offset into the binary and len is the number of bytes to send.

      Driver binaries are created with @@ -846,8 +846,8 @@

      driver_output_term()

      -
      int driver_output_term(ErlDrvPort port,
      -        ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use +

      int driver_output_term(ErlDrvPort port,
      +        ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use erl_drv_output_terminstead.

      Parameters term and n work as in erl_drv_output_term.

      Notice that this function is not thread-safe.

      @@ -855,8 +855,8 @@

      driver_output2()

      -
      int driver_output2(ErlDrvPort port, char *hbuf,
      -        ErlDrvSizeT hlen, char *buf, ErlDrvSizeT len);

      First sends hbuf (length in hlen) data as a list, regardless of port +

      int driver_output2(ErlDrvPort port, char *hbuf,
      +        ErlDrvSizeT hlen, char *buf, ErlDrvSizeT len);

      First sends hbuf (length in hlen) data as a list, regardless of port settings. Then sends buf as a binary or list. For example, if hlen is 3, the port owner process receives [H1, H2, H3 | T].

      The point of sending data as a list header, is to facilitate matching on the data received.

      The return value is 0 for normal use.

      @@ -865,8 +865,8 @@

      driver_outputv()

      -
      int driver_outputv(ErlDrvPort port, char* hbuf,
      -        ErlDrvSizeT hlen, ErlIOVec *ev, ErlDrvSizeT skip);

      Sends data from an I/O vector, ev, to the port owner process. It has a header +

      int driver_outputv(ErlDrvPort port, char* hbuf,
      +        ErlDrvSizeT hlen, ErlIOVec *ev, ErlDrvSizeT skip);

      Sends data from an I/O vector, ev, to the port owner process. It has a header buffer (hbuf and hlen), just like driver_output2.

      Parameter skip is a number of bytes to skip of the ev vector from the head.

      You get vectors of ErlIOVec type from the driver queue (see below), and the outputv driver entry function. You can also make @@ -878,7 +878,7 @@

      driver_pdl_create()

      -
      ErlDrvPDL driver_pdl_create(ErlDrvPort port);

      Creates a port data lock associated with the port.

      Note

      Once a port data lock has been created, it must be locked during all +

      ErlDrvPDL driver_pdl_create(ErlDrvPort port);

      Creates a port data lock associated with the port.

      Note

      Once a port data lock has been created, it must be locked during all operations on the driver queue of the port.

      Returns a newly created port data lock on success, otherwise NULL. The function fails if port is invalid or if a port data lock already has been associated with the port.

      @@ -887,40 +887,40 @@

      driver_pdl_dec_refc()

      -
      long driver_pdl_dec_refc(ErlDrvPDL
      -        pdl);

      Decrements the reference count of the port data lock passed as argument (pdl).

      The current reference count after the decrement has been performed is returned.

      This function is thread-safe.

      +
      long driver_pdl_dec_refc(ErlDrvPDL
      +        pdl);

      Decrements the reference count of the port data lock passed as argument (pdl).

      The current reference count after the decrement has been performed is returned.

      This function is thread-safe.

      driver_pdl_get_refc()

      -
      long driver_pdl_get_refc(ErlDrvPDL pdl);

      Returns the current reference count of the port data lock passed as argument +

      long driver_pdl_get_refc(ErlDrvPDL pdl);

      Returns the current reference count of the port data lock passed as argument (pdl).

      This function is thread-safe.

      driver_pdl_inc_refc()

      -
      long driver_pdl_inc_refc(ErlDrvPDL pdl);

      Increments the reference count of the port data lock passed as argument (pdl).

      The current reference count after the increment has been performed is returned.

      This function is thread-safe.

      +
      long driver_pdl_inc_refc(ErlDrvPDL pdl);

      Increments the reference count of the port data lock passed as argument (pdl).

      The current reference count after the increment has been performed is returned.

      This function is thread-safe.

      driver_pdl_lock()

      -
      void driver_pdl_lock(ErlDrvPDL pdl);

      Locks the port data lock passed as argument (pdl).

      This function is thread-safe.

      +
      void driver_pdl_lock(ErlDrvPDL pdl);

      Locks the port data lock passed as argument (pdl).

      This function is thread-safe.

      driver_pdl_unlock()

      -
      void driver_pdl_unlock(ErlDrvPDL pdl);

      Unlocks the port data lock passed as argument (pdl).

      This function is thread-safe.

      +
      void driver_pdl_unlock(ErlDrvPDL pdl);

      Unlocks the port data lock passed as argument (pdl).

      This function is thread-safe.

      driver_peekq()

      -
      SysIOVec * driver_peekq(ErlDrvPort port, int
      -        *vlen);

      Retrieves the driver queue as a pointer to an array of SysIOVecs. It also +

      SysIOVec * driver_peekq(ErlDrvPort port, int
      +        *vlen);

      Retrieves the driver queue as a pointer to an array of SysIOVecs. It also returns the number of elements in vlen. This is one of two ways to get data out of the queue.

      Nothing is removed from the queue by this function, that must be done with driver_deq.

      The returned array is suitable to use with the Unix system call writev.

      This function can be called from any thread if a @@ -931,8 +931,8 @@

      driver_peekqv()

      -
      ErlDrvSizeT driver_peekqv(ErlDrvPort port,
      -        ErlIOVec *ev);

      Retrieves the driver queue into a supplied ErlIOVec ev. It also returns the +

      ErlDrvSizeT driver_peekqv(ErlDrvPort port,
      +        ErlIOVec *ev);

      Retrieves the driver queue into a supplied ErlIOVec ev. It also returns the queue size. This is one of two ways to get data out of the queue.

      If ev is NULL, all ones that is -1 type cast to ErlDrvSizeT are returned.

      Nothing is removed from the queue by this function, that must be done with driver_deq.

      This function can be called from any thread if a @@ -943,8 +943,8 @@

      driver_pushq()

      -
      int driver_pushq(ErlDrvPort port, char* buf,
      -        ErlDrvSizeT len);

      Puts data at the head of the driver queue. The data in buf is copied (len +

      int driver_pushq(ErlDrvPort port, char* buf,
      +        ErlDrvSizeT len);

      Puts data at the head of the driver queue. The data in buf is copied (len bytes) and placed at the beginning of the queue.

      The return value is 0.

      This function can be called from any thread if a port data lock associated with the port is locked by the calling thread during the call.

      @@ -953,8 +953,8 @@

      driver_pushq_bin()

      -
      int driver_pushq_bin(ErlDrvPort port,
      -        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Puts data in the binary bin, at offset with length len at the head of the +

      int driver_pushq_bin(ErlDrvPort port,
      +        ErlDrvBinary *bin, ErlDrvSizeT offset, ErlDrvSizeT len);

      Puts data in the binary bin, at offset with length len at the head of the driver queue. It is most often faster than driver_pushq, because no data must be copied.

      This function can be called from any thread if a port data lock associated with the port is locked @@ -964,8 +964,8 @@

      driver_pushqv()

      -
      int driver_pushqv(ErlDrvPort port, ErlIOVec
      -        *ev, ErlDrvSizeT skip);

      Puts the data in ev, skipping the first skip bytes of it, at the head of the +

      int driver_pushqv(ErlDrvPort port, ErlIOVec
      +        *ev, ErlDrvSizeT skip);

      Puts the data in ev, skipping the first skip bytes of it, at the head of the driver queue. It is faster than driver_pushq, because no data must be copied.

      The return value is 0.

      This function can be called from any thread if a port data lock associated with the port is locked @@ -975,15 +975,15 @@

      driver_read_timer()

      -
      int driver_read_timer(ErlDrvPort port, unsigned
      -        long *time_left);

      Reads the current time of a timer, and places the result in time_left. This is +

      int driver_read_timer(ErlDrvPort port, unsigned
      +        long *time_left);

      Reads the current time of a timer, and places the result in time_left. This is the time in milliseconds, before the time-out occurs.

      The return value is 0.

      driver_realloc()

      -
      void * driver_realloc(void *ptr, ErlDrvSizeT size);

      Resizes a memory block, either in place, or by allocating a new block, copying +

      void * driver_realloc(void *ptr, ErlDrvSizeT size);

      Resizes a memory block, either in place, or by allocating a new block, copying the data, and freeing the old block. A pointer is returned to the reallocated memory. On failure (out of memory), NULL is returned. (This is most often a wrapper for realloc.)

      This function is thread-safe.

      @@ -992,15 +992,15 @@

      driver_realloc_binary()

      -
      ErlDrvBinary * driver_realloc_binary(ErlDrvBinary *bin, ErlDrvSizeT size);

      Resizes a driver binary, while keeping the data.

      Returns the resized driver binary on success. Returns NULL on failure (out of +

      ErlDrvBinary * driver_realloc_binary(ErlDrvBinary *bin, ErlDrvSizeT size);

      Resizes a driver binary, while keeping the data.

      Returns the resized driver binary on success. Returns NULL on failure (out of memory).

      This function is thread-safe.

      driver_select()

      -
      int driver_select(ErlDrvPort port, ErlDrvEvent
      -        event, int mode, int on);

      This function is used by drivers to provide the emulator with events to check +

      int driver_select(ErlDrvPort port, ErlDrvEvent
      +        event, int mode, int on);

      This function is used by drivers to provide the emulator with events to check for. This enables the emulator to call the driver when something has occurred asynchronously.

      Parameter event identifies an OS-specific event object. On Unix systems, the functions select/poll are used. The event object must be a socket or pipe @@ -1030,8 +1030,8 @@

      driver_send_term()

      -
      int driver_send_term(ErlDrvPort port,
      -        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use +

      int driver_send_term(ErlDrvPort port,
      +        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

      Warning

      This function is deprecated. Use erl_drv_send_term instead.

      Note

      The parameters of this function cannot be properly checked by the runtime system when executed by arbitrary threads. This can cause the function not to fail when it should.

      Parameters term and n work as in @@ -1041,8 +1041,8 @@

      driver_set_timer()

      -
      int driver_set_timer(ErlDrvPort port, unsigned
      -        long time);

      Sets a timer on the driver, which will count down and call the driver when it is +

      int driver_set_timer(ErlDrvPort port, unsigned
      +        long time);

      Sets a timer on the driver, which will count down and call the driver when it is timed out. Parameter time is the time in milliseconds before the timer expires.

      When the timer reaches 0 and expires, the driver entry function timeout is called.

      Notice that only one timer exists on each driver instance; setting a new timer @@ -1053,7 +1053,7 @@

      driver_sizeq()

      -
      ErlDrvSizeT driver_sizeq(ErlDrvPort port);

      Returns the number of bytes currently in the driver queue.

      This function can be called from any thread if a +

      ErlDrvSizeT driver_sizeq(ErlDrvPort port);

      Returns the number of bytes currently in the driver queue.

      This function can be called from any thread if a port data lock associated with the port is locked by the calling thread during the call.

      @@ -1061,8 +1061,8 @@

      driver_system_info()

      -
      void driver_system_info(ErlDrvSysInfo
      -        *sys_info_ptr, size_t size);

      Writes information about the Erlang runtime system into the +

      void driver_system_info(ErlDrvSysInfo
      +        *sys_info_ptr, size_t size);

      Writes information about the Erlang runtime system into the ErlDrvSysInfo structure referred to by the first argument. The second argument is to be the size of the ErlDrvSysInfo structure, that is, @@ -1073,8 +1073,8 @@

      driver_vec_to_buf()

      -
      ErlDrvSizeT driver_vec_to_buf(ErlIOVec *ev,
      -        char *buf, ErlDrvSizeT len);

      Collects several segments of data, referenced by ev, by copying them in order +

      ErlDrvSizeT driver_vec_to_buf(ErlIOVec *ev,
      +        char *buf, ErlDrvSizeT len);

      Collects several segments of data, referenced by ev, by copying them in order to the buffer buf, of the size len.

      If the data is to be sent from the driver to the port owner process, it is faster to use driver_outputv.

      The return value is the space left in the buffer, that is, if ev contains less than len bytes it is the difference, and if ev contains len bytes or more, @@ -1085,8 +1085,8 @@

      erl_drv_busy_msgq_limits()

      -
      void erl_drv_busy_msgq_limits(ErlDrvPort port,
      -        ErlDrvSizeT *low, ErlDrvSizeT *high);

      Sets and gets limits that will be used for controlling the busy state of the +

      void erl_drv_busy_msgq_limits(ErlDrvPort port,
      +        ErlDrvSizeT *low, ErlDrvSizeT *high);

      Sets and gets limits that will be used for controlling the busy state of the port message queue.

      The port message queue is set into a busy state when the amount of command data queued on the message queue reaches the high limit. The port message queue is set into a not busy state when the amount of command data queued on the message @@ -1118,16 +1118,16 @@

      erl_drv_cond_broadcast()

      -
      void erl_drv_cond_broadcast(ErlDrvCond
      -        *cnd);

      Broadcasts on a condition variable. That is, if other threads are waiting on the +

      void erl_drv_cond_broadcast(ErlDrvCond
      +        *cnd);

      Broadcasts on a condition variable. That is, if other threads are waiting on the condition variable being broadcast on, all of them are woken.

      cnd is a pointer to a condition variable to broadcast on.

      This function is thread-safe.

      erl_drv_cond_create()

      -
      ErlDrvCond * erl_drv_cond_create(char
      -        *name);

      Creates a condition variable and returns a pointer to it.

      name is a string identifying the created condition variable. It is used to +

      ErlDrvCond * erl_drv_cond_create(char
      +        *name);

      Creates a condition variable and returns a pointer to it.

      name is a string identifying the created condition variable. It is used to identify the condition variable in planned future debug functionality.

      Returns NULL on failure. The driver creating the condition variable is responsible for destroying it before the driver is unloaded.

      This function is thread-safe.

      @@ -1135,31 +1135,31 @@

      erl_drv_cond_destroy()

      -
      void erl_drv_cond_destroy(ErlDrvCond
      -        *cnd);

      Destroys a condition variable previously created by +

      void erl_drv_cond_destroy(ErlDrvCond
      +        *cnd);

      Destroys a condition variable previously created by erl_drv_cond_create.

      cnd is a pointer to a condition variable to destroy.

      This function is thread-safe.

      erl_drv_cond_name()

      -
      char * erl_drv_cond_name(ErlDrvCond
      -        *cnd);

      Returns a pointer to the name of the condition.

      cnd is a pointer to an initialized condition.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      +
      char * erl_drv_cond_name(ErlDrvCond
      +        *cnd);

      Returns a pointer to the name of the condition.

      cnd is a pointer to an initialized condition.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      erl_drv_cond_signal()

      -
      void erl_drv_cond_signal(ErlDrvCond
      -        *cnd);

      Signals on a condition variable. That is, if other threads are waiting on the +

      void erl_drv_cond_signal(ErlDrvCond
      +        *cnd);

      Signals on a condition variable. That is, if other threads are waiting on the condition variable being signaled, one of them is woken.

      cnd is a pointer to a condition variable to signal on.

      This function is thread-safe.

      erl_drv_cond_wait()

      -
      void erl_drv_cond_wait(ErlDrvCond *cnd,
      -        ErlDrvMutex *mtx);

      Waits on a condition variable. The calling thread is blocked until another +

      void erl_drv_cond_wait(ErlDrvCond *cnd,
      +        ErlDrvMutex *mtx);

      Waits on a condition variable. The calling thread is blocked until another thread wakes it by signaling or broadcasting on the condition variable. Before the calling thread is blocked, it unlocks the mutex passed as argument. When the calling thread is woken, it locks the same mutex before returning. That is, the @@ -1175,8 +1175,8 @@

      erl_drv_consume_timeslice()

      -
      int erl_drv_consume_timeslice(ErlDrvPort port,
      -        int percent);

      Gives the runtime system a hint about how much CPU time the current driver +

      int erl_drv_consume_timeslice(ErlDrvPort port,
      +        int percent);

      Gives the runtime system a hint about how much CPU time the current driver callback call has consumed since the last hint, or since the the start of the callback if no previous hint has been given.

      • port - Port handle of the executing port.

      • percent - Approximate consumed fraction of a full time-slice in percent.

      The time is specified as a fraction, in percent, of a full time-slice that a port is allowed to execute before it is to surrender the CPU to other runnable @@ -1199,8 +1199,8 @@

      erl_drv_convert_time_unit()

      -
      ErlDrvTime erl_drv_convert_time_unit(ErlDrvTime
      -        val, ErlDrvTimeUnit from, ErlDrvTimeUnit to);

      Converts the val value of time unit from to the corresponding value of time +

      ErlDrvTime erl_drv_convert_time_unit(ErlDrvTime
      +        val, ErlDrvTimeUnit from, ErlDrvTimeUnit to);

      Converts the val value of time unit from to the corresponding value of time unit to. The result is rounded using the floor function.

      • val - Value to convert time unit for.

      • from - Time unit of val.

      • to - Time unit of returned value.

      Returns ERL_DRV_TIME_ERROR if called with an invalid time unit argument.

      See also ErlDrvTime and ErlDrvTimeUnit.

      Available since OTP 18.3

      @@ -1208,8 +1208,8 @@

      erl_drv_equal_tids()

      -
      int erl_drv_equal_tids(ErlDrvTid tid1,
      -        ErlDrvTid tid2);

      Compares two thread identifiers, tid1 and tid2, for equality.

      Returns 0 it they are not equal, and a value not equal to 0 if they are +

      int erl_drv_equal_tids(ErlDrvTid tid1,
      +        ErlDrvTid tid2);

      Compares two thread identifiers, tid1 and tid2, for equality.

      Returns 0 it they are not equal, and a value not equal to 0 if they are equal.

      Note

      A thread identifier can be reused very quickly after a thread has terminated. Therefore, if a thread corresponding to one of the involved thread identifiers has terminated since the thread identifier was saved, the result of @@ -1219,8 +1219,8 @@

      erl_drv_getenv()

      -
      int erl_drv_getenv(const char *key, char
      -        *value, size_t *value_size);

      Retrieves the value of an environment variable.

      • key - A NULL-terminated string containing the name of the environment +

        int erl_drv_getenv(const char *key, char
        +        *value, size_t *value_size);

        Retrieves the value of an environment variable.

        • key - A NULL-terminated string containing the name of the environment variable.

        • value - A pointer to an output buffer.

        • value_size - A pointer to an integer. The integer is used both for passing input and output sizes (see below).

        When this function is called, *value_size is to contain the size of the value buffer.

        On success, 0 is returned, the value of the environment variable has been @@ -1238,8 +1238,8 @@

        erl_drv_init_ack()

        -
        void erl_drv_init_ack(ErlDrvPort port,
        -        ErlDrvData res);

        Acknowledges the start of the port.

        • port - The port handle of the port (driver instance) doing the +

          void erl_drv_init_ack(ErlDrvPort port,
          +        ErlDrvData res);

          Acknowledges the start of the port.

          • port - The port handle of the port (driver instance) doing the acknowledgment.

          • res - The result of the port initialization. Can be the same values as the return value of start, that is, any of the error codes or the ErlDrvData that is to be used for this port.

          When this function is called the initiating erlang:open_port call is returned @@ -1252,7 +1252,7 @@

          erl_drv_monotonic_time()

          -
          ErlDrvTime erl_drv_monotonic_time(ErlDrvTimeUnit time_unit);

          Returns Erlang monotonic time. +

          ErlDrvTime erl_drv_monotonic_time(ErlDrvTimeUnit time_unit);

          Returns Erlang monotonic time. Notice that negative values are not uncommon.

          time_unit is time unit of returned value.

          Returns ERL_DRV_TIME_ERROR if called with an invalid time unit argument, or if called from a thread that is not a scheduler thread.

          See also ErlDrvTime and ErlDrvTimeUnit.

          Available since OTP 18.3

          @@ -1261,8 +1261,8 @@

          erl_drv_mutex_create()

          -
          ErlDrvMutex * erl_drv_mutex_create(char
          -        *name);

          Creates a mutex and returns a pointer to it.

          name is a string identifying the created mutex. It is used to identify the +

          ErlDrvMutex * erl_drv_mutex_create(char
          +        *name);

          Creates a mutex and returns a pointer to it.

          name is a string identifying the created mutex. It is used to identify the mutex in debug functionality (see note).

          Returns NULL on failure. The driver creating the mutex is responsible for destroying it before the driver is unloaded.

          This function is thread-safe.

          Note

          One such debug functionality is the lock checker, which can detect locking order violations and thereby potential deadlock bugs. For the lock checker to @@ -1279,8 +1279,8 @@

          erl_drv_mutex_destroy()

          -
          void erl_drv_mutex_destroy(ErlDrvMutex
          -        *mtx);

          Destroys a mutex previously created by +

          void erl_drv_mutex_destroy(ErlDrvMutex
          +        *mtx);

          Destroys a mutex previously created by erl_drv_mutex_create. The mutex must be in an unlocked state before it is destroyed.

          mtx is a pointer to a mutex to destroy.

          This function is thread-safe.

          @@ -1288,8 +1288,8 @@

          erl_drv_mutex_lock()

          -
          void erl_drv_mutex_lock(ErlDrvMutex
          -        *mtx);

          Locks a mutex. The calling thread is blocked until the mutex has been locked. A +

          void erl_drv_mutex_lock(ErlDrvMutex
          +        *mtx);

          Locks a mutex. The calling thread is blocked until the mutex has been locked. A thread that has currently locked the mutex cannot lock the same mutex again.

          mtx is a pointer to a mutex to lock.

          Warning

          If you leave a mutex locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

          This function is thread-safe.

          @@ -1297,15 +1297,15 @@

          erl_drv_mutex_name()

          -
          char * erl_drv_mutex_name(ErlDrvMutex
          -        *mtx);

          Returns a pointer to the mutex name.

          mtx is a pointer to an initialized mutex.

          Note

          This function is intended for debugging purposes only.

          Available since OTP R16B02

          +
          char * erl_drv_mutex_name(ErlDrvMutex
          +        *mtx);

          Returns a pointer to the mutex name.

          mtx is a pointer to an initialized mutex.

          Note

          This function is intended for debugging purposes only.

          Available since OTP R16B02

          erl_drv_mutex_trylock()

          -
          int erl_drv_mutex_trylock(ErlDrvMutex
          -        *mtx);

          Tries to lock a mutex. A thread that has currently locked the mutex cannot try +

          int erl_drv_mutex_trylock(ErlDrvMutex
          +        *mtx);

          Tries to lock a mutex. A thread that has currently locked the mutex cannot try to lock the same mutex again.

          mtx is a pointer to a mutex to try to lock.

          Returns 0 on success, otherwise EBUSY.

          Warning

          If you leave a mutex locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

          This function is thread-safe.

          @@ -1313,15 +1313,15 @@

          erl_drv_mutex_unlock()

          -
          void erl_drv_mutex_unlock(ErlDrvMutex
          -        *mtx);

          Unlocks a mutex. The mutex currently must be locked by the calling thread.

          mtx is a pointer to a mutex to unlock.

          This function is thread-safe.

          +
          void erl_drv_mutex_unlock(ErlDrvMutex
          +        *mtx);

          Unlocks a mutex. The mutex currently must be locked by the calling thread.

          mtx is a pointer to a mutex to unlock.

          This function is thread-safe.

          erl_drv_output_term()

          -
          int erl_drv_output_term(ErlDrvTermData port,
          -        ErlDrvTermData* term, int n);

          Sends data in the special driver term format to the port owner process. This is +

          int erl_drv_output_term(ErlDrvTermData port,
          +        ErlDrvTermData* term, int n);

          Sends data in the special driver term format to the port owner process. This is a fast way to deliver term data from a driver. It needs no binary conversion, so the port owner process receives data as normal Erlang terms. The erl_drv_send_term functions can be used for @@ -1379,20 +1379,20 @@

          concatenating the strings added to a list. The tail must be specified before ERL_DRV_STRING_CONS.

          ERL_DRV_STRING constructs a string, and ends it. (So it is the same as ERL_DRV_NIL followed by ERL_DRV_STRING_CONS.)

          /* to send [x, "abc", y] to the port: */
          -ErlDrvTermData spec[] = {
          -    ERL_DRV_ATOM, driver_mk_atom("x"),
          -    ERL_DRV_STRING, (ErlDrvTermData)"abc", 3,
          -    ERL_DRV_ATOM, driver_mk_atom("y"),
          +ErlDrvTermData spec[] = {
          +    ERL_DRV_ATOM, driver_mk_atom("x"),
          +    ERL_DRV_STRING, (ErlDrvTermData)"abc", 3,
          +    ERL_DRV_ATOM, driver_mk_atom("y"),
               ERL_DRV_NIL,
               ERL_DRV_LIST, 4
          -};
          -erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
          /* to send "abc123" to the port: */
          -ErlDrvTermData spec[] = {
          +};
          +erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));
          /* to send "abc123" to the port: */
          +ErlDrvTermData spec[] = {
               ERL_DRV_NIL,        /* with STRING_CONS, the tail comes first */
          -    ERL_DRV_STRING_CONS, (ErlDrvTermData)"123", 3,
          -    ERL_DRV_STRING_CONS, (ErlDrvTermData)"abc", 3,
          -};
          -erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));

          The ERL_DRV_EXT2TERM term type is used for passing + ERL_DRV_STRING_CONS, (ErlDrvTermData)"123", 3, + ERL_DRV_STRING_CONS, (ErlDrvTermData)"abc", 3, +}; +erl_drv_output_term(driver_mk_port(drvport), spec, sizeof(spec) / sizeof(spec[0]));

  • The ERL_DRV_EXT2TERM term type is used for passing a term encoded with the external format, that is, a term that has been encoded by erlang:term_to_binary(), erl_interface:ei(3), and so on. For example, if @@ -1429,8 +1429,8 @@

    erl_drv_putenv()

    -
    int erl_drv_putenv(const char *key, char
    -        *value);

    Sets the value of an environment variable.

    key is a NULL-terminated string containing the name of the environment +

    int erl_drv_putenv(const char *key, char
    +        *value);

    Sets the value of an environment variable.

    key is a NULL-terminated string containing the name of the environment variable.

    value is a NULL-terminated string containing the new value of the environment variable.

    Returns 0 on success, otherwise a value != 0.

    Note

    The result of passing the empty string ("") as a value is platform-dependent. On some platforms the variable value is set to the empty @@ -1444,8 +1444,8 @@

    erl_drv_rwlock_create()

    -
    ErlDrvRWLock * erl_drv_rwlock_create(char
    -        *name);

    Creates an rwlock and returns a pointer to it.

    name is a string identifying the created rwlock. It is used to identify the +

    ErlDrvRWLock * erl_drv_rwlock_create(char
    +        *name);

    Creates an rwlock and returns a pointer to it.

    name is a string identifying the created rwlock. It is used to identify the rwlock in debug functionality (see note about the lock checker).

    Returns NULL on failure. The driver creating the rwlock is responsible for destroying it before the driver is unloaded.

    This function is thread-safe.

    @@ -1454,8 +1454,8 @@

    erl_drv_rwlock_destroy()

    -
    void erl_drv_rwlock_destroy(ErlDrvRWLock
    -        *rwlck);

    Destroys an rwlock previously created by +

    void erl_drv_rwlock_destroy(ErlDrvRWLock
    +        *rwlck);

    Destroys an rwlock previously created by erl_drv_rwlock_create. The rwlock must be in an unlocked state before it is destroyed.

    rwlck is a pointer to an rwlock to destroy.

    This function is thread-safe.

    @@ -1463,15 +1463,15 @@

    erl_drv_rwlock_name()

    -
    char * erl_drv_rwlock_name(ErlDrvRWLock
    -        *rwlck);

    Returns a pointer to the name of the rwlock.

    rwlck is a pointer to an initialized rwlock.

    Note

    This function is intended for debugging purposes only.

    Available since OTP R16B02

    +
    char * erl_drv_rwlock_name(ErlDrvRWLock
    +        *rwlck);

    Returns a pointer to the name of the rwlock.

    rwlck is a pointer to an initialized rwlock.

    Note

    This function is intended for debugging purposes only.

    Available since OTP R16B02

    erl_drv_rwlock_rlock()

    -
    void erl_drv_rwlock_rlock(ErlDrvRWLock
    -        *rwlck);

    Read locks an rwlock. The calling thread is blocked until the rwlock has been +

    void erl_drv_rwlock_rlock(ErlDrvRWLock
    +        *rwlck);

    Read locks an rwlock. The calling thread is blocked until the rwlock has been read locked. A thread that currently has read or read/write locked the rwlock cannot lock the same rwlock again.

    rwlck is a pointer to the rwlock to read lock.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1480,16 +1480,16 @@

    erl_drv_rwlock_runlock()

    -
    void erl_drv_rwlock_runlock(ErlDrvRWLock
    -        *rwlck);

    Read unlocks an rwlock. The rwlock currently must be read locked by the calling +

    void erl_drv_rwlock_runlock(ErlDrvRWLock
    +        *rwlck);

    Read unlocks an rwlock. The rwlock currently must be read locked by the calling thread.

    rwlck is a pointer to an rwlock to read unlock.

    This function is thread-safe.

    erl_drv_rwlock_rwlock()

    -
    void erl_drv_rwlock_rwlock(ErlDrvRWLock
    -        *rwlck);

    Read/write locks an rwlock. The calling thread is blocked until the rwlock has +

    void erl_drv_rwlock_rwlock(ErlDrvRWLock
    +        *rwlck);

    Read/write locks an rwlock. The calling thread is blocked until the rwlock has been read/write locked. A thread that currently has read or read/write locked the rwlock cannot lock the same rwlock again.

    rwlck is a pointer to an rwlock to read/write lock.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1498,16 +1498,16 @@

    erl_drv_rwlock_rwunlock()

    -
    void erl_drv_rwlock_rwunlock(ErlDrvRWLock
    -        *rwlck);

    Read/write unlocks an rwlock. The rwlock currently must be read/write locked by +

    void erl_drv_rwlock_rwunlock(ErlDrvRWLock
    +        *rwlck);

    Read/write unlocks an rwlock. The rwlock currently must be read/write locked by the calling thread.

    rwlck is a pointer to an rwlock to read/write unlock.

    This function is thread-safe.

    erl_drv_rwlock_tryrlock()

    -
    int erl_drv_rwlock_tryrlock(ErlDrvRWLock
    -        *rwlck);

    Tries to read lock an rwlock.

    rwlck is a pointer to an rwlock to try to read lock.

    Returns 0 on success, otherwise EBUSY. A thread that currently has read or +

    int erl_drv_rwlock_tryrlock(ErlDrvRWLock
    +        *rwlck);

    Tries to read lock an rwlock.

    rwlck is a pointer to an rwlock to try to read lock.

    Returns 0 on success, otherwise EBUSY. A thread that currently has read or read/write locked the rwlock cannot try to lock the same rwlock again.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1515,8 +1515,8 @@

    erl_drv_rwlock_tryrwlock()

    -
    int erl_drv_rwlock_tryrwlock(ErlDrvRWLock
    -        *rwlck);

    Tries to read/write lock an rwlock. A thread that currently has read or +

    int erl_drv_rwlock_tryrwlock(ErlDrvRWLock
    +        *rwlck);

    Tries to read/write lock an rwlock. A thread that currently has read or read/write locked the rwlock cannot try to lock the same rwlock again.

    rwlckis pointer to an rwlock to try to read/write lock.

    Returns 0 on success, otherwise EBUSY.

    Warning

    If you leave an rwlock locked in an emulator thread when you let the thread out of your control, you will very likely deadlock the whole emulator.

    This function is thread-safe.

    @@ -1524,8 +1524,8 @@

    erl_drv_send_term()

    -
    int erl_drv_send_term(ErlDrvTermData port,
    -        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

    This function is the only way for a driver to send data to other processes +

    int erl_drv_send_term(ErlDrvTermData port,
    +        ErlDrvTermData receiver, ErlDrvTermData* term, int n);

    This function is the only way for a driver to send data to other processes than the port owner process. Parameter receiver specifies the process to receive the data.

    Note

    Parameter port is not an ordinary port handle, but a port handle converted using driver_mk_port.

    Parameters port, term, and n work as in @@ -1535,17 +1535,17 @@

    erl_drv_set_os_pid()

    -
    void erl_drv_set_os_pid(ErlDrvPort port,
    -        ErlDrvSInt pid);

    Sets the os_pid seen when doing erlang:port_info/2 on this port.

    port is the port handle of the port (driver instance) to set the pid on. +

    void erl_drv_set_os_pid(ErlDrvPort port,
    +        ErlDrvSInt pid);

    Sets the os_pid seen when doing erlang:port_info/2 on this port.

    port is the port handle of the port (driver instance) to set the pid on. pidis the pid to set.

    Available since OTP 19.0

    erl_drv_thread_create()

    -
    int erl_drv_thread_create(char *name, ErlDrvTid
    -        *tid, void * (*func)(void *), void *arg, ErlDrvThreadOpts
    -        *opts);

    Creates a new thread.

    • name - A string identifying the created thread. It is used to identify +

      int erl_drv_thread_create(char *name, ErlDrvTid
      +        *tid, void * (*func)(void *), void *arg, ErlDrvThreadOpts
      +        *opts);

      Creates a new thread.

      • name - A string identifying the created thread. It is used to identify the thread in planned future debug functionality.

      • tid - A pointer to a thread identifier variable.

      • func - A pointer to a function to execute in the created thread.

      • arg - A pointer to argument to the func function.

      • opts - A pointer to thread options to use or NULL.

      Returns 0 on success, otherwise an errno value is returned to indicate the error. The newly created thread begins executing in the function pointed to by func, and func is passed arg as argument. When erl_drv_thread_create @@ -1570,8 +1570,8 @@

      erl_drv_thread_exit()

      -
      void erl_drv_thread_exit(void
      -        *exit_value);

      Terminates the calling thread with the exit value passed as argument. +

      void erl_drv_thread_exit(void
      +        *exit_value);

      Terminates the calling thread with the exit value passed as argument. exit_value is a pointer to an exit value or NULL.

      You are only allowed to terminate threads created with erl_drv_thread_create.

      The exit value can later be retrieved by another thread through erl_drv_thread_join.

      This function is thread-safe.

      @@ -1580,8 +1580,8 @@

      erl_drv_thread_join()

      -
      int erl_drv_thread_join(ErlDrvTid tid, void
      -        **exit_value);

      Joins the calling thread with another thread, that is, the calling thread is +

      int erl_drv_thread_join(ErlDrvTid tid, void
      +        **exit_value);

      Joins the calling thread with another thread, that is, the calling thread is blocked until the thread identified by tid has terminated.

      tid is the thread identifier of the thread to join. exit_value is a pointer to a pointer to an exit value, or NULL.

      Returns 0 on success, otherwise an errno value is returned to indicate the error.

      A thread can only be joined once. The behavior of joining more than once is @@ -1593,14 +1593,14 @@

      erl_drv_thread_name()

      -
      char * erl_drv_thread_name(ErlDrvTid
      -        tid);

      Returns a pointer to the name of the thread.

      tid is a thread identifier.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      +
      char * erl_drv_thread_name(ErlDrvTid
      +        tid);

      Returns a pointer to the name of the thread.

      tid is a thread identifier.

      Note

      This function is intended for debugging purposes only.

      Available since OTP R16B02

      erl_drv_thread_opts_create()

      -
      ErlDrvThreadOpts * erl_drv_thread_opts_create(char *name);

      Allocates and initializes a thread option structure.

      name is a string identifying the created thread options. It is used to +

      ErlDrvThreadOpts * erl_drv_thread_opts_create(char *name);

      Allocates and initializes a thread option structure.

      name is a string identifying the created thread options. It is used to identify the thread options in planned future debug functionality.

      Returns NULL on failure. A thread option structure is used for passing options to erl_drv_thread_create. If the structure is not modified before it is passed to @@ -1613,21 +1613,21 @@

      erl_drv_thread_opts_destroy()

      -
      void erl_drv_thread_opts_destroy(ErlDrvThreadOpts *opts);

      Destroys thread options previously created by +

      void erl_drv_thread_opts_destroy(ErlDrvThreadOpts *opts);

      Destroys thread options previously created by erl_drv_thread_opts_create.

      opts is a pointer to thread options to destroy.

      This function is thread-safe.

      erl_drv_thread_self()

      -
      ErlDrvTid erl_drv_thread_self(void);

      Returns the thread identifier of the calling thread.

      This function is thread-safe.

      +
      ErlDrvTid erl_drv_thread_self(void);

      Returns the thread identifier of the calling thread.

      This function is thread-safe.

      erl_drv_time_offset()

      -
      ErlDrvTime erl_drv_time_offset(ErlDrvTimeUnit
      -        time_unit);

      Returns the current time offset between +

      ErlDrvTime erl_drv_time_offset(ErlDrvTimeUnit
      +        time_unit);

      Returns the current time offset between Erlang monotonic time and Erlang system time converted into the time_unit passed as argument.

      time_unit is time unit of returned value.

      Returns ERL_DRV_TIME_ERROR if called with an invalid time unit argument, or if @@ -1638,15 +1638,15 @@

      erl_drv_tsd_get()

      -
      void * erl_drv_tsd_get(ErlDrvTSDKey
      -        key);

      Returns the thread-specific data associated with key for the calling thread.

      key is a thread-specific data key.

      Returns NULL if no data has been associated with key for the calling thread.

      This function is thread-safe.

      +
      void * erl_drv_tsd_get(ErlDrvTSDKey
      +        key);

      Returns the thread-specific data associated with key for the calling thread.

      key is a thread-specific data key.

      Returns NULL if no data has been associated with key for the calling thread.

      This function is thread-safe.

      erl_drv_tsd_key_create()

      -
      int erl_drv_tsd_key_create(char *name,
      -        ErlDrvTSDKey *key);

      Creates a thread-specific data key.

      name is a string identifying the created key. It is used to identify the key +

      int erl_drv_tsd_key_create(char *name,
      +        ErlDrvTSDKey *key);

      Creates a thread-specific data key.

      name is a string identifying the created key. It is used to identify the key in planned future debug functionality.

      key is a pointer to a thread-specific data key variable.

      Returns 0 on success, otherwise an errno value is returned to indicate the error. The driver creating the key is responsible for destroying it before the driver is unloaded.

      This function is thread-safe.

      @@ -1655,8 +1655,8 @@

      erl_drv_tsd_key_destroy()

      -
      void erl_drv_tsd_key_destroy(ErlDrvTSDKey
      -        key);

      Destroys a thread-specific data key previously created by +

      void erl_drv_tsd_key_destroy(ErlDrvTSDKey
      +        key);

      Destroys a thread-specific data key previously created by erl_drv_tsd_key_create. All thread-specific data using this key in all threads must be cleared (see erl_drv_tsd_set) before the call to @@ -1669,8 +1669,8 @@

      erl_drv_tsd_set()

      -
      void erl_drv_tsd_set(ErlDrvTSDKey key, void
      -        *data);

      Sets thread-specific data associated with key for the calling thread. You are +

      void erl_drv_tsd_set(ErlDrvTSDKey key, void
      +        *data);

      Sets thread-specific data associated with key for the calling thread. You are only allowed to set thread-specific data for threads while they are fully under your control. For example, if you set thread-specific data in a thread calling a driver callback function, it must be cleared, that is, set to NULL, before @@ -1682,7 +1682,7 @@

      erl_errno_id()

      -
      char * erl_errno_id(int error);

      Returns the atom name of the Erlang error, given the error number in error. +

      char * erl_errno_id(int error);

      Returns the atom name of the Erlang error, given the error number in error. The error atoms are einval, enoent, and so on. It can be used to make error terms from the driver.

      @@ -1690,8 +1690,8 @@

      remove_driver_entry()

      -
      int remove_driver_entry(ErlDrvEntry
      -        *de);

      Removes a driver entry de previously added with +

      int remove_driver_entry(ErlDrvEntry
      +        *de);

      Removes a driver entry de previously added with add_driver_entry.

      Driver entries added by the erl_ddll Erlang interface cannot be removed by using this interface.

      @@ -1699,8 +1699,8 @@

      set_busy_port()

      -
      void set_busy_port(ErlDrvPort port, int
      -        on);

      Sets and unsets the busy state of the port. If on is non-zero, the port is set +

      void set_busy_port(ErlDrvPort port, int
      +        on);

      Sets and unsets the busy state of the port. If on is non-zero, the port is set to busy. If it is zero, the port is set to not busy. You typically want to combine this feature with the busy port message queue functionality.

      Processes sending command data to the port are suspended if either the port or @@ -1717,8 +1717,8 @@

      set_port_control_flags()

      -
      void set_port_control_flags(ErlDrvPort port,
      -        int flags);

      Sets flags for how the control driver entry +

      void set_port_control_flags(ErlDrvPort port,
      +        int flags);

      Sets flags for how the control driver entry function will return data to the port owner process. (The control function is called from erlang:port_control/3.)

      Currently there are only two meaningful values for flags: 0 means that data is returned in a list, and PORT_CONTROL_FLAG_BINARY means data is returned as diff --git a/prs/9277/erts-15.2/doc/html/erl_ext_dist.html b/prs/9277/erts-15.2/doc/html/erl_ext_dist.html index adf8efb816894..df8d6adfec3c0 100644 --- a/prs/9277/erts-15.2/doc/html/erl_ext_dist.html +++ b/prs/9277/erts-15.2/doc/html/erl_ext_dist.html @@ -440,7 +440,7 @@

      positive and 1 if it is negative. The digits are stored with the least significant byte stored first. To calculate the integer, the following formula can be used:

      B = 256
      -(d0*B^0 + d1*B^1 + d2*B^2 + ... d(N-1)*B^(n-1))

      +(d0*B^0 + d1*B^1 + d2*B^2 + ... d(N-1)*B^(n-1))

    diff --git a/prs/9277/erts-15.2/doc/html/erl_nif.html b/prs/9277/erts-15.2/doc/html/erl_nif.html index 6a426754414c7..d187b8d43fbdb 100644 --- a/prs/9277/erts-15.2/doc/html/erl_nif.html +++ b/prs/9277/erts-15.2/doc/html/erl_nif.html @@ -155,29 +155,29 @@

    A minimal example of a NIF library can look as follows:

    /* niftest.c */
     #include <erl_nif.h>
     
    -static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
    -{
    -    return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
    -}
    +static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
    +{
    +    return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
    +}
     
    -static ErlNifFunc nif_funcs[] =
    -{
    -    {"hello", 0, hello}
    -};
    +static ErlNifFunc nif_funcs[] =
    +{
    +    {"hello", 0, hello}
    +};
     
    -ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

    The Erlang module can look as follows:

    -module(niftest).
    +ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)

    The Erlang module can look as follows:

    -module(niftest).
     
    --export([init/0, hello/0]).
    +-export([init/0, hello/0]).
     
    --nifs([hello/0]).
    +-nifs([hello/0]).
     
    --on_load(init/0).
    +-on_load(init/0).
     
    -init() ->
    -      erlang:load_nif("./niftest", 0).
    +init() ->
    +      erlang:load_nif("./niftest", 0).
     
    -hello() ->
    -      erlang:nif_error("NIF library not loaded").

    Compile and test can look as follows (on Linux):

    $> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/
    +hello() ->
    +      erlang:nif_error("NIF library not loaded").

    Compile and test can look as follows (on Linux):

    $> gcc -fPIC -shared -o niftest.so niftest.c -I $ERL_ROOT/usr/include/
     $> erl
     
     1> c(niftest).
    @@ -223,21 +223,21 @@ 

    ERL_NIF_TERM world_atom; -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) -{ - world_atom = enif_make_atom(env, "world"); +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) +{ + world_atom = enif_make_atom(env, "world"); return 0; -} +} -static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) -{ - ERL_NIF_TERM hello_string = enif_make_string(env, "Hello", ERL_NIF_LATIN1); - return enif_make_tuple2(env, hello_string, world_atom); -} +static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ + ERL_NIF_TERM hello_string = enif_make_string(env, "Hello", ERL_NIF_LATIN1); + return enif_make_tuple2(env, hello_string, world_atom); +} -static ErlNifFunc nif_funcs[] = { { "hello", 0, hello } }; +static ErlNifFunc nif_funcs[] = { { "hello", 0, hello } }; -ERL_NIF_INIT(niftest, nif_funcs, load, NULL, NULL, NULL)

  • Binaries - Terms of type binary are accessed with the help of struct type +ERL_NIF_INIT(niftest, nif_funcs, load, NULL, NULL, NULL)

  • Binaries - Terms of type binary are accessed with the help of struct type ErlNifBinary, which contains a pointer (data) to the raw binary data and the length (size) of the data in bytes. Both data and size are read-only and are only to be written using calls to API @@ -275,19 +275,19 @@

    garbage collector or enif_release_resource). Resource types are uniquely identified by a supplied name string and the name of the implementing module.

    The following is a template example of how to create and return a resource object.

    ERL_NIF_TERM term;
    -MyStruct* obj = enif_alloc_resource(my_resource_type, sizeof(MyStruct));
    +MyStruct* obj = enif_alloc_resource(my_resource_type, sizeof(MyStruct));
     
     /* initialize struct ... */
     
    -term = enif_make_resource(env, obj);
    +term = enif_make_resource(env, obj);
     
    -if (keep_a_reference_of_our_own) {
    +if (keep_a_reference_of_our_own) {
         /* store 'obj' in static variable, private data or other resource object */
    -}
    -else {
    -    enif_release_resource(obj);
    +}
    +else {
    +    enif_release_resource(obj);
         /* resource now only owned by "Erlang" */
    -}
    +}
     return term;

    Notice that once enif_make_resource creates the term to return to Erlang, the code can choose to either keep its own native pointer to the allocated struct and release it later, or release it immediately and rely only on the @@ -339,50 +339,50 @@

    libraries can however fail if deprecated features are used.

  • Time Measurement - Support for time measurement in NIF libraries:

  • I/O Queues
    The Erlang nif library contains function for easily working with I/O vectors as used by the unix system call writev. The I/O Queue is not thread safe, so -some other synchronization mechanism has to be used.

    Typical usage when writing to a file descriptor looks like this:

    int writeiovec(ErlNifEnv *env, ERL_NIF_TERM term, ERL_NIF_TERM *tail,
    -               ErlNifIOQueue *q, int fd) {
    +some other synchronization mechanism has to be used.

    Typical usage when writing to a file descriptor looks like this:

    int writeiovec(ErlNifEnv *env, ERL_NIF_TERM term, ERL_NIF_TERM *tail,
    +               ErlNifIOQueue *q, int fd) {
     
         ErlNifIOVec vec, *iovec = &vec;
         SysIOVec *sysiovec;
         int saved_errno;
         int iovcnt, n;
     
    -    if (!enif_inspect_iovec(env, 64, term, tail, &iovec))
    +    if (!enif_inspect_iovec(env, 64, term, tail, &iovec))
             return -2;
     
    -    if (enif_ioq_size(q) > 0) {
    +    if (enif_ioq_size(q) > 0) {
             /* If the I/O queue contains data we enqueue the iovec and
                then peek the data to write out of the queue. */
    -        if (!enif_ioq_enqv(q, iovec, 0))
    +        if (!enif_ioq_enqv(q, iovec, 0))
                 return -3;
     
    -        sysiovec = enif_ioq_peek(q, &iovcnt);
    -    } else {
    +        sysiovec = enif_ioq_peek(q, &iovcnt);
    +    } else {
             /* If the I/O queue is empty we skip the trip through it. */
             iovcnt = iovec->iovcnt;
             sysiovec = iovec->iov;
    -    }
    +    }
     
         /* Attempt to write the data */
    -    n = writev(fd, sysiovec, iovcnt);
    +    n = writev(fd, sysiovec, iovcnt);
         saved_errno = errno;
     
    -    if (enif_ioq_size(q) == 0) {
    +    if (enif_ioq_size(q) == 0) {
             /* If the I/O queue was initially empty we enqueue any
                remaining data into the queue for writing later. */
    -        if (n >= 0 && !enif_ioq_enqv(q, iovec, n))
    +        if (n >= 0 && !enif_ioq_enqv(q, iovec, n))
                 return -3;
    -    } else {
    +    } else {
             /* Dequeue any data that was written from the queue. */
    -        if (n > 0 && !enif_ioq_deq(q, n, NULL))
    +        if (n > 0 && !enif_ioq_deq(q, n, NULL))
                 return -4;
    -    }
    +    }
     
         /* return n, which is either number of bytes written or -1 if
            some error happened */
         errno = saved_errno;
         return n;
    -}
  • Long-running NIFs
    As mentioned in the warning text at the beginning of +}

  • Long-running NIFs
    As mentioned in the warning text at the beginning of this manual page, it is of vital importance that a native function returns relatively fast. It is difficult to give an exact maximum amount of time that a native function is allowed to work, but usually a well-behaving native @@ -512,12 +512,12 @@

    with all its terms is valid until you explicitly invalidate it with enif_free_env or enif_send.

  • All contained terms of a list/tuple/map must belong to the same environment as the list/tuple/map itself. Terms can be copied between environments with -enif_make_copy.

  • ErlNifFunc

    typedef struct {
    +enif_make_copy.

  • ErlNifFunc

    typedef struct {
         const char* name;
         unsigned arity;
    -    ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
    +    ERL_NIF_TERM (*fptr)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
         unsigned flags;
    -} ErlNifFunc;

    Describes a NIF by its name, arity, and implementation.

    • fptr - A pointer to the function that implements the NIF.

    • argv - Contains the function arguments passed to the NIF.

    • argc - The array length, that is, the function arity. argv[N-1] thus +} ErlNifFunc;

  • Describes a NIF by its name, arity, and implementation.

    • fptr - A pointer to the function that implements the NIF.

    • argv - Contains the function arguments passed to the NIF.

    • argc - The array length, that is, the function arity. argv[N-1] thus denotes the Nth argument to the NIF. Notice that the argument argc allows for the same C function to implement several Erlang functions with different arity (but probably with the same name).

    • flags - Is 0 for a regular NIF (and so its value can be omitted for @@ -561,25 +561,25 @@

      type. It can be copied, moved in memory, forgotten, and so on.

    • ErlNifResourceType - Each instance of ErlNifResourceType represents a class of memory-managed resource objects that can be garbage collected. Each resource type has a unique name and a -destructor function that is called when objects of its type are released.

    • ErlNifResourceTypeInit

      typedef struct {
      +destructor function that is called when objects of its type are released.

    • ErlNifResourceTypeInit

      typedef struct {
           ErlNifResourceDtor* dtor;       // #1 Destructor
           ErlNifResourceStop* stop;       // #2 Select stop
           ErlNifResourceDown* down;       // #3 Monitor down
           int members;
           ErlNifResourceDynCall* dyncall; // #4 Dynamic call
      -} ErlNifResourceTypeInit;

      Initialization structure read by +} ErlNifResourceTypeInit;

    Initialization structure read by enif_open_resource_type_x enif_init_resource_type.

  • ErlNifResourceDtor

    typedef void ErlNifResourceDtor(ErlNifEnv* caller_env, void* obj);

    The function prototype of a resource destructor function.

    The obj argument is a pointer to the resource. The only allowed use for the resource in the destructor is to access its user data one final time. The destructor is guaranteed to be the last callback before the resource is -deallocated.

  • ErlNifResourceDown

    typedef void ErlNifResourceDown(ErlNifEnv* caller_env, void* obj, ErlNifPid* pid, ErlNifMonitor* mon);

    The function prototype of a resource down function, called on the behalf of +deallocated.

  • ErlNifResourceDown

    typedef void ErlNifResourceDown(ErlNifEnv* caller_env, void* obj, ErlNifPid* pid, ErlNifMonitor* mon);

    The function prototype of a resource down function, called on the behalf of enif_monitor_process. obj is the resource, pid is the identity of the monitored process that is exiting, and mon is the identity of the monitor.

  • ErlNifResourceStop

    typedef void ErlNifResourceStop(ErlNifEnv* caller_env, void* obj, ErlNifEvent event, int is_direct_call);

    The function prototype of a resource stop function, called on the behalf of enif_select. obj is the resource, event is OS event, is_direct_call is true if the call is made directly from enif_select or false if it is a scheduled call (potentially from another -thread).

  • ErlNifResourceDynCall

    typedef void ErlNifResourceDynCall(ErlNifEnv* caller_env, void* obj, void* call_data);

    The function prototype of a dynamic resource call function, called by +thread).

  • ErlNifResourceDynCall

    typedef void ErlNifResourceDynCall(ErlNifEnv* caller_env, void* obj, void* call_data);

    The function prototype of a dynamic resource call function, called by enif_dynamic_resource_call. Argument obj is the resource object and call_data is the last argument to enif_dynamic_resource_call passed through.

  • ErlNifCharEncoding

    typedef enum {
    @@ -602,11 +602,11 @@ 

    guarantees the same hash for the same term within one Erlang VM instance.

    It takes 32-bit salt values and generates hashes within 0..2^32-1.

  • ERL_NIF_PHASH2 - Portable hash function that gives the same hash for the same Erlang term regardless of machine architecture and ERTS version.

    It ignores salt values and generates hashes within 0..2^27-1.

    Slower than ERL_NIF_INTERNAL_HASH. It corresponds to erlang:phash2/1.

  • SysIOVec - A system I/O vector, as used by writev on Unix and WSASend on Win32. It is used in ErlNifIOVec and by -enif_ioq_peek.

  • ErlNifIOVec

    typedef struct {
    +enif_ioq_peek.

  • ErlNifIOVec

    typedef struct {
       int iovcnt;
       size_t size;
       SysIOVec* iov;
    -} ErlNifIOVec;

    An I/O vector containing iovcnt SysIOVecs pointing to the data. It is used +} ErlNifIOVec;

  • An I/O vector containing iovcnt SysIOVecs pointing to the data. It is used by enif_inspect_iovec and enif_ioq_enqv.

  • ErlNifIOQueueOpts - Options to configure a ErlNifIOQueue.

    • ERL_NIF_IOQ_NORMAL - Create a normal I/O Queue
  • @@ -615,17 +615,17 @@

    enif_alloc()

    -
    void * enif_alloc(
    -        size_t size);

    Allocates memory of size bytes.

    Returns NULL if the allocation fails.

    The returned pointer is suitably aligned for any built-in type that fit in the +

    void * enif_alloc(
    +        size_t size);

    Allocates memory of size bytes.

    Returns NULL if the allocation fails.

    The returned pointer is suitably aligned for any built-in type that fit in the allocated memory.

    enif_alloc_binary()

    -
    int enif_alloc_binary(
    +
    int enif_alloc_binary(
             size_t size,
    -        ErlNifBinary* bin);

    Allocates a new binary of size size bytes. Initializes the structure pointed + ErlNifBinary* bin);

    Allocates a new binary of size size bytes. Initializes the structure pointed to by bin to refer to the allocated binary. The binary must either be released by enif_release_binary or ownership transferred to an Erlang term with @@ -638,7 +638,7 @@

    enif_alloc_env()

    -
    ErlNifEnv * enif_alloc_env();

    Allocates a new process independent environment. +

    ErlNifEnv * enif_alloc_env();

    Allocates a new process independent environment. The environment can be used to hold terms that are not bound to any process. Such terms can later be copied to a process environment with enif_make_copy or be sent to a process as a @@ -648,20 +648,20 @@

    enif_alloc_resource()

    -
    void * enif_alloc_resource(
    +
    void * enif_alloc_resource(
             ErlNifResourceType* type,
    -        unsigned size);

    Allocates a memory-managed resource object of type type and size size bytes.

    Available since OTP R13B04

    + unsigned size);

    Allocates a memory-managed resource object of type type and size size bytes.

    Available since OTP R13B04

    enif_binary_to_term()

    -
    size_t enif_binary_to_term(
    +
    size_t enif_binary_to_term(
             ErlNifEnv *env,
             const unsigned char* data,
             size_t size,
             ERL_NIF_TERM *term,
    -        unsigned int opts);

    Creates a term that is the result of decoding the binary data at data, which + unsigned int opts);

    Creates a term that is the result of decoding the binary data at data, which must be encoded according to the Erlang external term format. No more than size bytes are read from data. Argument opts corresponds to the second argument to erlang:binary_to_term/2 and must be either 0 or @@ -674,16 +674,16 @@

    enif_clear_env()

    -
    void enif_clear_env(ErlNifEnv* env);

    Frees all terms in an environment and clears it for reuse. The environment must +

    void enif_clear_env(ErlNifEnv* env);

    Frees all terms in an environment and clears it for reuse. The environment must have been allocated with enif_alloc_env.

    Available since OTP R14B

    enif_compare()

    -
    int enif_compare(
    +
    int enif_compare(
             ERL_NIF_TERM lhs,
    -        ERL_NIF_TERM rhs);

    Returns an integer < 0 if lhs < rhs, 0 if lhs = rhs, and > 0 if + ERL_NIF_TERM rhs);

    Returns an integer < 0 if lhs < rhs, 0 if lhs = rhs, and > 0 if lhs > rhs. Corresponds to the Erlang operators ==, /=, =<, <, >=, and > (but not =:= or =/=).

    Available since OTP R13B04

    @@ -691,9 +691,9 @@

    enif_compare_monitors()

    -
    int enif_compare_monitors(
    +
    int enif_compare_monitors(
             const ErlNifMonitor *monitor1,
    -        const ErlNifMonitor *monitor2);

    Compares two ErlNifMonitors. Can also be used to + const ErlNifMonitor *monitor2);

    Compares two ErlNifMonitors. Can also be used to imply some artificial order on monitors, for whatever reason.

    Returns 0 if monitor1 and monitor2 are equal, < 0 if monitor1 < monitor2, and > 0 if monitor1 > monitor2.

    Available since OTP 20.0

    @@ -701,61 +701,61 @@

    enif_compare_pids()

    -
    int enif_compare_pids(
    +
    int enif_compare_pids(
             const ErlNifPid *pid1,
    -        const ErlNifPid *pid2);

    Compares two ErlNifPid s according to term order.

    Returns 0 if pid1 and pid2 are equal, < 0 if pid1 < pid2, and > 0 + const ErlNifPid *pid2);

    Compares two ErlNifPid s according to term order.

    Returns 0 if pid1 and pid2 are equal, < 0 if pid1 < pid2, and > 0 if pid1 > pid2.

    Available since OTP 22.0

    enif_cond_broadcast()

    -
    void enif_cond_broadcast(
    -        ErlNifCond *cnd);

    Same as erl_drv_cond_broadcast.

    Available since OTP R13B04

    +
    void enif_cond_broadcast(
    +        ErlNifCond *cnd);

    Same as erl_drv_cond_broadcast.

    Available since OTP R13B04

    enif_cond_create()

    -
    ErlNifCond * enif_cond_create(
    -        char *name);

    Same as erl_drv_cond_create.

    Available since OTP R13B04

    +
    ErlNifCond * enif_cond_create(
    +        char *name);

    Same as erl_drv_cond_create.

    Available since OTP R13B04

    enif_cond_destroy()

    -
    void enif_cond_destroy(
    -        ErlNifCond *cnd);

    Same as erl_drv_cond_destroy.

    Available since OTP R13B04

    +
    void enif_cond_destroy(
    +        ErlNifCond *cnd);

    Same as erl_drv_cond_destroy.

    Available since OTP R13B04

    enif_cond_name()

    -
    char* enif_cond_name(
    -        ErlNifCond* cnd);

    Same as erl_drv_cond_name.

    Available since OTP 21.0

    +
    char* enif_cond_name(
    +        ErlNifCond* cnd);

    Same as erl_drv_cond_name.

    Available since OTP 21.0

    enif_cond_signal()

    -
    void enif_cond_signal(
    -        ErlNifCond *cnd);

    Same as erl_drv_cond_signal.

    Available since OTP R13B04

    +
    void enif_cond_signal(
    +        ErlNifCond *cnd);

    Same as erl_drv_cond_signal.

    Available since OTP R13B04

    enif_cond_wait()

    -
    void enif_cond_wait(
    +
    void enif_cond_wait(
             ErlNifCond *cnd,
    -        ErlNifMutex *mtx);

    Same as erl_drv_cond_wait.

    Available since OTP R13B04

    + ErlNifMutex *mtx);

    Same as erl_drv_cond_wait.

    Available since OTP R13B04

    enif_consume_timeslice()

    -
    int enif_consume_timeslice(
    +
    int enif_consume_timeslice(
             ErlNifEnv *env,
    -        int percent);

    Gives the runtime system a hint about how much CPU time the current NIF call has + int percent);

    Gives the runtime system a hint about how much CPU time the current NIF call has consumed since the last hint, or since the start of the NIF if no previous hint has been specified. The time is specified as a percent of the timeslice that a process is allowed to execute Erlang code until it can be suspended to give time @@ -777,10 +777,10 @@

    enif_convert_time_unit()

    -
    ErlNifTime enif_convert_time_unit(
    +
    ErlNifTime enif_convert_time_unit(
             ErlNifTime val,
             ErlNifTimeUnit from,
    -        ErlNifTimeUnit to);

    Converts the val value of time unit from to the corresponding value of time + ErlNifTimeUnit to);

    Converts the val value of time unit from to the corresponding value of time unit to. The result is rounded using the floor function.

    • val - Value to convert time unit for.

    • from - Time unit of val.

    • to - Time unit of returned value.

    Returns ERL_NIF_TIME_ERROR if called with an invalid time unit argument.

    See also ErlNifTime and ErlNifTimeUnit.

    Available since OTP 18.3

    @@ -788,8 +788,8 @@

    enif_cpu_time()

    -
    ERL_NIF_TERM enif_cpu_time(
    -        ErlNifEnv *env);

    Returns the CPU time in the same format as +

    ERL_NIF_TERM enif_cpu_time(
    +        ErlNifEnv *env);

    Returns the CPU time in the same format as erlang:timestamp(). The CPU time is the time the current logical CPU has spent executing since some arbitrary point in the past. If the OS does not support fetching this value, enif_cpu_time invokes @@ -799,10 +799,10 @@

    enif_demonitor_process()

    -
    int enif_demonitor_process(
    +
    int enif_demonitor_process(
             ErlNifEnv* caller_env,
             void* obj,
    -        const ErlNifMonitor* mon);

    Cancels a monitor created earlier with + const ErlNifMonitor* mon);

    Cancels a monitor created earlier with enif_monitor_process. Argument obj is a pointer to the resource holding the monitor and *mon identifies the monitor.

    Argument caller_env is the environment of the calling thread (process bound or @@ -814,12 +814,12 @@

    enif_dynamic_resource_call()

    -
    int enif_dynamic_resource_call(
    +
    int enif_dynamic_resource_call(
             ErlNifEnv* caller_env,
             ERL_NIF_TERM rt_module,
             ERL_NIF_TERM rt_name,
             ERL_NIF_TERM resource,
    -        void* call_data);

    Call code of a resource type implemented by another NIF module. The atoms + void* call_data);

    Call code of a resource type implemented by another NIF module. The atoms rt_module and rt_name identifies the resource type to be called. Argument resource identifies a resource object of that type.

    The callback dyncall of the identified resource type will be called with a pointer to the resource objects obj and @@ -834,18 +834,18 @@

    enif_equal_tids()

    -
    int enif_equal_tids(
    +
    int enif_equal_tids(
             ErlNifTid tid1,
    -        ErlNifTid tid2);

    Same as erl_drv_equal_tids.

    Available since OTP R13B04

    + ErlNifTid tid2);

    Same as erl_drv_equal_tids.

    Available since OTP R13B04

    enif_fprintf()

    -
    int enif_fprintf(
    +
    int enif_fprintf(
             FILE *stream,
             const char *format,
    -        ...);

    Similar to fprintf but this format string also accepts "%T", which formats + ...);

    Similar to fprintf but this format string also accepts "%T", which formats Erlang terms of type ERL_NIF_TERM.

    This function is primarily intended for debugging purpose. It is not recommended to print very large terms with %T. The function may change errno, even if successful.

    Available since OTP 21.0

    @@ -854,15 +854,15 @@

    enif_free()

    -
    void enif_free(
    -        void* ptr);

    Frees memory allocated by enif_alloc.

    +
    void enif_free(
    +        void* ptr);

    Frees memory allocated by enif_alloc.

    enif_free_env()

    -
    void enif_free_env(
    -        ErlNifEnv* env);

    Frees an environment allocated with +

    void enif_free_env(
    +        ErlNifEnv* env);

    Frees an environment allocated with enif_alloc_env. All terms created in the environment are freed as well.

    Available since OTP R14B

    @@ -870,31 +870,31 @@

    enif_free_iovec()

    -
    void enif_free_iovec(
    -        ErlNifIOVec* iov);

    Frees an io vector returned from +

    void enif_free_iovec(
    +        ErlNifIOVec* iov);

    Frees an io vector returned from enif_inspect_iovec. This is needed only if a NULL environment is passed to enif_inspect_iovec.

    ErlNifIOVec *iovec = NULL;
     size_t max_elements = 128;
     ERL_NIF_TERM tail;
    -if (!enif_inspect_iovec(NULL, max_elements, term, &tail, &iovec))
    +if (!enif_inspect_iovec(NULL, max_elements, term, &tail, &iovec))
       return 0;
     
     // Do things with the iovec
     
     /* Free the iovector, possibly in another thread or nif function call */
    -enif_free_iovec(iovec);

    Available since OTP 20.1

    +enif_free_iovec(iovec);

    Available since OTP 20.1

    enif_get_atom()

    -
    int enif_get_atom(
    +
    int enif_get_atom(
             ErlNifEnv *env,
             ERL_NIF_TERM term,
             char *buf,
             unsigned size,
    -        ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf of size + ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf of size size bytes, consisting of the string representation of the atom term with encoding.

    Returns the number of bytes written (including terminating NULL character) or 0 if term is not an atom with maximum length of size-1 bytes in @@ -904,11 +904,11 @@

    enif_get_atom_length()

    -
    int enif_get_atom_length(
    +
    int enif_get_atom_length(
             ErlNifEnv *env,
             ERL_NIF_TERM term,
             unsigned *len,
    -        ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL + ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL character) of the atom term with encoding.

    Returns true on success, or false if term is not an atom or if the atom cannot be encoded using encoding.

    Available since OTP R14B

    @@ -916,39 +916,39 @@

    enif_get_double()

    -
    int enif_get_double(
    +
    int enif_get_double(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        double* dp);

    Sets *dp to the floating-point value of term.

    Returns true on success, or false if term is not a float.

    Available since OTP R13B04

    + double* dp);

    Sets *dp to the floating-point value of term.

    Returns true on success, or false if term is not a float.

    Available since OTP R13B04

    enif_get_int()

    -
    int enif_get_int(
    +
    int enif_get_int(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        int* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside + int* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside the bounds of type int.

    enif_get_int64()

    -
    int enif_get_int64(
    +
    int enif_get_int64(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        ErlNifSInt64* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside + ErlNifSInt64* ip);

    Sets *ip to the integer value of term.

    Returns true on success, or false if term is not an integer or is outside the bounds of a signed 64-bit integer.

    Available since OTP R14B

    enif_get_local_pid()

    -
    int enif_get_local_pid(
    +
    int enif_get_local_pid(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        ErlNifPid* pid);

    If term is the pid of a node local process, this function initializes the pid + ErlNifPid* pid);

    If term is the pid of a node local process, this function initializes the pid variable *pid from it and returns true. Otherwise returns false. No check is done to see if the process is alive.

    Note

    enif_get_local_pid will return false if argument term is the atom undefined.

    Available since OTP R14B

    @@ -957,10 +957,10 @@

    enif_get_local_port()

    -
    int enif_get_local_port(
    +
    int enif_get_local_port(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        ErlNifPort* port_id);

    If term identifies a node local port, this function initializes the port + ErlNifPort* port_id);

    If term identifies a node local port, this function initializes the port variable *port_id from it and returns true. Otherwise returns false. No check is done to see if the port is alive.

    Available since OTP 19.0

    @@ -968,60 +968,60 @@

    enif_get_list_cell()

    -
    int enif_get_list_cell(
    +
    int enif_get_list_cell(
             ErlNifEnv* env,
             ERL_NIF_TERM list,
             ERL_NIF_TERM* head,
    -        ERL_NIF_TERM* tail);

    Sets *head and *tail from list list.

    Returns true on success, or false if it is not a list or the list is empty.

    + ERL_NIF_TERM* tail);

    Sets *head and *tail from list list.

    Returns true on success, or false if it is not a list or the list is empty.

    enif_get_list_length()

    -
    int enif_get_list_length(
    +
    int enif_get_list_length(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        unsigned* len);

    Sets *len to the length of list term.

    Returns true on success, or false if term is not a proper list.

    Available since OTP R14B

    + unsigned* len);

    Sets *len to the length of list term.

    Returns true on success, or false if term is not a proper list.

    Available since OTP R14B

    enif_get_long()

    -
    int enif_get_long(
    +
    int enif_get_long(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        long int* ip);

    Sets *ip to the long integer value of term.

    Returns true on success, or false if term is not an integer or is outside + long int* ip);

    Sets *ip to the long integer value of term.

    Returns true on success, or false if term is not an integer or is outside the bounds of type long int.

    Available since OTP R13B04

    enif_get_map_size()

    -
    int enif_get_map_size(
    +
    int enif_get_map_size(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        size_t *size);

    Sets *size to the number of key-value pairs in the map term.

    Returns true on success, or false if term is not a map.

    Available since OTP 18.0

    + size_t *size);

    Sets *size to the number of key-value pairs in the map term.

    Returns true on success, or false if term is not a map.

    Available since OTP 18.0

    enif_get_map_value()

    -
    int enif_get_map_value(
    +
    int enif_get_map_value(
             ErlNifEnv* env,
             ERL_NIF_TERM map,
             ERL_NIF_TERM key,
    -        ERL_NIF_TERM* value);

    Sets *value to the value associated with key in the map map.

    Returns true on success, or false if map is not a map or if map does not + ERL_NIF_TERM* value);

    Sets *value to the value associated with key in the map map.

    Returns true on success, or false if map is not a map or if map does not contain key.

    Available since OTP 18.0

    enif_get_resource()

    -
    int enif_get_resource(
    +
    int enif_get_resource(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
             ErlNifResourceType* type,
    -        void** objp);

    Sets *objp to point to the resource object referred to by term.

    Returns true on success, or false if term is not a handle to a resource + void** objp);

    Sets *objp to point to the resource object referred to by term.

    Returns true on success, or false if term is not a handle to a resource object of type type.

    enif_get_resource does not add a reference to the resource object. However, the pointer received in *objp is guaranteed to be valid at least as long as the resource handle term is valid.

    Available since OTP R13B04

    @@ -1030,12 +1030,12 @@

    enif_get_string()

    -
    int enif_get_string(
    +
    int enif_get_string(
             ErlNifEnv* env,
             ERL_NIF_TERM list,
             char* buf,
             unsigned size,
    -        ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf with size + ErlNifCharEncoding encoding);

    Writes a NULL-terminated string in the buffer pointed to by buf with size size, consisting of the characters in the string list. The characters are written using encoding.

    Returns one of the following:

    • The number of bytes written (including terminating NULL character)
    • -size if the string was truncated because of buffer space
    • 0 if list is not a string that can be encoded with encoding or if size was < 1.

    The written string is always NULL-terminated, unless buffer size is < 1.

    Available since OTP R13B04

    @@ -1044,11 +1044,11 @@

    enif_get_string_length()

    -
    int enif_get_string_length(
    +
    int enif_get_string_length(
             ErlNifEnv *env,
             ERL_NIF_TERM list,
             unsigned *len,
    -        ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL + ErlNifCharEncoding encoding);

    Sets *len to the length (number of bytes excluding terminating NULL character) of the string list with encoding.

    Returns true on success, or false if list is not a string that can be encoded with encoding.

    Available since OTP 26.0

    @@ -1056,11 +1056,11 @@

    enif_get_tuple()

    -
    int enif_get_tuple(
    +
    int enif_get_tuple(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
             int* arity,
    -        const ERL_NIF_TERM** array);

    If term is a tuple, this function sets *array to point to an array + const ERL_NIF_TERM** array);

    If term is a tuple, this function sets *array to point to an array containing the elements of the tuple, and sets *arity to the number of elements. Notice that the array is read-only and (*array)[N-1] is the Nth element of the tuple. *array is undefined if the arity of the tuple is zero.

    Returns true on success, or false if term is not a tuple.

    Available since OTP R13B04

    @@ -1069,48 +1069,48 @@

    enif_get_uint()

    -
    int enif_get_uint(
    +
    int enif_get_uint(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        unsigned int* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is + unsigned int* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is outside the bounds of type unsigned int.

    Available since OTP R13B04

    enif_get_uint64()

    -
    int enif_get_uint64(
    +
    int enif_get_uint64(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        ErlNifUInt64* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is + ErlNifUInt64* ip);

    Sets *ip to the unsigned integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is outside the bounds of an unsigned 64-bit integer.

    Available since OTP R14B

    enif_get_ulong()

    -
    int enif_get_ulong(
    +
    int enif_get_ulong(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        unsigned long* ip);

    Sets *ip to the unsigned long integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is + unsigned long* ip);

    Sets *ip to the unsigned long integer value of term.

    Returns true on success, or false if term is not an unsigned integer or is outside the bounds of type unsigned long.

    enif_getenv()

    -
    int enif_getenv(
    +
    int enif_getenv(
             const char* key,
             char* value,
    -        size_t *value_size);

    Same as erl_drv_getenv.

    Available since OTP 18.2

    + size_t *value_size);

    Same as erl_drv_getenv.

    Available since OTP 18.2

    enif_has_pending_exception()

    -
    int enif_has_pending_exception(
    +
    int enif_has_pending_exception(
             ErlNifEnv* env,
    -        ERL_NIF_TERM* reason);

    Returns true if a pending exception is associated with the environment env. + ERL_NIF_TERM* reason);

    Returns true if a pending exception is associated with the environment env. If reason is a NULL pointer, ignore it. Otherwise, if a pending exception associated with env exists, set *reason to the value of the exception term. For example, if enif_make_badarg is called to @@ -1123,30 +1123,30 @@

    enif_hash()

    -
    ErlNifUInt64 enif_hash(
    +
    ErlNifUInt64 enif_hash(
             ErlNifHash type,
             ERL_NIF_TERM term,
    -        ErlNifUInt64 salt);

    Hashes term according to the specified ErlNifHash + ErlNifUInt64 salt);

    Hashes term according to the specified ErlNifHash type.

    Ranges of taken salt (if any) and returned value depend on the hash type.

    Available since OTP 20.0

    enif_inspect_binary()

    -
    int enif_inspect_binary(
    +
    int enif_inspect_binary(
             ErlNifEnv* env,
             ERL_NIF_TERM bin_term,
    -        ErlNifBinary* bin);

    Initializes the structure pointed to by bin with information about binary term + ErlNifBinary* bin);

    Initializes the structure pointed to by bin with information about binary term bin_term.

    Returns true on success, or false if bin_term is not a binary.

    enif_inspect_iolist_as_binary()

    -
    int enif_inspect_iolist_as_binary(
    +
    int enif_inspect_iolist_as_binary(
             ErlNifEnv* env,
             ERL_NIF_TERM term,
    -        ErlNifBinary* bin);

    Initializes the structure pointed to by bin with a continuous buffer with the + ErlNifBinary* bin);

    Initializes the structure pointed to by bin with a continuous buffer with the same byte content as iolist. As with inspect_binary, the data pointed to by bin is transient and does not need to be released.

    Returns true on success, or false if iolist is not an iolist.

    Available since OTP R13B04

    @@ -1154,23 +1154,23 @@

    enif_inspect_iovec()

    -
    int enif_inspect_iovec(
    +
    int enif_inspect_iovec(
             ErlNifEnv* env,
             size_t max_elements,
             ERL_NIF_TERM iovec_term,
             ERL_NIF_TERM* tail,
    -        ErlNifIOVec** iovec);

    Fills iovec with the list of binaries provided in iovec_term. The number of + ErlNifIOVec** iovec);

    Fills iovec with the list of binaries provided in iovec_term. The number of elements handled in the call is limited to max_elements, and tail is set to the remainder of the list. Note that the output may be longer than max_elements on some platforms.

    To create a list of binaries from an arbitrary iolist, use erlang:iolist_to_iovec/1.

    When calling this function, iovec should contain a pointer to NULL or a ErlNifIOVec structure that should be used if possible. e.g.

    /* Don't use a pre-allocated structure */
     ErlNifIOVec *iovec = NULL;
    -enif_inspect_iovec(env, max_elements, term, &tail, &iovec);
    +enif_inspect_iovec(env, max_elements, term, &tail, &iovec);
     
     /* Use a stack-allocated vector as an optimization for vectors with few elements */
     ErlNifIOVec vec, *iovec = &vec;
    -enif_inspect_iovec(env, max_elements, term, &tail, &iovec);

    The contents of the iovec is valid until the called nif function returns. If +enif_inspect_iovec(env, max_elements, term, &tail, &iovec);

    The contents of the iovec is valid until the called nif function returns. If the iovec should be valid after the nif call returns, it is possible to call this function with a NULL environment. If no environment is given the iovec owns the data in the vector and it has to be explicitly freed using @@ -1180,25 +1180,25 @@

    enif_ioq_create()

    -
    ErlNifIOQueue * enif_ioq_create(
    -        ErlNifIOQueueOpts opts);

    Create a new I/O Queue that can be used to store data. opts has to be set to +

    ErlNifIOQueue * enif_ioq_create(
    +        ErlNifIOQueueOpts opts);

    Create a new I/O Queue that can be used to store data. opts has to be set to ERL_NIF_IOQ_NORMAL.

    Available since OTP 20.1

    enif_ioq_destroy()

    -
    void enif_ioq_destroy(
    -        ErlNifIOQueue *q);

    Destroy the I/O queue and free all of it's contents

    Available since OTP 20.1

    +
    void enif_ioq_destroy(
    +        ErlNifIOQueue *q);

    Destroy the I/O queue and free all of it's contents

    Available since OTP 20.1

    enif_ioq_deq()

    -
    int enif_ioq_deq(
    +
    int enif_ioq_deq(
             ErlNifIOQueue *q,
             size_t count,
    -        size_t *size);

    Dequeue count bytes from the I/O queue. If size is not NULL, the new size + size_t *size);

    Dequeue count bytes from the I/O queue. If size is not NULL, the new size of the queue is placed there.

    Returns true on success, or false if the I/O does not contain count bytes. On failure the queue is left un-altered.

    Available since OTP 20.1

    @@ -1206,10 +1206,10 @@

    enif_ioq_enq_binary()

    -
    int enif_ioq_enq_binary(
    +
    int enif_ioq_enq_binary(
             ErlNifIOQueue *q,
             ErlNifBinary *bin,
    -        size_t skip);

    Enqueue the bin into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of + size_t skip);

    Enqueue the bin into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of bin. Any ownership of the binary data is transferred to the queue and bin is to be considered read-only for the rest of the NIF call and then as released.

    Available since OTP 20.1

    @@ -1217,19 +1217,19 @@

    enif_ioq_enqv()

    -
    int enif_ioq_enqv(
    +
    int enif_ioq_enqv(
             ErlNifIOQueue *q,
             ErlNifIOVec *iovec,
    -        size_t skip);

    Enqueue the iovec into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of + size_t skip);

    Enqueue the iovec into q skipping the first skip bytes.

    Returns true on success, or false if skip is greater than the size of iovec.

    Available since OTP 20.1

    enif_ioq_peek()

    -
    SysIOVec * enif_ioq_peek(
    +
    SysIOVec * enif_ioq_peek(
             ErlNifIOQueue *q,
    -        int *iovlen);

    Get the I/O queue as a pointer to an array of SysIOVecs. It also returns the + int *iovlen);

    Get the I/O queue as a pointer to an array of SysIOVecs. It also returns the number of elements in iovlen.

    Nothing is removed from the queue by this function, that must be done with enif_ioq_deq.

    The returned array is suitable to use with the Unix system call writev.

    Available since OTP 20.1

    @@ -1237,42 +1237,42 @@

    enif_ioq_peek_head()

    -
    int enif_ioq_peek_head(
    +
    int enif_ioq_peek_head(
             ErlNifEnv *env,
             ErlNifIOQueue *q,
             size_t *size,
    -        ERL_NIF_TERM *bin_term);

    Get the head of the IO Queue as a binary term.

    If size is not NULL, the size of the head is placed there.

    Nothing is removed from the queue by this function, that must be done with + ERL_NIF_TERM *bin_term);

    Get the head of the IO Queue as a binary term.

    If size is not NULL, the size of the head is placed there.

    Nothing is removed from the queue by this function, that must be done with enif_ioq_deq.

    Returns true on success, or false if the queue is empty.

    Available since OTP 21.0

    enif_ioq_size()

    -
    size_t enif_ioq_size(
    -        ErlNifIOQueue *q);

    Get the size of q.

    Available since OTP 20.1

    +
    size_t enif_ioq_size(
    +        ErlNifIOQueue *q);

    Get the size of q.

    Available since OTP 20.1

    enif_is_atom()

    -
    int enif_is_atom(
    +
    int enif_is_atom(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is an atom.

    Available since OTP R13B04

    + ERL_NIF_TERM term);

    Returns true if term is an atom.

    Available since OTP R13B04

    enif_is_binary()

    -
    int enif_is_binary(
    +
    int enif_is_binary(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a binary.

    + ERL_NIF_TERM term);

    Returns true if term is a binary.

    enif_is_current_process_alive()

    -
    int enif_is_current_process_alive(
    -        ErlNifEnv* env);

    Returns true if the currently executing process is currently alive, otherwise +

    int enif_is_current_process_alive(
    +        ErlNifEnv* env);

    Returns true if the currently executing process is currently alive, otherwise false.

    This function can only be used from a NIF-calling thread, and with an environment corresponding to currently executing processes.

    Available since OTP 19.0

    @@ -1280,121 +1280,121 @@

    enif_is_empty_list()

    -
    int enif_is_empty_list(
    +
    int enif_is_empty_list(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is an empty list.

    Available since OTP R13B04

    + ERL_NIF_TERM term);

    Returns true if term is an empty list.

    Available since OTP R13B04

    enif_is_exception()

    -
    int enif_is_exception(
    +
    int enif_is_exception(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Return true if term is an exception.

    Available since OTP R14B03

    + ERL_NIF_TERM term);

    Return true if term is an exception.

    Available since OTP R14B03

    enif_is_fun()

    -
    int enif_is_fun(
    +
    int enif_is_fun(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a fun.

    Available since OTP R13B04

    + ERL_NIF_TERM term);

    Returns true if term is a fun.

    Available since OTP R13B04

    enif_is_identical()

    -
    int enif_is_identical(
    +
    int enif_is_identical(
             ERL_NIF_TERM lhs,
    -        ERL_NIF_TERM rhs);

    Returns true if the two terms are identical. Corresponds to the Erlang + ERL_NIF_TERM rhs);

    Returns true if the two terms are identical. Corresponds to the Erlang operators =:= and =/=.

    Available since OTP R13B04

    enif_is_list()

    -
    int enif_is_list(
    +
    int enif_is_list(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a list.

    Available since OTP R14B

    + ERL_NIF_TERM term);

    Returns true if term is a list.

    Available since OTP R14B

    enif_is_map()

    -
    int enif_is_map(
    +
    int enif_is_map(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a map, otherwise false.

    Available since OTP 18.0

    + ERL_NIF_TERM term);

    Returns true if term is a map, otherwise false.

    Available since OTP 18.0

    enif_is_number()

    -
    int enif_is_number(
    +
    int enif_is_number(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a number.

    Available since OTP R15B

    + ERL_NIF_TERM term);

    Returns true if term is a number.

    Available since OTP R15B

    enif_is_pid()

    -
    int enif_is_pid(
    +
    int enif_is_pid(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a pid.

    Available since OTP R13B04

    + ERL_NIF_TERM term);

    Returns true if term is a pid.

    Available since OTP R13B04

    enif_is_pid_undefined()

    -
    int enif_is_pid_undefined(
    -        const ErlNifPid* pid);

    Returns true if pid has been set as undefined by +

    int enif_is_pid_undefined(
    +        const ErlNifPid* pid);

    Returns true if pid has been set as undefined by enif_set_pid_undefined .

    Available since OTP 22.0

    enif_is_port()

    -
    int enif_is_port(
    +
    int enif_is_port(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a port.

    Available since OTP R13B04

    + ERL_NIF_TERM term);

    Returns true if term is a port.

    Available since OTP R13B04

    enif_is_port_alive()

    -
    int enif_is_port_alive(
    +
    int enif_is_port_alive(
             ErlNifEnv* env,
    -        ErlNifPort *port_id);

    Returns true if port_id is alive.

    This function is thread-safe.

    Available since OTP 19.0

    + ErlNifPort *port_id);

    Returns true if port_id is alive.

    This function is thread-safe.

    Available since OTP 19.0

    enif_is_process_alive()

    -
    int enif_is_process_alive(
    +
    int enif_is_process_alive(
             ErlNifEnv* env,
    -        ErlNifPid *pid);

    Returns true if pid is alive.

    This function is thread-safe.

    Available since OTP 19.0

    + ErlNifPid *pid);

    Returns true if pid is alive.

    This function is thread-safe.

    Available since OTP 19.0

    enif_is_ref()

    -
    int enif_is_ref(
    +
    int enif_is_ref(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a reference.

    Available since OTP R13B04

    + ERL_NIF_TERM term);

    Returns true if term is a reference.

    Available since OTP R13B04

    enif_is_tuple()

    -
    int enif_is_tuple(
    +
    int enif_is_tuple(
             ErlNifEnv* env,
    -        ERL_NIF_TERM term);

    Returns true if term is a tuple.

    Available since OTP R14B

    + ERL_NIF_TERM term);

    Returns true if term is a tuple.

    Available since OTP R14B

    enif_keep_resource()

    -
    int enif_keep_resource(
    -        void* obj);

    Adds a reference to resource object obj obtained from +

    int enif_keep_resource(
    +        void* obj);

    Adds a reference to resource object obj obtained from enif_alloc_resource. Each call to enif_keep_resource for an object must be balanced by a call to enif_release_resource before the object is @@ -1404,9 +1404,9 @@

    enif_make_atom()

    -
    ERL_NIF_TERM enif_make_atom(
    +
    ERL_NIF_TERM enif_make_atom(
             ErlNifEnv *env,
    -        const char *name);

    Creates an atom term from the NULL-terminated C-string name with ISO + const char *name);

    Creates an atom term from the NULL-terminated C-string name with ISO Latin-1 encoding. If the length of name exceeds the maximum length allowed for an atom (255 characters), enif_make_atom invokes enif_make_badarg.

    @@ -1415,10 +1415,10 @@

    enif_make_atom_len()

    -
    ERL_NIF_TERM enif_make_atom_len(
    +
    ERL_NIF_TERM enif_make_atom_len(
             ErlNifEnv *env,
             const char *name,
    -        size_t len);

    Create an atom term from the string name with length len and ISO Latin-1 + size_t len);

    Create an atom term from the string name with length len and ISO Latin-1 encoding. NULL characters are treated as any other characters. If len exceeds the maximum length allowed for an atom (255 characters), enif_make_atom invokes enif_make_badarg .

    Available since OTP R14B

    @@ -1427,8 +1427,8 @@

    enif_make_badarg()

    -
    ERL_NIF_TERM enif_make_badarg(
    -        ErlNifEnv* env);

    Makes a badarg exception to be returned from a NIF, and associates it with +

    ERL_NIF_TERM enif_make_badarg(
    +        ErlNifEnv* env);

    Makes a badarg exception to be returned from a NIF, and associates it with environment env. Once a NIF or any function it calls invokes enif_make_badarg, the runtime ensures that a badarg exception is raised when the NIF returns, even if the NIF attempts to return a non-exception term @@ -1444,9 +1444,9 @@

    enif_make_binary()

    -
    ERL_NIF_TERM enif_make_binary(
    +
    ERL_NIF_TERM enif_make_binary(
             ErlNifEnv* env,
    -        ErlNifBinary* bin);

    Makes a binary term from bin. Any ownership of the binary data is transferred + ErlNifBinary* bin);

    Makes a binary term from bin. Any ownership of the binary data is transferred to the created term and bin is to be considered read-only for the rest of the NIF call and then as released.

    @@ -1454,18 +1454,18 @@

    enif_make_copy()

    -
    ERL_NIF_TERM enif_make_copy(
    +
    ERL_NIF_TERM enif_make_copy(
             ErlNifEnv* dst_env,
    -        ERL_NIF_TERM src_term);

    Makes a copy of term src_term. The copy is created in environment dst_env. + ERL_NIF_TERM src_term);

    Makes a copy of term src_term. The copy is created in environment dst_env. The source term can be located in any environment.

    Available since OTP R14B

    enif_make_double()

    -
    ERL_NIF_TERM enif_make_double(
    +
    ERL_NIF_TERM enif_make_double(
             ErlNifEnv* env,
    -        double d);

    Creates a floating-point term from a double. If argument double is not + double d);

    Creates a floating-point term from a double. If argument double is not finite or is NaN, enif_make_double invokes enif_make_badarg.

    Available since OTP R13B04

    @@ -1473,11 +1473,11 @@

    enif_make_existing_atom()

    -
    int enif_make_existing_atom(
    +
    int enif_make_existing_atom(
             ErlNifEnv *env,
             const char *name,
             ERL_NIF_TERM *atom,
    -        ErlNifCharEncoding encoding);

    Tries to create the term of an already existing atom from the NULL-terminated + ErlNifCharEncoding encoding);

    Tries to create the term of an already existing atom from the NULL-terminated C-string name with encoding.

    If the atom already exists, this function stores the term in *atom and returns true, otherwise returns false. It also returns false if the string name exceeds the maximum length allowed for an atom (255 characters) or if name is @@ -1487,12 +1487,12 @@

    enif_make_existing_atom_len()

    -
    int enif_make_existing_atom_len(
    +
    int enif_make_existing_atom_len(
             ErlNifEnv *env,
             const char *name,
             size_t len,
             ERL_NIF_TERM *atom,
    -        ErlNifCharEncoding encoding);

    Tries to create the term of an already existing atom from the string name with + ErlNifCharEncoding encoding);

    Tries to create the term of an already existing atom from the string name with length len bytes and encoding. NULL characters are treated as any other characters.

    If the atom already exists, this function stores the term in *atom and returns true, otherwise returns false. It also returns false if the string name @@ -1503,26 +1503,26 @@

    enif_make_int()

    -
    ERL_NIF_TERM enif_make_int(
    +
    ERL_NIF_TERM enif_make_int(
             ErlNifEnv* env,
    -        int i);

    Creates an integer term.

    + int i);

    Creates an integer term.

    enif_make_int64()

    -
    ERL_NIF_TERM enif_make_int64(
    +
    ERL_NIF_TERM enif_make_int64(
             ErlNifEnv* env,
    -        ErlNifSInt64 i);

    Creates an integer term from a signed 64-bit integer.

    Available since OTP R14B

    + ErlNifSInt64 i);

    Creates an integer term from a signed 64-bit integer.

    Available since OTP R14B

    enif_make_list()

    -
    ERL_NIF_TERM enif_make_list(
    +
    ERL_NIF_TERM enif_make_list(
             ErlNifEnv* env,
             unsigned cnt,
    -        ...);

    Creates an ordinary list term of length cnt. Expects cnt number of arguments + ...);

    Creates an ordinary list term of length cnt. Expects cnt number of arguments (after cnt) of type ERL_NIF_TERM as the elements of the list.

    Returns an empty list if cnt is 0.

    @@ -1577,25 +1577,25 @@

    enif_make_list9()

    -
    ERL_NIF_TERM enif_make_list1(
    +
    ERL_NIF_TERM enif_make_list1(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_list2(
    +        ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_list2(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_list3(
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_list3(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_list4(
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_list4(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_list5(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_list5(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_list6(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_list6(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_list7(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_list7(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_list8(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_list8(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_list9(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_list9(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates an ordinary list term with length indicated by the function name. Prefer + ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates an ordinary list term with length indicated by the function name. Prefer these functions (macros) over the variadic enif_make_list to get a compile-time error if the number of arguments does not match.

    Available since OTP R13B04

    @@ -1603,38 +1603,38 @@

    enif_make_list_cell()

    -
    ERL_NIF_TERM enif_make_list_cell(
    +
    ERL_NIF_TERM enif_make_list_cell(
             ErlNifEnv* env,
             ERL_NIF_TERM head,
    -        ERL_NIF_TERM tail);

    Creates a list cell [head | tail].

    + ERL_NIF_TERM tail);

    Creates a list cell [head | tail].

    enif_make_list_from_array()

    -
    ERL_NIF_TERM enif_make_list_from_array(
    +
    ERL_NIF_TERM enif_make_list_from_array(
             ErlNifEnv* env,
    -        const ERL_NIF_TERM arr[],
    -        unsigned cnt);

    Creates an ordinary list containing the elements of array arr of length cnt.

    Returns an empty list if cnt is 0.

    Available since OTP R13B04

    + const ERL_NIF_TERM arr[], + unsigned cnt);

    Creates an ordinary list containing the elements of array arr of length cnt.

    Returns an empty list if cnt is 0.

    Available since OTP R13B04

    enif_make_long()

    -
    ERL_NIF_TERM enif_make_long(
    +
    ERL_NIF_TERM enif_make_long(
             ErlNifEnv* env,
    -        long int i);

    Creates an integer term from a long int.

    Available since OTP R13B04

    + long int i);

    Creates an integer term from a long int.

    Available since OTP R13B04

    enif_make_map_put()

    -
    int enif_make_map_put(
    +
    int enif_make_map_put(
             ErlNifEnv* env,
             ERL_NIF_TERM map_in,
             ERL_NIF_TERM key,
             ERL_NIF_TERM value,
    -        ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and inserts key with value. If key already + ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and inserts key with value. If key already exists in map_in, the old associated value is replaced by value.

    If successful, this function sets *map_out to the new map and returns true. Returns false if map_in is not a map.

    The map_in term must belong to environment env.

    Available since OTP 18.0

    @@ -1642,11 +1642,11 @@

    enif_make_map_remove()

    -
    int enif_make_map_remove(
    +
    int enif_make_map_remove(
             ErlNifEnv* env,
             ERL_NIF_TERM map_in,
             ERL_NIF_TERM key,
    -        ERL_NIF_TERM* map_out);

    If map map_in contains key, this function makes a copy of map_in in + ERL_NIF_TERM* map_out);

    If map map_in contains key, this function makes a copy of map_in in *map_out, and removes key and the associated value. If map map_in does not contain key, *map_out is set to map_in.

    Returns true on success, or false if map_in is not a map.

    The map_in term must belong to environment env.

    Available since OTP 18.0

    @@ -1654,12 +1654,12 @@

    enif_make_map_update()

    -
    int enif_make_map_update(
    +
    int enif_make_map_update(
             ErlNifEnv* env,
             ERL_NIF_TERM map_in,
             ERL_NIF_TERM key,
             ERL_NIF_TERM new_value,
    -        ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and replace the old associated value for key with + ERL_NIF_TERM* map_out);

    Makes a copy of map map_in and replace the old associated value for key with new_value.

    If successful, this function sets *map_out to the new map and returns true. Returns false if map_in is not a map or if it does not contain key.

    The map_in term must belong to environment env.

    Available since OTP 18.0

    @@ -1667,32 +1667,32 @@

    enif_make_map_from_arrays()

    -
    int enif_make_map_from_arrays(
    +
    int enif_make_map_from_arrays(
             ErlNifEnv* env,
    -        ERL_NIF_TERM keys[],
    -        ERL_NIF_TERM values[],
    +        ERL_NIF_TERM keys[],
    +        ERL_NIF_TERM values[],
             size_t cnt,
    -        ERL_NIF_TERM *map_out);

    Makes a map term from the given keys and values.

    If successful, this function sets *map_out to the new map and returns true. + ERL_NIF_TERM *map_out);

    Makes a map term from the given keys and values.

    If successful, this function sets *map_out to the new map and returns true. Returns false there are any duplicate keys.

    All keys and values must belong to env.

    Available since OTP 21.0

    enif_make_monitor_term()

    -
    ERL_NIF_TERM enif_make_monitor_term(
    +
    ERL_NIF_TERM enif_make_monitor_term(
             ErlNifEnv* env,
    -        const ErlNifMonitor* mon);

    Creates a term identifying the given monitor received from + const ErlNifMonitor* mon);

    Creates a term identifying the given monitor received from enif_monitor_process .

    This function is primarily intended for debugging purpose.

    Available since OTP 22.0

    enif_make_new_atom()

    -
    int enif_make_new_atom(
    +
    int enif_make_new_atom(
             ErlNifEnv *env,
             const char *name,
             ERL_NIF_TERM *atom,
    -        ErlNifCharEncoding encoding);

    Creates an atom term from the NULL-terminated C-string name with + ErlNifCharEncoding encoding);

    Creates an atom term from the NULL-terminated C-string name with encoding.

    If successful, true is returned and the atom term is stored in *atom.

    Otherwise, false is returned if the length of name exceeds the maximum length allowed for an atom (255 characters) or if name is not correctly encoded.

    Available since OTP 26.0

    @@ -1701,12 +1701,12 @@

    enif_make_new_atom_len()

    -
    int enif_make_new_atom_len(
    +
    int enif_make_new_atom_len(
             ErlNifEnv *env,
             const char *name,
             size_t len,
             ERL_NIF_TERM *atom,
    -        ErlNifCharEncoding encoding);

    Create an atom term from string name with length len bytes and + ErlNifCharEncoding encoding);

    Create an atom term from string name with length len bytes and encoding.

    If successful, true is returned and atom term is stored in *atom.

    Otherwise, false is returned if the string exceeds the maximum length allowed for an atom (255 characters) or if the string is not correctly encoded.

    Available since OTP 26.0

    @@ -1714,10 +1714,10 @@

    enif_make_new_binary()

    -
    unsigned char * enif_make_new_binary(
    +
    unsigned char * enif_make_new_binary(
     	 ErlNifEnv* env,
     	 size_t size,
    -	 ERL_NIF_TERM* termp);

    Allocates a binary of size size bytes and creates an owning term. The binary + ERL_NIF_TERM* termp);

    Allocates a binary of size size bytes and creates an owning term. The binary data is mutable until the calling NIF returns. This is a quick way to create a new binary without having to use ErlNifBinary. The drawbacks are that the binary cannot be kept between NIF calls and it cannot be @@ -1727,32 +1727,32 @@

    enif_make_new_map()

    -
    ERL_NIF_TERM enif_make_new_map(
    -        ErlNifEnv* env);

    Makes an empty map term.

    Available since OTP 18.0

    +
    ERL_NIF_TERM enif_make_new_map(
    +        ErlNifEnv* env);

    Makes an empty map term.

    Available since OTP 18.0

    enif_make_pid()

    -
    ERL_NIF_TERM enif_make_pid(
    +
    ERL_NIF_TERM enif_make_pid(
             ErlNifEnv* env,
    -        const ErlNifPid* pid);

    Makes a pid term or the atom undefined + const ErlNifPid* pid);

    Makes a pid term or the atom undefined from *pid.

    Available since OTP R14B

    enif_make_ref()

    -
    ERL_NIF_TERM enif_make_ref(
    -        ErlNifEnv* env);

    Creates a reference like erlang:make_ref/0.

    Available since OTP R13B04

    +
    ERL_NIF_TERM enif_make_ref(
    +        ErlNifEnv* env);

    Creates a reference like erlang:make_ref/0.

    Available since OTP R13B04

    enif_make_resource()

    -
    ERL_NIF_TERM enif_make_resource(
    +
    ERL_NIF_TERM enif_make_resource(
             ErlNifEnv* env,
    -        void* obj);

    Creates an opaque handle to a memory-managed resource object obtained by + void* obj);

    Creates an opaque handle to a memory-managed resource object obtained by enif_alloc_resource. No ownership transfer is done, as the resource object still needs to be released by enif_release_resource. However, notice @@ -1779,11 +1779,11 @@

    enif_make_resource_binary()

    -
    ERL_NIF_TERM enif_make_resource_binary(
    +
    ERL_NIF_TERM enif_make_resource_binary(
             ErlNifEnv* env,
             void* obj,
             const void* data,
    -        size_t size);

    Creates a binary term that is memory-managed by a resource object obj obtained + size_t size);

    Creates a binary term that is memory-managed by a resource object obj obtained by enif_alloc_resource. The returned binary term consists of size bytes pointed to by data. This raw binary data must be kept readable and unchanged until the destructor of the resource is called. The @@ -1798,10 +1798,10 @@

    enif_make_reverse_list()

    -
    int enif_make_reverse_list(
    +
    int enif_make_reverse_list(
             ErlNifEnv* env,
             ERL_NIF_TERM list_in,
    -        ERL_NIF_TERM *list_out);

    Sets *list_out to the reverse list of the list list_in and returns true, + ERL_NIF_TERM *list_out);

    Sets *list_out to the reverse list of the list list_in and returns true, or returns false if list_in is not a list.

    This function is only to be used on short lists, as a copy is created of the list, which is not released until after the NIF returns.

    The list_in term must belong to environment env.

    Available since OTP R15B

    @@ -1809,21 +1809,21 @@

    enif_make_string()

    -
    ERL_NIF_TERM enif_make_string(
    +
    ERL_NIF_TERM enif_make_string(
             ErlNifEnv *env,
             const char *string,
    -        ErlNifCharEncoding encoding);

    Creates a list containing the characters of the NULL-terminated string + ErlNifCharEncoding encoding);

    Creates a list containing the characters of the NULL-terminated string string with encoding.

    enif_make_string_len()

    -
    ERL_NIF_TERM enif_make_string_len(
    +
    ERL_NIF_TERM enif_make_string_len(
             ErlNifEnv *env,
             const char *string,
             size_t len,
    -        ErlNifCharEncoding encoding);

    Creates a list containing the characters of the string string with length + ErlNifCharEncoding encoding);

    Creates a list containing the characters of the string string with length len and encoding. NULL characters are treated as any other characters.

    Available since OTP R14B

    @@ -1831,11 +1831,11 @@

    enif_make_sub_binary()

    -
    ERL_NIF_TERM enif_make_sub_binary(
    +
    ERL_NIF_TERM enif_make_sub_binary(
             ErlNifEnv* env,
             ERL_NIF_TERM bin_term,
             size_t pos,
    -        size_t size);

    Makes a subbinary of binary bin_term, starting at zero-based position pos + size_t size);

    Makes a subbinary of binary bin_term, starting at zero-based position pos with a length of size bytes. bin_term must be a binary or bitstring. pos+size must be less or equal to the number of whole bytes in bin_term.

    Available since OTP R13B04

    @@ -1843,10 +1843,10 @@

    enif_make_tuple()

    -
    ERL_NIF_TERM enif_make_tuple(
    +
    ERL_NIF_TERM enif_make_tuple(
             ErlNifEnv* env,
             unsigned cnt,
    -        ...);

    Creates a tuple term of arity cnt. Expects cnt number of arguments (after + ...);

    Creates a tuple term of arity cnt. Expects cnt number of arguments (after cnt) of type ERL_NIF_TERM as the elements of the tuple.

    @@ -1901,25 +1901,25 @@

    enif_make_tuple9()

    -
    ERL_NIF_TERM enif_make_tuple1(
    +
    ERL_NIF_TERM enif_make_tuple1(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_tuple2(
    +        ERL_NIF_TERM e1);
    ERL_NIF_TERM enif_make_tuple2(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_tuple3(
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2);
    ERL_NIF_TERM enif_make_tuple3(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_tuple4(
    +        ERL_NIF_TERM e1, ERL_NIF_TERM e2, ERL_NIF_TERM e3);
    ERL_NIF_TERM enif_make_tuple4(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_tuple5(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e4);
    ERL_NIF_TERM enif_make_tuple5(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_tuple6(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e5);
    ERL_NIF_TERM enif_make_tuple6(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_tuple7(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e6);
    ERL_NIF_TERM enif_make_tuple7(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_tuple8(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e7);
    ERL_NIF_TERM enif_make_tuple8(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_tuple9(
    +        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e8);
    ERL_NIF_TERM enif_make_tuple9(
             ErlNifEnv* env,
    -        ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates a tuple term with length indicated by the function name. Prefer these + ERL_NIF_TERM e1, ..., ERL_NIF_TERM e9);

    Creates a tuple term with length indicated by the function name. Prefer these functions (macros) over the variadic enif_make_tuple to get a compile-time error if the number of arguments does not match.

    Available since OTP R13B04

    @@ -1927,42 +1927,42 @@

    enif_make_tuple_from_array()

    -
    ERL_NIF_TERM enif_make_tuple_from_array(
    +
    ERL_NIF_TERM enif_make_tuple_from_array(
             ErlNifEnv* env,
    -        const ERL_NIF_TERM arr[],
    -        unsigned cnt);

    Creates a tuple containing the elements of array arr of length cnt.

    Available since OTP R13B04

    + const ERL_NIF_TERM arr[], + unsigned cnt);

    Creates a tuple containing the elements of array arr of length cnt.

    Available since OTP R13B04

    enif_make_uint()

    -
    ERL_NIF_TERM enif_make_uint(
    +
    ERL_NIF_TERM enif_make_uint(
             ErlNifEnv* env,
    -        unsigned int i);

    Creates an integer term from an unsigned int.

    Available since OTP R13B04

    + unsigned int i);

    Creates an integer term from an unsigned int.

    Available since OTP R13B04

    enif_make_uint64()

    -
    ERL_NIF_TERM enif_make_uint64(
    +
    ERL_NIF_TERM enif_make_uint64(
             ErlNifEnv* env,
    -        ErlNifUInt64 i);

    Creates an integer term from an unsigned 64-bit integer.

    Available since OTP R14B

    + ErlNifUInt64 i);

    Creates an integer term from an unsigned 64-bit integer.

    Available since OTP R14B

    enif_make_ulong()

    -
    ERL_NIF_TERM enif_make_ulong(
    +
    ERL_NIF_TERM enif_make_ulong(
             ErlNifEnv* env,
    -        unsigned long i);

    Creates an integer term from an unsigned long int.

    + unsigned long i);

    Creates an integer term from an unsigned long int.

    enif_make_unique_integer()

    -
    ERL_NIF_TERM enif_make_unique_integer(
    +
    ERL_NIF_TERM enif_make_unique_integer(
             ErlNifEnv *env,
    -        ErlNifUniqueInteger properties);

    Returns a unique integer with the same properties as specified by + ErlNifUniqueInteger properties);

    Returns a unique integer with the same properties as specified by erlang:unique_integer/1.

    env is the environment to create the integer in.

    ERL_NIF_UNIQUE_POSITIVE and ERL_NIF_UNIQUE_MONOTONIC can be passed as the second argument to change the properties of the integer returned. They can be combined by OR:ing the two values together.

    See also ErlNifUniqueInteger.

    Available since OTP 19.0

    @@ -1971,23 +1971,23 @@

    enif_map_iterator_create()

    -
    int enif_map_iterator_create(
    +
    int enif_map_iterator_create(
             ErlNifEnv *env,
             ERL_NIF_TERM map,
             ErlNifMapIterator *iter,
    -        ErlNifMapIteratorEntry entry);

    Creates an iterator for the map map by initializing the structure pointed to + ErlNifMapIteratorEntry entry);

    Creates an iterator for the map map by initializing the structure pointed to by iter. Argument entry determines the start position of the iterator: ERL_NIF_MAP_ITERATOR_FIRST or ERL_NIF_MAP_ITERATOR_LAST.

    Returns true on success, or false if map is not a map.

    A map iterator is only useful during the lifetime of environment env that the map belongs to. The iterator must be destroyed by calling enif_map_iterator_destroy:

    ERL_NIF_TERM key, value;
     ErlNifMapIterator iter;
    -enif_map_iterator_create(env, my_map, &iter, ERL_NIF_MAP_ITERATOR_FIRST);
    +enif_map_iterator_create(env, my_map, &iter, ERL_NIF_MAP_ITERATOR_FIRST);
     
    -while (enif_map_iterator_get_pair(env, &iter, &key, &value)) {
    -    do_something(key,value);
    -    enif_map_iterator_next(env, &iter);
    -}
    -enif_map_iterator_destroy(env, &iter);

    Note

    The key-value pairs of a map have no defined iteration order. The only +while (enif_map_iterator_get_pair(env, &iter, &key, &value)) { + do_something(key,value); + enif_map_iterator_next(env, &iter); +} +enif_map_iterator_destroy(env, &iter);

    Note

    The key-value pairs of a map have no defined iteration order. The only guarantee is that the iteration order of a single map instance is preserved during the lifetime of the environment that the map belongs to.

    Available since OTP 18.0

    @@ -1995,65 +1995,65 @@

    enif_map_iterator_destroy()

    -
    void enif_map_iterator_destroy(
    +
    void enif_map_iterator_destroy(
             ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Destroys a map iterator created by + ErlNifMapIterator *iter);

    Destroys a map iterator created by enif_map_iterator_create.

    Available since OTP 18.0

    enif_map_iterator_get_pair()

    -
    int enif_map_iterator_get_pair(
    +
    int enif_map_iterator_get_pair(
             ErlNifEnv *env,
             ErlNifMapIterator *iter,
             ERL_NIF_TERM *key,
    -        ERL_NIF_TERM *value);

    Gets key and value terms at the current map iterator position.

    On success, sets *key and *value and returns true. Returns false if the + ERL_NIF_TERM *value);

    Gets key and value terms at the current map iterator position.

    On success, sets *key and *value and returns true. Returns false if the iterator is positioned at head (before first entry) or tail (beyond last entry).

    Available since OTP 18.0

    enif_map_iterator_is_head()

    -
    int enif_map_iterator_is_head(
    +
    int enif_map_iterator_is_head(
             ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned before the first entry.

    Available since OTP 18.0

    + ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned before the first entry.

    Available since OTP 18.0

    enif_map_iterator_is_tail()

    -
    int enif_map_iterator_is_tail(
    +
    int enif_map_iterator_is_tail(
             ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned after the last entry.

    Available since OTP 18.0

    + ErlNifMapIterator *iter);

    Returns true if map iterator iter is positioned after the last entry.

    Available since OTP 18.0

    enif_map_iterator_next()

    -
    int enif_map_iterator_next(
    +
    int enif_map_iterator_next(
             ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Increments map iterator to point to the next key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or + ErlNifMapIterator *iter);

    Increments map iterator to point to the next key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or false if the iterator is positioned at the tail (beyond the last entry).

    Available since OTP 18.0

    enif_map_iterator_prev()

    -
    int enif_map_iterator_prev(
    +
    int enif_map_iterator_prev(
             ErlNifEnv *env,
    -        ErlNifMapIterator *iter);

    Decrements map iterator to point to the previous key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or + ErlNifMapIterator *iter);

    Decrements map iterator to point to the previous key-value entry.

    Returns true if the iterator is now positioned at a valid key-value entry, or false if the iterator is positioned at the head (before the first entry).

    Available since OTP 18.0

    enif_monitor_process()

    -
    int enif_monitor_process(
    +
    int enif_monitor_process(
             ErlNifEnv* caller_env,
             void* obj,
             const ErlNifPid* target_pid,
    -        ErlNifMonitor* mon);

    Starts monitoring a process from a resource. When a process is monitored, a + ErlNifMonitor* mon);

    Starts monitoring a process from a resource. When a process is monitored, a process exit results in a call to the provided down callback associated with the resource type.

    Argument obj is pointer to the resource to hold the monitor and *target_pid @@ -2073,8 +2073,8 @@

    enif_monotonic_time()

    -
    ErlNifTime enif_monotonic_time(
    -        ErlNifTimeUnit time_unit);

    Returns the current +

    ErlNifTime enif_monotonic_time(
    +        ErlNifTimeUnit time_unit);

    Returns the current Erlang monotonic time. Notice that it is not uncommon with negative values.

    time_unit is the time unit of the returned value.

    Returns ERL_NIF_TIME_ERROR if called with an invalid time unit argument, or if called from a thread that is not a scheduler thread.

    See also ErlNifTime and @@ -2084,62 +2084,62 @@

    enif_mutex_create()

    -
    ErlNifMutex * enif_mutex_create(
    -        char *name);

    Same as erl_drv_mutex_create.

    Available since OTP R13B04

    +
    ErlNifMutex * enif_mutex_create(
    +        char *name);

    Same as erl_drv_mutex_create.

    Available since OTP R13B04

    enif_mutex_destroy()

    -
    void enif_mutex_destroy(
    -        ErlNifMutex *mtx);

    Same as erl_drv_mutex_destroy.

    Available since OTP R13B04

    +
    void enif_mutex_destroy(
    +        ErlNifMutex *mtx);

    Same as erl_drv_mutex_destroy.

    Available since OTP R13B04

    enif_mutex_lock()

    -
    void enif_mutex_lock(
    -        ErlNifMutex *mtx);

    Same as erl_drv_mutex_lock.

    Available since OTP R13B04

    +
    void enif_mutex_lock(
    +        ErlNifMutex *mtx);

    Same as erl_drv_mutex_lock.

    Available since OTP R13B04

    enif_mutex_name()

    -
    char* enif_mutex_name(
    -        ErlNifMutex* mtx);

    Same as erl_drv_mutex_name.

    Available since OTP 21.0

    +
    char* enif_mutex_name(
    +        ErlNifMutex* mtx);

    Same as erl_drv_mutex_name.

    Available since OTP 21.0

    enif_mutex_trylock()

    -
    int enif_mutex_trylock(
    -        ErlNifMutex *mtx);

    Same as erl_drv_mutex_trylock.

    Available since OTP R13B04

    +
    int enif_mutex_trylock(
    +        ErlNifMutex *mtx);

    Same as erl_drv_mutex_trylock.

    Available since OTP R13B04

    enif_mutex_unlock()

    -
    void enif_mutex_unlock(
    -        ErlNifMutex *mtx);

    Same as erl_drv_mutex_unlock.

    Available since OTP R13B04

    +
    void enif_mutex_unlock(
    +        ErlNifMutex *mtx);

    Same as erl_drv_mutex_unlock.

    Available since OTP R13B04

    enif_now_time()

    -
    ERL_NIF_TERM enif_now_time(
    -        ErlNifEnv *env);

    Returns an erlang:now() time stamp.

    This function is deprecated.

    Available since OTP 19.0

    +
    ERL_NIF_TERM enif_now_time(
    +        ErlNifEnv *env);

    Returns an erlang:now() time stamp.

    This function is deprecated.

    Available since OTP 19.0

    enif_open_resource_type()

    -
    ErlNifResourceType * enif_open_resource_type(
    +
    ErlNifResourceType * enif_open_resource_type(
             ErlNifEnv* env,
             const char* module_str,
             const char* name,
             ErlNifResourceDtor* dtor,
             ErlNifResourceFlags flags,
    -        ErlNifResourceFlags* tried);

    Creates or takes over a resource type identified by the string name and gives + ErlNifResourceFlags* tried);

    Creates or takes over a resource type identified by the string name and gives it the destructor function pointed to by dtor. Argument flags can have the following values:

    • ERL_NIF_RT_CREATE - Creates a new resource type that does not already @@ -2160,12 +2160,12 @@

      enif_open_resource_type_x()

      -
      ErlNifResourceType * enif_open_resource_type_x(
      +
      ErlNifResourceType * enif_open_resource_type_x(
               ErlNifEnv* env,
               const char* name,
               const ErlNifResourceTypeInit* init,
               ErlNifResourceFlags flags,
      -        ErlNifResourceFlags* tried);

      Same as enif_open_resource_type except + ErlNifResourceFlags* tried);

      Same as enif_open_resource_type except it accepts additional callback functions for resource types that are used together with enif_select and enif_monitor_process.

      Argument init is a pointer to an @@ -2180,12 +2180,12 @@

      enif_init_resource_type()

      -
      ErlNifResourceType * enif_init_resource_type(
      +
      ErlNifResourceType * enif_init_resource_type(
               ErlNifEnv* env,
               const char* name,
               const ErlNifResourceTypeInit* init,
               ErlNifResourceFlags flags,
      -        ErlNifResourceFlags* tried);

      Same as enif_open_resource_type_x + ErlNifResourceFlags* tried);

      Same as enif_open_resource_type_x except it accepts an additional callback function for resource types that are used together with enif_dynamic_resource_call.

      Argument init is a pointer to an @@ -2200,11 +2200,11 @@

      enif_port_command()

      -
      int enif_port_command(
      +
      int enif_port_command(
               ErlNifEnv* env, const
               ErlNifPort* to_port,
               ErlNifEnv *msg_env,
      -        ERL_NIF_TERM msg);

      Works as erlang:port_command/2, except that it is always completely + ERL_NIF_TERM msg);

      Works as erlang:port_command/2, except that it is always completely asynchronous.

      • env - The environment of the calling process. Must not be NULL.

      • *to_port - The port ID of the receiving port. The port ID is to refer to a port on the local node.

      • msg_env - The environment of the message term. Can be a process independent environment allocated with @@ -2219,17 +2219,17 @@

        enif_priv_data()

        -
        void * enif_priv_data(
        -        ErlNifEnv* env);

        Returns the pointer to the private data that was set by +

        void * enif_priv_data(
        +        ErlNifEnv* env);

        Returns the pointer to the private data that was set by load or upgrade.

        Available since OTP R13B04

        enif_raise_exception()

        -
        ERL_NIF_TERM enif_raise_exception(
        +
        ERL_NIF_TERM enif_raise_exception(
                 ErlNifEnv* env,
        -        ERL_NIF_TERM reason);

        Creates an error exception with the term reason to be returned from a NIF, and + ERL_NIF_TERM reason);

        Creates an error exception with the term reason to be returned from a NIF, and associates it with environment env. Once a NIF or any function it calls invokes enif_raise_exception, the runtime ensures that the exception it creates is raised when the NIF returns, even if the NIF attempts to return a @@ -2243,9 +2243,9 @@

        enif_realloc()

        -
        void * enif_realloc(
        +
        void * enif_realloc(
                 void* ptr,
        -        size_t size);

        Reallocates memory allocated by enif_alloc to size + size_t size);

        Reallocates memory allocated by enif_alloc to size bytes.

        Returns NULL if the reallocation fails.

        The returned pointer is suitably aligned for any built-in type that fit in the allocated memory.

        Available since OTP 20.2

        @@ -2253,9 +2253,9 @@

        enif_realloc_binary()

        -
        int enif_realloc_binary(
        +
        int enif_realloc_binary(
                 ErlNifBinary* bin,
        -        size_t size);

        Changes the size of a binary bin. The source binary can be read-only, in which + size_t size);

        Changes the size of a binary bin. The source binary can be read-only, in which case it is left untouched and a mutable copy is allocated and assigned to *bin.

        Returns true on success, or false if memory allocation failed.

        Available since OTP R13B04

        @@ -2263,16 +2263,16 @@

        enif_release_binary()

        -
        void enif_release_binary(
        -        ErlNifBinary* bin);

        Releases a binary obtained from +

        void enif_release_binary(
        +        ErlNifBinary* bin);

        Releases a binary obtained from enif_alloc_binary.

        enif_release_resource()

        -
        void enif_release_resource(
        -        void* obj);

        Removes a reference to resource object obj obtained from +

        void enif_release_resource(
        +        void* obj);

        Removes a reference to resource object obj obtained from enif_alloc_resource. The resource object is destructed when the last reference is removed. Each call to enif_release_resource must correspond to a previous call to @@ -2286,76 +2286,76 @@

        enif_rwlock_create()

        -
        ErlNifRWLock * enif_rwlock_create(
        -        char *name);

        Same as erl_drv_rwlock_create.

        Available since OTP R13B04

        +
        ErlNifRWLock * enif_rwlock_create(
        +        char *name);

        Same as erl_drv_rwlock_create.

        Available since OTP R13B04

        enif_rwlock_destroy()

        -
        void enif_rwlock_destroy(
        -        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_destroy.

        Available since OTP R13B04

        +
        void enif_rwlock_destroy(
        +        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_destroy.

        Available since OTP R13B04

        enif_rwlock_name()

        -
        char* enif_rwlock_name(
        -        ErlNifRWLock* rwlck);

        Same as erl_drv_rwlock_name.

        Available since OTP 21.0

        +
        char* enif_rwlock_name(
        +        ErlNifRWLock* rwlck);

        Same as erl_drv_rwlock_name.

        Available since OTP 21.0

        enif_rwlock_rlock()

        -
        void enif_rwlock_rlock(
        -        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rlock.

        Available since OTP R13B04

        +
        void enif_rwlock_rlock(
        +        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rlock.

        Available since OTP R13B04

        enif_rwlock_runlock()

        -
        void enif_rwlock_runlock(
        -        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_runlock.

        Available since OTP R13B04

        +
        void enif_rwlock_runlock(
        +        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_runlock.

        Available since OTP R13B04

        enif_rwlock_rwlock()

        -
        void enif_rwlock_rwlock(
        -        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwlock.

        Available since OTP R13B04

        +
        void enif_rwlock_rwlock(
        +        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwlock.

        Available since OTP R13B04

        enif_rwlock_rwunlock()

        -
        void enif_rwlock_rwunlock(
        -        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwunlock.

        Available since OTP R13B04

        +
        void enif_rwlock_rwunlock(
        +        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_rwunlock.

        Available since OTP R13B04

        enif_rwlock_tryrlock()

        -
        int enif_rwlock_tryrlock(
        -        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrlock.

        Available since OTP R13B04

        +
        int enif_rwlock_tryrlock(
        +        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrlock.

        Available since OTP R13B04

        enif_rwlock_tryrwlock()

        -
        int enif_rwlock_tryrwlock(
        -        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrwlock.

        Available since OTP R13B04

        +
        int enif_rwlock_tryrwlock(
        +        ErlNifRWLock *rwlck);

        Same as erl_drv_rwlock_tryrwlock.

        Available since OTP R13B04

        enif_schedule_nif()

        -
        ERL_NIF_TERM enif_schedule_nif(
        +
        ERL_NIF_TERM enif_schedule_nif(
                 ErlNifEnv* caller_env,
                 const char* fun_name,
                 int flags,
        -        ERL_NIF_TERM (*fp)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]),
        +        ERL_NIF_TERM (*fp)(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]),
                 int argc,
        -        const ERL_NIF_TERM argv[]);

        Schedules NIF fp to execute. This function allows an application to break up + const ERL_NIF_TERM argv[]);

        Schedules NIF fp to execute. This function allows an application to break up long-running work into multiple regular NIF calls or to schedule a dirty NIF to execute on a dirty scheduler thread.

        • caller_env - Must be process bound environment of the calling NIF.

        • fun_name - Provides a name for the NIF that is scheduled for execution. @@ -2376,13 +2376,13 @@

          enif_select()

          -
          int enif_select(
          +
          int enif_select(
                   ErlNifEnv* env,
                   ErlNifEvent event,
                   enum ErlNifSelectFlags mode,
                   void* obj,
                   const ErlNifPid* pid,
          -        ERL_NIF_TERM ref);

          This function can be used to receive asynchronous notifications when OS-specific + ERL_NIF_TERM ref);

          This function can be used to receive asynchronous notifications when OS-specific event objects become ready for either read or write operations.

          Argument event identifies the event object. On Unix systems, the functions select/poll are used. The event object must be a socket, pipe or other file descriptor object that select/poll can use.

          Argument mode describes the type of events to wait for. It can be @@ -2437,14 +2437,14 @@

          to the poll set.

        Note

        Use bitwise AND to test for specific bits in the return value. New significant bits may be added in future releases to give more detailed information for both failed and successful calls. Do NOT use equality tests like ==, as that -may cause your application to stop working.

        Example:

        retval = enif_select(env, fd, ERL_NIF_SELECT_STOP, resource, ref);
        -if (retval < 0) {
        +may cause your application to stop working.

        Example:

        retval = enif_select(env, fd, ERL_NIF_SELECT_STOP, resource, ref);
        +if (retval < 0) {
             /* handle error */
        -}
        +}
         /* Success! */
        -if (retval & ERL_NIF_SELECT_STOP_CALLED) {
        +if (retval & ERL_NIF_SELECT_STOP_CALLED) {
             /* ... */
        -}

        Note

        The mode flag ERL_NIF_SELECT_CANCEL and the return flags +}

    Note

    The mode flag ERL_NIF_SELECT_CANCEL and the return flags ERL_NIF_SELECT_READ_CANCELLED and ERL_NIF_SELECT_WRITE_CANCELLED were introduced in erts-11.0 (OTP-22.0).

    Available since OTP 20.0

    @@ -2458,19 +2458,19 @@

    enif_select_write()

    -
    int enif_select_read(
    +
    int enif_select_read(
             ErlNifEnv* env,
             ErlNifEvent event,
             void* obj,
             const ErlNifPid* pid,
             ERL_NIF_TERM msg,
    -        ErlNifEnv* msg_env);
    int enif_select_write(
    +        ErlNifEnv* msg_env);
    int enif_select_write(
             ErlNifEnv* env,
             ErlNifEvent event,
             void* obj,
             const ErlNifPid* pid,
             ERL_NIF_TERM msg,
    -        ErlNifEnv* msg_env);

    These are variants of enif_select where you can supply + ErlNifEnv* msg_env);

    These are variants of enif_select where you can supply your own message term msg that will be sent to the process instead of the predefined tuple {select,_,_,_}.

    Argument msg_env must either be NULL or the environment of msg allocated with enif_alloc_env. If argument msg_env is @@ -2488,9 +2488,9 @@

    enif_self()

    -
    ErlNifPid * enif_self(
    +
    ErlNifPid * enif_self(
             ErlNifEnv* caller_env,
    -        ErlNifPid* pid);

    Initializes the ErlNifPid variable at *pid to + ErlNifPid* pid);

    Initializes the ErlNifPid variable at *pid to represent the calling process.

    Returns pid if successful, or NULL if caller_env is not a process bound environment.

    Available since OTP R14B

    @@ -2498,11 +2498,11 @@

    enif_send()

    -
    int enif_send(
    +
    int enif_send(
             ErlNifEnv* caller_env,
             ErlNifPid* to_pid,
             ErlNifEnv* msg_env,
    -        ERL_NIF_TERM msg);

    Sends a message to a process.

    • caller_env - The environment of the calling thread + ERL_NIF_TERM msg);

    Sends a message to a process.

    • caller_env - The environment of the calling thread (process bound or callback environment) or NULL if calling from a custom thread not spawned by ERTS.

    • *to_pid - The pid of the receiving process. The pid is to refer to a @@ -2521,11 +2521,11 @@

      enif_set_option()

      -
      int enif_set_option(
      +
      int enif_set_option(
               ErlNifEnv *env,
               ErlNifOption opt,
      -	...);

      Set an option. On success, zero will be returned. On failure, a non zero value -will be returned. Currently the following options can be set:

      Set an option. On success, zero will be returned. On failure, a non zero value +will be returned. Currently the following options can be set:

      • ERL_NIF_OPT_DELAY_HALT

        enif_set_option(env, ERL_NIF_OPT_DELAY_HALT)

        Enable delay of runtime system halt with flushing enabled until all calls to NIFs in the NIF library have returned. If the delay halt feature has not been enabled, a halt with flushing enabled may complete even though processes are still @@ -2555,7 +2555,7 @@

        case typically used to notify processes blocked in NIFs in the library that it is time to return in order to let the runtime system complete the halting. Such NIFs should be dirty NIFs, since ordinary NIFs should never block for a -long time.

      • ERL_NIF_OPT_ON_HALT

        enif_set_option(env, ERL_NIF_OPT_ON_HALT, on_halt)

        Install a callback that will be called when the runtime system halts with +long time.

      • ERL_NIF_OPT_ON_HALT

        enif_set_option(env, ERL_NIF_OPT_ON_HALT, on_halt)

        Install a callback that will be called when the runtime system halts with flushing enabled.

        The runtime system halts when one of the erlang:halt() BIFs are called. By default flushing is enabled, but can be disabled using the erlang:halt/2 BIF. When flushing has been disabled, the runtime system will @@ -2582,7 +2582,7 @@

        returned. The on halt callback is in this case typically used to notify processes blocked in NIFs in the library that it is time to return in order to let the runtime system complete the halting. Such NIFs should be dirty NIFs, -since ordinary NIFs should never block for a long time.

      • ERL_NIF_OPT_ON_UNLOAD_THREAD

        enif_set_option(env, ERL_NIF_OPT_ON_UNLOAD_THREAD, on_unload_thread)

        Install a callback that will be called by each scheduler thread when the +since ordinary NIFs should never block for a long time.

      • ERL_NIF_OPT_ON_UNLOAD_THREAD

        enif_set_option(env, ERL_NIF_OPT_ON_UNLOAD_THREAD, on_unload_thread)

        Install a callback that will be called by each scheduler thread when the module instance that the NIF library belongs to is purged as old. A typical use is to release thread specific data.

        The ERL_NIF_OPT_ON_UNLOAD_THREAD option can only be set during loading of a NIF library inside a call to load() or @@ -2607,27 +2607,27 @@

        enif_set_pid_undefined()

        -
        void enif_set_pid_undefined(
        -        ErlNifPid* pid);

        Sets an ErlNifPid variable as undefined. See +

        void enif_set_pid_undefined(
        +        ErlNifPid* pid);

        Sets an ErlNifPid variable as undefined. See enif_is_pid_undefined.

        Available since OTP 22.0

        enif_sizeof_resource()

        -
        unsigned enif_sizeof_resource(
        -        void* obj);

        Gets the byte size of resource object obj obtained by +

        unsigned enif_sizeof_resource(
        +        void* obj);

        Gets the byte size of resource object obj obtained by enif_alloc_resource.

        Available since OTP R13B04

        enif_snprintf()

        -
        int enif_snprintf(
        +
        int enif_snprintf(
                 char *str,
                 size_t size,
                 const char *format,
        -	...);

        Similar to snprintf but this format string also accepts "%T", which formats + ...);

        Similar to snprintf but this format string also accepts "%T", which formats Erlang terms of type ERL_NIF_TERM.

        This function is primarily intended for debugging purpose. It is not recommended to print very large terms with %T. The function may change errno, even if successful.

        Available since OTP 19.0

        @@ -2636,18 +2636,18 @@

        enif_system_info()

        -
        void enif_system_info(
        +
        void enif_system_info(
                 ErlNifSysInfo *sys_info_ptr,
        -        size_t size);

        Same as driver_system_info.

        Available since OTP R13B04

        + size_t size);

        Same as driver_system_info.

        Available since OTP R13B04

        enif_term_to_binary()

        -
        int enif_term_to_binary(
        +
        int enif_term_to_binary(
                 ErlNifEnv *env,
                 ERL_NIF_TERM term,
        -        ErlNifBinary *bin);

        Allocates a new binary with enif_alloc_binary + ErlNifBinary *bin);

        Allocates a new binary with enif_alloc_binary and stores the result of encoding term according to the Erlang external term format.

        Returns true on success, or false if the allocation fails.

        See also erlang:term_to_binary/1 and enif_binary_to_term.

        Available since OTP 19.0

        @@ -2656,9 +2656,9 @@

        enif_term_type()

        -
        ErlNifTermType enif_term_type(
        +
        ErlNifTermType enif_term_type(
                 ErlNifEnv *env,
        -        ERL_NIF_TERM term);

        Determines the type of the given term. The term must be an ordinary Erlang term + ERL_NIF_TERM term);

        Determines the type of the given term. The term must be an ordinary Erlang term and not one of the special terms returned by enif_raise_exception, enif_schedule_nif, or similar.

        The following types are defined at the moment:

        • ERL_NIF_TERM_TYPE_ATOM

        • ERL_NIF_TERM_TYPE_BITSTRING - A bitstring or binary

        • ERL_NIF_TERM_TYPE_FLOAT

        • ERL_NIF_TERM_TYPE_FUN

        • ERL_NIF_TERM_TYPE_INTEGER

        • ERL_NIF_TERM_TYPE_LIST - A list, empty or not

        • ERL_NIF_TERM_TYPE_MAP

        • ERL_NIF_TERM_TYPE_PID

        • ERL_NIF_TERM_TYPE_PORT

        • ERL_NIF_TERM_TYPE_REFERENCE

        • ERL_NIF_TERM_TYPE_TUPLE

        Note that new types may be added in the future, so the caller must be prepared @@ -2668,62 +2668,62 @@

        enif_thread_create()

        -
        int enif_thread_create(
        +
        int enif_thread_create(
                 char *name,
                 ErlNifTid *tid,
        -        void * (*func)(void *),
        +        void * (*func)(void *),
                 void *args,
        -        ErlNifThreadOpts *opts);

        Same as erl_drv_thread_create.

        Available since OTP R13B04

        + ErlNifThreadOpts *opts);

        Same as erl_drv_thread_create.

        Available since OTP R13B04

        enif_thread_exit()

        -
        void enif_thread_exit(
        -        void *resp);

        Same as erl_drv_thread_exit.

        Available since OTP R13B04

        +
        void enif_thread_exit(
        +        void *resp);

        Same as erl_drv_thread_exit.

        Available since OTP R13B04

        enif_thread_join()

        -
        int enif_thread_join(
        +
        int enif_thread_join(
                 ErlNifTid tid,
        -        void **respp);

        Same as erl_drv_thread_join.

        Available since OTP R13B04

        + void **respp);

        Same as erl_drv_thread_join.

        Available since OTP R13B04

        enif_thread_name()

        -
        char* enif_thread_name(
        -        ErlNifTid tid);

        Same as erl_drv_thread_name.

        Available since OTP 21.0

        +
        char* enif_thread_name(
        +        ErlNifTid tid);

        Same as erl_drv_thread_name.

        Available since OTP 21.0

        enif_thread_opts_create()

        -
        ErlNifThreadOpts * enif_thread_opts_create(
        -        char *name);

        Same as +

        ErlNifThreadOpts * enif_thread_opts_create(
        +        char *name);

        Same as erl_drv_thread_opts_create.

        Available since OTP R13B04

        enif_thread_opts_destroy()

        -
        void enif_thread_opts_destroy(
        -        ErlNifThreadOpts *opts);

        Same as +

        void enif_thread_opts_destroy(
        +        ErlNifThreadOpts *opts);

        Same as erl_drv_thread_opts_destroy.

        Available since OTP R13B04

        enif_thread_self()

        -
        ErlNifTid enif_thread_self(void);

        Same as erl_drv_thread_self.

        Available since OTP R13B04

        +
        ErlNifTid enif_thread_self(void);

        Same as erl_drv_thread_self.

        Available since OTP R13B04

        enif_thread_type()

        -
        int enif_thread_type(void);

        Determine the type of currently executing thread. A positive value indicates a +

        int enif_thread_type(void);

        Determine the type of currently executing thread. A positive value indicates a scheduler thread while a negative value or zero indicates another type of thread. Currently the following specific types exist (which may be extended in the future):

        • ERL_NIF_THR_UNDEFINED - Undefined thread that is not a scheduler thread.

        • ERL_NIF_THR_NORMAL_SCHEDULER - A normal scheduler thread.

        • ERL_NIF_THR_DIRTY_CPU_SCHEDULER - A dirty CPU scheduler thread.

        • ERL_NIF_THR_DIRTY_IO_SCHEDULER - A dirty I/O scheduler thread.

        Available since OTP 19.0

        @@ -2732,8 +2732,8 @@

        enif_time_offset()

        -
        ErlNifTime enif_time_offset(
        -        ErlNifTimeUnit time_unit);

        Returns the current time offset between +

        ErlNifTime enif_time_offset(
        +        ErlNifTimeUnit time_unit);

        Returns the current time offset between Erlang monotonic time and Erlang system time converted into the time_unit passed as argument.

        time_unit is the time unit of the returned value.

        Returns ERL_NIF_TIME_ERROR if called with an invalid time unit argument or if @@ -2744,61 +2744,61 @@

        enif_tsd_get()

        -
        void * enif_tsd_get(
        -        ErlNifTSDKey key);

        Same as erl_drv_tsd_get.

        Available since OTP R13B04

        +
        void * enif_tsd_get(
        +        ErlNifTSDKey key);

        Same as erl_drv_tsd_get.

        Available since OTP R13B04

        enif_tsd_key_create()

        -
        int enif_tsd_key_create(
        +
        int enif_tsd_key_create(
                 char *name,
        -        ErlNifTSDKey *key);

        Same as erl_drv_tsd_key_create.

        Available since OTP R13B04

        + ErlNifTSDKey *key);

        Same as erl_drv_tsd_key_create.

        Available since OTP R13B04

        enif_tsd_key_destroy()

        -
        void enif_tsd_key_destroy(
        -        ErlNifTSDKey key);

        Same as erl_drv_tsd_key_destroy.

        Available since OTP R13B04

        +
        void enif_tsd_key_destroy(
        +        ErlNifTSDKey key);

        Same as erl_drv_tsd_key_destroy.

        Available since OTP R13B04

        enif_tsd_set()

        -
        void enif_tsd_set(
        +
        void enif_tsd_set(
                 ErlNifTSDKey key,
        -        void *data);

        Same as erl_drv_tsd_set.

        Available since OTP R13B04

        + void *data);

        Same as erl_drv_tsd_set.

        Available since OTP R13B04

        enif_vfprintf()

        -
        int enif_vfprintf(
        +
        int enif_vfprintf(
                 FILE *stream,
                 const char *format,
        -        va_list ap);

        Equivalent to enif_fprintf except that its called + va_list ap);

        Equivalent to enif_fprintf except that its called with a va_list instead of a variable number of arguments.

        Available since OTP 21.0

        enif_vsnprintf()

        -
        int enif_vsnprintf(
        +
        int enif_vsnprintf(
                 char *str,
                 size_t size,
                 const char *format,
        -        va_list ap);

        Equivalent to enif_snprintf except that its called + va_list ap);

        Equivalent to enif_snprintf except that its called with a va_list instead of a variable number of arguments.

        Available since OTP 21.0

        enif_whereis_pid()

        -
        int enif_whereis_pid(
        +
        int enif_whereis_pid(
                 ErlNifEnv *caller_env,
                 ERL_NIF_TERM name,
        -        ErlNifPid *pid);

        Looks up a process by its registered name.

        • caller_env - The environment of the calling thread + ErlNifPid *pid);

        Looks up a process by its registered name.

        • caller_env - The environment of the calling thread (process bound or callback environment) or NULL if calling from a custom thread not spawned by ERTS.

        • name - The name of a registered process, as an atom.

        • *pid - The ErlNifPid in which the resolved @@ -2811,10 +2811,10 @@

          enif_whereis_port()

          -
          int enif_whereis_port(
          +
          int enif_whereis_port(
                   ErlNifEnv *caller_env,
                   ERL_NIF_TERM name,
          -        ErlNifPort *port);

          Looks up a port by its registered name.

          • caller_env - The environment of the calling thread + ErlNifPort *port);

          Looks up a port by its registered name.

          • caller_env - The environment of the calling thread (process bound or callback environment) or NULL if calling from a custom thread not spawned by ERTS.

          • name - The name of a registered port, as an atom.

          • *port - The ErlNifPort in which the resolved diff --git a/prs/9277/erts-15.2/doc/html/erl_prim_loader.html b/prs/9277/erts-15.2/doc/html/erl_prim_loader.html index d8a4a9f164575..320f499c08d74 100644 --- a/prs/9277/erts-15.2/doc/html/erl_prim_loader.html +++ b/prs/9277/erts-15.2/doc/html/erl_prim_loader.html @@ -412,7 +412,7 @@

            read_file_info(Filename)

            Retrieves information about a file.

            Returns {ok, FileInfo} if successful, otherwise error. FileInfo is a record file_info, defined in the Kernel include file file.hrl. Include the following directive in the module from which the -function is called:

            -include_lib("kernel/include/file.hrl").

            For more information about the record see file:read_file_info/2.

            Filename can also be a file in an archive, for example, +function is called:

            -include_lib("kernel/include/file.hrl").

            For more information about the record see file:read_file_info/2.

            Filename can also be a file in an archive, for example, $OTPROOT/lib/mnesia-4.4.7.ez/mnesia-4.4.7/ebin/mnesia. For information about archive files, see code.

            diff --git a/prs/9277/erts-15.2/doc/html/erl_tracer.html b/prs/9277/erts-15.2/doc/html/erl_tracer.html index 89456933a35a0..46e6de9d06c1c 100644 --- a/prs/9277/erts-15.2/doc/html/erl_tracer.html +++ b/prs/9277/erts-15.2/doc/html/erl_tracer.html @@ -149,107 +149,107 @@

            module, a much more lightweight message tracer is used, which only records who sent messages to who.

            The following is an example session using it on Linux:

            $ gcc -I erts-8.0/include/ -fPIC -shared -o erl_msg_tracer.so erl_msg_tracer.c
             $ erl
            -Erlang/OTP 19 [DEVELOPMENT] [erts-8.0] [source-ed2b56b] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
            +Erlang/OTP 19 [DEVELOPMENT] [erts-8.0] [source-ed2b56b] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
             
            -Eshell V8.0  (abort with ^G)
            -1> c(erl_msg_tracer), erl_msg_tracer:load().
            +Eshell V8.0  (abort with ^G)
            +1> c(erl_msg_tracer), erl_msg_tracer:load().
             ok
            -2> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
            +2> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
             <0.37.0>
            -3> erlang:trace(new, true, [send,{tracer, erl_msg_tracer, Tracer}]).
            +3> erlang:trace(new, true, [send,{tracer, erl_msg_tracer, Tracer}]).
             0
            -{trace,<0.39.0>,<0.27.0>}
            -4> {ok, D} = file:open("/tmp/tmp.data",[write]).
            -{trace,#Port<0.486>,<0.40.0>}
            -{trace,<0.40.0>,<0.21.0>}
            -{trace,#Port<0.487>,<0.4.0>}
            -{trace,#Port<0.488>,<0.4.0>}
            -{trace,#Port<0.489>,<0.4.0>}
            -{trace,#Port<0.490>,<0.4.0>}
            -{ok,<0.40.0>}
            -{trace,<0.41.0>,<0.27.0>}
            -5>

            erl_msg_tracer.erl:

            -module(erl_msg_tracer).
            +{trace,<0.39.0>,<0.27.0>}
            +4> {ok, D} = file:open("/tmp/tmp.data",[write]).
            +{trace,#Port<0.486>,<0.40.0>}
            +{trace,<0.40.0>,<0.21.0>}
            +{trace,#Port<0.487>,<0.4.0>}
            +{trace,#Port<0.488>,<0.4.0>}
            +{trace,#Port<0.489>,<0.4.0>}
            +{trace,#Port<0.490>,<0.4.0>}
            +{ok,<0.40.0>}
            +{trace,<0.41.0>,<0.27.0>}
            +5>

            erl_msg_tracer.erl:

            -module(erl_msg_tracer).
             
            --export([enabled/3, trace/5, load/0]).
            +-export([enabled/3, trace/5, load/0]).
             
            -load() ->
            -    erlang:load_nif("erl_msg_tracer", []).
            +load() ->
            +    erlang:load_nif("erl_msg_tracer", []).
             
            -enabled(_, _, _) ->
            +enabled(_, _, _) ->
                 error.
             
            -trace(_, _, _, _, _) ->
            +trace(_, _, _, _, _) ->
                 error.

            erl_msg_tracer.c:

            #include <erl_nif.h>
             
             /* NIF interface declarations */
            -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
            -static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
            -static void unload(ErlNifEnv* env, void* priv_data);
            +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
            +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
            +static void unload(ErlNifEnv* env, void* priv_data);
             
             /* The NIFs: */
            -static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
            -static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
            +static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
            +static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
             
            -static ErlNifFunc nif_funcs[] = {
            -    {"enabled", 3, enabled},
            -    {"trace", 5, trace}
            -};
            +static ErlNifFunc nif_funcs[] = {
            +    {"enabled", 3, enabled},
            +    {"trace", 5, trace}
            +};
             
            -ERL_NIF_INIT(erl_msg_tracer, nif_funcs, load, NULL, upgrade, unload)
            +ERL_NIF_INIT(erl_msg_tracer, nif_funcs, load, NULL, upgrade, unload)
             
            -static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
            -{
            +static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
            +{
                 *priv_data = NULL;
                 return 0;
            -}
            +}
             
            -static void unload(ErlNifEnv* env, void* priv_data)
            -{
            +static void unload(ErlNifEnv* env, void* priv_data)
            +{
             
            -}
            +}
             
            -static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data,
            -		   ERL_NIF_TERM load_info)
            -{
            -    if (*old_priv_data != NULL || *priv_data != NULL) {
            +static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data,
            +		   ERL_NIF_TERM load_info)
            +{
            +    if (*old_priv_data != NULL || *priv_data != NULL) {
             	return -1; /* Don't know how to do that */
            -    }
            -    if (load(env, priv_data, load_info)) {
            +    }
            +    if (load(env, priv_data, load_info)) {
             	return -1;
            -    }
            +    }
                 return 0;
            -}
            +}
             
             /*
              * argv[0]: TraceTag
              * argv[1]: TracerState
              * argv[2]: Tracee
              */
            -static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
            -{
            +static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
            +{
                 ErlNifPid to_pid;
            -    if (enif_get_local_pid(env, argv[1], &to_pid))
            -        if (!enif_is_process_alive(env, &to_pid))
            -            if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
            +    if (enif_get_local_pid(env, argv[1], &to_pid))
            +        if (!enif_is_process_alive(env, &to_pid))
            +            if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
                             /* tracer is dead so we should remove this tracepoint */
            -                return enif_make_atom(env, "remove");
            +                return enif_make_atom(env, "remove");
                         else
            -                return enif_make_atom(env, "discard");
            +                return enif_make_atom(env, "discard");
             
                 /* Only generate trace for when tracer != tracee */
            -    if (enif_is_identical(argv[1], argv[2]))
            -        return enif_make_atom(env, "discard");
            +    if (enif_is_identical(argv[1], argv[2]))
            +        return enif_make_atom(env, "discard");
             
                 /* Only trigger trace messages on 'send' */
            -    if (enif_is_identical(enif_make_atom(env, "send"), argv[0]))
            -        return enif_make_atom(env, "trace");
            +    if (enif_is_identical(enif_make_atom(env, "send"), argv[0]))
            +        return enif_make_atom(env, "trace");
             
                 /* Have to answer trace_status */
            -    if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
            -        return enif_make_atom(env, "trace");
            +    if (enif_is_identical(enif_make_atom(env, "trace_status"), argv[0]))
            +        return enif_make_atom(env, "trace");
             
            -    return enif_make_atom(env, "discard");
            -}
            +    return enif_make_atom(env, "discard");
            +}
             
             /*
              * argv[0]: TraceTag, should only be 'send'
            @@ -258,20 +258,20 @@ 

            * argv[3]: Message * argv[4]: Options, map containing Recipient */ -static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) -{ +static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +{ ErlNifPid to_pid; ERL_NIF_TERM recipient, msg; - if (enif_get_local_pid(env, argv[1], &to_pid)) { - if (enif_get_map_value(env, argv[4], enif_make_atom(env, "extra"), &recipient)) { - msg = enif_make_tuple3(env, enif_make_atom(env, "trace"), argv[2], recipient); - enif_send(env, &to_pid, NULL, msg); - } - } + if (enif_get_local_pid(env, argv[1], &to_pid)) { + if (enif_get_map_value(env, argv[4], enif_make_atom(env, "extra"), &recipient)) { + msg = enif_make_tuple3(env, enif_make_atom(env, "trace"), argv[2], recipient); + enif_send(env, &to_pid, NULL, msg); + } + } - return enif_make_atom(env, "ok"); -}

            + return enif_make_atom(env, "ok"); +}

    diff --git a/prs/9277/erts-15.2/doc/html/erlang.html b/prs/9277/erts-15.2/doc/html/erlang.html index 72b590d66abdf..a77cba0d719d6 100644 --- a/prs/9277/erts-15.2/doc/html/erlang.html +++ b/prs/9277/erts-15.2/doc/html/erlang.html @@ -7036,8 +7036,8 @@

    adler32(OldAdler, Data)

    Continues computing the adler32 checksum by combining the previous checksum, -OldAdler, with the checksum of Data.

    The following code:

    X = erlang:adler32(Data1),
    -Y = erlang:adler32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:adler32([Data1,Data2]).
    +OldAdler, with the checksum of Data.

    The following code:

    X = erlang:adler32(Data1),
    +Y = erlang:adler32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:adler32([Data1,Data2]).
    @@ -7070,10 +7070,10 @@

    adler32_combine(FirstAdler, SecondAdler, Se

    Combines two previously computed adler32 checksums.

    This computation requires the size of the data object for the second checksum -to be known.

    The following code:

    Y = erlang:adler32(Data1),
    -Z = erlang:adler32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:adler32(Data1),
    -Y = erlang:adler32(Data2),
    -Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).
    +to be known.

    The following code:

    Y = erlang:adler32(Data1),
    +Z = erlang:adler32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:adler32(Data1),
    +Y = erlang:adler32(Data2),
    +Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).

    @@ -7130,8 +7130,8 @@

    crc32(OldCrc, Data)

    Continues computing the crc32 checksum by combining the previous checksum, -OldCrc, with the checksum of Data.

    The following code:

    X = erlang:crc32(Data1),
    -Y = erlang:crc32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:crc32([Data1,Data2]).
    +OldCrc, with the checksum of Data.

    The following code:

    X = erlang:crc32(Data1),
    +Y = erlang:crc32(X,Data2).

    assigns the same value to Y as this:

    Y = erlang:crc32([Data1,Data2]).
    @@ -7164,10 +7164,10 @@

    crc32_combine(FirstCrc, SecondCrc, SecondSi

    Combines two previously computed crc32 checksums.

    This computation requires the size of the data object for the second checksum -to be known.

    The following code:

    Y = erlang:crc32(Data1),
    -Z = erlang:crc32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:crc32(Data1),
    -Y = erlang:crc32(Data2),
    -Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).
    +to be known.

    The following code:

    Y = erlang:crc32(Data1),
    +Z = erlang:crc32(Y,Data2).

    assigns the same value to Z as this:

    X = erlang:crc32(Data1),
    +Y = erlang:crc32(Data2),
    +Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).

    @@ -8391,11 +8391,11 @@

    nodes(Arg, InfoOpts)

    in the result returned by nodes/0.

  • hidden - The node is connected to the node of the calling process through a hidden connection. That is, the node name would not appear in the result returned by nodes/0.

  • this - This is the node of the calling process.

  • known - The node is not connected but known to the node of the calling -process.

  • Example:

    (a@localhost)1> nodes([this, connected], #{connection_id=>true, node_type=>true}).
    -[{c@localhost,#{connection_id => 13892108,node_type => hidden}},
    - {b@localhost,#{connection_id => 3067553,node_type => visible}},
    - {a@localhost,#{connection_id => undefined,node_type => this}}]
    -(a@localhost)2>
    +process.

    Example:

    (a@localhost)1> nodes([this, connected], #{connection_id=>true, node_type=>true}).
    +[{c@localhost,#{connection_id => 13892108,node_type => hidden}},
    + {b@localhost,#{connection_id => 3067553,node_type => visible}},
    + {a@localhost,#{connection_id => undefined,node_type => this}}]
    +(a@localhost)2>
    @@ -8505,9 +8505,9 @@

    abs(Number)

    Returns an integer or float that is the arithmetical absolute value of Float -or Int.

    For example:

    > abs(-3.33).
    +or Int.

    For example:

    > abs(-3.33).
     3.33
    -> abs(-3).
    +> abs(-3).
     3
    @@ -8539,8 +8539,8 @@

    append_element(Tuple1, Term)

    Returns a new tuple that has one element more than Tuple1, and contains the elements in Tuple1 followed by Term as the last element.

    Semantically equivalent to list_to_tuple(tuple_to_list(Tuple1) ++ [Term]), but much -faster.

    For example:

    > erlang:append_element({one, two}, three).
    -{one,two,three}
    +faster.

    For example:

    > erlang:append_element({one, two}, three).
    +{one,two,three}
    @@ -8607,7 +8607,7 @@

    atom_to_binary(Atom, Encoding)

    representation. If Encoding is utf8 or unicode, the characters are encoded using UTF-8 where characters may require multiple bytes.

    Change

    As from Erlang/OTP 20, atoms can contain any Unicode character and atom_to_binary(Atom, latin1) may fail if the text -representation for Atom contains a Unicode character > 255.

    Example:

    > atom_to_binary('Erlang', latin1).
    +representation for Atom contains a Unicode character > 255.

    Example:

    > atom_to_binary('Erlang', latin1).
     <<"Erlang">>
    @@ -8639,9 +8639,9 @@

    atom_to_list(Atom)

    Returns a list of unicode code points corresponding to the text representation -of Atom.

    For example:

    > atom_to_list('Erlang').
    -"Erlang"
    > atom_to_list('你好').
    -[20320,22909]

    See unicode for how to convert the resulting list to different formats.

    +of Atom.

    For example:

    > atom_to_list('Erlang').
    +"Erlang"
    > atom_to_list('你好').
    +[20320,22909]

    See unicode for how to convert the resulting list to different formats.

    @@ -8679,9 +8679,9 @@

    binary_part(Subject, PosLen)

    Extracts the part of the binary described by PosLen.

    Negative length can be used to extract bytes at the end of a binary.

    For example:

    1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
    -2> binary_part(Bin,{byte_size(Bin), -5}).
    +2> binary_part(Bin,{byte_size(Bin), -5}).
     <<6,7,8,9,10>>

    Failure: badarg if PosLen in any way references outside the binary.

    Start is zero-based, that is:

    1> Bin = <<1,2,3>>
    -2> binary_part(Bin,{0,2}).
    +2> binary_part(Bin,{0,2}).
     <<1,2>>

    For details about the PosLen semantics, see binary.

    @@ -8789,8 +8789,8 @@

    binary_to_atom(Binary, Encoding)

    garbage collected. Therefore, it is recommended to consider whether binary_to_existing_atom/2 is a better option than binary_to_atom/2. The default limits can be found -in Efficiency Guide (section System Limits).

    Examples:

    > binary_to_atom(<<"Erlang">>, latin1).
    -'Erlang'
    > binary_to_atom(<<1024/utf8>>, utf8).
    +in Efficiency Guide (section System Limits).

    Examples:

    > binary_to_atom(<<"Erlang">>, latin1).
    +'Erlang'
    > binary_to_atom(<<1024/utf8>>, utf8).
     'Ѐ'
    @@ -8903,7 +8903,7 @@

    binary_to_float(Binary)

    -

    Returns the float whose text representation is Binary.

    For example:

    > binary_to_float(<<"2.2017764e+0">>).
    +

    Returns the float whose text representation is Binary.

    For example:

    > binary_to_float(<<"2.2017764e+0">>).
     2.2017764

    The float string format is the same as the format for Erlang float literals except for that underscores are not permitted.

    Failure: badarg if Binary contains a bad representation of a float.

    @@ -8938,7 +8938,7 @@

    binary_to_integer(Binary)

    -

    Returns an integer whose text representation is Binary.

    For example:

    > binary_to_integer(<<"123">>).
    +

    Returns an integer whose text representation is Binary.

    For example:

    > binary_to_integer(<<"123">>).
     123

    binary_to_integer/1 accepts the same string formats as list_to_integer/1.

    Failure: badarg if Binary contains a bad representation of an integer.

    @@ -8972,7 +8972,7 @@

    binary_to_integer(Binary, Base)

    -

    Returns an integer whose text representation in base Base is Binary.

    For example:

    > binary_to_integer(<<"3FF">>, 16).
    +

    Returns an integer whose text representation in base Base is Binary.

    For example:

    > binary_to_integer(<<"3FF">>, 16).
     1023

    binary_to_integer/2 accepts the same string formats as list_to_integer/2.

    Failure: badarg if Binary contains a bad representation of an integer.

    @@ -9071,9 +9071,9 @@

    binary_to_term(Binary)

    Returns an Erlang term that is the result of decoding binary object Binary, which must be encoded according to the -Erlang external term format.

    > Bin = term_to_binary(hello).
    +Erlang external term format.

    > Bin = term_to_binary(hello).
     <<131,100,0,5,104,101,108,108,111>>
    -> hello = binary_to_term(Bin).
    +> hello = binary_to_term(Bin).
     hello

    Warning

    When decoding binaries from untrusted sources, the untrusted source may submit data in a way to create resources, such as atoms and remote references, that cannot be garbage collected and lead to Denial of Service attack. In such @@ -9122,11 +9122,11 @@

    binary_to_term(Binary, Opts)

    (as they are embedded in certain structures, such as process identifiers, refs, and funs), and creation of new external function references. None of those resources are garbage collected, so unchecked creation of them can -exhaust available memory.

    > binary_to_term(<<131,100,0,5,"hello">>, [safe]).
    +exhaust available memory.

    > binary_to_term(<<131,100,0,5,"hello">>, [safe]).
     ** exception error: bad argument
     > hello.
     hello
    -> binary_to_term(<<131,100,0,5,"hello">>, [safe]).
    +> binary_to_term(<<131,100,0,5,"hello">>, [safe]).
     hello

    Warning

    The safe option ensures the data is safely processed by the Erlang runtime but it does not guarantee the data is safe to your application. You must always validate data from untrusted sources. If the binary is stored or @@ -9134,10 +9134,10 @@

    binary_to_term(Binary, Opts)

    cryptographically signing it.

  • used - Changes the return value to {Term, Used} where Used is the number of bytes actually read from Binary.

    > Input = <<131,100,0,5,"hello","world">>.
     <<131,100,0,5,104,101,108,108,111,119,111,114,108,100>>
    -> {Term, Used} = binary_to_term(Input, [used]).
    -{hello, 9}
    -> split_binary(Input, Used).
    -{<<131,100,0,5,104,101,108,108,111>>, <<"world">>}
  • Failure: badarg if safe is specified and unsafe data is decoded.

    See also term_to_binary/1, binary_to_term/1, and list_to_existing_atom/1.

    +>
    {Term, Used} = binary_to_term(Input, [used]). +{hello, 9} +> split_binary(Input, Used). +{<<131,100,0,5,104,101,108,108,111>>, <<"world">>}

    Failure: badarg if safe is specified and unsafe data is decoded.

    See also term_to_binary/1, binary_to_term/1, and list_to_existing_atom/1.

    @@ -9169,9 +9169,9 @@

    bit_size(Bitstring)

    -

    Returns an integer that is the size in bits of Bitstring.

    For example:

    > bit_size(<<433:16,3:3>>).
    +

    Returns an integer that is the size in bits of Bitstring.

    For example:

    > bit_size(<<433:16,3:3>>).
     19
    -> bit_size(<<1,2,3>>).
    +> bit_size(<<1,2,3>>).
     24
    @@ -9203,9 +9203,9 @@

    bitstring_to_list(Bitstring)

    Returns a list of integers corresponding to the bytes of Bitstring.

    If the number of bits in the binary is not divisible by 8, the last element of -the list is a bitstring containing the remaining 1-7 bits.

    For example:

    > bitstring_to_list(<<433:16>>).
    -[1,177]
    > bitstring_to_list(<<433:16,3:3>>).
    -[1,177,<<3:3>>]
    +the list is a bitstring containing the remaining 1-7 bits.

    For example:

    > bitstring_to_list(<<433:16>>).
    +[1,177]
    > bitstring_to_list(<<433:16,3:3>>).
    +[1,177,<<3:3>>]
    @@ -9239,9 +9239,9 @@

    byte_size(Bitstring)

    Returns an integer that is the number of bytes needed to contain Bitstring. That is, if the number of bits in Bitstring is not divisible by 8, the -resulting number of bytes is rounded up.

    For example:

    > byte_size(<<433:16,3:3>>).
    +resulting number of bytes is rounded up.

    For example:

    > byte_size(<<433:16,3:3>>).
     3
    -> byte_size(<<1,2,3>>).
    +> byte_size(<<1,2,3>>).
     3
    @@ -9276,7 +9276,7 @@

    ceil(Number)

    -

    Returns the smallest integer not less than Number.

    For example:

    > ceil(5.5).
    +

    Returns the smallest integer not less than Number.

    For example:

    > ceil(5.5).
     6
    @@ -9386,10 +9386,10 @@

    decode_packet(Type, Bin, Options)

    than the indicated length are truncated.

    Option line_length also applies to http* packet types as an alias for option packet_size if packet_size itself is not set. This use is only intended for backward compatibility.

  • {line_delimiter, 0 =< byte() =< 255} - For packet type line, sets the -delimiting byte. Default is the latin-1 character $\n.

  • Examples:

    > erlang:decode_packet(1,<<3,"abcd">>,[]).
    -{ok,<<"abc">>,<<"d">>}
    -> erlang:decode_packet(1,<<5,"abcd">>,[]).
    -{more,6}
    +delimiting byte. Default is the latin-1 character $\n.

    Examples:

    > erlang:decode_packet(1,<<3,"abcd">>,[]).
    +{ok,<<"abc">>,<<"d">>}
    +> erlang:decode_packet(1,<<5,"abcd">>,[]).
    +{more,6}
    @@ -9420,8 +9420,8 @@

    delete_element(Index, Tuple1)

    -

    Returns a new tuple with element at Index removed from tuple Tuple1.

    For example:

    > erlang:delete_element(2, {one, two, three}).
    -{one,three}
    +

    Returns a new tuple with element at Index removed from tuple Tuple1.

    For example:

    > erlang:delete_element(2, {one, two, three}).
    +{one,three}
    @@ -9483,7 +9483,7 @@

    element(N, Tuple)

    -

    Returns the Nth element (numbering from 1) of Tuple.

    For example:

    > element(2, {a, b, c}).
    +

    Returns the Nth element (numbering from 1) of Tuple.

    For example:

    > element(2, {a, b, c}).
     b
    @@ -9515,10 +9515,10 @@

    external_size(Term)

    Calculates, without doing the encoding, the maximum byte size for a term encoded -in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term)),
    -> Size2 = erlang:external_size(Term),
    +in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term)),
    +> Size2 = erlang:external_size(Term),
     > true = Size1 =< Size2.
    -true

    This is equivalent to a call to:

    erlang:external_size(Term, [])
    +
    true

    This is equivalent to a call to:

    erlang:external_size(Term, [])
    @@ -9557,8 +9557,8 @@

    external_size(Term, Options)

    Calculates, without doing the encoding, the maximum byte size for a term encoded -in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term, Options)),
    -> Size2 = erlang:external_size(Term, Options),
    +in the Erlang external term format.

    The following condition applies always:

    > Size1 = byte_size(term_to_binary(Term, Options)),
    +> Size2 = erlang:external_size(Term, Options),
     > true = Size1 =< Size2.
     true

    Option {minor_version, Version} specifies how floats are encoded. For a detailed description, see term_to_binary/2.

    @@ -9593,7 +9593,7 @@

    float(Number)

    -

    Returns a float by converting Number to a float.

    For example:

    > float(55).
    +

    Returns a float by converting Number to a float.

    For example:

    > float(55).
     55.0

    Note

    If used on the top level in a guard, it tests whether the argument is a floating point number; for clarity, use is_float/1 instead.

    When float/1 is used in an expression in a guard, such as 'float(A) == 4.0', it converts a number as described earlier.

    @@ -9668,17 +9668,17 @@

    float_to_binary(Float, Options)

    Returns a binary corresponding to the text representation of Float using fixed -decimal point formatting.

    Options behaves in the same way as float_to_list/2.

    For example:

    > float_to_binary(7.12, [{decimals, 4}]).
    +decimal point formatting.

    Options behaves in the same way as float_to_list/2.

    For example:

    > float_to_binary(7.12, [{decimals, 4}]).
     <<"7.1200">>
    -> float_to_binary(7.12, [{decimals, 4}, compact]).
    +> float_to_binary(7.12, [{decimals, 4}, compact]).
     <<"7.12">>
    -> float_to_binary(7.12, [{scientific, 3}]).
    +> float_to_binary(7.12, [{scientific, 3}]).
     <<"7.120e+00">>
    -> float_to_binary(7.12, [short]).
    +> float_to_binary(7.12, [short]).
     <<"7.12">>
    -> float_to_binary(0.1+0.2, [short]).
    +> float_to_binary(0.1+0.2, [short]).
     <<"0.30000000000000004">>
    -> float_to_binary(0.1+0.2)
    +> float_to_binary(0.1+0.2)
     <<"3.00000000000000044409e-01">>
    @@ -9759,17 +9759,17 @@

    float_to_list(Float, Options)

    range (-2⁵³, 2⁵³), the notation that yields the smallest number of characters is used (scientific notation or normal decimal notation). Floats outside the range (-2⁵³, 2⁵³) are always formatted using scientific notation to avoid -confusing results when doing arithmetic operations.
  • If Options is [], the function behaves as float_to_list/1.
  • Examples:

    > float_to_list(7.12, [{decimals, 4}]).
    +confusing results when doing arithmetic operations.
  • If Options is [], the function behaves as float_to_list/1.
  • Examples:

    > float_to_list(7.12, [{decimals, 4}]).
     "7.1200"
    -> float_to_list(7.12, [{decimals, 4}, compact]).
    +> float_to_list(7.12, [{decimals, 4}, compact]).
     "7.12"
    -> float_to_list(7.12, [{scientific, 3}]).
    +> float_to_list(7.12, [{scientific, 3}]).
     "7.120e+00"
    -> float_to_list(7.12, [short]).
    +> float_to_list(7.12, [short]).
     "7.12"
    -> float_to_list(0.1+0.2, [short]).
    +> float_to_list(0.1+0.2, [short]).
     "0.30000000000000004"
    -> float_to_list(0.1+0.2)
    +> float_to_list(0.1+0.2)
     "3.00000000000000044409e-01"

    In the last example, float_to_list(0.1+0.2) evaluates to "3.00000000000000044409e-01". The reason for this is explained in Representation of Floating Point Numbers.

    @@ -9806,7 +9806,7 @@

    floor(Number)

    -

    Returns the largest integer not greater than Number.

    For example:

    > floor(-10.5).
    +

    Returns the largest integer not greater than Number.

    For example:

    > floor(-10.5).
     -11
    @@ -9940,17 +9940,17 @@

    fun_to_list(Fun)

    funs are equal as fun_to_list/1 does not take the fun's environment into account. See erlang:fun_info/1 for how to get the environment of a fun.

    Change

    The output of fun_to_list/1 can differ between Erlang -implementations and may change in future versions.

    Examples:

    -module(test).
    --export([add/1, add2/0, fun_tuple/0]).
    -add(A) -> fun(B) -> A + B end.
    -add2() -> fun add/1.
    -fun_tuple() -> {fun() -> 1 end, fun() -> 1 end}.
    > {fun test:add/1, test:add2()}.
    -{fun test:add/1,#Fun<test.1.107738983>}

    Explanation: fun test:add/1 is upgradable but test:add2() is not upgradable.

    > {test:add(1), test:add(42)}.
    -{#Fun<test.0.107738983>,#Fun<test.0.107738983>}

    Explanation: test:add(1) and test:add(42) has the same string representation -as the environment is not taken into account.

    >test:fun_tuple().
    -{#Fun<test.2.107738983>,#Fun<test.3.107738983>}

    Explanation: The string representations differ because the funs come from -different fun expressions.

    > {fun() -> 1 end, fun() -> 1 end}. >
    -{#Fun<erl_eval.45.97283095>,#Fun<erl_eval.45.97283095>}

    Explanation: All funs created from fun expressions of this form in uncompiled +implementations and may change in future versions.

    Examples:

    -module(test).
    +-export([add/1, add2/0, fun_tuple/0]).
    +add(A) -> fun(B) -> A + B end.
    +add2() -> fun add/1.
    +fun_tuple() -> {fun() -> 1 end, fun() -> 1 end}.
    > {fun test:add/1, test:add2()}.
    +{fun test:add/1,#Fun<test.1.107738983>}

    Explanation: fun test:add/1 is upgradable but test:add2() is not upgradable.

    > {test:add(1), test:add(42)}.
    +{#Fun<test.0.107738983>,#Fun<test.0.107738983>}

    Explanation: test:add(1) and test:add(42) has the same string representation +as the environment is not taken into account.

    >test:fun_tuple().
    +{#Fun<test.2.107738983>,#Fun<test.3.107738983>}

    Explanation: The string representations differ because the funs come from +different fun expressions.

    > {fun() -> 1 end, fun() -> 1 end}. >
    +{#Fun<erl_eval.45.97283095>,#Fun<erl_eval.45.97283095>}

    Explanation: All funs created from fun expressions of this form in uncompiled code with the same arity are mapped to the same list by fun_to_list/1.

    @@ -9984,8 +9984,8 @@

    hd(List)

    -

    Returns the head of List, that is, the first element.

    It works with improper lists.

    Examples:

    > hd([1,2,3,4,5]).
    -1
    > hd([first, second, third, so_on | improper_end]).
    +

    Returns the head of List, that is, the first element.

    It works with improper lists.

    Examples:

    > hd([1,2,3,4,5]).
    +1
    > hd([first, second, third, so_on | improper_end]).
     first

    Failure: badarg if List is an empty list [].

    @@ -10020,8 +10020,8 @@

    insert_element(Index, Tuple1, Term)

    Returns a new tuple with element Term inserted at position Index in tuple Tuple1. All elements from position Index and upwards are pushed one step -higher in the new tuple Tuple2.

    For example:

    > erlang:insert_element(2, {one, two, three}, new).
    -{one,new,two,three}
    +higher in the new tuple Tuple2.

    For example:

    > erlang:insert_element(2, {one, two, three}, new).
    +{one,new,two,three}
    @@ -10053,7 +10053,7 @@

    integer_to_binary(Integer)

    -

    Returns a binary corresponding to the text representation of Integer.

    For example:

    > integer_to_binary(77).
    +

    Returns a binary corresponding to the text representation of Integer.

    For example:

    > integer_to_binary(77).
     <<"77">>
    @@ -10087,7 +10087,7 @@

    integer_to_binary(Integer, Base)

    Returns a binary corresponding to the text representation of Integer in base -Base.

    For example:

    > integer_to_binary(1023, 16).
    +Base.

    For example:

    > integer_to_binary(1023, 16).
     <<"3FF">>
    @@ -10118,7 +10118,7 @@

    integer_to_list(Integer)

    -

    Returns a string corresponding to the text representation of Integer.

    For example:

    > integer_to_list(77).
    +

    Returns a string corresponding to the text representation of Integer.

    For example:

    > integer_to_list(77).
     "77"
    @@ -10150,7 +10150,7 @@

    integer_to_list(Integer, Base)

    Returns a string corresponding to the text representation of Integer in base -Base.

    For example:

    > integer_to_list(1023, 16).
    +Base.

    For example:

    > integer_to_list(1023, 16).
     "3FF"
    @@ -10182,7 +10182,7 @@

    iolist_size(Item)

    Returns an integer, that is the size in bytes, of the binary that would be the -result of iolist_to_binary(Item).

    For example:

    > iolist_size([1,2|<<3,4>>]).
    +result of iolist_to_binary(Item).

    For example:

    > iolist_size([1,2|<<3,4>>]).
     4
    @@ -10220,7 +10220,7 @@

    iolist_to_binary(IoListOrBinary)

    <<4,5>> > Bin3 = <<6>>. <<6>> -> iolist_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). +> iolist_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). <<1,2,3,1,2,3,4,5,4,6>>
    @@ -10264,16 +10264,16 @@

    iolist_to_iovec(IoListOrBinary)

    >
    Bin3 = <<6>>. <<6>> %% If you pass small binaries and integers it works as iolist_to_binary -> erlang:iolist_to_iovec([Bin1,1,[2,3,Bin2],4|Bin3]). -[<<1,2,3,1,2,3,4,5,4,6>>] +> erlang:iolist_to_iovec([Bin1,1,[2,3,Bin2],4|Bin3]). +[<<1,2,3,1,2,3,4,5,4,6>>] %% If you pass larger binaries, they are split and returned in a form %% optimized for calling the C function writev. -> erlang:iolist_to_iovec([<<1>>,<<2:8096>>,<<3:8096>>]). -[<<1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +> erlang:iolist_to_iovec([<<1>>,<<2:8096>>,<<3:8096>>]). +[<<1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,...>>, <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ...>>, - <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...>>]
    +
    <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...>>]
    @@ -10633,11 +10633,11 @@

    is_map_key(Key, Map)

    Returns true if map Map contains Key and returns false if it does not -contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    -#{"42" => value}
    -> is_map_key("42",Map).
    +contain the Key.

    The call fails with a {badmap,Map} exception if Map is not a map.

    Example:

    > Map = #{"42" => value}.
    +#{"42" => value}
    +> is_map_key("42",Map).
     true
    -> is_map_key(value,Map).
    +> is_map_key(value,Map).
     false
    @@ -10904,7 +10904,7 @@

    length(List)

    -

    Returns the length of List.

    For example:

    > length([1,2,3,4,5,6,7,8,9]).
    +

    Returns the length of List.

    For example:

    > length([1,2,3,4,5,6,7,8,9]).
     9
    @@ -10944,7 +10944,7 @@

    list_to_atom(String)

    garbage collected. Therefore, it is recommended to consider if list_to_existing_atom/1 is a better option than list_to_atom/1. The default limits can be found in the -Efficiency Guide (section System Limits).

    Example:

    > list_to_atom("Erlang").
    +Efficiency Guide (section System Limits).

    Example:

    > list_to_atom("Erlang").
     'Erlang'
    @@ -10981,7 +10981,7 @@

    list_to_binary(IoList)

    <<4,5>> > Bin3 = <<6>>. <<6>> -> list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). +> list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]). <<1,2,3,1,2,3,4,5,4,6>>
    @@ -11020,7 +11020,7 @@

    list_to_bitstring(BitstringList)

    <<4,5>> > Bin3 = <<6,7:4>>. <<6,7:4>> -> list_to_bitstring([Bin1,1,[2,3,Bin2],4|Bin3]). +> list_to_bitstring([Bin1,1,[2,3,Bin2],4|Bin3]). <<1,2,3,1,2,3,4,5,4,6,7:4>>
    @@ -11089,7 +11089,7 @@

    list_to_float(String)

    -

    Returns the float whose text representation is String.

    For example:

    > list_to_float("2.2017764e+0").
    +

    Returns the float whose text representation is String.

    For example:

    > list_to_float("2.2017764e+0").
     2.2017764

    The float string format is the same as the format for Erlang float literals except for that underscores are not permitted.

    Failure: badarg if String contains a bad representation of a float.

    @@ -11122,9 +11122,9 @@

    list_to_integer(String)

    -

    Returns an integer whose text representation is String.

    For example:

    > list_to_integer("123").
    -123
    > list_to_integer("-123").
    --123
    > list_to_integer("+123234982304982309482093833234234").
    +

    Returns an integer whose text representation is String.

    For example:

    > list_to_integer("123").
    +123
    > list_to_integer("-123").
    +-123
    > list_to_integer("+123234982304982309482093833234234").
     123234982304982309482093833234234

    String must contain at least one digit character and can have an optional prefix consisting of a single "+" or "-" character (that is, String must match the regular expression "^[+-]?[0-9]+$").

    Failure: badarg if String contains a bad representation of an integer.

    @@ -11157,11 +11157,11 @@

    list_to_integer(String, Base)

    -

    Returns an integer whose text representation in base Base is String.

    For example:

    > list_to_integer("3FF", 16).
    -1023
    > list_to_integer("+3FF", 16).
    -1023
    > list_to_integer("3ff", 16).
    -1023
    > list_to_integer("3fF", 16).
    -1023
    > list_to_integer("-3FF", 16).
    +

    Returns an integer whose text representation in base Base is String.

    For example:

    > list_to_integer("3FF", 16).
    +1023
    > list_to_integer("+3FF", 16).
    +1023
    > list_to_integer("3ff", 16).
    +1023
    > list_to_integer("3fF", 16).
    +1023
    > list_to_integer("-3FF", 16).
     -1023

    For example, when Base is 16, String must match the regular expression "^[+-]?([0-9]|[A-F]|[a-f])+$".

    Failure: badarg if String contains a bad representation of an integer.

    @@ -11193,7 +11193,7 @@

    list_to_pid(String)

    -

    Returns a process identifier whose text representation is a String.

    For example:

    > list_to_pid("<0.4.1>").
    +

    Returns a process identifier whose text representation is a String.

    For example:

    > list_to_pid("<0.4.1>").
     <0.4.1>

    Failure: badarg if String contains a bad representation of a process identifier.

    Warning

    This BIF is intended for debugging and is not to be used in application programs.

    @@ -11228,7 +11228,7 @@

    list_to_port(String)

    -

    Returns a port identifier whose text representation is a String.

    For example:

    > list_to_port("#Port<0.4>").
    +

    Returns a port identifier whose text representation is a String.

    For example:

    > list_to_port("#Port<0.4>").
     #Port<0.4>

    Failure: badarg if String contains a bad representation of a port identifier.

    Warning

    This BIF is intended for debugging and is not to be used in application programs.

    @@ -11263,7 +11263,7 @@

    list_to_ref(String)

    -

    Returns a reference whose text representation is a String.

    For example:

    > list_to_ref("#Ref<0.4192537678.4073193475.71181>").
    +

    Returns a reference whose text representation is a String.

    For example:

    > list_to_ref("#Ref<0.4192537678.4073193475.71181>").
     #Ref<0.4192537678.4073193475.71181>

    Failure: badarg if String contains a bad representation of a reference.

    Warning

    This BIF is intended for debugging and is not to be used in application programs.

    @@ -11295,8 +11295,8 @@

    list_to_tuple(List)

    -

    Returns a tuple corresponding to List, for example

    > list_to_tuple([share, ['Ericsson_B', 163]]).
    -{share, ['Ericsson_B', 163]}

    List can contain any Erlang terms.

    +

    Returns a tuple corresponding to List, for example

    > list_to_tuple([share, ['Ericsson_B', 163]]).
    +{share, ['Ericsson_B', 163]}

    List can contain any Erlang terms.

    @@ -11358,8 +11358,8 @@

    make_tuple(Arity, InitialValue)

    Creates a new tuple of the specified Arity, where all elements are -InitialValue.

    For example:

    > erlang:make_tuple(4, []).
    -{[],[],[],[]}
    +InitialValue.

    For example:

    > erlang:make_tuple(4, []).
    +{[],[],[],[]}
    @@ -11395,8 +11395,8 @@

    make_tuple(Arity, DefaultValue, InitList)InitList.

    Each list element in InitList must be a two-tuple, where the first element is a position in the newly created tuple and the second element is any term. If a position occurs more than once in the list, the term corresponding to the last -occurrence is used.

    For example:

    > erlang:make_tuple(5, [], [{2,ignored},{5,zz},{2,aa}]).
    -{[],aa,[],[],zz}
    +occurrence is used.

    For example:

    > erlang:make_tuple(5, [], [{2,ignored},{5,zz},{2,aa}]).
    +{[],aa,[],[],zz}

    @@ -11432,8 +11432,8 @@

    map_get(Key, Map)

    Returns value Value associated with Key if Map contains Key.

    The call fails with a {badmap,Map} exception if Map is not a map, or with a {badkey,Key} exception if no value is associated with Key.

    Example:

    > Key = 1337,
    -  Map = #{42 => value_two,1337 => "value one","a" => 1},
    -  map_get(Key,Map).
    +  Map = #{42 => value_two,1337 => "value one","a" => 1},
    +  map_get(Key,Map).
     "value one"
    @@ -11468,7 +11468,7 @@

    map_size(Map)

    -

    Returns an integer, which is the number of key-value pairs in Map.

    For example:

    > map_size(#{a=>1, b=>2, c=>3}).
    +

    Returns an integer, which is the number of key-value pairs in Map.

    For example:

    > map_size(#{a=>1, b=>2, c=>3}).
     3
    @@ -11551,10 +11551,10 @@

    max(Term1, Term2)

    Returns the largest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

    The Expressions section contains -descriptions of the == operator and how terms are ordered.

    Examples:

    > max(1, 2).
    -2
    > max(1.0, 1).
    -1.0
    > max(1, 1.0).
    -1
    > max("abc", "b").
    +descriptions of the == operator and how terms are ordered.

    Examples:

    > max(1, 2).
    +2
    > max(1.0, 1).
    +1.0
    > max(1, 1.0).
    +1
    > max("abc", "b").
     "b"

    Change

    Allowed in guards tests from Erlang/OTP 26.

    @@ -11589,10 +11589,10 @@

    min(Term1, Term2)

    Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.

    The Expressions section contains -descriptions of the == operator and how terms are ordered.

    Examples:

    > min(1, 2).
    -1
    > min(1.0, 1).
    -1.0
    > min(1, 1.0).
    -1
    > min("abc", "b").
    +descriptions of the == operator and how terms are ordered.

    Examples:

    > min(1, 2).
    +1
    > min(1.0, 1).
    +1.0
    > min(1, 1.0).
    +1
    > min("abc", "b").
     "abc"

    Change

    Allowed in guards tests from Erlang/OTP 26.

    @@ -11718,7 +11718,7 @@

    pid_to_list(Pid)

    -

    Returns a string corresponding to the text representation of Pid.

    For example:

    > erlang:pid_to_list(self()).
    +

    Returns a string corresponding to the text representation of Pid.

    For example:

    > erlang:pid_to_list(self()).
     "<0.85.0>"

    Note

    The creation for the node is not included in the list representation of Pid. This means that processes in different incarnations of a node with a specific name can get the same list representation.

    @@ -11815,10 +11815,10 @@

    round(Number)

    -

    Returns an integer by rounding Number.

    For example:

    round(42.1).
    -42
    round(5.5).
    -6
    round(-5.5).
    --6
    round(36028797018963969.0).
    +

    Returns an integer by rounding Number.

    For example:

    round(42.1).
    +42
    round(5.5).
    +6
    round(-5.5).
    +-6
    round(36028797018963969.0).
     36028797018963968

    In the last example, round(36028797018963969.0) evaluates to 36028797018963968. The reason for this is that the number 36028797018963969.0 cannot be represented exactly as a float value. Instead, @@ -11858,8 +11858,8 @@

    setelement(Index, Tuple1, Value)

    Returns a tuple that is a copy of argument Tuple1 with the element specified by integer argument Index (the first element is the element with index 1) -replaced by argument Value.

    For example:

    > setelement(2, {10, green, bottles}, red).
    -{10,red,bottles}
    +replaced by argument Value.

    For example:

    > setelement(2, {10, green, bottles}, red).
    +{10,red,bottles}
    @@ -11892,9 +11892,9 @@

    size(Item)

    Returns the number of elements in a tuple or the number of bytes in a binary or -bitstring.

    For example:

    > size({morni, mulle, bwange}).
    +bitstring.

    For example:

    > size({morni, mulle, bwange}).
     3
    -> size(<<11, 22, 33>>).
    +> size(<<11, 22, 33>>).
     3

    For bitstrings, the number of whole bytes is returned. That is, if the number of bits in the bitstring is not divisible by 8, the resulting number of bytes is rounded down.

    See also tuple_size/1, byte_size/1, and bit_size/1.

    @@ -11928,15 +11928,15 @@

    split_binary(Bin, Pos)

    Returns a tuple containing the binaries that are the result of splitting Bin -into two parts at position Pos.

    This is not a destructive operation. After the operation, there are three binaries altogether.

    For example:

    > B = list_to_binary("0123456789").
    +into two parts at position Pos.

    This is not a destructive operation. After the operation, there are three binaries altogether.

    For example:

    > B = list_to_binary("0123456789").
     <<"0123456789">>
    -> byte_size(B).
    +> byte_size(B).
     10
    -> {B1, B2} = split_binary(B,3).
    -{<<"012">>,<<"3456789">>}
    -> byte_size(B1).
    +> {B1, B2} = split_binary(B,3).
    +{<<"012">>,<<"3456789">>}
    +> byte_size(B1).
     3
    -> byte_size(B2).
    +> byte_size(B2).
     7
    @@ -11970,9 +11970,9 @@

    term_to_binary(Term)

    Returns a binary data object that is the result of encoding Term according to the Erlang external term format.

    This can be used for various purposes, for example, writing a term to a file in an efficient way, or sending an Erlang term to some type of communications -channel not supported by distributed Erlang.

    > Bin = term_to_binary(hello).
    +channel not supported by distributed Erlang.

    > Bin = term_to_binary(hello).
     <<131,100,0,5,104,101,108,108,111>>
    -> hello = binary_to_term(Bin).
    +> hello = binary_to_term(Bin).
     hello

    See also binary_to_term/1.

    Note

    There is no guarantee that this function will return the same encoded representation for the same term.

    @@ -12205,10 +12205,10 @@

    tl(List)

    -

    Returns the tail of List, that is, the list minus the first element

    It works with improper lists.

    Examples:

    > tl([geesties, guilies, beasties]).
    -[guilies, beasties]
    > tl([geesties]).
    -[]
    > tl([geesties, guilies, beasties | improper_end]).
    -[guilies, beasties | improper_end]
    > tl([geesties | improper_end]).
    +

    Returns the tail of List, that is, the list minus the first element

    It works with improper lists.

    Examples:

    > tl([geesties, guilies, beasties]).
    +[guilies, beasties]
    > tl([geesties]).
    +[]
    > tl([geesties, guilies, beasties | improper_end]).
    +[guilies, beasties | improper_end]
    > tl([geesties | improper_end]).
     improper_end

    Failure: badarg if List is an empty list [].

    @@ -12241,10 +12241,10 @@

    trunc(Number)

    -

    Truncates the decimals of Number.

    For example:

    > trunc(5.7).
    -5
    > trunc(-5.7).
    --5
    > trunc(5).
    -5
    > trunc(36028797018963969.0).
    +

    Truncates the decimals of Number.

    For example:

    > trunc(5.7).
    +5
    > trunc(-5.7).
    +-5
    > trunc(5).
    +5
    > trunc(36028797018963969.0).
     36028797018963968

    In the last example, trunc(36028797018963969.0) evaluates to 36028797018963968. The reason for this is that the number 36028797018963969.0 cannot be represented exactly as a float value. Instead, @@ -12283,7 +12283,7 @@

    tuple_size(Tuple)

    -

    Returns an integer that is the number of elements in Tuple.

    For example:

    > tuple_size({morni, mulle, bwange}).
    +

    Returns an integer that is the number of elements in Tuple.

    For example:

    > tuple_size({morni, mulle, bwange}).
     3
    @@ -12315,8 +12315,8 @@

    tuple_to_list(Tuple)

    Returns a list corresponding to Tuple. Tuple can contain any Erlang terms. -Example:

    > tuple_to_list({share, {'Ericsson_B', 163}}).
    -[share,{'Ericsson_B',163}]
    +Example:

    > tuple_to_list({share, {'Ericsson_B', 163}}).
    +[share,{'Ericsson_B',163}]
    @@ -12487,27 +12487,27 @@

    alias(Opts)

    unalias/1. This is also the default behaviour if no options are passed or if alias/0 is called.

  • reply - The alias will be automatically deactivated when a reply message sent via the alias is received. The alias can also still be deactivated via a -call to unalias/1.

  • Example:

    server() ->
    +call to unalias/1.

    Example:

    server() ->
         receive
    -        {request, AliasReqId, Request} ->
    -            Result = perform_request(Request),
    -            AliasReqId ! {reply, AliasReqId, Result}
    +        {request, AliasReqId, Request} ->
    +            Result = perform_request(Request),
    +            AliasReqId ! {reply, AliasReqId, Result}
         end,
    -    server().
    +    server().
     
    -client(ServerPid, Request) ->
    -    AliasReqId = alias([reply]),
    -    ServerPid ! {request, AliasReqId, Request},
    +client(ServerPid, Request) ->
    +    AliasReqId = alias([reply]),
    +    ServerPid ! {request, AliasReqId, Request},
         %% Alias will be automatically deactivated if we receive a reply
         %% since we used the 'reply' option...
         receive
    -        {reply, AliasReqId, Result} -> Result
    +        {reply, AliasReqId, Result} -> Result
         after 5000 ->
    -            unalias(AliasReqId),
    +            unalias(AliasReqId),
                 %% Flush message queue in case the reply arrived
                 %% just before the alias was deactivated...
    -            receive {reply, AliasReqId, Result} -> Result
    -            after 0 -> exit(timeout)
    +            receive {reply, AliasReqId, Result} -> Result
    +            after 0 -> exit(timeout)
                 end
         end.

    Note that both the server and the client in this example must be executing on at least OTP 24 systems in order for this to work.

    For more information on process aliases see the @@ -12578,9 +12578,9 @@

    apply(Module, Function, Args)

    Returns the result of applying Function in Module to Args. The applied function must be exported from Module. The arity of the function is the length -of Args.

    For example:

    > apply(lists, reverse, [[a, b, c]]).
    -[c,b,a]
    -> apply(erlang, atom_to_list, ['Erlang']).
    +of Args.

    For example:

    > apply(lists, reverse, [[a, b, c]]).
    +[c,b,a]
    +> apply(erlang, atom_to_list, ['Erlang']).
     "Erlang"

    If the number of arguments are known at compile time, the call is better written as Module:Function(Arg1, Arg2, ..., ArgN).

    Failure: error_handler:undefined_function/3 is called if the applied function is not exported. The error handler can be redefined (see process_flag/2). If @@ -12701,9 +12701,9 @@

    demonitor(MonitorRef, OptionList)

    The returned value is true unless info is part of OptionList.

    demonitor(MonitorRef, []) is equivalent to demonitor(MonitorRef).

    Options:

    • flush - Removes (one) {_, MonitorRef, _, _, _} message, if there is one, from the caller message queue after monitoring has been stopped.

      Calling demonitor(MonitorRef, [flush]) is equivalent to the -following, but more efficient:

      demonitor(MonitorRef),
      +following, but more efficient:

      demonitor(MonitorRef),
       receive
      -    {_, MonitorRef, _, _, _} ->
      +    {_, MonitorRef, _, _, _} ->
               true
       after 0 ->
               true
      @@ -12742,10 +12742,10 @@ 

      erase()

      -

      Returns the process dictionary and deletes it.

      For example:

      > put(key1, {1, 2, 3}),
      -put(key2, [a, b, c]),
      -erase().
      -[{key1,{1,2,3}},{key2,[a,b,c]}]
      +

      Returns the process dictionary and deletes it.

      For example:

      > put(key1, {1, 2, 3}),
      +put(key2, [a, b, c]),
      +erase().
      +[{key1,{1,2,3}},{key2,[a,b,c]}]
    @@ -12778,10 +12778,10 @@

    erase(Key)

    Returns the value Val associated with Key and deletes it from the process dictionary. Returns undefined if no value is associated with Key.

    The average time complexity for the current implementation of this function is O(1) and the worst case time complexity is O(N), where N is the number of -items in the process dictionary.

    For example:

    > put(key1, {merry, lambs, are, playing}),
    -X = erase(key1),
    -{X, erase(key1)}.
    -{{merry,lambs,are,playing},undefined}
    +items in the process dictionary.

    For example:

    > put(key1, {merry, lambs, are, playing}),
    +X = erase(key1),
    +{X, erase(key1)}.
    +{{merry,lambs,are,playing},undefined}
    @@ -12815,14 +12815,14 @@

    error(Reason)

    has happened (for example, a function is called with a parameter that has an incorrect type). See the guide about errors and error handling for additional information. -Example:

    > catch error(foobar).
    -{'EXIT',{foobar,[{shell,apply_fun,3,
    -                        [{file,"shell.erl"},{line,906}]},
    -                 {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,677}]},
    -                 {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,430}]},
    -                 {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
    -                 {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
    -                 {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}}
    +Example:

    > catch error(foobar).
    +{'EXIT',{foobar,[{shell,apply_fun,3,
    +                        [{file,"shell.erl"},{line,906}]},
    +                 {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,677}]},
    +                 {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,430}]},
    +                 {shell,exprs,7,[{file,"shell.erl"},{line,687}]},
    +                 {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
    +                 {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}}
    @@ -12861,13 +12861,13 @@

    error(Reason, Args)

    has happened (for example, a function is called with a parameter that has an incorrect type). See the guide about errors and error handling for additional information. -Example:

    test.erl:

    -module(test).
    --export([example_fun/2]).
    +Example:

    test.erl:

    -module(test).
    +-export([example_fun/2]).
     
    -example_fun(A1, A2) ->
    -    erlang:error(my_error, [A1, A2]).

    Erlang shell:

    6> c(test).
    -{ok,test}
    -7> test:example_fun(arg1,"this is the second argument").
    +example_fun(A1, A2) ->
    +    erlang:error(my_error, [A1, A2]).

    Erlang shell:

    6> c(test).
    +{ok,test}
    +7> test:example_fun(arg1,"this is the second argument").
     ** exception error: my_error
          in function  test:example_fun/2
              called as test:example_fun(arg1,"this is the second argument")
    @@ -12956,10 +12956,10 @@

    exit(Reason)

    stopped (for example when a message telling a process to stop is received).

    This function differ from error/1,2,3 by causing an exception of a different class and by having a reason that does not include the list of functions from the call stack.

    See the guide about errors and error handling for -additional information.

    Example:

    > exit(foobar).
    +additional information.

    Example:

    > exit(foobar).
     ** exception exit: foobar
    -> catch exit(foobar).
    -{'EXIT',foobar}

    Note

    If a process calls exit(kill) and does not catch the exception, +> catch exit(foobar). +{'EXIT',foobar}

    Note

    If a process calls exit(kill) and does not catch the exception, it will terminate with exit reason kill and also emit exit signals with exit reason kill (not killed) to all linked processes. Such exit signals with exit reason kill can be trapped by the linked processes. Note that this @@ -13170,11 +13170,11 @@

    get()

    Returns the process dictionary as a list of {Key, Val} tuples. The items in -the returned list can be in any order.

    For example:

    > put(key1, merry),
    -put(key2, lambs),
    -put(key3, {are, playing}),
    -get().
    -[{key1,merry},{key2,lambs},{key3,{are,playing}}]
    +the returned list can be in any order.

    For example:

    > put(key1, merry),
    +put(key2, lambs),
    +put(key3, {are, playing}),
    +get().
    +[{key1,merry},{key2,lambs},{key3,{are,playing}}]
    @@ -13207,11 +13207,11 @@

    get(Key)

    Returns the value Val associated with Key in the process dictionary, or undefined if Key does not exist.

    The expected time complexity for the current implementation of this function is O(1) and the worst case time complexity is O(N), where N is the number of -items in the process dictionary.

    For example:

    > put(key1, merry),
    -put(key2, lambs),
    -put({any, [valid, term]}, {are, playing}),
    -get({any, [valid, term]}).
    -{are,playing}
    +items in the process dictionary.

    For example:

    > put(key1, merry),
    +put(key2, lambs),
    +put({any, [valid, term]}, {are, playing}),
    +get({any, [valid, term]}).
    +{are,playing}
    @@ -13244,11 +13244,11 @@

    get_keys()

    Returns a list of all keys present in the process dictionary. The items in the -returned list can be in any order.

    For example:

    > put(dog, {animal,1}),
    -put(cow, {animal,2}),
    -put(lamb, {animal,3}),
    -get_keys().
    -[dog,cow,lamb]
    +returned list can be in any order.

    For example:

    > put(dog, {animal,1}),
    +put(cow, {animal,2}),
    +put(lamb, {animal,3}),
    +get_keys().
    +[dog,cow,lamb]
    @@ -13279,14 +13279,14 @@

    get_keys(Val)

    Returns a list of keys that are associated with the value Val in the process -dictionary. The items in the returned list can be in any order.

    For example:

    > put(mary, {1, 2}),
    -put(had, {1, 2}),
    -put(a, {1, 2}),
    -put(little, {1, 2}),
    -put(dog, {1, 3}),
    -put(lamb, {1, 2}),
    -get_keys({1, 2}).
    -[mary,had,a,little,lamb]
    +dictionary. The items in the returned list can be in any order.

    For example:

    > put(mary, {1, 2}),
    +put(had, {1, 2}),
    +put(a, {1, 2}),
    +put(little, {1, 2}),
    +put(dog, {1, 3}),
    +put(lamb, {1, 2}),
    +get_keys({1, 2}).
    +[mary,had,a,little,lamb]
    @@ -13449,9 +13449,9 @@

    is_process_alive(Pid)

    aliveness of P2 is checked. This guarantee means that one can use is_process_alive/1 to let a process P1 wait until a process P2, which has got an exit signal with reason kill from P1, is -killed.

    For example:

    exit(P2Pid, kill),
    +killed.

    For example:

    exit(P2Pid, kill),
     % P2 might not be killed
    -is_process_alive(P2Pid),
    +is_process_alive(P2Pid),
     % P2 is not alive (the call above always return false)

    See the documentation about signals and erlang:exit/2 for more information about signals and exit signals.

    @@ -13544,7 +13544,7 @@

    monitor(Type, Item)

    Sends a monitor request of type Type to the entity identified by Item.

    If the monitored entity does not exist or it changes monitored state, the caller -of monitor/2 is notified by a message on the following format:

    {Tag, MonitorRef, Type, Object, Info}

    Note

    The monitor request is an asynchronous signal. That is, it takes time before +of monitor/2 is notified by a message on the following format:

    {Tag, MonitorRef, Type, Object, Info}

    Note

    The monitor request is an asynchronous signal. That is, it takes time before the signal reaches its destination.

    Type can be one of the following atoms: process, port or time_offset.

    A process or port monitor is triggered only once, after that it is removed from both monitoring process and the monitored entity. Monitors are fired when the monitored process or port terminates, does not exist at the moment of @@ -13553,7 +13553,7 @@

    monitor(Type, Item)

    demonitor/1 is called.

    A process or port monitor by name resolves the RegisteredName to pid/0 or port/0 only once at the moment of monitor instantiation, later changes to the name registration will not affect the existing monitor.

    When a process or port monitor is triggered, a 'DOWN' message is sent that -has the following pattern:

    {'DOWN', MonitorRef, Type, Object, Info}

    In the monitor message MonitorRef and Type are the same as described +has the following pattern:

    {'DOWN', MonitorRef, Type, Object, Info}

    In the monitor message MonitorRef and Type are the same as described earlier, and:

    • Object - The monitored entity, which triggered the event. When monitoring a process or a local port, Object will be equal to the pid/0 or port/0 that was being monitored. When monitoring process or port by @@ -13597,7 +13597,7 @@

      monitor(Type, Item)

      under normal operation this is to be detected within a minute, but during heavy load it can take longer time.

      The monitor is not automatically removed after it has been triggered. That is, repeated changes of the time offset trigger the monitor repeatedly.

      When the monitor is triggered a 'CHANGE' message is sent to the monitoring -process. A 'CHANGE' message has the following pattern:

      {'CHANGE', MonitorRef, Type, Item, NewTimeOffset}

      where MonitorRef, Type, and Item are the same as described above, and +process. A 'CHANGE' message has the following pattern:

      {'CHANGE', MonitorRef, Type, Item, NewTimeOffset}

      where MonitorRef, Type, and Item are the same as described above, and NewTimeOffset is the new time offset.

      When the 'CHANGE' message has been received you are guaranteed not to retrieve the old time offset when calling erlang:time_offset/0. Notice that you can observe the @@ -13663,25 +13663,25 @@

      monitor(Type, Item, Opts)

      monitor will be automatically removed regardless of whether the response is a reply or a 'DOWN' message. The alias can also still be deactivated via a call to unalias/1. Note that if the alias is removed using -the unalias/1 BIF, the monitor will still be left active.

    Example:

    server() ->
    +the unalias/1 BIF, the monitor will still be left active.

    Example:

    server() ->
         receive
    -        {request, AliasReqId, Request} ->
    -            Result = perform_request(Request),
    -            AliasReqId ! {reply, AliasReqId, Result}
    +        {request, AliasReqId, Request} ->
    +            Result = perform_request(Request),
    +            AliasReqId ! {reply, AliasReqId, Result}
         end,
    -    server().
    +    server().
     
    -client(ServerPid, Request) ->
    -    AliasMonReqId = monitor(process, ServerPid, [{alias, reply_demonitor}]),
    -    ServerPid ! {request, AliasMonReqId, Request},
    +client(ServerPid, Request) ->
    +    AliasMonReqId = monitor(process, ServerPid, [{alias, reply_demonitor}]),
    +    ServerPid ! {request, AliasMonReqId, Request},
         %% Alias as well as monitor will be automatically deactivated if we
         %% receive a reply or a 'DOWN' message since we used 'reply_demonitor'
         %% as unalias option...
         receive
    -        {reply, AliasMonReqId, Result} ->
    +        {reply, AliasMonReqId, Result} ->
                 Result;
    -        {'DOWN', AliasMonReqId, process, ServerPid, ExitReason} ->
    -            error(ExitReason)
    +        {'DOWN', AliasMonReqId, process, ServerPid, ExitReason} ->
    +            error(ExitReason)
         end.

    Note that both the server and the client in this example must be executing on at least OTP 24 systems in order for this to work.

    For more information on process aliases see the Process Aliases section @@ -13691,42 +13691,42 @@

    monitor(Type, Item, Opts)

    in the down message will be replaced by UserDefinedTag.

    An example of how the {tag, UserDefinedTag} option can be used in order to enable the new selective receive optimization, -introduced in OTP 24, when making multiple requests to different servers:

    server() ->
    +introduced in OTP 24, when making multiple requests to different servers:

    server() ->
         receive
    -        {request, From, ReqId, Request} ->
    -            Result = perform_request(Request),
    -            From ! {reply, self(), ReqId, Result}
    +        {request, From, ReqId, Request} ->
    +            Result = perform_request(Request),
    +            From ! {reply, self(), ReqId, Result}
         end,
    -    server().
    -
    -client(ServerPids, Request) when is_list(ServerPids) ->
    -    ReqId = make_ref(),
    -    lists:foreach(fun (ServerPid) ->
    -                          _ = monitor(process, ServerPid,
    -                                      [{tag, {'DOWN', ReqId}}]),
    -                          ServerPid ! {request, self(), ReqId, Request}
    +    server().
    +
    +client(ServerPids, Request) when is_list(ServerPids) ->
    +    ReqId = make_ref(),
    +    lists:foreach(fun (ServerPid) ->
    +                          _ = monitor(process, ServerPid,
    +                                      [{tag, {'DOWN', ReqId}}]),
    +                          ServerPid ! {request, self(), ReqId, Request}
                       end,
    -                  ServerPids),
    -    receive_replies(ReqId, length(ServerPids), []).
    +                  ServerPids),
    +    receive_replies(ReqId, length(ServerPids), []).
     
    -receive_replies(_ReqId, 0, Acc) ->
    +receive_replies(_ReqId, 0, Acc) ->
         Acc;
    -receive_replies(ReqId, N, Acc) ->
    +receive_replies(ReqId, N, Acc) ->
         %% The compiler will detect that we match on the 'ReqId'
         %% reference in all clauses, and will enable the selective
         %% receive optimization which makes the receive able to
         %% skip past all messages present in the message queue at
         %% the time when the 'ReqId' reference was created...
         Res = receive
    -              {reply, ServerPid, ReqId, Result} ->
    +              {reply, ServerPid, ReqId, Result} ->
                       %% Here we typically would have deactivated the
                       %% monitor by a call to demonitor(Mon, [flush]) but
                       %% we ignore this in this example for simplicity...
    -                  {ok, ServerPid, Result};
    -              {{'DOWN', ReqId}, _Mon, process, ServerPid, ExitReason} ->
    -                  {error, ServerPid, ExitReason}
    +                  {ok, ServerPid, Result};
    +              {{'DOWN', ReqId}, _Mon, process, ServerPid, ExitReason} ->
    +                  {error, ServerPid, ExitReason}
               end,
    -    receive_replies(ReqId, N-1, [Res | Acc]).

    In order for this example to work as intended, the client must be executing on + receive_replies(ReqId, N-1, [Res | Acc]).

    In order for this example to work as intended, the client must be executing on at least an OTP 24 system, but the servers may execute on older systems.

    @@ -14468,7 +14468,7 @@

    process_flag(Flag, Value)

    Sets the process flag indicated to the specified value. Returns the previous value -of the flag.

    Flag is one of the following:

    • process_flag(async_dist, boolean())

      Enable or disable fully asynchronous distributed signaling for the calling +of the flag.

      Flag is one of the following:

      • process_flag(async_dist, boolean())

        Enable or disable fully asynchronous distributed signaling for the calling process. When disabled, which is the default, the process sending a distributed signal will block in the send operation if the buffer for the distribution channel reach the distribution buffer busy limit. The @@ -14493,14 +14493,14 @@

        process_flag(Flag, Value)

        command line argument +pad <boolean> when starting the runtime system. If the +pad <boolean> command line argument is not passed, the default value of the async_dist flag will be false.

        You can inspect the state of the async_dist process flag of a process by -calling process_info(Pid, async_dist).

      • process_flag(trap_exit, boolean())

        When trap_exit is set to true, exit signals arriving to a process are +calling process_info(Pid, async_dist).

      • process_flag(trap_exit, boolean())

        When trap_exit is set to true, exit signals arriving to a process are converted to {'EXIT', From, Reason} messages, which can be received as ordinary messages. If trap_exit is set to false, the process exits if it receives an exit signal other than normal and the exit signal is propagated to -its linked processes. Application processes are normally not to trap exits.

        See also exit/2.

      • process_flag(error_handler, module())

        Used by a process to redefine the error_handler for undefined function calls and +its linked processes. Application processes are normally not to trap exits.

        See also exit/2.

      • process_flag(error_handler, module())

        Used by a process to redefine the error_handler for undefined function calls and undefined registered processes. Use this flag with substantial caution, as code -auto-loading depends on the correct operation of the error handling module.

      • process_flag(fullsweep_after,  non_neg_integer())

        Changes the maximum number of generational collections before forcing a -fullsweep for the calling process.

      • process_flag(min_heap_size, non_neg_integer())

        Changes the minimum heap size for the calling process.

      • process_flag(min_bin_vheap_size, non_neg_integer())

        Changes the minimum binary virtual heap size for the calling process.

      • process_flag(max_heap_size, max_heap_size())

        This flag sets the maximum heap size for the calling process. If MaxHeapSize +auto-loading depends on the correct operation of the error handling module.

      • process_flag(fullsweep_after,  non_neg_integer())

        Changes the maximum number of generational collections before forcing a +fullsweep for the calling process.

      • process_flag(min_heap_size, non_neg_integer())

        Changes the minimum heap size for the calling process.

      • process_flag(min_bin_vheap_size, non_neg_integer())

        Changes the minimum binary virtual heap size for the calling process.

      • process_flag(max_heap_size, max_heap_size())

        This flag sets the maximum heap size for the calling process. If MaxHeapSize is an integer, the system default values for kill and error_logger are used.

        For details on how the heap grows, see Sizing the heap in the ERTS internal documentation.

        • size - The maximum size in words of the process. If set to zero, the @@ -14536,7 +14536,7 @@

          process_flag(Flag, Value)

          memory that is used during the garbage collection. When contemplating using this option, it is recommended to first run it in production with kill set to false and inspect the log events to see what the normal peak sizes of the -processes in the system is and then tune the value accordingly.

        • process_flag(message_queue_data, message_queue_data())

          Determines how messages in the message queue are stored, as follows:

          • off_heap - All messages in the message queue will be stored outside +processes in the system is and then tune the value accordingly.

          • process_flag(message_queue_data, message_queue_data())

            Determines how messages in the message queue are stored, as follows:

            • off_heap - All messages in the message queue will be stored outside the process heap. This implies that no messages in the message queue will be part of a garbage collection of the process.

            • on_heap - All messages in the message queue will eventually be placed on the process heap. They can, however, be temporarily stored off the heap. This @@ -14548,7 +14548,7 @@

              process_flag(Flag, Value)

              consume large amounts of memory. The performance of the actual message passing is, however, generally better when the flag value is on_heap.

              Changing the flag value causes any existing messages to be moved. The move operation is initiated, but not necessarily completed, by the time the function -returns.

            • process_flag(priority, priority_level())

              Sets the process priority. Level is an atom. Four priority levels exist: +returns.

            • process_flag(priority, priority_level())

              Sets the process priority. Level is an atom. Four priority levels exist: low, normal, high, and max. Default is normal.

              Note

              Priority level max is reserved for internal use in the Erlang runtime system, and is not to be used by others.

              Internally in each priority level, processes are scheduled in a round robin fashion.

              Execution of processes on priority normal and low are interleaved. Processes @@ -14577,7 +14577,7 @@

              process_flag(Flag, Value)

              are used, use them with care, especially priority high. A process on priority high is only to perform work for short periods. Busy looping for long periods in a high priority process causes most likely problems, as important -OTP servers run on priority normal.

            • process_flag(save_calls, 0..10000)

              N must be an integer in the interval 0..10000. If N > 0, call saving is made +OTP servers run on priority normal.

            • process_flag(save_calls, 0..10000)

              N must be an integer in the interval 0..10000. If N > 0, call saving is made active for the process. This means that information about the N most recent global function calls, BIF calls, sends, and receives made by the process are saved in a list, which can be retrieved with @@ -14586,7 +14586,7 @@

              process_flag(Flag, Value)

              amount of information is saved, as follows:

              • A tuple {Module, Function, Arity} for function calls
              • The atoms send, 'receive', and timeout for sends and receives ('receive' when a message is received and timeout when a receive times out)

              If N = 0, call saving is disabled for the process, which is the default. -Whenever the size of the call saving list is set, its contents are reset.

            • process_flag(sensitive, boolean())

              Sets or clears flag sensitive for the current process. When a process has been +Whenever the size of the call saving list is set, its contents are reset.

            • process_flag(sensitive, boolean())

              Sets or clears flag sensitive for the current process. When a process has been marked as sensitive by calling process_flag(sensitive, true), features in the runtime system that can be used for examining the data or inner working of the process @@ -14846,8 +14846,8 @@

              processes()

              currently existing on the local node.

              Notice that an exiting process exists, but is not alive. That is, is_process_alive/1 returns false for an exiting process, but its process identifier is part of the result returned from -processes/0.

              Example:

              > processes().
              -[<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>]
              +processes/0.

              Example:

              > processes().
              +[<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>]
              @@ -14881,10 +14881,10 @@

              put(Key, Val)

              returns undefined. If Key exists, the old value is deleted and replaced by Val, and the function returns the old value.

              The average time complexity for the current implementation of this function is O(1) and the worst case time complexity is O(N), where N is the number of -items in the process dictionary.

              For example:

              > X = put(name, walrus), Y = put(name, carpenter),
              -Z = get(name),
              -{X, Y, Z}.
              -{undefined,walrus,carpenter}

              Note

              The values stored when put is evaluated within the scope of a catch are +items in the process dictionary.

              For example:

              > X = put(name, walrus), Y = put(name, carpenter),
              +Z = get(name),
              +{X, Y, Z}.
              +{undefined,walrus,carpenter}

              Note

              The values stored when put is evaluated within the scope of a catch are not retracted if a throw is evaluated, or if an error occurs.

              @@ -14967,7 +14967,7 @@

              register(RegName, PidOrPort)

              name registry. RegName, which must be an atom, can be used instead of the pid or port identifier in send operator (RegName ! Message) and most other BIFs that take -a pid or port identifies as an argument.

              For example:

              > register(db, Pid).
              +a pid or port identifies as an argument.

              For example:

              > register(db, Pid).
               true

              The registered name is considered a Directly Visible Erlang Resource and is automatically unregistered when the process terminates.

              Failures:

              • badarg - If PidOrPort is not an existing local process or port.

              • badarg - If RegName is already in use.

              • badarg - If the process or port is already registered (already has a @@ -15001,8 +15001,8 @@

                registered()

                -

                Returns a list of names that have been registered using register/2.

                For example:

                > registered().
                -[code_server, file_server, init, user, my_db]
                +

                Returns a list of names that have been registered using register/2.

                For example:

                > registered().
                +[code_server, file_server, init, user, my_db]
                @@ -15069,7 +15069,7 @@

                self()

                -

                Returns the process identifier of the calling process.

                For example:

                > self().
                +

                Returns the process identifier of the calling process.

                For example:

                > self().
                 <0.26.0>
                @@ -15333,7 +15333,7 @@

                spawn(Module, Function, Args)

                (see process_flag/2). If error_handler is undefined, or the user has redefined the default error_handler and its replacement is undefined, a failure with reason undef -occurs.

                Example:

                > spawn(speed, regulator, [high_speed, thin_cut]).
                +occurs.

                Example:

                > spawn(speed, regulator, [high_speed, thin_cut]).
                 <0.13.1>
                @@ -16325,14 +16325,14 @@

                throw(Any)

                Raises an exception of class throw. Intended to be used to do non-local returns from functions.

                If evaluated within a catch expression, the -catch expression returns value Any.

                For example:

                > catch throw({hello, there}).
                -        {hello,there}

                If evaluated within a try-block of a +catch expression returns value Any.

                For example:

                > catch throw({hello, there}).
                +        {hello,there}

                If evaluated within a try-block of a try expression, the value Any can be caught within the catch block.

                For example:

                try
                -    throw({my_exception, "Something happened"})
                +    throw({my_exception, "Something happened"})
                 catch
                -    throw:{my_exception, Desc} ->
                -        io:format(standard_error, "Error: ~s~n", [Desc])
                +    throw:{my_exception, Desc} ->
                +        io:format(standard_error, "Error: ~s~n", [Desc])
                 end

                Failure: nocatch if not caught by an exception handler.

                See the guide about errors and error handling for additional information.

                @@ -16414,9 +16414,9 @@

                unlink(Id)

                result of the link, but may also be the result of the unlikee sending the caller an exit signal by calling the exit/2 BIF. Therefore, it may or may not be appropriate to clean up the message queue after a call to -unlink(Id) as follows, when trapping exits:

                unlink(Id),
                +unlink(Id) as follows, when trapping exits:

                unlink(Id),
                 receive
                -    {'EXIT', Id, _} ->
                +    {'EXIT', Id, _} ->
                         true
                 after 0 ->
                         true
                @@ -16457,7 +16457,7 @@ 

                unregister(RegName)

                Removes the registered name RegName associated with a process identifier or a port identifier from the -name registry.

                For example:

                > unregister(db).
                +name registry.

                For example:

                > unregister(db).
                 true

                Keep in mind that you can still receive signals associated with the registered name after it has been unregistered as the sender may have looked up the name before sending to it.

                Users are advised not to unregister system processes.

                Failure: badarg if RegName is not a registered name.

                @@ -16493,7 +16493,7 @@

                whereis(RegName)

                Returns the process identifier or port identifier with the registered name RegName from the name registry. Returns -undefined if the name is not registered.

                For example:

                > whereis(db).
                +undefined if the name is not registered.

                For example:

                > whereis(db).
                 <0.43.0>
                @@ -16572,7 +16572,7 @@

                halt()

                -

                Equivalent to calling halt(0, []).

                For example:

                > halt().
                +

                Equivalent to calling halt(0, []).

                For example:

                > halt().
                 os_prompt%
                @@ -16605,7 +16605,7 @@

                halt(HaltType)

                -

                Equivalent to calling halt(HaltType, []).

                For example:

                > halt(17).
                +

                Equivalent to calling halt(HaltType, []).

                For example:

                > halt(17).
                 os_prompt% echo $?
                 17
                 os_prompt%
                @@ -16642,7 +16642,7 @@

                halt/2

                -

                Halt the runtime system.

                • halt(Status :: non_neg_integer(), Options :: halt_options())

                  Halt the runtime system with status code Status.

                  Note

                  On many platforms, the OS supports only status codes 0-255. A too large +

                  Halt the runtime system.

                  • halt(Status :: non_neg_integer(), Options :: halt_options())

                    Halt the runtime system with status code Status.

                    Note

                    On many platforms, the OS supports only status codes 0-255. A too large status code is truncated by clearing the high bits.

                    Currently the following options are valid:

                    • {flush, EnableFlushing} - If EnableFlushing equals true, which also is the default behavior, the runtime system will perform the following operations before terminating:

                      • Flush all outstanding output.
                      • Send all Erlang ports exit signals and wait for them to exit.
                      • Wait for all async threads to complete all outstanding async jobs.
                      • Call all installed NIF on halt callbacks.
                      • Wait for all ongoing @@ -16659,10 +16659,10 @@

                        halt/2

                        with the exit code 255. If flushing is not enabled, the timeout will have no effect on the system.

                        See also the erl +zhft <Timeout> command line flag. Note that the shortest timeout set by the command line flag and the -flush_timeout option will be the actual timeout value in effect.

                        Since: OTP 27.0

                    • halt(Abort :: abort, Options :: halt_options())

                      Halt the Erlang runtime system by aborting and produce a core dump if core +flush_timeout option will be the actual timeout value in effect.

                      Since: OTP 27.0

                  • halt(Abort :: abort, Options :: halt_options())

                    Halt the Erlang runtime system by aborting and produce a core dump if core dumping has been enabled in the environment that the runtime system is executing in.

                    Note

                    The {flush, boolean()} option will be ignored, and -flushing will be disabled.

                  • halt(CrashDumpSlogan :: string(), Options :: halt_options())

                    Halt the Erlang runtime system and generate an +flushing will be disabled.

                • halt(CrashDumpSlogan :: string(), Options :: halt_options())

                  Halt the Erlang runtime system and generate an Erlang crash dump. The string CrashDumpSlogan will be used as slogan in the Erlang crash dump created. The slogan will be trunkated if CrashDumpSlogan is longer than 1023 characters.

                  Note

                  The {flush, boolean()} option will be ignored, and @@ -16853,11 +16853,11 @@

                  statistics(Item)

                  -

                  Returns statistics about the current system.

                  The possible flags are:

                  • statistics(active_tasks) -> [non_neg_integer()]

                    Returns the same as +

                    Returns statistics about the current system.

                    The possible flags are:

                    • statistics(active_tasks) -> [non_neg_integer()]

                      Returns the same as statistics(active_tasks_all) with the exception that no information about the dirty IO run queue and its associated schedulers is part of the result. That is, only tasks that are -expected to be CPU bound are part of the result.

                      Available since OTP 18.3

                    • statistics(active_tasks_all) -> [non_neg_integer()]

                      Returns a list where each element represents the amount of active processes and +expected to be CPU bound are part of the result.

                      Available since OTP 18.3

                    • statistics(active_tasks_all) -> [non_neg_integer()]

                      Returns a list where each element represents the amount of active processes and ports on each run queue and its associated schedulers. That is, the number of processes and ports that are ready to run, or are currently running. Values for normal run queues and their associated schedulers are located first in the @@ -16879,11 +16879,11 @@

                      statistics(Item)

                      statistics(run_queue_lengths_all), statistics(total_run_queue_lengths), and -statistics(total_run_queue_lengths_all).

                      Available since OTP 20.0

                    • statistics(context_switches) -> {non_neg_integer(), 0}

                      Returns the total number of context switches since the system started.

                    • statistics(exact_reductions) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                      Returns the number of exact reductions.

                      Note

                      statistics(exact_reductions) is a more expensive operation -than statistics(reductions).

                    • statistics(garbage_collection) ->
                      -  { NumerOfGCs :: non_neg_integer(), WordsReclaimed :: non_neg_integer(), 0}

                      Returns information about garbage collection, for example:

                      > statistics(garbage_collection).
                      -{85,23961,0}

                      This information can be invalid for some implementations.

                    • statistics(io) -> {{input, non_neg_integer()}, {output, non_neg_integer()}}

                      Returns Input, which is the total number of bytes received through ports, and -Output, which is the total number of bytes output to ports.

                    • statistics(microstate_accounting) -> [MSAcc_Thread]

                      Microstate accounting can be used to measure how much time the Erlang runtime +statistics(total_run_queue_lengths_all).

                      Available since OTP 20.0

                    • statistics(context_switches) -> {non_neg_integer(), 0}

                      Returns the total number of context switches since the system started.

                    • statistics(exact_reductions) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                      Returns the number of exact reductions.

                      Note

                      statistics(exact_reductions) is a more expensive operation +than statistics(reductions).

                    • statistics(garbage_collection) ->
                      +  { NumerOfGCs :: non_neg_integer(), WordsReclaimed :: non_neg_integer(), 0}

                      Returns information about garbage collection, for example:

                      > statistics(garbage_collection).
                      +{85,23961,0}

                      This information can be invalid for some implementations.

                    • statistics(io) -> {{input, non_neg_integer()}, {output, non_neg_integer()}}

                      Returns Input, which is the total number of bytes received through ports, and +Output, which is the total number of bytes output to ports.

                    • statistics(microstate_accounting) -> [MSAcc_Thread]

                      Microstate accounting can be used to measure how much time the Erlang runtime system spends doing various tasks. It is designed to be as lightweight as possible, but some overhead exists when this is enabled. Microstate accounting is meant to be a profiling tool to help finding performance bottlenecks. To @@ -16892,23 +16892,23 @@

                      statistics(Item)

                      representing some of the OS threads within ERTS. Each map contains type and id fields that can be used to identify what thread it is, and also a counters field that contains data about how much time has been spent in the various -states.

                      Example:

                      > erlang:statistics(microstate_accounting).
                      -[#{counters => #{aux => 1899182914,
                      +states.

                      Example:

                      > erlang:statistics(microstate_accounting).
                      +[#{counters => #{aux => 1899182914,
                                        check_io => 2605863602,
                                        emulator => 45731880463,
                                        gc => 1512206910,
                                        other => 5421338456,
                                        port => 221631,
                      -                 sleep => 5150294100},
                      +                 sleep => 5150294100},
                          id => 1,
                      -   type => scheduler}|...]

                      The time unit is the same as returned by os:perf_counter/0. So, to convert it -to milliseconds, you can do something like this:

                      lists:map(
                      -  fun(#{ counters := Cnt } = M) ->
                      -         MsCnt = maps:map(fun(_K, PerfCount) ->
                      -                                    erlang:convert_time_unit(PerfCount, perf_counter, 1000)
                      -                           end, Cnt),
                      -         M#{ counters := MsCnt }
                      -  end, erlang:statistics(microstate_accounting)).

                      Notice that these values are not guaranteed to be the exact time spent in each + type => scheduler}|...]

                      The time unit is the same as returned by os:perf_counter/0. So, to convert it +to milliseconds, you can do something like this:

                      lists:map(
                      +  fun(#{ counters := Cnt } = M) ->
                      +         MsCnt = maps:map(fun(_K, PerfCount) ->
                      +                                    erlang:convert_time_unit(PerfCount, perf_counter, 1000)
                      +                           end, Cnt),
                      +         M#{ counters := MsCnt }
                      +  end, erlang:statistics(microstate_accounting)).

                      Notice that these values are not guaranteed to be the exact time spent in each state. This is because of various optimisation done to keep the overhead as small as possible.

                      MSAcc_Thread_Types:

                      • scheduler - The main execution threads that do most of the work. See erl +S for more details.

                      • dirty_cpu_scheduler - The threads for long running cpu intensive work. @@ -16940,20 +16940,20 @@

                        statistics(Item)

                        statistics.

                        Returns undefined if system flag microstate_accounting is turned off.

                        The list of thread information is unsorted and can appear in different order -between calls.

                        Note

                        The threads and states are subject to change without any prior notice.

                        Available since OTP 19.0

                      • statistics(reductions) -> {Reductions :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                        Returns information about reductions, for example:

                        > statistics(reductions).
                        -{2046,11}

                        Change

                        As from ERTS 5.5 (Erlang/OTP R11B), this value does not include reductions +between calls.

                        Note

                        The threads and states are subject to change without any prior notice.

                        Available since OTP 19.0

                      • statistics(reductions) -> {Reductions :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                        Returns information about reductions, for example:

                        > statistics(reductions).
                        +{2046,11}

                        Change

                        As from ERTS 5.5 (Erlang/OTP R11B), this value does not include reductions performed in current time slices of currently scheduled processes. If an exact value is wanted, use -statistics(exact_reductions).

                      • statistics(run_queue) -> non_neg_integer()

                        Returns the total length of all normal and dirty CPU run queues. That is, queued +statistics(exact_reductions).

                • statistics(run_queue) -> non_neg_integer()

                  Returns the total length of all normal and dirty CPU run queues. That is, queued work that is expected to be CPU bound. The information is gathered atomically. That is, the result is a consistent snapshot of the state, but this operation is much more expensive compared to statistics(total_run_queue_lengths), -especially when a large amount of schedulers is used.

                • statistics(run_queue_lengths) -> [non_neg_integer()]

                  Returns the same as +especially when a large amount of schedulers is used.

                • statistics(run_queue_lengths) -> [non_neg_integer()]

                  Returns the same as statistics(run_queue_lengths_all) with the exception that no information about the dirty IO run queue is part of the result. That is, only run queues with work that is expected to be CPU bound -is part of the result.

                  Available since OTP 18.3

                • statistics(run_queue_lengths_all) -> [non_neg_integer()]

                  Returns a list where each element represents the amount of processes and ports +is part of the result.

                  Available since OTP 18.3

                • statistics(run_queue_lengths_all) -> [non_neg_integer()]

                  Returns a list where each element represents the amount of processes and ports ready to run for each run queue. Values for normal run queues are located first in the resulting list. The first element corresponds to the normal run queue of scheduler number 1 and so on. If support for dirty schedulers exist, values for @@ -16973,13 +16973,13 @@

                  statistics(Item)

                  statistics(active_tasks), statistics(active_tasks_all), and statistics(total_active_tasks), -statistics(total_active_tasks_all).

                  Available since OTP 20.0

                • statistics(runtime) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about runtime, in milliseconds.

                  This is the sum of the runtime for all threads in the Erlang runtime system and +statistics(total_active_tasks_all).

                  Available since OTP 20.0

                • statistics(runtime) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about runtime, in milliseconds.

                  This is the sum of the runtime for all threads in the Erlang runtime system and can therefore be greater than the wall clock time.

                  Warning

                  This value might wrap due to limitations in the underlying functionality -provided by the operating system that is used.

                  Example:

                  > statistics(runtime).
                  -{1690,1620}
                • statistics(scheduler_wall_time) ->
                  -  [{Id :: pos_integer,
                  -    ActiveTime :: non_neg_integer(),
                  -    TotalTime :: non_neg_integer()}] |
                  +provided by the operating system that is used.

                  Example:

                  > statistics(runtime).
                  +{1690,1620}
                • statistics(scheduler_wall_time) ->
                  +  [{Id :: pos_integer,
                  +    ActiveTime :: non_neg_integer(),
                  +    TotalTime :: non_neg_integer()}] |
                     undefined

                  Returns information describing how much time normal and dirty CPU schedulers in the @@ -17019,52 +17019,52 @@

                  statistics(Item)

                  This fact has to be taken under consideration when evaluating the result returned.

                  You can use scheduler_wall_time to calculate scheduler utilization. First you take a sample of the values returned by -erlang:statistics(scheduler_wall_time).

                  > erlang:system_flag(scheduler_wall_time, true).
                  +erlang:statistics(scheduler_wall_time).

                  > erlang:system_flag(scheduler_wall_time, true).
                   false
                  -> Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                  +> Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                   ok

                  Some time later the user takes another snapshot and calculates scheduler -utilization per scheduler, for example:

                  > Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                  +utilization per scheduler, for example:

                  > Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.
                   ok
                  -> lists:map(fun({{I, A0, T0}, {I, A1, T1}}) ->
                  -        {I, (A1 - A0)/(T1 - T0)} end, lists:zip(Ts0,Ts1)).
                  -[{1,0.9743474730177548},
                  - {2,0.9744843782751444},
                  - {3,0.9995902361669045},
                  - {4,0.9738012596572161},
                  - {5,0.9717956667018103},
                  - {6,0.9739235846420741},
                  - {7,0.973237033077876},
                  - {8,0.9741297293248656}]

                  Using the same snapshots to calculate a total scheduler utilization:

                  > {A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) ->
                  -        {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)),
                  +> lists:map(fun({{I, A0, T0}, {I, A1, T1}}) ->
                  +        {I, (A1 - A0)/(T1 - T0)} end, lists:zip(Ts0,Ts1)).
                  +[{1,0.9743474730177548},
                  + {2,0.9744843782751444},
                  + {3,0.9995902361669045},
                  + {4,0.9738012596572161},
                  + {5,0.9717956667018103},
                  + {6,0.9739235846420741},
                  + {7,0.973237033077876},
                  + {8,0.9741297293248656}]

                  Using the same snapshots to calculate a total scheduler utilization:

                  > {A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) ->
                  +        {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)),
                     TotalSchedulerUtilization = A/T.
                   0.9769136803764825

                  Total scheduler utilization will equal 1.0 when all schedulers have been active all the time between the two measurements.

                  Another (probably more) useful value is to calculate total scheduler utilization -weighted against maximum amount of available CPU time:

                  > WeightedSchedulerUtilization = (TotalSchedulerUtilization
                  -                                  * (erlang:system_info(schedulers)
                  -                                     + erlang:system_info(dirty_cpu_schedulers)))
                  -                                 / erlang:system_info(logical_processors_available).
                  +weighted against maximum amount of available CPU time:

                  > WeightedSchedulerUtilization = (TotalSchedulerUtilization
                  +                                  * (erlang:system_info(schedulers)
                  +                                     + erlang:system_info(dirty_cpu_schedulers)))
                  +                                 / erlang:system_info(logical_processors_available).
                   0.9769136803764825

                  This weighted scheduler utilization will reach 1.0 when schedulers are active the same amount of time as maximum available CPU time. If more schedulers exist than available logical processors, this value may be greater than 1.0.

                  As of ERTS version 9.0, the Erlang runtime system will as default have more schedulers than logical processors. This due to the dirty schedulers.

                  Note

                  scheduler_wall_time is by default disabled. To enable it, use -erlang:system_flag(scheduler_wall_time, true).

                  Available since OTP R15B01

                • statistics(scheduler_wall_time_all) ->
                  -  [{Id :: pos_integer,
                  -    ActiveTime :: non_neg_integer(),
                  -    TotalTime :: non_neg_integer()}] |
                  +erlang:system_flag(scheduler_wall_time, true).

                  Available since OTP R15B01

                • statistics(scheduler_wall_time_all) ->
                  +  [{Id :: pos_integer,
                  +    ActiveTime :: non_neg_integer(),
                  +    TotalTime :: non_neg_integer()}] |
                     undefined

                  Equivalent to statistics(scheduler_wall_time), except that it also include information about all dirty I/O schedulers.

                  Dirty IO schedulers will have scheduler identifiers in the range erlang:system_info(schedulers)+erlang:system_info(dirty_cpu_schedulers)< SchedulerId =< erlang:system_info(schedulers) + erlang:system_info(dirty_cpu_schedulers) +erlang:system_info(dirty_io_schedulers).

                  Note

                  Note that work executing on dirty I/O schedulers are expected to mainly wait for I/O. That is, when you get high scheduler utilization on dirty I/O -schedulers, CPU utilization is not expected to be high due to this work.

                  Available since OTP 20.0

                • statistics(total_active_tasks) -> non_neg_integer()

                  Equivalent to calling +schedulers, CPU utilization is not expected to be high due to this work.

                  Available since OTP 20.0

                • statistics(total_active_tasks) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(active_tasks)), -but more efficient.

                  Available since OTP 18.3

                • statistics(total_active_tasks_all) -> non_neg_integer()

                  Equivalent to calling +but more efficient.

                  Available since OTP 18.3

                • statistics(total_active_tasks_all) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(active_tasks_all)), -but more efficient.

                  Available since OTP 20.0

                • statistics(total_run_queue_lengths) -> non_neg_integer()

                  Equivalent to calling +but more efficient.

                  Available since OTP 20.0

                • statistics(total_run_queue_lengths) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(run_queue_lengths)), -but more efficient.

                  Available since OTP 18.3

                • statistics(total_run_queue_lengths_all) -> non_neg_integer()

                  Equivalent to calling +but more efficient.

                  Available since OTP 18.3

                • statistics(total_run_queue_lengths_all) -> non_neg_integer()

                  Equivalent to calling lists:sum(statistics(run_queue_lengths_all)), -but more efficient.

                  Available since OTP 20.0

                • statistics(wall_clock) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about wall clock. wall_clock can be used in the same +but more efficient.

                  Available since OTP 20.0

                • statistics(wall_clock) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}

                  Returns information about wall clock. wall_clock can be used in the same manner as runtime, except that real time is measured as opposed to runtime or CPU time.

                @@ -17138,9 +17138,9 @@

                system_flag(Flag, Value)

                -

                Sets a system flag to the given value.

                The possible flags to set are:

                • system_flag(backtrace_depths, non_neg_integer()) -> non_neg_integer()

                  Sets the maximum depth of call stack back-traces in the exit reason element of +

                  Sets a system flag to the given value.

                  The possible flags to set are:

                  • system_flag(backtrace_depths, non_neg_integer()) -> non_neg_integer()

                    Sets the maximum depth of call stack back-traces in the exit reason element of 'EXIT' tuples. The flag also limits the stacktrace depth returned by -process_info/2 item current_stacktrace.

                    Returns the old value of the flag.

                  • system_flag(cpu_topology, cpu_topology()) -> cpu_topology()

                    Warning

                    This argument is deprecated. Instead of using this argument, use +process_info/2 item current_stacktrace.

                    Returns the old value of the flag.

                  • system_flag(cpu_topology, cpu_topology()) -> cpu_topology()

                    Warning

                    This argument is deprecated. Instead of using this argument, use command-line argument +sct in erl.

                    When this argument is removed, a final CPU topology to use is determined at emulator boot time.

                    Sets the user-defined CpuTopology. The user-defined CPU topology overrides any automatically detected CPU topology. By passing undefined as CpuTopology, @@ -17152,7 +17152,7 @@

                    system_flag(Flag, Value)

                    +sct to erl.

                    For information on type CpuTopology and more, see erlang:system_info(cpu_topology) as well as command-line flags +sct and -+sbt in erl.

                  • system_flag(dirty_cpu_schedulers_online, pos_integer()) -> pos_integer()

                    Sets the number of dirty CPU schedulers online. Range is ++sbt in erl.

                  • system_flag(dirty_cpu_schedulers_online, pos_integer()) -> pos_integer()

                    Sets the number of dirty CPU schedulers online. Range is 1 <= DirtyCPUSchedulersOnline <= N, where N is the smallest of the return values of erlang:system_info(dirty_cpu_schedulers) and erlang:system_info(schedulers_online).

                    Returns the old value of the flag.

                    The number of dirty CPU schedulers online can change if the number of schedulers @@ -17164,31 +17164,31 @@

                    system_flag(Flag, Value)

                    of schedulers online.

                    For more information, see erlang:system_info(dirty_cpu_schedulers) and -erlang:system_info(dirty_cpu_schedulers_online).

                    Available since OTP 17.0

                  • system_flag(erts_alloc, {Alloc :: atom(), F :: atom(), V :: integer()}) ->
                    +erlang:system_info(dirty_cpu_schedulers_online).

                    Available since OTP 17.0

                  • system_flag(erts_alloc, {Alloc :: atom(), F :: atom(), V :: integer()}) ->
                       ok | notsup

                    Sets system flags for erts_alloc(3). Alloc is the allocator to affect, for example binary_alloc. F is the flag to change and V is the new value.

                    Only a subset of all erts_alloc flags can be changed at run time. This subset -is currently only the flag sbct.

                    Returns ok if the flag was set or notsup if not supported by erts_alloc.

                    Available since OTP 20.2.3

                  • system_flag(fullsweep_after, non_neg_integer()) -> non_neg_integer()

                    Sets system flag fullsweep_after. Number is a non-negative integer +is currently only the flag sbct.

                    Returns ok if the flag was set or notsup if not supported by erts_alloc.

                    Available since OTP 20.2.3

                  • system_flag(fullsweep_after, non_neg_integer()) -> non_neg_integer()

                    Sets system flag fullsweep_after. Number is a non-negative integer indicating how many times generational garbage collections can be done without forcing a fullsweep collection. The value applies to new processes, while processes already running are not affected.

                    Returns the old value of the flag.

                    In low-memory systems (especially without virtual memory), setting the value to 0 can help to conserve memory.

                    This value can also be set through (OS) environment variable -ERL_FULLSWEEP_AFTER.

                  • system_flag(microstate_accounting, true | false | reset) -> boolean()

                    Turns on/off microstate accounting measurements. When passing reset, all +ERL_FULLSWEEP_AFTER.

                  • system_flag(microstate_accounting, true | false | reset) -> boolean()

                    Turns on/off microstate accounting measurements. When passing reset, all counters are reset to 0.

                    For more information see -statistics(microstate_accounting).

                    Available since OTP 19.0

                  • system_flag(min_heap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum heap size for processes. The size is specified in +statistics(microstate_accounting).

                    Available since OTP 19.0

                  • system_flag(min_heap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum heap size for processes. The size is specified in words. The new min_heap_size effects only processes spawned after the change of min_heap_size has been made. min_heap_size can be set for individual -processes by using spawn_opt/4 or process_flag/2.

                    Returns the old value of the flag.

                  • system_flag(min_bin_vheap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum binary virtual heap size for processes. The size is +processes by using spawn_opt/4 or process_flag/2.

                    Returns the old value of the flag.

                  • system_flag(min_bin_vheap_size, non_neg_integer()) -> non_neg_integer()

                    Sets the default minimum binary virtual heap size for processes. The size is specified in words. The new min_bin_vhheap_size effects only processes spawned after the change of min_bin_vheap_size has been made. min_bin_vheap_size can be set for individual processes by using spawn_opt/2,3,4 or -process_flag/2.

                    Returns the old value of the flag.

                    Available since OTP R13B04

                  • system_flag(max_heap_size, max_heap_size()) -> max_heap_size()

                    Sets the default maximum heap size settings for processes. The size is specified +process_flag/2.

                    Returns the old value of the flag.

                    Available since OTP R13B04

                  • system_flag(max_heap_size, max_heap_size()) -> max_heap_size()

                    Sets the default maximum heap size settings for processes. The size is specified in words. The new max_heap_size effects only processes spawned after the change has been made. max_heap_size can be set for individual processes using spawn_opt/2,3,4 or process_flag/2.

                    Returns the old value of the flag.

                    For details on how the heap grows, see Sizing the heap in the ERTS internal -documentation.

                    Available since OTP 19.0

                  • system_flag(multi_scheduling, BlockState) -> OldBlockState when
                    +documentation.

                    Available since OTP 19.0

                  • system_flag(multi_scheduling, BlockState) -> OldBlockState when
                       BlockState :: block | unblock | block_normal | unblock_normal,
                       OldBlockState :: blocked | disabled | enabled

                    If multi-scheduling is enabled, more than one scheduler thread is used by the emulator. Multi-scheduling can be blocked in two different ways. Either all @@ -17217,7 +17217,7 @@

                    system_flag(Flag, Value)

                    erlang:system_info(multi_scheduling), erlang:system_info(normal_multi_scheduling_blockers), erlang:system_info(multi_scheduling_blockers), -and erlang:system_info(schedulers).

                  • system_flag(outstanding_system_requests_limit, 1..134217727) -> 1..134217727

                    Sets a limit on the amount of outstanding requests made by a system process +and erlang:system_info(schedulers).

                  • system_flag(outstanding_system_requests_limit, 1..134217727) -> 1..134217727

                    Sets a limit on the amount of outstanding requests made by a system process orchestrating system wide changes. Currently there are two such processes:

                    • The Code Purger - The code purger orchestrates checking of references to old code before old code is removed from the system.

                    • The Literal Area Collector - The literal area collector orchestrates copying of references from old literal areas before removal of such areas from @@ -17228,8 +17228,8 @@

                      system_flag(Flag, Value)

                      quickly as possible at the same time as other work will be interleaved with this work. Currently used limit can be checked by calling erlang:system_info(outstanding_system_requests_limit).

                      This limit can also be set by passing the command line argument -+zosrl <Limit> to erl.

                      Available since OTP 24.2

                    • system_flag(scheduler_bind_type, scheduler_bind_type() | default_bind) ->
                      -  scheduler_bind_type()

                      Warning

                      This argument is deprecated. Instead of using this argument, use ++zosrl <Limit> to erl.

                      Available since OTP 24.2

                    • system_flag(scheduler_bind_type, scheduler_bind_type() | default_bind) ->
                      +  scheduler_bind_type()

                      Warning

                      This argument is deprecated. Instead of using this argument, use command-line argument +sbt in erl. When this argument is removed, a final scheduler bind type to use is determined at emulator boot time.

                      Controls if and how schedulers are bound to logical processors.

                      When erlang:system_flag(scheduler_bind_type, How) is called, an asynchronous @@ -17263,7 +17263,7 @@

                      system_flag(Flag, Value)

                      erlang:system_info(scheduler_bind_type), erlang:system_info(scheduler_bindings), as well as command-line flags +sbt and -+sct in erl.

                    • system_flag(scheduler_wall_time, boolean()) -> boolean()

                      Try enable or disable scheduler wall time measurements by passing Boolean as ++sct in erl.

                    • system_flag(scheduler_wall_time, boolean()) -> boolean()

                      Try enable or disable scheduler wall time measurements by passing Boolean as either true or false.

                      For more information about how to use scheduler wall time measurements, see statistics(scheduler_wall_time).

                      Scheduler wall time measurements has a node global state. It is either enabled for all processes on the node or disabled for all processes. Each process has a @@ -17275,7 +17275,7 @@

                      system_flag(Flag, Value)

                      counter will also disappear. To ensure scheduler_wall_time is kept enabled, the process that enabled it must therefore be kept alive.

                      Returns the old value of the node global state, true if scheduler wall time measurements were enabled, false if it were disabled.

                      Scheduler wall time measurements do consume some cpu overhead and should not be -left turned on unless used.

                      Available since OTP R15B01

                    • system_flag(schedulers_online, pos_integer()) -> pos_integer()

                      Sets the number of schedulers online. Range is +left turned on unless used.

                      Available since OTP R15B01

                    • system_flag(schedulers_online, pos_integer()) -> pos_integer()

                      Sets the number of schedulers online. Range is 1 <= SchedulersOnline <= erlang:system_info(schedulers).

                      Returns the old value of the flag.

                      If the emulator was built with support for dirty schedulers, changing the number of schedulers online can also change the number of dirty CPU @@ -17286,23 +17286,23 @@

                      system_flag(Flag, Value)

                      dirty CPU schedulers online increases proportionally to increases in the number of schedulers online.

                      For more information, see erlang:system_info(schedulers) and -erlang:system_info(schedulers_online).

                    • system_flag(system_logger, logger | undefined | pid()) -> logger | undefined | pid()

                      Sets the process that will receive the logging messages generated by ERTS. If +erlang:system_info(schedulers_online).

                    • system_flag(system_logger, logger | undefined | pid()) -> logger | undefined | pid()

                      Sets the process that will receive the logging messages generated by ERTS. If set to undefined, all logging messages generated by ERTS will be dropped. The -messages will be in the format:

                      {log,Level,Format,ArgList,Metadata} where
                      -
                      -Level = atom(),
                      -Format = string(),
                      -ArgList = list(term()),
                      -Metadata = #{ pid => pid(),
                      -   group_leader => pid(),
                      -   time := logger:timestamp(),
                      -   error_logger := #{ emulator := true, tag := atom() }

                      If the system_logger process dies, this flag will be reset to logger.

                      The default is the process named logger.

                      Returns the old value of the flag.

                      Note

                      This function is designed to be used by the KERNEL logger. Be careful if +messages will be in the format:

                      {log,Level,Format,ArgList,Metadata} where
                      +
                      +Level = atom(),
                      +Format = string(),
                      +ArgList = list(term()),
                      +Metadata = #{ pid => pid(),
                      +   group_leader => pid(),
                      +   time := logger:timestamp(),
                      +   error_logger := #{ emulator := true, tag := atom() }

                      If the system_logger process dies, this flag will be reset to logger.

                      The default is the process named logger.

                      Returns the old value of the flag.

                      Note

                      This function is designed to be used by the KERNEL logger. Be careful if you change it to something else as log messages may be lost. If you want to intercept emulator log messages, do it by adding a specialized handler to the -KERNEL logger.

                      Available since OTP 21.2

                    • system_flag(trace_control_word, non_neg_integer()) -> non_neg_integer()

                      Sets the value of the node trace control word to TCW, which is to be an +KERNEL logger.

                      Available since OTP 21.2

                    • system_flag(trace_control_word, non_neg_integer()) -> non_neg_integer()

                      Sets the value of the node trace control word to TCW, which is to be an unsigned integer. For more information, see function set_tcw in section "Match Specifications in Erlang" -in the User's Guide.

                      Returns the old value of the flag.

                    • system_flag(time_offset, finalize) -> preliminary | final | volatile

                      Finalizes the time offset when +in the User's Guide.

                      Returns the old value of the flag.

                    • system_flag(time_offset, finalize) -> preliminary | final | volatile

                      Finalizes the time offset when single time warp mode is used. If another time warp mode is used, the time offset state is left unchanged.

                      Returns the old state identifier, that is:

                      • If preliminary is returned, finalization was performed and the time offset is now final.
                      • If final is returned, the time offset was already in the final state. This @@ -17514,14 +17514,14 @@

                        system_info(Item)

                        allocated by the emulator. Some values are part of other values, and some memory areas are not part of the result. For information about the total amount of memory allocated by the emulator, see -erlang:memory/0,1.

                      • allocator - Returns

                        {Allocator :: undefined | glibc,
                        - Version :: [non_neg_integer()],
                        - Features :: [atom()],
                        - Settings :: [{Subsystem :: atom(),
                        -               [{Parameter :: atom(),
                        -                 Value :: term()}]
                        -               }]
                        -}

                        where

                        • allocator - Returns

                          {Allocator :: undefined | glibc,
                          + Version :: [non_neg_integer()],
                          + Features :: [atom()],
                          + Settings :: [{Subsystem :: atom(),
                          +               [{Parameter :: atom(),
                          +                 Value :: term()}]
                          +               }]
                          +}

                          where

                          • Allocator corresponds to the malloc() implementation used. If Allocator equals undefined, the malloc() implementation used cannot be identified. glibc can be identified.
                          • Version is a list of integers (but not a string) representing the version of the malloc() implementation used.
                          • Features is a list of atoms representing the allocation features used.
                          • Settings is a list of subsystems, their configurable parameters, and used @@ -18417,8 +18417,8 @@

                            date()

                            Returns the current date as {Year, Month, Day}.

                            The time zone and Daylight Saving Time correction depend on the underlying OS. The return value is based on the -OS System Time.

                            For example:

                            > date().
                            -{1995,2,19}
                            +OS System Time.

                            For example:

                            > date().
                            +{1995,2,19}
                            @@ -18447,8 +18447,8 @@

                            localtime()

                            Returns the current local date and time, -{{Year, Month, Day}, {Hour, Minute, Second}}.

                            For example:

                            > erlang:localtime().
                            -{{1996,11,6},{14,45,17}}

                            The time zone and Daylight Saving Time correction depend on the underlying OS. +{{Year, Month, Day}, {Hour, Minute, Second}}.

                            For example:

                            > erlang:localtime().
                            +{{1996,11,6},{14,45,17}}

                            The time zone and Daylight Saving Time correction depend on the underlying OS. The return value is based on the OS System Time.

                            @@ -18483,8 +18483,8 @@

                            localtime_to_universaltime(Localtime)

                            Converts local date and time to Universal Time Coordinated (UTC), if supported by the underlying OS. Otherwise no conversion is done and Localtime is -returned.

                            For example:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}).
                            -{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            +returned.

                            For example:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}).
                            +{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            @@ -18521,12 +18521,12 @@

                            localtime_to_universaltime(Localtime, IsDst Time is active.

                            If IsDst == true, Localtime is during Daylight Saving Time, if IsDst == false it is not. If IsDst == undefined, the underlying OS can guess, which is the same as calling -erlang:localtime_to_universaltime(Localtime).

                            Examples:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, true).
                            -{{1996,11,6},{12,45,17}}
                            -> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, false).
                            -{{1996,11,6},{13,45,17}}
                            -> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, undefined).
                            -{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            +erlang:localtime_to_universaltime(Localtime).

                            Examples:

                            > erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, true).
                            +{{1996,11,6},{12,45,17}}
                            +> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, false).
                            +{{1996,11,6},{13,45,17}}
                            +> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, undefined).
                            +{{1996,11,6},{13,45,17}}

                            Failure: badarg if Localtime denotes an invalid date and time.

                            @@ -18957,8 +18957,8 @@

                            time()

                            Returns the current time as {Hour, Minute, Second}.

                            The time zone and Daylight Saving Time correction depend on the underlying OS. The return value is based on the -OS System Time.

                            For example:

                            > time().
                            -{9,42,44}
                            +OS System Time.

                            For example:

                            > time().
                            +{9,42,44}
                            @@ -19071,12 +19071,12 @@

                            timestamp()

                            The reason for the existence of erlang:timestamp() is purely to simplify use for existing code that assumes this time stamp format. Current Erlang system time can more efficiently be retrieved in the time unit of your choice using -erlang:system_time/1.

                            The erlang:timestamp() BIF is equivalent to:

                            timestamp() ->
                            -    ErlangSystemTime = erlang:system_time(microsecond),
                            +erlang:system_time/1.

                            The erlang:timestamp() BIF is equivalent to:

                            timestamp() ->
                            +    ErlangSystemTime = erlang:system_time(microsecond),
                                 MegaSecs = ErlangSystemTime div 1000_000_000_000,
                                 Secs = ErlangSystemTime div 1000_000 - MegaSecs*1000_000,
                                 MicroSecs = ErlangSystemTime rem 1000_000,
                            -    {MegaSecs, Secs, MicroSecs}.

                            It, however, uses a native implementation that does not build garbage on the + {MegaSecs, Secs, MicroSecs}.

                            It, however, uses a native implementation that does not build garbage on the heap and with slightly better performance.

                            Note

                            This time is not a monotonically increasing time in the general case. For more information, see the documentation of time warp modes in the User's Guide.

                            @@ -19111,8 +19111,8 @@

                            universaltime()

                            in the form {{Year, Month, Day}, {Hour, Minute, Second}} if supported by the underlying OS. Otherwise erlang:universaltime() is equivalent to erlang:localtime(). The return value is based on the -OS System Time.

                            For example:

                            > erlang:universaltime().
                            -{{1996,11,6},{14,18,43}}
                            +OS System Time.

                            For example:

                            > erlang:universaltime().
                            +{{1996,11,6},{14,18,43}}
                            @@ -19145,8 +19145,8 @@

                            universaltime_to_localtime(Universaltime)Converts Universal Time Coordinated (UTC) date and time to local date and time in the form {{Year, Month, Day}, {Hour, Minute, Second}} if supported by the -underlying OS. Otherwise no conversion is done, and Universaltime is returned.

                            For example:

                            > erlang:universaltime_to_localtime({{1996,11,6},{14,18,43}}).
                            -{{1996,11,7},{15,18,43}}

                            Failure: badarg if Universaltime denotes an invalid date and time.

                            +underlying OS. Otherwise no conversion is done, and Universaltime is returned.

                            For example:

                            > erlang:universaltime_to_localtime({{1996,11,6},{14,18,43}}).
                            +{{1996,11,7},{15,18,43}}

                            Failure: badarg if Universaltime denotes an invalid date and time.

                            diff --git a/prs/9277/erts-15.2/doc/html/erlsrv_cmd.html b/prs/9277/erts-15.2/doc/html/erlsrv_cmd.html index ce35982cbcef5..93975eed219a0 100644 --- a/prs/9277/erts-15.2/doc/html/erlsrv_cmd.html +++ b/prs/9277/erts-15.2/doc/html/erlsrv_cmd.html @@ -315,28 +315,28 @@

                            ** A Console control handler that ignores the log off events, ** and lets the default handler take care of other events. */ -BOOL WINAPI service_aware_handler(DWORD ctrl){ - if(ctrl == CTRL_LOGOFF_EVENT) +BOOL WINAPI service_aware_handler(DWORD ctrl){ + if(ctrl == CTRL_LOGOFF_EVENT) return TRUE; - if(ctrl == CTRL_SHUTDOWN_EVENT) + if(ctrl == CTRL_SHUTDOWN_EVENT) return TRUE; return FALSE; -} +} -void initialize_handler(void){ - char buffer[2]; +void initialize_handler(void){ + char buffer[2]; /* * We assume we are running as a service if this * environment variable is defined. */ - if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, - (DWORD) 2)){ + if(GetEnvironmentVariable("ERLSRV_SERVICE_NAME",buffer, + (DWORD) 2)){ /* ** Actually set the control handler */ - SetConsoleCtrlHandler(&service_aware_handler, TRUE); - } -}

                + SetConsoleCtrlHandler(&service_aware_handler, TRUE); + } +}

                diff --git a/prs/9277/erts-15.2/doc/html/escript_cmd.html b/prs/9277/erts-15.2/doc/html/escript_cmd.html index f5a65f17c4d02..f72b806890776 100644 --- a/prs/9277/erts-15.2/doc/html/escript_cmd.html +++ b/prs/9277/erts-15.2/doc/html/escript_cmd.html @@ -131,7 +131,7 @@

                Synopsis

                -
                script-name [arg1 arg2...]

                +
                script-name [arg1 arg2...]

                @@ -143,24 +143,24 @@

                $ cat factorial

                #!/usr/bin/env escript
                 %% -*- erlang -*-
                 %%! -sname factorial -mnesia debug verbose
                -main([String]) ->
                +main([String]) ->
                     try
                -        N = list_to_integer(String),
                -        F = fac(N),
                -        io:format("factorial ~w = ~w\n", [N,F])
                +        N = list_to_integer(String),
                +        F = fac(N),
                +        io:format("factorial ~w = ~w\n", [N,F])
                     catch
                         _:_ ->
                -            usage()
                +            usage()
                     end;
                -main(_) ->
                -    usage().
                +main(_) ->
                +    usage().
                 
                -usage() ->
                -    io:format("usage: factorial integer\n"),
                -    halt(1).
                +usage() ->
                +    io:format("usage: factorial integer\n"),
                +    halt(1).
                 
                -fac(0) -> 1;
                -fac(N) -> N * fac(N-1).
                $ ./factorial 5
                +fac(0) -> 1;
                +fac(N) -> N * fac(N-1).
                $ ./factorial 5
                 factorial 5 = 120
                 $ ./factorial
                 usage: factorial integer
                @@ -173,7 +173,7 @@ 

                If the directive is present, it must be located on the second line.

                If a comment selecting the encoding exists, it can be located on the second line.

                Note

                The encoding specified by the above mentioned comment applies to the script itself. The encoding of the I/O-server, however, must be set explicitly as -follows:

                io:setopts([{encoding, latin1}])

                The default encoding of the I/O-server for +follows:

                io:setopts([{encoding, latin1}])

                The default encoding of the I/O-server for standard_io is unicode if its supported. (see section Summary of Options) in @@ -192,7 +192,7 @@

                script (the pathname is usually, but not always, absolute).

                If the file contains source code (as in the example above), it is processed by the epp preprocessor. This means that you, for example, can use predefined macros (such as ?MODULE) and include directives like the -include_lib -directive. For example, use

                -include_lib("kernel/include/file.hrl").

                to include the record definitions for the records used by function +directive. For example, use

                -include_lib("kernel/include/file.hrl").

                to include the record definitions for the records used by function file:read_link_info/1. You can also select encoding by including an encoding comment here, but if a valid encoding comment exists on the second line, it takes precedence.

                The script is checked for syntactic and semantic correctness before it is run. @@ -200,7 +200,7 @@

                script will still be run. If there are errors, they are printed and the script will not be run and its exit status is 127.

                Both the module declaration and the export declaration of the main/1 function are optional.

                By default, the script will be compiled by the Erlang compiler.

                It is possible to force it to be interpreted by including the following line -somewhere in the script file:

                -mode(interpret).

                Execution of interpreted code is slower than compiled code, and some language +somewhere in the script file:

                -mode(interpret).

                Execution of interpreted code is slower than compiled code, and some language constructs will not work, but there is no requirement for the Erlang compiler application to be available.

                Change

                Before Erlang/OTP 27 the script would be interpreted by default.

                diff --git a/prs/9277/erts-15.2/doc/html/garbagecollection.html b/prs/9277/erts-15.2/doc/html/garbagecollection.html index 90582aa694d0f..f4eaa3c37e6cd 100644 --- a/prs/9277/erts-15.2/doc/html/garbagecollection.html +++ b/prs/9277/erts-15.2/doc/html/garbagecollection.html @@ -137,25 +137,25 @@

                Creating Data

                -

                Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

                Let's look at an example that returns a tuple with the newly created data.

                data(Foo) ->
                -   Cons = [42|Foo],
                -   Literal = {text, "hello world!"},
                -   {tag, Cons, Literal}.

                In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

                On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

                Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

                ...
                -{test_heap,6,1}.
                -{put_list,{integer,42},{x,0},{x,1}}.
                -{put_tuple,3,{x,0}}.
                -{put,{atom,tag}}.
                -{put,{x,1}}.
                -{put,{literal,{text,"hello world!"}}}.
                +

                Terms are created on the heap by evaluating expressions. There are two major types of terms: immediate terms which require no heap space (small integers, atoms, pids, port ids etc) and cons or boxed terms (tuple, big num, binaries etc) that do require heap space. Immediate terms do not need any heap space because they are embedded into the containing structure.

                Let's look at an example that returns a tuple with the newly created data.

                data(Foo) ->
                +   Cons = [42|Foo],
                +   Literal = {text, "hello world!"},
                +   {tag, Cons, Literal}.

                In this example we first create a new cons cell with an integer and a tuple with some text. Then a tuple of size three wrapping the other values with an atom tag is created and returned.

                On the heap tuples require a word size for each of its elements as well as for the header. Cons cells always require two words. Adding these things together, we get seven words for the tuples and 26 words for the cons cells. The string "hello world!" is a list of cons cells and thus requires 24 words. The atom tag and the integer 42 do not require any additional heap memory since it is an immediate. Adding all the terms together, the heap space required in this example should be 33 words.

                Compiling this code to beam assembly (erlc -S) shows exactly what is happening.

                ...
                +{test_heap,6,1}.
                +{put_list,{integer,42},{x,0},{x,1}}.
                +{put_tuple,3,{x,0}}.
                +{put,{atom,tag}}.
                +{put,{x,1}}.
                +{put,{literal,{text,"hello world!"}}}.
                 return.

                Looking at the assembler code we can see three things: The heap requirement in this function turns out to be only six words, as seen by the {test_heap,6,1} instruction. All the allocations are combined to a single instruction. The bulk of the data {text, "hello world!"} is a literal. Literals, sometimes referred to as constants, are not allocated in the function since they are a part of the module and allocated at load time.

                If there is not enough space available on the heap to satisfy the test_heap instructions request for memory, then a garbage collection is initiated. It may happen immediately in the test_heap instruction, or it can be delayed until a later time depending on what state the process is in. If the garbage collection is delayed, any memory needed will be allocated in heap fragments. Heap fragments are extra memory blocks that are a part of the young heap, but are not allocated in the contiguous area where terms normally reside. See The young heap for more details.

                The collector

                -

                Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

                Garbage collection: initial values

                It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

                After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

                foo(Arg) ->
                -    T = {test, Arg},
                -    {wrapper, T, T, T}.

                Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

                Garbage collection: root set scan

                After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

                Garbage collection: heap scan

                Every term object we can reach is copied to the to space and stored on top off the scan stop line, and then the scan stop is moved to the end of the last object.

                Garbage collection: heap scan

                When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

                +

                Erlang has a copying semi-space garbage collector. This means that when doing a garbage collection, the terms are copied from one distinct area, called the from space, to a new clean area, called the to space. The collector starts by scanning the root-set (stack, registers, etc).

                Garbage collection: initial values

                It follows all the pointers from the root-set to the heap and copies each term word by word to the to space.

                After the header word has been copied a move marker is destructively placed in it pointing to the term in the to space. Any other term that points to the already moved term will see this move marker and copy the referring pointer instead. For example, if the have the following Erlang code:

                foo(Arg) ->
                +    T = {test, Arg},
                +    {wrapper, T, T, T}.

                Only one copy of T exists on the heap and during the garbage collection only the first time T is encountered will it be copied.

                Garbage collection: root set scan

                After all terms referenced by the root-set have been copied, the collector scans the to space and copies all terms that these terms reference. When scanning, the collector steps through each term on the to space and any term still referencing the from space is copied over to the to space. Some terms contain non-term data (the payload of a on heap binary for instance). When encountered by the collector, these values are simply skipped.

                Garbage collection: heap scan

                Every term object we can reach is copied to the to space and stored on top off the scan stop line, and then the scan stop is moved to the end of the last object.

                Garbage collection: heap scan

                When scan stop marker catches up to the scan start marker, the garbage collection is done. At this point we can deallocate the entire from space and therefore reclaim the entire young heap.

                @@ -179,11 +179,11 @@

                Literals

                -

                When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

                if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
                +

                When garbage collecting a heap (young or old) all literals are left in place and not copied. To figure out if a term should be copied or not when doing a garbage collection the following pseudo code is used:

                if (erts_is_literal(ptr) || (on_old_heap(ptr) && !fullsweep)) {
                   /* literal or non fullsweep - do not copy */
                -} else {
                -  copy(ptr);
                -}

                The erts_is_literal check works differently on different architectures and operating systems.

                On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

                On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

                On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

                This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

                +} else { + copy(ptr); +}

                The erts_is_literal check works differently on different architectures and operating systems.

                On 64 bit systems that allow mapping of unreserved virtual memory areas (most operating systems except Windows), an area of size 1 GB (by default) is mapped and then all literals are placed within that area. Then all that has to be done to determine if something is a literal or not is two quick pointer checks. This system relies on the fact that a memory page that has not been touched yet does not take any actual space. So even if 1 GB of virtual memory is mapped, only the memory which is actually needed for literals is allocated in ram. The size of the literal area is configurable through the +MIscs erts_alloc option.

                On 32 bit systems, there is not enough virtual memory space to allocate 1 GB for just literals, so instead small 256 KB sized literal regions are created on demand and a card mark bit-array of the entire 32 bit memory space is then used to determine if a term is a literal or not. Since the total memory space is only 32 bits, the card mark bit-array is only 256 words large. On a 64 bit system the same bit-array would have to be 1 tera words large, so this technique is only viable on 32 bit systems. Doing lookups in the array is a little more expensive then just doing the pointer checks that can be done in 64 bit systems, but not extremely so.

                On 64 bit windows, on which erts_alloc cannot do unreserved virtual memory mappings, a special tag within the Erlang term object is used to determine if something is a literal or not. This is very cheap, however, the tag is only available on 64 bit machines, and it is possible to do a great deal of other nice optimizations with this tag in the future (like for instance a more compact list implementation) so it is not used on operating systems where it is not needed.

                This behaviour is different from how it worked prior to Erlang/OTP 19.0. Before 19.0 the literal check was done by checking if the pointer pointed to the young or old heap block. If it did not, then it was considered a literal. This lead to considerable overhead and strange memory usage scenarios, so it was removed in 19.0.

                diff --git a/prs/9277/erts-15.2/doc/html/inet_cfg.html b/prs/9277/erts-15.2/doc/html/inet_cfg.html index ab95d0815f927..894f82eb43af4 100644 --- a/prs/9277/erts-15.2/doc/html/inet_cfg.html +++ b/prs/9277/erts-15.2/doc/html/inet_cfg.html @@ -165,11 +165,11 @@

                The user configuration file is always examined last in the configuration process, making it possible for the user to override any default values or previously made settings. Call inet:get_rc() to view the state of the inet -configuration database.

                The valid configuration parameters are as follows:

                • {file, Format, File}.
                  -  Format = atom()
                  -  File = string()

                  Specify a system file that Erlang is to read configuration data from. Format -tells the parser how the file is to be interpreted:

                  • resolv (Unix resolv.conf)
                  • host_conf_freebsd (FreeBSD host.conf)
                  • host_conf_bsdos (BSDOS host.conf)
                  • host_conf_linux (Linux host.conf)
                  • nsswitch_conf (Unix nsswitch.conf)
                  • hosts (Unix hosts)

                  File is to specify the filename with full path.

                • {resolv_conf, File}.
                  -  File = string()

                  Specify a system file that Erlang is to read resolver configuration from for +configuration database.

                  The valid configuration parameters are as follows:

                  • {file, Format, File}.
                    +  Format = atom()
                    +  File = string()

                    Specify a system file that Erlang is to read configuration data from. Format +tells the parser how the file is to be interpreted:

                    • resolv (Unix resolv.conf)
                    • host_conf_freebsd (FreeBSD host.conf)
                    • host_conf_bsdos (BSDOS host.conf)
                    • host_conf_linux (Linux host.conf)
                    • nsswitch_conf (Unix nsswitch.conf)
                    • hosts (Unix hosts)

                    File is to specify the filename with full path.

                  • {resolv_conf, File}.
                    +  File = string()

                    Specify a system file that Erlang is to read resolver configuration from for the internal DNS client inet_res, and monitor for changes, even if it does not exist. The path must be absolute.

                    This can override the configuration parameters nameserver and search depending on the contents of the specified file. They can also change any time @@ -177,61 +177,61 @@

                    in the future. This emulates the old behavior of not configuring the DNS client when the node is started in short name distributed mode.

                    If this parameter is not specified, it defaults to /etc/resolv.conf unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

                  • {hosts_file, File}.
                    -  File = string()

                    Specify a system file that Erlang is to read resolver configuration from for +for this file to some maybe other than /etc.

                  • {hosts_file, File}.
                    +  File = string()

                    Specify a system file that Erlang is to read resolver configuration from for the internal hosts file resolver, and monitor for changes, even if it does not exist. The path must be absolute.

                    These host entries are searched after all added with {file, hosts, File} above or {host, IP, Aliases} below when lookup option file is used.

                    If the file is specified as an empty string "", no file is read or monitored in the future. This emulates the old behavior of not configuring the DNS client when the node is started in short name distributed mode.

                    If this parameter is not specified, it defaults to /etc/hosts unless environment variable ERL_INET_ETC_DIR is set, which defines the directory -for this file to some maybe other than /etc.

                  • {registry, Type}.
                    -  Type = atom()

                    Specify a system registry that Erlang is to read configuration data from. -win32 is the only valid option.

                  • {host, IP, Aliases}.
                    -  IP = tuple()

                    Aliases = [string()]

                    Add host entry to the hosts table.

                  • {domain, Domain}.
                    -  Domain = string()

                    Set domain name.

                  • {nameserver, IP [,Port]}.
                    -  IP = tuple()
                    -  Port = integer()

                    Add address (and port, if other than default) of the primary nameserver to use -for inet_res.

                  • {alt_nameserver, IP [,Port]}.
                    -  IP = tuple()
                    -  Port = integer()

                    Add address (and port, if other than default) of the secondary nameserver for -inet_res.

                  • {search, Domains}.
                    -  Domains = [string()]

                    Add search domains for inet_res.

                  • {lookup, Methods}.
                    -  Methods = [atom()]

                    Specify lookup methods and in which order to try them. The valid methods are +for this file to some maybe other than /etc.

                  • {registry, Type}.
                    +  Type = atom()

                    Specify a system registry that Erlang is to read configuration data from. +win32 is the only valid option.

                  • {host, IP, Aliases}.
                    +  IP = tuple()

                    Aliases = [string()]

                    Add host entry to the hosts table.

                  • {domain, Domain}.
                    +  Domain = string()

                    Set domain name.

                  • {nameserver, IP [,Port]}.
                    +  IP = tuple()
                    +  Port = integer()

                    Add address (and port, if other than default) of the primary nameserver to use +for inet_res.

                  • {alt_nameserver, IP [,Port]}.
                    +  IP = tuple()
                    +  Port = integer()

                    Add address (and port, if other than default) of the secondary nameserver for +inet_res.

                  • {search, Domains}.
                    +  Domains = [string()]

                    Add search domains for inet_res.

                  • {lookup, Methods}.
                    +  Methods = [atom()]

                    Specify lookup methods and in which order to try them. The valid methods are as follows:

                    • native (use system calls)
                    • file (use host data retrieved from system configuration files and/or the user configuration file)
                    • dns (use the Erlang DNS client inet_res for nameserver queries)

                    The lookup method string tries to parse the hostname as an IPv4 or IPv6 string and return the resulting IP address. It is automatically tried first when native is not in the Methods list. To skip it in this case, the pseudo lookup method nostring can be inserted anywhere in the Methods -list.

                  • {cache_size, Size}.
                    -  Size = integer()

                    Set the resolver cache size for dns lookups. native lookups are not -cached. Defaults to 100 DNS records.

                  • {cache_refresh, Time}.
                    -  Time = integer()

                    Set how often (in milliseconds) the resolver cache for inet_res is -refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

                  • {timeout, Time}.
                    -  Time = integer()

                    Set the time to wait until retry (in milliseconds) for DNS queries made by -inet_res. Defaults to 2 seconds.

                  • {retry, N}.
                    -  N = integer()

                    Set the number of DNS queries inet_res will try before giving up. Defaults -to 3.

                  • {servfail_retry_timeout, Time}.
                    -  Time = non_neg_integer()

                    After all name servers have been tried, there is a timeout before the name +list.

                  • {cache_size, Size}.
                    +  Size = integer()

                    Set the resolver cache size for dns lookups. native lookups are not +cached. Defaults to 100 DNS records.

                  • {cache_refresh, Time}.
                    +  Time = integer()

                    Set how often (in milliseconds) the resolver cache for inet_res is +refreshed (that is, expired DNS records are deleted). Defaults to 1 hour.

                  • {timeout, Time}.
                    +  Time = integer()

                    Set the time to wait until retry (in milliseconds) for DNS queries made by +inet_res. Defaults to 2 seconds.

                  • {retry, N}.
                    +  N = integer()

                    Set the number of DNS queries inet_res will try before giving up. Defaults +to 3.

                  • {servfail_retry_timeout, Time}.
                    +  Time = non_neg_integer()

                    After all name servers have been tried, there is a timeout before the name servers are tried again. This is to prevent the server from answering the query with what's in the servfail cache, inet_res. Defaults to 1500 milli -seconds .

                  • {inet6, Bool}.
                    +seconds .

                  • {inet6, Bool}.
                       Bool = true | false

                    Tells the DNS client inet_res to look up IPv6 addresses. Defaults to -false.

                  • {usevc, Bool}.
                    +false.

                  • {usevc, Bool}.
                       Bool = true | false

                    Tells the DNS client inet_res to use TCP (Virtual Circuit) instead of UDP. -Defaults to false.

                  • {edns, Version}.
                    +Defaults to false.

                  • {edns, Version}.
                       Version = false | 0

                    Sets the EDNS version that inet_res will use. The only allowed version is -zero. Defaults to false, which means not to use EDNS.

                  • {udp_payload_size, Size}.
                    -  N = integer()

                    Sets the allowed UDP payload size inet_res will advertise in EDNS queries. +zero. Defaults to false, which means not to use EDNS.

                  • {udp_payload_size, Size}.
                    +  N = integer()

                    Sets the allowed UDP payload size inet_res will advertise in EDNS queries. Also sets the limit when the DNS query will be deemed too large for UDP forcing a TCP query instead; this is not entirely correct, as the advertised UDP payload size of the individual nameserver is what is to be used, but this simple strategy will do until a more intelligent (probing, caching) algorithm needs to be implemented. Default to 1280, which stems from the standard -Ethernet MTU size.

                  • {udp, Module}.
                    -  Module = atom()

                    Tell Erlang to use another primitive UDP module than inet_udp.

                  • {tcp, Module}.
                    -  Module = atom()

                    Tell Erlang to use another primitive TCP module than inet_tcp.

                  • clear_hosts.

                    Clear the hosts table.

                  • clear_ns.

                    Clear the list of recorded nameservers (primary and secondary).

                  • clear_search.

                    Clear the list of search domains.

                  +Ethernet MTU size.

                • {udp, Module}.
                  +  Module = atom()

                  Tell Erlang to use another primitive UDP module than inet_udp.

                • {tcp, Module}.
                  +  Module = atom()

                  Tell Erlang to use another primitive TCP module than inet_tcp.

                • clear_hosts.

                  Clear the hosts table.

                • clear_ns.

                  Clear the list of recorded nameservers (primary and secondary).

                • clear_search.

                  Clear the list of search domains.

                @@ -246,19 +246,19 @@

                (in this example named erl_inetrc, stored in directory ./cfg_files) can then look as follows (Unix):

                %% -- ERLANG INET CONFIGURATION FILE --
                 %% read the hosts file
                -{file, hosts, "/etc/hosts"}.
                +{file, hosts, "/etc/hosts"}.
                 %% add a particular host
                -{host, {134,138,177,105}, ["finwe"]}.
                +{host, {134,138,177,105}, ["finwe"]}.
                 %% do not monitor the hosts file
                -{hosts_file, ""}.
                +{hosts_file, ""}.
                 %% read and monitor nameserver config from here
                -{resolv_conf, "/usr/local/etc/resolv.conf"}.
                +{resolv_conf, "/usr/local/etc/resolv.conf"}.
                 %% enable EDNS
                -{edns,0}.
                +{edns,0}.
                 %% disable caching
                -{cache_size, 0}.
                +{cache_size, 0}.
                 %% specify lookup method
                -{lookup, [file, dns]}.

                And Erlang can, for example, be started as follows:

                % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
                +{lookup, [file, dns]}.

                And Erlang can, for example, be started as follows:

                % erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'
                diff --git a/prs/9277/erts-15.2/doc/html/init.html b/prs/9277/erts-15.2/doc/html/init.html index 5b6f4f84a12ce..149354d595303 100644 --- a/prs/9277/erts-15.2/doc/html/init.html +++ b/prs/9277/erts-15.2/doc/html/init.html @@ -161,8 +161,8 @@

                initialization process.

              • -extra - Everything following -extra is considered plain arguments and can be retrieved using get_plain_arguments/0.

                Example:

                % erl -extra +A 1 --
                 ...
                -1> init:get_plain_arguments().
                -["+A","1","--"]

                The -extra flag can be passed on the command line, through ERL_*FLAGS or +1> init:get_plain_arguments(). +["+A","1","--"]

              The -extra flag can be passed on the command line, through ERL_*FLAGS or -args_file. It only effects the remaining command-line flags in the entity in which it is passed. If multiple -extra flags are passed they are concatenated using the same order rules as ERL_*FLAGS or -args_file in @@ -216,13 +216,13 @@

              % erl -- a b -children thomas claire -ages 7 3 -- x y
               ...
               
              -1> init:get_plain_arguments().
              -["a","b","x","y"]
              -2> init:get_argument(children).
              -{ok,[["thomas","claire"]]}
              -3> init:get_argument(ages).
              -{ok, [["7","3"]]}
              -4> init:get_argument(silly).
              +1> init:get_plain_arguments().
              +["a","b","x","y"]
              +2> init:get_argument(children).
              +{ok,[["thomas","claire"]]}
              +3> init:get_argument(ages).
              +{ok, [["7","3"]]}
              +4> init:get_argument(silly).
               error

              @@ -524,12 +524,12 @@

              get_argument(Flag)

              Returns all values associated with the command-line user flag Flag.

              If Flag is provided several times, each Values is returned in preserved order. Example:

              % erl -a b c -a d
               ...
              -1> init:get_argument(a).
              -{ok,[["b","c"],["d"]]}

              The following flags are defined automatically and can be retrieved using this +1> init:get_argument(a). +{ok,[["b","c"],["d"]]}

    The following flags are defined automatically and can be retrieved using this function:

    Returns error if no value is associated with Flag.

    +{ok,[["/usr/local/otp/releases/otp_beam_solaris8_r10b_patched"]]}
  • progname - The name of the program which started Erlang:

    3> init:get_argument(progname).
    +{ok,[["erl"]]}
  • home - The home directory (on Unix, the value of $HOME):

    4> init:get_argument(home).
    +{ok,[["/home/harry"]]}
  • Returns error if no value is associated with Flag.

    diff --git a/prs/9277/erts-15.2/doc/html/match_spec.html b/prs/9277/erts-15.2/doc/html/match_spec.html index 581a02774bf97..c59bb0e8b345d 100644 --- a/prs/9277/erts-15.2/doc/html/match_spec.html +++ b/prs/9277/erts-15.2/doc/html/match_spec.html @@ -371,70 +371,70 @@

    Tracing Examples

    -

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    -  [],
    -  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    -  [{ '>', '$1', 3}],
    -  []}]

    Match an argument list of three, where the third argument is either a tuple +

    Match an argument list of three, where the first and third arguments are equal:

    [{['$1', '_', '$1'],
    +  [],
    +  []}]

    Match an argument list of three, where the second argument is a number > 3:

    [{['_', '$1', '_'],
    +  [{ '>', '$1', 3}],
    +  []}]

    Match an argument list of three, where the third argument is either a tuple containing argument one and two, or a list beginning with argument one and two -(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    -  [{'orelse',
    -      {'=:=', '$3', {{'$1','$2'}}},
    -      {'and',
    -        {'=:=', '$1', {hd, '$3'}},
    -        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    -  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    - {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in +(that is, [a,b,[a,b,c]] or [a,b,{a,b}]):

    [{['$1', '$2', '$3'],
    +  [{'orelse',
    +      {'=:=', '$3', {{'$1','$2'}}},
    +      {'and',
    +        {'=:=', '$1', {hd, '$3'}},
    +        {'=:=', '$2', {hd, {tl, '$3'}}}}}],
    +  []}]

    The above problem can also be solved as follows:

    [{['$1', '$2', {'$1', '$2}], [], []},
    + {['$1', '$2', ['$1', '$2' | '_']], [], []}]

    Match two arguments, where the first is a tuple beginning with a list that in turn begins with the second argument times two (that is, [{[4,x],y},2] or -[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    -  []}]

    Match three arguments. When all three are equal and are numbers, append the +[{[8], y, z},4]):

    [{['$1', '$2'],[{'=:=', {'*', 2, '$2'}, {hd, {element, 1, '$1'}}}],
    +  []}]

    Match three arguments. When all three are equal and are numbers, append the process dump to the trace message, otherwise let the trace message be "as is", -but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    -  [{is_number, '$1'}],
    -  [{message, {process_dump}}]},
    - {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single +but set the sequential trace token label to 4711:

    [{['$1', '$1', '$1'],
    +  [{is_number, '$1'}],
    +  [{message, {process_dump}}]},
    + {'_', [], [{set_seq_token, label, 4711}]}]

    As can be noted above, the parameter list can be matched against a single MatchVariable or an '_'. To replace the whole parameter list with a single variable is a special case. In all other cases the MatchHead must be a -proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    -  [{'==',{get_tcw},{const, 1}}],
    -  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    -  [{'==',{is_seq_trace},{const, 1}}],
    -  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add -it when it is 'silent':

    [{'$1',
    -  [{'==',{hd, '$1'},verbose}],
    -  [{trace, [silent],[]}]},
    - {'$1',
    -  [{'==',{hd, '$1'},silent}],
    -  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    -  [{'==',{length, '$1'},3}],
    -  [{return_trace}]},
    - {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first -argument is 'trace':

    [{['trace','$2','$3'],
    -  [],
    -  []},
    - {'_',[],[]}]

    +proper list.

    Generate a trace message only if the trace control word is set to 1:

    [{'_',
    +  [{'==',{get_tcw},{const, 1}}],
    +  []}]

    Generate a trace message only if there is a seq_trace token:

    [{'_',
    +  [{'==',{is_seq_trace},{const, 1}}],
    +  []}]

    Remove the 'silent' trace flag when the first argument is 'verbose', and add +it when it is 'silent':

    [{'$1',
    +  [{'==',{hd, '$1'},verbose}],
    +  [{trace, [silent],[]}]},
    + {'$1',
    +  [{'==',{hd, '$1'},silent}],
    +  [{trace, [],[silent]}]}]

    Add a return_trace message if the function is of arity 3:

    [{'$1',
    +  [{'==',{length, '$1'},3}],
    +  [{return_trace}]},
    + {'_',[],[]}]

    Generate a trace message only if the function is of arity 3 and the first +argument is 'trace':

    [{['trace','$2','$3'],
    +  [],
    +  []},
    + {'_',[],[]}]

    ETS Examples

    Match all objects in an ETS table, where the first element is the atom -'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    -  [],
    -  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is -'gandalf', and return element 2:

    [{'$1',
    -  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    -  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more +'strider' and the tuple arity is 3, and return the whole object:

    [{{strider,'_','_'},
    +  [],
    +  ['$_']}]

    Match all objects in an ETS table with arity > 1 and the first element is +'gandalf', and return element 2:

    [{'$1',
    +  [{'==', gandalf, {element, 1, '$1'}},{'>=',{size, '$1'},2}],
    +  [{element,2,'$1'}]}]

    In this example, if the first element had been the key, it is much more efficient to match that key in the MatchHead part than in the MatchConditions part. The search space of the tables is restricted with regards to the MatchHead so that only objects with the matching key are searched.

    Match tuples of three elements, where the second element is either 'merry' or -'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    -  [],
    -  ['$_']},
    - {{'_',pippin,'_'},
    -  [],
    -  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

    +'pippin', and return the whole objects:

    [{{'_',merry,'_'},
    +  [],
    +  ['$_']},
    + {{'_',pippin,'_'},
    +  [],
    +  ['$_']}]

    Function ets:test_ms/2 can be useful for testing complicated ETS matches.

    diff --git a/prs/9277/erts-15.2/doc/html/notes.html b/prs/9277/erts-15.2/doc/html/notes.html index 0c2b42b4aa2d0..37c2ee8d391d6 100644 --- a/prs/9277/erts-15.2/doc/html/notes.html +++ b/prs/9277/erts-15.2/doc/html/notes.html @@ -144,7 +144,7 @@

    Improvements and New Features

    -
    • Improved documentation of timers.

      Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

    • The label for a process can now be retrieved also using process_info(Pid, label) in addition to proc_lib:get_label/1.

      This new option is useful when one wants to retrieve more than one process info item. For example:

      process_info(Pid, [label,registered_name])

      Own Id: OTP-19373 Aux Id: PR-9108

    +
    • Improved documentation of timers.

      Own Id: OTP-19360 Aux Id: ERIERL-1149, PR-9062

    • The label for a process can now be retrieved also using process_info(Pid, label) in addition to proc_lib:get_label/1.

      This new option is useful when one wants to retrieve more than one process info item. For example:

      process_info(Pid, [label,registered_name])

      Own Id: OTP-19373 Aux Id: PR-9108

    @@ -192,8 +192,8 @@

    Fixed Bugs and Malfunctions

    -
    • The erl -man example has been corrected to not consider values set in ERL_ZFLAGS and stop parsing arguments when a -- is encountered.

      Own Id: OTP-19098 Aux Id: PR-8478, GH-8477

    • Compiler warnings for Windows I/O back-end have been silenced.

      Own Id: OTP-19113

    • Bugs related to return_to trace have been fixed. It did not work for more than once trace session and it did sometimes not trigger for exceptions.

      Own Id: OTP-19122

    • Potential deadlocks while writing a crash dump have been eliminated.

      Own Id: OTP-19133 Aux Id: PR-8521, GH-8498

    • When loading a damaged or too old BEAM file, the runtime system could crash.

      Own Id: OTP-19153 Aux Id: PR-8623

    • A scheduler thread could get stuck when deleting a memory allocator carrier when adjacent carriers were deleted and/or inserted simultaneously by other schedulers. This in turn could cause the other schedulers to get stuck as well.

      Own Id: OTP-19154 Aux Id: GH-8613, PR-8627

    • Statistics for number of carriers in a shared pool after calling instrument:allocations or instrument:carriers are now correct. Also, a potential bug in carrier block scanning was eliminated.

      Own Id: OTP-19166 Aux Id: PR-8636

    • A race in the kTLS flavour of SSL distribution has been fixed so that inet_drv.c doesn't read ahead too much data, which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.

      Own Id: OTP-19175 Aux Id: GH-8561, PR-8690

    • Fixed an emulator crash relating to compressed ETS tables.

      Own Id: OTP-19176 Aux Id: PR-8683

    • A function (encode_sockaddr) was called with superfluous argument, on Windows, in the net nif.

      Own Id: OTP-19181

    • Fixed a crash that could happen on reallocation failure.

      Own Id: OTP-19192

    • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

      Own Id: OTP-19201 Aux Id: PR-8740

    • A previous correction in the Erlang/OTP 27.0.1 emergency patch had the unfortunate side effect of sometimes causing an unnecessary fullsweep (major) garbage collection instead of a generation (minor) garbage collection. This has been corrected.

      Own Id: OTP-19209 Aux Id: PR-8751, PR-8539

    • Fixed trace matchspec functions trace and enable_trace to use the session tracer when enabling trace flags on untraced processes.

      Own Id: OTP-19211 Aux Id: GH-8657

    • Fixed a typo in the type spec for erlang:garbage_collection_defaults/0.

      Own Id: OTP-19215 Aux Id: PR-8757

    • Corrected socket:ioctl for genaddr (SIOCGENADDR).

      Own Id: OTP-19216

    • The support for Transparent Huge Pages has been disabled on non-amd64 Linux systems.

      Own Id: OTP-19219 Aux Id: PR-8702

    • Fixed a race condition on Windows when upgrading from -noshell to a shell that would cause Erlang to crash with the error:

      {'GetOverlappedResult',
      -  'The I/O operation has been aborted because of either a thread exit or an application request.'}.

      Own Id: OTP-19220 Aux Id: PR-8774, GH-7621

    +
    • The erl -man example has been corrected to not consider values set in ERL_ZFLAGS and stop parsing arguments when a -- is encountered.

      Own Id: OTP-19098 Aux Id: PR-8478, GH-8477

    • Compiler warnings for Windows I/O back-end have been silenced.

      Own Id: OTP-19113

    • Bugs related to return_to trace have been fixed. It did not work for more than once trace session and it did sometimes not trigger for exceptions.

      Own Id: OTP-19122

    • Potential deadlocks while writing a crash dump have been eliminated.

      Own Id: OTP-19133 Aux Id: PR-8521, GH-8498

    • When loading a damaged or too old BEAM file, the runtime system could crash.

      Own Id: OTP-19153 Aux Id: PR-8623

    • A scheduler thread could get stuck when deleting a memory allocator carrier when adjacent carriers were deleted and/or inserted simultaneously by other schedulers. This in turn could cause the other schedulers to get stuck as well.

      Own Id: OTP-19154 Aux Id: GH-8613, PR-8627

    • Statistics for number of carriers in a shared pool after calling instrument:allocations or instrument:carriers are now correct. Also, a potential bug in carrier block scanning was eliminated.

      Own Id: OTP-19166 Aux Id: PR-8636

    • A race in the kTLS flavour of SSL distribution has been fixed so that inet_drv.c doesn't read ahead too much data, which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.

      Own Id: OTP-19175 Aux Id: GH-8561, PR-8690

    • Fixed an emulator crash relating to compressed ETS tables.

      Own Id: OTP-19176 Aux Id: PR-8683

    • A function (encode_sockaddr) was called with superfluous argument, on Windows, in the net nif.

      Own Id: OTP-19181

    • Fixed a crash that could happen on reallocation failure.

      Own Id: OTP-19192

    • Man pages are now available for erl, erlc, dialyzer, and all other programs that are included in Erlang/OTP.

      Own Id: OTP-19201 Aux Id: PR-8740

    • A previous correction in the Erlang/OTP 27.0.1 emergency patch had the unfortunate side effect of sometimes causing an unnecessary fullsweep (major) garbage collection instead of a generation (minor) garbage collection. This has been corrected.

      Own Id: OTP-19209 Aux Id: PR-8751, PR-8539

    • Fixed trace matchspec functions trace and enable_trace to use the session tracer when enabling trace flags on untraced processes.

      Own Id: OTP-19211 Aux Id: GH-8657

    • Fixed a typo in the type spec for erlang:garbage_collection_defaults/0.

      Own Id: OTP-19215 Aux Id: PR-8757

    • Corrected socket:ioctl for genaddr (SIOCGENADDR).

      Own Id: OTP-19216

    • The support for Transparent Huge Pages has been disabled on non-amd64 Linux systems.

      Own Id: OTP-19219 Aux Id: PR-8702

    • Fixed a race condition on Windows when upgrading from -noshell to a shell that would cause Erlang to crash with the error:

      {'GetOverlappedResult',
      +  'The I/O operation has been aborted because of either a thread exit or an application request.'}.

      Own Id: OTP-19220 Aux Id: PR-8774, GH-7621

    @@ -230,17 +230,17 @@

    Improvements and New Features

    -
    • Refactored how the JIT handles POSIX signals and how they affect thread stacks, allowing us to use the native stack register for Erlang stacks on more platforms.

      Notably, containers built on 64-bit x86 Alpine Linux images will now perform much better in sequential code. As an example, running dialyzer over the OTP code base finishes about 15% quicker.

      Own Id: OTP-18568 Aux Id: PR-7174

    • The instrument module can now track allocations on a per-process or per-port basis.

      Own Id: OTP-18577 Aux Id: PR-7236

    • The pid field returned from erlang:fun_info/1,2 is now always the pid for the init process of the local node, not the pid for the actual process that created the fun.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18594 Aux Id: PR-7274

    • By default, escripts will now be compiled instead of interpreted. That means that the compiler application must be installed.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18639 Aux Id: PR-7348

    • A binary returned from the socket receive functions is no longer created as a sub binary of an often large receive buffer binary (socket option {otp,rcvbuf}). This avoids space waste, trusting the allocators to implement reallocation efficiently.

      Own Id: OTP-18642 Aux Id: GH-6152, PR-7465

    • The default process limit has been raised to 1048576 processes.

      Own Id: OTP-18699 Aux Id: PR-7388

    • The erlang:system_monitor/2 functionality is now able to monitor long message queues in the system.

      Own Id: OTP-18709 Aux Id: PR-7651

    • The erl command now supports the -S flag, which is similar to the -run flag, except that it will pass all arguments up to end of the command line to the called function. (The -run flag will not pass arguments beginning with a hyphen.) Another difference is that -S will always call a function with one argument, passing an empty list if no arguments were given.

      Own Id: OTP-18744 Aux Id: PR-7470

    • When implementing an alternative carrier for the Erlang distribution, a separate input handler process may now be registered, using erlang:dist_ctrl_input_handler/2, also in the case when the distribution controller is a port.

      Own Id: OTP-18774 Aux Id: PR-7110

    • The call stack trace has now been added to the error reported by erlang:process_flag/2 when max_heap_size limit has been exceeded.

      Own Id: OTP-18779 Aux Id: PR-7592

    • -callback attributes have been added to erl_tracer.

      Own Id: OTP-18794 Aux Id: PR-7703

    • For inet_backend = socket, setting the active socket option alone, to once, true or N has been optimized, as well as the corresponding data delivery.

      Own Id: OTP-18835

    • New functions socket:sendv/* for sending I/O vectors have been added.

      Own Id: OTP-18845

    • Socket options that take string now also accept binaries.

      Own Id: OTP-18849 Aux Id: PR-6510

    • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

      There are also new APIs to support native coverage without using the cover tool.

      To instrument code for native coverage it must be compiled with the line_coverage option.

      To enable native coverage in the runtime system, start it like so:

      $ erl +JPcover true

      There are also the following new functions for supporting native coverage:

      Own Id: OTP-18856 Aux Id: PR-7856

    • Changed the default value of the command line flag -code_path_choice to strict.

      Note that for application systems using archives, it is necessary to add the code_path_choice relaxed to the command line that invokes erl.

      Own Id: OTP-18894 Aux Id: PR-7243

    • Added module loading to erl -init_debug printouts.

      Own Id: OTP-18929 Aux Id: PR-8004

    • When the runtime system halts, it performs various flush operations before terminating. By default there is no limit on how much time the flush operations are allowed to take. A new halt flush timeout functionality has been introduced which can be used for limiting the amount of time that the flushing operations are allowed to take. For more information see the documentation of the flush_timeout option of the erlang:halt/2 BIF and the documentation of the erl +zhft <Timeout> command line flag.

      Own Id: OTP-18938 Aux Id: PR-8035, GH-7438

    • Optimized code loading by moving certain operations from the code server to the caller.

      Own Id: OTP-18941 Aux Id: PR-7981

    • Updated asmjit to version a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d

      Own Id: OTP-18942

    • The deprecated functions in zlib have been removed. That includes inflateChunk/{1,2}, getBufSize/1, setBufSize/2, the CRC32 functions, and the Adler checksum functions.

      Own Id: OTP-18950

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

      Example:

      -record(rec, {a,b,c}).
      +
      • Refactored how the JIT handles POSIX signals and how they affect thread stacks, allowing us to use the native stack register for Erlang stacks on more platforms.

        Notably, containers built on 64-bit x86 Alpine Linux images will now perform much better in sequential code. As an example, running dialyzer over the OTP code base finishes about 15% quicker.

        Own Id: OTP-18568 Aux Id: PR-7174

      • The instrument module can now track allocations on a per-process or per-port basis.

        Own Id: OTP-18577 Aux Id: PR-7236

      • The pid field returned from erlang:fun_info/1,2 is now always the pid for the init process of the local node, not the pid for the actual process that created the fun.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18594 Aux Id: PR-7274

      • By default, escripts will now be compiled instead of interpreted. That means that the compiler application must be installed.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18639 Aux Id: PR-7348

      • A binary returned from the socket receive functions is no longer created as a sub binary of an often large receive buffer binary (socket option {otp,rcvbuf}). This avoids space waste, trusting the allocators to implement reallocation efficiently.

        Own Id: OTP-18642 Aux Id: GH-6152, PR-7465

      • The default process limit has been raised to 1048576 processes.

        Own Id: OTP-18699 Aux Id: PR-7388

      • The erlang:system_monitor/2 functionality is now able to monitor long message queues in the system.

        Own Id: OTP-18709 Aux Id: PR-7651

      • The erl command now supports the -S flag, which is similar to the -run flag, except that it will pass all arguments up to end of the command line to the called function. (The -run flag will not pass arguments beginning with a hyphen.) Another difference is that -S will always call a function with one argument, passing an empty list if no arguments were given.

        Own Id: OTP-18744 Aux Id: PR-7470

      • When implementing an alternative carrier for the Erlang distribution, a separate input handler process may now be registered, using erlang:dist_ctrl_input_handler/2, also in the case when the distribution controller is a port.

        Own Id: OTP-18774 Aux Id: PR-7110

      • The call stack trace has now been added to the error reported by erlang:process_flag/2 when max_heap_size limit has been exceeded.

        Own Id: OTP-18779 Aux Id: PR-7592

      • -callback attributes have been added to erl_tracer.

        Own Id: OTP-18794 Aux Id: PR-7703

      • For inet_backend = socket, setting the active socket option alone, to once, true or N has been optimized, as well as the corresponding data delivery.

        Own Id: OTP-18835

      • New functions socket:sendv/* for sending I/O vectors have been added.

        Own Id: OTP-18845

      • Socket options that take string now also accept binaries.

        Own Id: OTP-18849 Aux Id: PR-6510

      • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

        There are also new APIs to support native coverage without using the cover tool.

        To instrument code for native coverage it must be compiled with the line_coverage option.

        To enable native coverage in the runtime system, start it like so:

        $ erl +JPcover true

        There are also the following new functions for supporting native coverage:

        Own Id: OTP-18856 Aux Id: PR-7856

      • Changed the default value of the command line flag -code_path_choice to strict.

        Note that for application systems using archives, it is necessary to add the code_path_choice relaxed to the command line that invokes erl.

        Own Id: OTP-18894 Aux Id: PR-7243

      • Added module loading to erl -init_debug printouts.

        Own Id: OTP-18929 Aux Id: PR-8004

      • When the runtime system halts, it performs various flush operations before terminating. By default there is no limit on how much time the flush operations are allowed to take. A new halt flush timeout functionality has been introduced which can be used for limiting the amount of time that the flushing operations are allowed to take. For more information see the documentation of the flush_timeout option of the erlang:halt/2 BIF and the documentation of the erl +zhft <Timeout> command line flag.

        Own Id: OTP-18938 Aux Id: PR-8035, GH-7438

      • Optimized code loading by moving certain operations from the code server to the caller.

        Own Id: OTP-18941 Aux Id: PR-7981

      • Updated asmjit to version a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d

        Own Id: OTP-18942

      • The deprecated functions in zlib have been removed. That includes inflateChunk/{1,2}, getBufSize/1, setBufSize/2, the CRC32 functions, and the Adler checksum functions.

        Own Id: OTP-18950

      • The documentation has been migrated to use Markdown and ExDoc.

        Own Id: OTP-18955 Aux Id: PR-8026

      • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

        Example:

        -record(rec, {a,b,c}).
         
        -update(#rec{a=needs_update,b=N}=R0) ->
        -    R = R0#rec{a=up_to_date},
        +update(#rec{a=needs_update,b=N}=R0) ->
        +    R = R0#rec{a=up_to_date},
             if
                 N < 0 ->
        -            R#rec{c=negative};
        +            R#rec{c=negative};
                 N == 0 ->
        -            R#rec{c=zero};
        +            R#rec{c=zero};
                 N > 0 ->
        -            R#rec{c=positive}
        +            R#rec{c=positive}
             end.

        The record updates in each of the three clauses of the if can safely be done in-place, because variable R is not used again.

        Own Id: OTP-18972 Aux Id: PR-8090

      • The obsolete and undocumented support for opening a port to an external resource by passing an atom (or a string) as first argument to open_port(), implemented by the vanilla driver, @@ -3126,9 +3126,9 @@

        has now been removed.

        * POTENTIAL INCOMPATIBILITY *

        Own Id: OTP-16329 Aux Id: OTP-15621

      • The return value when using the httph and httph_bin option to erlang:decode_packet/3 and inet:setopts/2 has been changed to also include the original header unmodified. See erlang:decode_packet/3. Example:

         >
        -      erlang:decode_packet(httph_bin,<<"HELLO:
        -      hi\r\n\r\n">>,[]).
        -      {ok,{http_header,0,<<"Hello">>,<<"HELLO">>,<<"hi">>},<<"\r\n">>}

        Own Id: OTP-16347 Aux Id: PR-2466

      • Ensure net_kernel:monitor_nodes/1 sends nodedown messages of a failed + erlang:decode_packet(httph_bin,<<"HELLO: + hi\r\n\r\n">>,[]). + {ok,{http_header,0,<<"Hello">>,<<"HELLO">>,<<"hi">>},<<"\r\n">>}

      Own Id: OTP-16347 Aux Id: PR-2466

    • Ensure net_kernel:monitor_nodes/1 sends nodedown messages of a failed connection before nodeup messages of a reestablished connection toward the same node.

      Own Id: OTP-16362

    • Update of sequential tracing to also support other information transfers than message passing.

      Own Id: OTP-16370 Aux Id: OTP-15251, OTP-15232

    • socket: It is now possible to create a socket from an already existing file @@ -10843,12 +10843,12 @@

      viewed as two operations performed atomically. Asynchronously send an unlink signal or a demonitor signal, and ignore any future results of the link or monitor.

      NOTE: This change can cause some obscure code to fail which previously did -not. For example, the following code might hang:

                  Mon = erlang:monitor(process, Pid),
      +not. For example, the following code might hang:

                  Mon = erlang:monitor(process, Pid),
                   %% ...
      -            exit(Pid, bang),
      -            erlang:demonitor(Mon),
      +            exit(Pid, bang),
      +            erlang:demonitor(Mon),
                   receive
      -                {'DOWN', Mon , process, Pid, _} -> ok
      +                {'DOWN', Mon , process, Pid, _} -> ok
                   %% We were previously guaranteed to get a down message
                   %% (since we exited the process ourself), so we could
                   %% in this case leave out:
      diff --git a/prs/9277/erts-15.2/doc/html/persistent_term.html b/prs/9277/erts-15.2/doc/html/persistent_term.html
      index d6c3123a3a52c..6746bf22609e1 100644
      --- a/prs/9277/erts-15.2/doc/html/persistent_term.html
      +++ b/prs/9277/erts-15.2/doc/html/persistent_term.html
      @@ -200,9 +200,9 @@ 

      The following example shows how lock contention for ETS tables can be minimized by having one ETS table for each scheduler. The table identifiers for the ETS tables are stored as a single persistent term:

          %% There is one ETS table for each scheduler.
      -    Sid = erlang:system_info(scheduler_id),
      -    Tid = element(Sid, persistent_term:get(?MODULE)),
      -    ets:update_counter(Tid, Key, 1).
      + Sid = erlang:system_info(scheduler_id), + Tid = element(Sid, persistent_term:get(?MODULE)), + ets:update_counter(Tid, Key, 1).

    diff --git a/prs/9277/erts-15.2/doc/html/supercarrier.html b/prs/9277/erts-15.2/doc/html/supercarrier.html index 7f0d507e90b54..73213648aa63a 100644 --- a/prs/9277/erts-15.2/doc/html/supercarrier.html +++ b/prs/9277/erts-15.2/doc/html/supercarrier.html @@ -229,12 +229,12 @@

    and free entire pages and we don't want to waste an entire page just to hold the block header of the following pages.

    Instead we store the meta information about all the free segments in a dedicated area apart from the sa and sua areas. Every free segment is -represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
    +represented by a descriptor struct (ErtsFreeSegDesc).

    typedef struct {
         RBTNode snode;      /* node in 'stree' */
         RBTNode anode;      /* node in 'atree' */
         char* start;
         char* end;
    -}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation +}ErtsFreeSegDesc;

    To find the smallest free segment that will satisfy a carrier allocation (best fit), the free segments are organized in a tree sorted by size (stree). We search in this tree at allocation. If no free segment of sufficient size was found, the area (sa or sua) is instead expanded. diff --git a/prs/9277/erts-15.2/doc/html/time_correction.html b/prs/9277/erts-15.2/doc/html/time_correction.html index cd5ea1fd4393c..8c0c1a9fdf215 100644 --- a/prs/9277/erts-15.2/doc/html/time_correction.html +++ b/prs/9277/erts-15.2/doc/html/time_correction.html @@ -564,9 +564,9 @@

    the event occurs.

    Do

    Determine the order of events by saving a tuple containing monotonic time and a strictly monotonically increasing integer as -follows:

    Time = erlang:monotonic_time(),
    -UMI = erlang:unique_integer([monotonic]),
    -EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system +follows:

    Time = erlang:monotonic_time(),
    +UMI = erlang:unique_integer([monotonic]),
    +EventTag = {Time, UMI}

    These tuples are strictly monotonically ordered on the current runtime system instance according to creation time. It is important that the monotonic time is in the first element (the most significant element when comparing two-tuples). Using the monotonic time in the tuples, you can calculate time diff --git a/prs/9277/erts-15.2/doc/html/tracing.html b/prs/9277/erts-15.2/doc/html/tracing.html index f3ac2762c20b8..79ddb27d25428 100644 --- a/prs/9277/erts-15.2/doc/html/tracing.html +++ b/prs/9277/erts-15.2/doc/html/tracing.html @@ -149,23 +149,23 @@

    to inspecting the stack we can only say where we're going to return to, which is not quite the same thing.

    As an illustration, when the caller option is enabled all trace messages from bar/1 will say that they were called from foo/0, even though it -went through a bunch of other functions on the way:

    foo() ->
    -    lots(),
    +went through a bunch of other functions on the way:

    foo() ->
    +    lots(),
         ok.
     
    -lots() ->
    -    'of'().
    +lots() ->
    +    'of'().
     
    -'of'() ->
    -    indirections().
    +'of'() ->
    +    indirections().
     
    -indirections() ->
    -    bar(10).
    +indirections() ->
    +    bar(10).
     
    -bar(0) ->
    +bar(0) ->
         done;
    -bar(N) ->
    -    bar(N - 1).

    +bar(N) -> + bar(N - 1).

    diff --git a/prs/9277/erts-15.2/doc/html/zlib.html b/prs/9277/erts-15.2/doc/html/zlib.html index 2cf03cc45ebac..fd725e54c3270 100644 --- a/prs/9277/erts-15.2/doc/html/zlib.html +++ b/prs/9277/erts-15.2/doc/html/zlib.html @@ -133,18 +133,18 @@

    data. The data format is described by RFC 1950, RFC 1951, and -RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    -ok = zlib:deflateInit(Z,default),
    +RFC 1952.

    A typical (compress) usage is as follows:

    Z = zlib:open(),
    +ok = zlib:deflateInit(Z,default),
     
    -Compress = fun(end_of_data, _Cont) -> [];
    -              (Data, Cont) ->
    -                 [zlib:deflate(Z, Data)|Cont(Read(),Cont)]
    +Compress = fun(end_of_data, _Cont) -> [];
    +              (Data, Cont) ->
    +                 [zlib:deflate(Z, Data)|Cont(Read(),Cont)]
                end,
    -Compressed = Compress(Read(),Compress),
    -Last = zlib:deflate(Z, [], finish),
    -ok = zlib:deflateEnd(Z),
    -zlib:close(Z),
    -list_to_binary([Compressed|Last])

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where +Compressed = Compress(Read(),Compress), +Last = zlib:deflate(Z, [], finish), +ok = zlib:deflateEnd(Z), +zlib:close(Z), +list_to_binary([Compressed|Last])

    In all functions errors, {'EXIT',{Reason,Backtrace}}, can be thrown, where Reason describes the error.

    Typical Reasons:

    • badarg - Bad argument.

    • not_initialized - The stream hasn't been initialized, eg. if inflateInit/1 wasn't called prior to a call to inflate/2.

    • not_on_controlling_process - The stream was used by a process that doesn't control it. Use set_controlling_process/2 if you need to transfer a @@ -853,11 +853,11 @@

      deflate(Z, Data, Flush)

      full too often can seriously degrade the compression.

      If Flush is set to finish, pending input is processed, pending output is flushed, and deflate/3 returns. Afterwards the only possible operations on the stream are deflateReset/1 or deflateEnd/1.

      Flush can be set to finish immediately after -deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      -B1 = zlib:deflate(Z,Data),
      -B2 = zlib:deflate(Z,<< >>,finish),
      -zlib:deflateEnd(Z),
      -list_to_binary([B1,B2])
      +deflateInit if all compression is to be done in one step.

      Example:

      zlib:deflateInit(Z),
      +B1 = zlib:deflate(Z,Data),
      +B2 = zlib:deflate(Z,<< >>,finish),
      +zlib:deflateEnd(Z),
      +list_to_binary([B1,B2])
      @@ -1409,20 +1409,20 @@

      inflateSetDictionary(Z, Dictionary)

      {'EXIT',{{need_dictionary,Adler},_StackTrace}} exception.

      The dictionary chosen by the compressor can be determined from the Adler value returned or thrown by the call to the inflate function. The compressor and decompressor must use the same dictionary (See deflateSetDictionary/2).

      After setting the dictionary the inflate operation should be retried without new -input.

      Example:

      deprecated_unpack(Z, Compressed, Dict) ->
      -     case catch zlib:inflate(Z, Compressed) of
      -          {'EXIT',{{need_dictionary,_DictID},_}} ->
      -                 ok = zlib:inflateSetDictionary(Z, Dict),
      -                 Uncompressed = zlib:inflate(Z, []);
      +input.

      Example:

      deprecated_unpack(Z, Compressed, Dict) ->
      +     case catch zlib:inflate(Z, Compressed) of
      +          {'EXIT',{{need_dictionary,_DictID},_}} ->
      +                 ok = zlib:inflateSetDictionary(Z, Dict),
      +                 Uncompressed = zlib:inflate(Z, []);
                 Uncompressed ->
                        Uncompressed
            end.
       
      -new_unpack(Z, Compressed, Dict) ->
      -    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
      -        {need_dictionary, _DictId, Output} ->
      -            ok = zlib:inflateSetDictionary(Z, Dict),
      -            [Output | zlib:inflate(Z, [])];
      +new_unpack(Z, Compressed, Dict) ->
      +    case zlib:inflate(Z, Compressed, [{exception_on_need_dict, false}]) of
      +        {need_dictionary, _DictId, Output} ->
      +            ok = zlib:inflateSetDictionary(Z, Dict),
      +            [Output | zlib:inflate(Z, [])];
               Uncompressed ->
                   Uncompressed
           end.
      @@ -1498,18 +1498,18 @@

      safeInflate(Z, Data)

      desired, and the function will return {finished, Output} once all queued data has been decompressed.

      This function can introduce some output latency (reading input without producing any output).

      If a preset dictionary is required for further decompression, this function -returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

      Example:

      walk(Compressed, Handler) ->
      -    Z = zlib:open(),
      -    zlib:inflateInit(Z),
      -    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
      -    zlib:inflateEnd(Z),
      -    zlib:close(Z).
      -
      -loop(Z, Handler, {continue, Output}) ->
      -    Handler(Output),
      -    loop(Z, Handler, zlib:safeInflate(Z, []));
      -loop(Z, Handler, {finished, Output}) ->
      -    Handler(Output).
      +returns a need_dictionary tuple. See inflateSetDictionary/2) for details.

      Example:

      walk(Compressed, Handler) ->
      +    Z = zlib:open(),
      +    zlib:inflateInit(Z),
      +    loop(Z, Handler, zlib:safeInflate(Z, Compressed)),
      +    zlib:inflateEnd(Z),
      +    zlib:close(Z).
      +
      +loop(Z, Handler, {continue, Output}) ->
      +    Handler(Output),
      +    loop(Z, Handler, zlib:safeInflate(Z, []));
      +loop(Z, Handler, {finished, Output}) ->
      +    Handler(Output).
      diff --git a/prs/9277/lib/asn1-5.3.1/doc/html/asn1.epub b/prs/9277/lib/asn1-5.3.1/doc/html/asn1.epub index b9575540b8d5d..7494abdbf1576 100644 Binary files a/prs/9277/lib/asn1-5.3.1/doc/html/asn1.epub and b/prs/9277/lib/asn1-5.3.1/doc/html/asn1.epub differ diff --git a/prs/9277/lib/asn1-5.3.1/doc/html/asn1_getting_started.html b/prs/9277/lib/asn1-5.3.1/doc/html/asn1_getting_started.html index a562909513b1f..bbbb61b51a157 100644 --- a/prs/9277/lib/asn1-5.3.1/doc/html/asn1_getting_started.html +++ b/prs/9277/lib/asn1-5.3.1/doc/html/asn1_getting_started.html @@ -143,37 +143,37 @@

      the syntax is correct and that the text represents proper ASN.1 code before generating an abstract syntax tree. The code generator then uses the abstract syntax tree to generate code.

      The generated Erlang files are placed in the current directory or in the -directory specified with option {outdir,Dir}.

      The compiler can be called from the Erlang shell like this:

      1> asn1ct:compile("People", [ber]).
      -ok

      Option verbose can be added to get information about the generated files:

      2> asn1ct:compile("People", [ber,verbose]).
      +directory specified with option {outdir,Dir}.

      The compiler can be called from the Erlang shell like this:

      1> asn1ct:compile("People", [ber]).
      +ok

      Option verbose can be added to get information about the generated files:

      2> asn1ct:compile("People", [ber,verbose]).
       Erlang ASN.1 compiling "People.asn"
      ---{generated,"People.asn1db"}--
      ---{generated,"People.hrl"}--
      ---{generated,"People.erl"}--
      +--{generated,"People.asn1db"}--
      +--{generated,"People.hrl"}--
      +--{generated,"People.erl"}--
       ok

      ASN.1 module People is now accepted and the abstract syntax tree is saved in file People.asn1db. The generated Erlang code is compiled using the Erlang compiler and loaded into the Erlang runtime system. There is now an API for -encode/2 and decode/2 in module People, which is called like this:

      'People':encode(<Type name>, <Value>)

      or:

      'People':decode(<Type name>, <Value>)

      Assume that there is a network application that receives instances of the ASN.1 +encode/2 and decode/2 in module People, which is called like this:

      'People':encode(<Type name>, <Value>)

      or:

      'People':decode(<Type name>, <Value>)

      Assume that there is a network application that receives instances of the ASN.1 defined type Person, modifies, and sends them back again:

      receive
      -   {Port,{data,Bytes}} ->
      -       case 'People':decode('Person',Bytes) of
      -           {ok,P} ->
      -               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
      -               Port ! {self(),{command,Answer}};
      -           {error,Reason} ->
      -               exit({error,Reason})
      +   {Port,{data,Bytes}} ->
      +       case 'People':decode('Person',Bytes) of
      +           {ok,P} ->
      +               {ok,Answer} = 'People':encode('Person',mk_answer(P)),
      +               Port ! {self(),{command,Answer}};
      +           {error,Reason} ->
      +               exit({error,Reason})
              end
           end,

      In this example, a series of bytes is received from an external source and the bytes are then decoded into a valid Erlang term. This was achieved with the call 'People':decode('Person',Bytes), which returned an Erlang value of the ASN.1 type Person. Then an answer was constructed and encoded using 'People':encode('Person',Answer), which takes an instance of a defined ASN.1 -type and transforms it to a binary according to the BER or PER encoding rules.

      The encoder and decoder can also be run from the shell:

      2> Rockstar = {'Person',"Some Name",roving,50}.
      -{'Person',"Some Name",roving,50}
      -3> {ok,Bin} = 'People':encode('Person',Rockstar).
      -{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
      -      2,1,50>>}
      -4> {ok,Person} = 'People':decode('Person',Bin).
      -{ok,{'Person',"Some Name",roving,50}}

      +type and transforms it to a binary according to the BER or PER encoding rules.

      The encoder and decoder can also be run from the shell:

      2> Rockstar = {'Person',"Some Name",roving,50}.
      +{'Person',"Some Name",roving,50}
      +3> {ok,Bin} = 'People':encode('Person',Rockstar).
      +{ok,<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,
      +      2,1,50>>}
      +4> {ok,Person} = 'People':decode('Person',Bin).
      +{ok,{'Person',"Some Name",roving,50}}

      @@ -271,16 +271,16 @@

      to manually add tags to certain constructs in order for the ASN.1 specification to be valid. Example of an old-style specification:

      Tags DEFINITIONS ::=
       BEGIN
      -  Afters ::= CHOICE { cheese [0] IA5String,
      -                      dessert [1] IA5String }
      +  Afters ::= CHOICE { cheese [0] IA5String,
      +                      dessert [1] IA5String }
       END

      Without the tags (the numbers in square brackets) the ASN.1 compiler refused to compile the file.

      In 1994 the global tagging mode AUTOMATIC TAGS was introduced. By putting AUTOMATIC TAGS in the module header, the ASN.1 compiler automatically adds tags when needed. The following is the same specification in AUTOMATIC TAGS mode:

      Tags DEFINITIONS AUTOMATIC TAGS ::=
       BEGIN
      -  Afters ::= CHOICE { cheese IA5String,
      -                      dessert IA5String }
      +  Afters ::= CHOICE { cheese IA5String,
      +                      dessert IA5String }
       END

      @@ -291,7 +291,7 @@

      and how values are assigned in Erlang.

      ASN.1 has both primitive and constructed types:

      Primitive TypesConstructed Types
      BOOLEANSEQUENCE
      INTEGERSET
      REALCHOICE
      NULLSET OF and SEQUENCE OF
      ENUMERATEDANY
      BIT STRINGANY DEFINED BY
      OCTET STRINGEXTERNAL
      Character StringsEMBEDDED PDV
      OBJECT IDENTIFIERCHARACTER STRING
      Object Descriptor
      TIME Types

      Table: Supported ASN.1 Types

      Note

      The values of each ASN.1 type have their own representation in Erlang, as described in the following sections. Users must provide these values for encoding according to the representation, as shown in the following example:

      Operational ::= BOOLEAN --ASN.1 definition

      In Erlang code it can look as follows:

      Val = true,
      -{ok,Bytes} = MyModule:encode('Operational', Val),

      +{ok,Bytes} = MyModule:encode('Operational', Val),

      @@ -308,11 +308,11 @@

      An ASN.1 INTEGER is represented by an integer in Erlang.

      The concept of subtyping can be applied to integers and to other ASN.1 types. The details of subtyping are not explained here; for more information, see X.680. Various syntaxes are allowed when defining a type as an integer:

      T1 ::= INTEGER
      -T2 ::= INTEGER (-2..7)
      -T3 ::= INTEGER (0..MAX)
      -T4 ::= INTEGER (0<..MAX)
      -T5 ::= INTEGER (MIN<..-99)
      -T6 ::= INTEGER {red(0),blue(1),white(2)}

      The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a +T2 ::= INTEGER (-2..7) +T3 ::= INTEGER (0..MAX) +T4 ::= INTEGER (0<..MAX) +T5 ::= INTEGER (MIN<..-99) +T6 ::= INTEGER {red(0),blue(1),white(2)}

    The Erlang representation of an ASN.1 INTEGER is an integer or an atom if a Named Number List (see T6 in the previous list) is specified.

    The following is an example of Erlang code that assigns values for the types in the previous list:

    T1value = 0,
     T2value = 6,
    @@ -359,7 +359,7 @@ 

    The type BIT STRING can be used to model information that is made up of arbitrary length series of bits. It is intended to be used for selection of flags, not for binary files.

    In ASN.1, BIT STRING definitions can look as follows:

    Bits1 ::= BIT STRING
    -Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

    The following two notations are available for representation of BIT STRING +Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}

    The following two notations are available for representation of BIT STRING values in Erlang and as input to the encode functions:

    1. A bitstring. By default, a BIT STRING with no symbolic names is decoded to an Erlang bitstring.
    2. A list of atoms corresponding to atoms in the NamedBitList in the BIT STRING definition. A BIT STRING with symbolic names is always decoded @@ -387,7 +387,7 @@

      OCTET STRING is the simplest of all ASN.1 types. OCTET STRING only moves or transfers, for example, binary files or other unstructured information complying with two rules: the bytes consist of octets and encoding is not required.

      It is possible to have the following ASN.1 type definitions:

      O1 ::= OCTET STRING
      -O2 ::= OCTET STRING (SIZE(28))

      With the following example assignments in Erlang:

      O1Val = <<17,13,19,20,0,0,255,254>>,
      +O2 ::= OCTET STRING (SIZE(28))

      With the following example assignments in Erlang:

      O1Val = <<17,13,19,20,0,0,255,254>>,
       O2Val = <<"must be exactly 28 chars....">>,

      By default, an OCTET STRING is always represented as an Erlang binary. If the specification has been compiled with option legacy_erlang_types, the encode functions accept both lists and binaries, and the decode functions decode an @@ -408,11 +408,11 @@

      of view, octets are very similar to character strings and are compiled in the same way.

      When PER is used, there is a significant difference in the encoding scheme for OCTET STRINGs and other strings. The constraints specified for a type -are especially important for PER, because they affect the encoding.

      Examples:

      Digs ::= NumericString (SIZE(1..3))
      -TextFile ::= IA5String (SIZE(0..64000))

      The corresponding Erlang assignments:

      DigsVal1 = "456",
      +are especially important for PER, because they affect the encoding.

      Examples:

      Digs ::= NumericString (SIZE(1..3))
      +TextFile ::= IA5String (SIZE(0..64000))

      The corresponding Erlang assignments:

      DigsVal1 = "456",
       DigsVal2 = "123",
       TextFileVal1 = "abc...xyz...",
      -TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

      The Erlang representation for BMPString and UniversalString is either a list +TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]

      The Erlang representation for BMPString and UniversalString is either a list of ASCII values or a list of quadruples. The quadruple representation associates to the Unicode standard representation of characters. The ASCII characters are all represented by quadruples beginning with three zeros like {0,0,0,65} for @@ -421,26 +421,26 @@

      in file PrimStrings.asn1:

      PrimStrings DEFINITIONS AUTOMATIC TAGS ::=
       BEGIN
          BMP ::= BMPString
      -END

      Encoding and decoding some strings:

      1> asn1ct:compile('PrimStrings', [ber]).
      +END

      Encoding and decoding some strings:

      1> asn1ct:compile('PrimStrings', [ber]).
       ok
      -2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]).
      -{ok,<<30,4,53,54,45,56>>}
      -3> 'PrimStrings':decode('BMP', Bytes1).
      -{ok,[{0,0,53,53},{0,0,45,56}]}
      -4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]).
      -{ok,<<30,4,53,53,0,65>>}
      -5> 'PrimStrings':decode('BMP', Bytes2).
      -{ok,[{0,0,53,53},65]}
      -6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string").
      -{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>}
      -7> 'PrimStrings':decode('BMP', Bytes3).
      -{ok,"BMP string"}

      Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such +2> {ok,Bytes1} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,45,56}]). +{ok,<<30,4,53,54,45,56>>} +3> 'PrimStrings':decode('BMP', Bytes1). +{ok,[{0,0,53,53},{0,0,45,56}]} +4> {ok,Bytes2} = 'PrimStrings':encode('BMP', [{0,0,53,53},{0,0,0,65}]). +{ok,<<30,4,53,53,0,65>>} +5> 'PrimStrings':decode('BMP', Bytes2). +{ok,[{0,0,53,53},65]} +6> {ok,Bytes3} = 'PrimStrings':encode('BMP', "BMP string"). +{ok,<<30,20,0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103>>} +7> 'PrimStrings':decode('BMP', Bytes3). +{ok,"BMP string"}

    Type UTF8String is represented as a UTF-8 encoded binary in Erlang. Such binaries can be created directly using the binary syntax or by converting from a list of Unicode code points using function unicode:characters_to_binary/1.

    The following shows examples of how UTF-8 encoded binaries can be created and manipulated:

    1> Gs = "Мой маленький Гном".
    -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    - 1081,32,1043,1085,1086,1084]
    -2> Gbin = unicode:characters_to_binary(Gs).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]
    +2> Gbin = unicode:characters_to_binary(Gs).
     <<208,156,208,190,208,185,32,208,188,208,176,208,187,208,
       181,208,189,209,140,208,186,208,184,208,185,32,208,147,
       208,...>>
    @@ -448,22 +448,22 @@ 

    <<208,156,208,190,208,185,32,208,188,208,176,208,187,208, 181,208,189,209,140,208,186,208,184,208,185,32,208,147, 208,...>> -4> Gs = unicode:characters_to_list(Gbin). -[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080, - 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
    +4> Gs = unicode:characters_to_list(Gbin).
    +[1052,1086,1081,32,1084,1072,1083,1077,1085,1100,1082,1080,
    + 1081,32,1043,1085,1086,1084]

    For details, see the unicode module in STDLIB.

    In the following example, this ASN.1 specification is used:

    UTF DEFINITIONS AUTOMATIC TAGS ::=
     BEGIN
        UTF ::= UTF8String
    -END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile('UTF', [ber]).
    +END

    Encoding and decoding a string with Unicode characters:

    5> asn1ct:compile('UTF', [ber]).
     ok
    -6> {ok,Bytes1} = 'UTF':encode('UTF', <<"Гном"/utf8>>).
    -{ok,<<12,8,208,147,208,189,208,190,208,188>>}
    -7> {ok,Bin1} = 'UTF':decode('UTF', Bytes1).
    -{ok,<<208,147,208,189,208,190,208,188>>}
    -8> io:format("~ts\n", [Bin1]).
    +6> {ok,Bytes1} = 'UTF':encode('UTF', <<"Гном"/utf8>>).
    +{ok,<<12,8,208,147,208,189,208,190,208,188>>}
    +7> {ok,Bin1} = 'UTF':decode('UTF', Bytes1).
    +{ok,<<208,147,208,189,208,190,208,188>>}
    +8> io:format("~ts\n", [Bin1]).
     Гном
     ok
    -9> unicode:characters_to_list(Bin1).
    -[1043,1085,1086,1084]

    +9> unicode:characters_to_list(Bin1). +[1043,1085,1086,1084]

    @@ -499,15 +499,15 @@

    The structured types of ASN.1 are constructed from other types in a manner similar to the concepts of arrays and structs in C.

    A SEQUENCE in ASN.1 is comparable with a struct in C and a record in Erlang. A -SEQUENCE can be defined as follows:

    Pdu ::= SEQUENCE {
    +SEQUENCE can be defined as follows:

    Pdu ::= SEQUENCE {
        a INTEGER,
        b REAL,
        c OBJECT IDENTIFIER,
    -   d NULL }

    This is a 4-component structure called Pdu. By default, a SEQUENCE is + d NULL }

    This is a 4-component structure called Pdu. By default, a SEQUENCE is represented by a record in Erlang. It can also be represented as a map; see Map representation for SEQUENCE and SET. For each SEQUENCE and SET in an ASN.1 module an Erlang record declaration is -generated. For Pdu, a record like the following is defined:

    -record('Pdu', {a, b, c, d}).

    The record declarations for a module M are placed in a separate M.hrl file.

    Values can be assigned in Erlang as follows:

    MyPdu = #'Pdu'{a=22,b=77.99,c={0,1,2,3,4},d='NULL'}.

    The decode functions return a record as result when decoding a SEQUENCE or a +generated. For Pdu, a record like the following is defined:

    -record('Pdu', {a, b, c, d}).

    The record declarations for a module M are placed in a separate M.hrl file.

    Values can be assigned in Erlang as follows:

    MyPdu = #'Pdu'{a=22,b=77.99,c={0,1,2,3,4},d='NULL'}.

    The decode functions return a record as result when decoding a SEQUENCE or a SET.

    A SEQUENCE and a SET can contain a component with a DEFAULT keyword followed by the actual value, which is the default value. The DEFAULT keyword means that the application doing the encoding can omit encoding of the value, @@ -532,21 +532,21 @@

    Seq3 ::= SEQUENCE { bs BIT STRING {a(0), b(1), c(2)} DEFAULT {a, c} } -END

    Example where the BER encoder is able to omit encoding of the default values:

    1> asn1ct:compile('File', [ber]).
    +END

    Example where the BER encoder is able to omit encoding of the default values:

    1> asn1ct:compile('File', [ber]).
     ok
    -2> 'File':encode('Seq1', {'Seq1',asn1_DEFAULT,asn1_DEFAULT}).
    -{ok,<<48,0>>}
    -3> 'File':encode('Seq1', {'Seq1',1,{'Seq2',true,15}}).
    -{ok,<<48,0>>}

    Example with a named BIT STRING where the BER encoder does not omit the -encoding:

    4> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
    -{ok,<<48,0>>}
    -5> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
    -{ok,<<48,4,128,2,5,160>>}

    The DER encoder omits the encoding for the same BIT STRING:

    6> asn1ct:compile('File', [ber,der]).
    +2> 'File':encode('Seq1', {'Seq1',asn1_DEFAULT,asn1_DEFAULT}).
    +{ok,<<48,0>>}
    +3> 'File':encode('Seq1', {'Seq1',1,{'Seq2',true,15}}).
    +{ok,<<48,0>>}

    Example with a named BIT STRING where the BER encoder does not omit the +encoding:

    4> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
    +{ok,<<48,0>>}
    +5> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
    +{ok,<<48,4,128,2,5,160>>}

    The DER encoder omits the encoding for the same BIT STRING:

    6> asn1ct:compile('File', [ber,der]).
     ok
    -7> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT).
    -{ok,<<48,0>>}
    -8> 'File':encode('Seq3', {'Seq3',<<16#101:3>>).
    -{ok,<<48,0>>}

    +7> 'File':encode('Seq3', {'Seq3',asn1_DEFAULT). +{ok,<<48,0>>} +8> 'File':encode('Seq3', {'Seq3',<<16#101:3>>). +{ok,<<48,0>>}

    @@ -582,14 +582,14 @@

    b BOOLEAN OPTIONAL, c IA5String } -END

    Optional fields are to be omitted from the map if they have no value:

    1> asn1ct:compile('File', [per,maps]).
    +END

    Optional fields are to be omitted from the map if they have no value:

    1> asn1ct:compile('File', [per,maps]).
     ok
    -2> {ok,E} = 'File':encode('Seq1', #{a=>0,c=>"string"}).
    -{ok,<<128,1,0,6,115,116,114,105,110,103>>}

    When decoding, optional fields will be omitted from the map:

    3> 'File':decode('Seq1', E).
    -{ok,#{a => 0,c => "string"}}

    Default values can be omitted from the map:

    4> {ok,E2} = 'File':encode('Seq1', #{c=>"string"}).
    -{ok,<<0,6,115,116,114,105,110,103>>}
    -5> 'File':decode('Seq1', E2).
    -{ok,#{a => 42,c => "string"}}

    Note

    It is not allowed to use the atoms asn1_VALUE and asn1_DEFAULT with maps.

    +2> {ok,E} = 'File':encode('Seq1', #{a=>0,c=>"string"}). +{ok,<<128,1,0,6,115,116,114,105,110,103>>}

    When decoding, optional fields will be omitted from the map:

    3> 'File':decode('Seq1', E).
    +{ok,#{a => 0,c => "string"}}

    Default values can be omitted from the map:

    4> {ok,E2} = 'File':encode('Seq1', #{c=>"string"}).
    +{ok,<<0,6,115,116,114,105,110,103>>}
    +5> 'File':decode('Seq1', E2).
    +{ok,#{a => 42,c => "string"}}

    Note

    It is not allowed to use the atoms asn1_VALUE and asn1_DEFAULT with maps.

    @@ -602,8 +602,8 @@

    x REAL, y INTEGER, z OBJECT IDENTIFIER } -END

    It is then possible to assign values as follows:

    TVal1 = {y,17},
    -TVal2 = {z,{0,1,2}},

    A CHOICE value is always represented as the tuple {ChoiceAlternative, Val} +END

    It is then possible to assign values as follows:

    TVal1 = {y,17},
    +TVal2 = {z,{0,1,2}},

    A CHOICE value is always represented as the tuple {ChoiceAlternative, Val} where ChoiceAlternative is an atom denoting the selected choice alternative.

    Extensible CHOICE

    When a CHOICE contains an extension marker and the decoder detects an unknown alternative of the CHOICE, the value is represented as follows:

    {asn1_ExtAlt, BytesForOpenType}

    Here BytesForOpenType is a list of bytes constituting the encoding of the "unknown" CHOICE alternative.

    @@ -669,8 +669,8 @@

    x REAL, y INTEGER, z OBJECT IDENTIFIER } - END

    SEQUENCE b can be encoded as follows in Erlang:

    1> 'EmbeddedExample':encode('B', {'B',[4,5,6,7,8],{x,"7.77"}}).
    -{ok,<<5,56,0,8,3,55,55,55,46,69,45,50>>}

    + END

    SEQUENCE b can be encoded as follows in Erlang:

    1> 'EmbeddedExample':encode('B', {'B',[4,5,6,7,8],{x,"7.77"}}).
    +{ok,<<5,56,0,8,3,55,55,55,46,69,45,50>>}

    @@ -696,10 +696,10 @@

    a INTEGER, b FooType } } -FooType ::= [3] VisibleString

    The following records are generated because of type Emb:

    -record('Emb,{a, b, c}).
    --record('Emb_b',{a, b = asn1_DEFAULT}). % the embedded SET type

    Values of type Emb can be assigned as follows:

    V = #'Emb'{a=["qqqq",[1,2,255]],
    -           b = #'Emb_b'{a=99},
    -           c ={b,"Can you see this"}}.

    For an embedded type of type SEQUENCE/SET in a SEQUENCE/SET, the record +FooType ::= [3] VisibleString

    The following records are generated because of type Emb:

    -record('Emb,{a, b, c}).
    +-record('Emb_b',{a, b = asn1_DEFAULT}). % the embedded SET type

    Values of type Emb can be assigned as follows:

    V = #'Emb'{a=["qqqq",[1,2,255]],
    +           b = #'Emb_b'{a=99},
    +           c ={b,"Can you see this"}}.

    For an embedded type of type SEQUENCE/SET in a SEQUENCE/SET, the record name is extended with an underscore and the component name. If the embedded structure is deeper with the SEQUENCE, SET, or CHOICE types in the line, each component name/alternative name is added to the record name.

    Example:

    Seq ::= SEQUENCE{
    @@ -708,7 +708,7 @@ 

    c INTEGER } } -}

    This results in the following record:

    -record('Seq_a_b',{c}).

    If the structured type has a component with an embedded SEQUENCE OF/SET OF +}

    This results in the following record:

    -record('Seq_a_b',{c}).

    If the structured type has a component with an embedded SEQUENCE OF/SET OF which embedded type in turn is a SEQUENCE/SET, it gives a record with the SEQUENCE OF/SET OF addition as in the following example:

    Seq ::= SEQUENCE {
         a SEQUENCE OF SEQUENCE {
    @@ -717,8 +717,8 @@ 

    c SET OF SEQUENCE { d } -}

    This results in the following records:

    -record('Seq_a_SEQOF'{b}).
    --record('Seq_c_SETOF'{d}).

    A parameterized type is to be considered as an embedded type. Each time such a +}

    This results in the following records:

    -record('Seq_a_SEQOF'{b}).
    +-record('Seq_c_SETOF'{d}).

    A parameterized type is to be considered as an embedded type. Each time such a type is referenced, an instance of it is defined. Thus, in the following example a record with name 'Seq_b' is generated in the .hrl file and is used to hold values:

    Seq ::= SEQUENCE {
    @@ -733,15 +733,15 @@ 

    Recursive Types

    -

    Types that refer to themselves are called recursive types. Example:

    Rec ::= CHOICE {
    +

    Types that refer to themselves are called recursive types. Example:

    Rec ::= CHOICE {
          nothing NULL,
    -     something SEQUENCE {
    +     something SEQUENCE {
               a INTEGER,
               b OCTET STRING,
    -          c Rec }}

    This is allowed in ASN.1 and the ASN.1-to-Erlang compiler supports this -recursive type. A value for this type is assigned in Erlang as follows:

    V = {something,#'Rec_something'{a = 77,
    +          c Rec }}

    This is allowed in ASN.1 and the ASN.1-to-Erlang compiler supports this +recursive type. A value for this type is assigned in Erlang as follows:

    V = {something,#'Rec_something'{a = 77,
                                     b = "some octets here",
    -                                c = {nothing,'NULL'}}}.

    + c = {nothing,'NULL'}}}.

    @@ -750,22 +750,22 @@

    Values can be assigned to an ASN.1 type within the ASN.1 code itself, as opposed to the actions in the previous section where a value was assigned to an ASN.1 type in Erlang. The full value syntax of ASN.1 is supported and X.680 describes -in detail how to assign values in ASN.1. A short example:

    TT ::= SEQUENCE {
    +in detail how to assign values in ASN.1. A short example:

    TT ::= SEQUENCE {
        a INTEGER,
    -   b SET OF OCTET STRING }
    +   b SET OF OCTET STRING }
     
    -tt TT ::= {a 77,b {"kalle","kula"}}

    The value defined here can be used in several ways. It can, for example, be used +tt TT ::= {a 77,b {"kalle","kula"}}

    The value defined here can be used in several ways. It can, for example, be used as the value in some DEFAULT component:

    SS ::= SET {
         s OBJECT IDENTIFIER,
         val TT DEFAULT tt }

    It can also be used from inside an Erlang program. If this ASN.1 code is defined in ASN.1 module Values, the ASN.1 value tt can be reached from Erlang as a -function call to 'Values':tt() as in the following example:

    1> Val = 'Values':tt().
    -{'TT',77,["kalle","kula"]}
    -2> {ok,Bytes} = 'Values':encode('TT',Val).
    -{ok,<<48,18,128,1,77,161,13,4,5,107,97,108,108,101,4,4,
    -      107,117,108,97>>}
    -4> 'Values':decode('TT',Bytes).
    -{ok,{'TT',77,["kalle","kula"]}}
    +function call to 'Values':tt() as in the following example:

    1> Val = 'Values':tt().
    +{'TT',77,["kalle","kula"]}
    +2> {ok,Bytes} = 'Values':encode('TT',Val).
    +{ok,<<48,18,128,1,77,161,13,4,5,107,97,108,108,101,4,4,
    +      107,117,108,97>>}
    +4> 'Values':decode('TT',Bytes).
    +{ok,{'TT',77,["kalle","kula"]}}
     5>

    This example shows that a function is generated by the compiler that returns a valid Erlang representation of the value, although the value is of a complex type.

    Furthermore, if the option maps is not used, a macro is generated for each @@ -818,10 +818,10 @@

    object1 | object2}

    You cannot encode a class, object, or object set, only refer to it when defining other ASN.1 entities. Typically you refer to a class as well as to object sets by table constraints and component relation constraints (X.682) in ASN.1 types, -as in the following:

    StartMessage  ::= SEQUENCE {
    -    msgId  GENERAL-PROCEDURE.&id  ({GENERAL-PROCEDURES}),
    -    content GENERAL-PROCEDURE.&Message ({GENERAL-PROCEDURES}{@msgId}),
    -    }

    In type StartMessage, the constraint following field content tells that in a +as in the following:

    StartMessage  ::= SEQUENCE {
    +    msgId  GENERAL-PROCEDURE.&id  ({GENERAL-PROCEDURES}),
    +    content GENERAL-PROCEDURE.&Message ({GENERAL-PROCEDURES}{@msgId}),
    +    }

    In type StartMessage, the constraint following field content tells that in a value of type StartMessage the value in field content must come from the same object that is chosen by field msgId.

    So, the value #'StartMessage'{msgId="home",content="Any Printable String"} is legal to encode as a StartMessage value. However, the value diff --git a/prs/9277/lib/asn1-5.3.1/doc/html/asn1_spec.html b/prs/9277/lib/asn1-5.3.1/doc/html/asn1_spec.html index bac992c768394..70786217ff75f 100644 --- a/prs/9277/lib/asn1-5.3.1/doc/html/asn1_spec.html +++ b/prs/9277/lib/asn1-5.3.1/doc/html/asn1_spec.html @@ -165,37 +165,37 @@

    exclusive decode is enabled. This function decodes the parts that were left undecoded during the exclusive decode.

    Both functions are described in the following.

    If the exclusive decode function has, for example, the name decode_exclusive and an ASN.1 encoded message Bin is to be exclusive decoded, the call is as -follows:

    {ok,ExclMessage} = 'MyModule':decode_exclusive(Bin)

    The result ExclMessage has the same structure as a +follows:

    {ok,ExclMessage} = 'MyModule':decode_exclusive(Bin)

    The result ExclMessage has the same structure as a complete decode would have, except for the parts of the top type that were not decoded. The undecoded parts are on their places in the structure on format {TypeKey,UndecodedValue}.

    Each undecoded part that is to be decoded must be fed into function -decode_part/2 as follows:

    {ok,PartMessage} = 'MyModule':decode_part(TypeKey, UndecodedValue)

    +decode_part/2 as follows:

    {ok,PartMessage} = 'MyModule':decode_part(TypeKey, UndecodedValue)

    Writing an Exclusive Decode Instruction

    -

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
    +

    This instruction is written in the configuration file in the following format:

    ExclusiveDecodeInstruction = {exclusive_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {ExclusiveDecodeFunctionName,TypeList}
     
    -ExclusiveDecodeFunctionName = atom()
    +ExclusiveDecodeFunctionName = atom()
     
    -TypeList = [TopType,ElementList]
    +TypeList = [TopType,ElementList]
     
    -ElementList = [Element]+
    +ElementList = [Element]+
     
    -Element = {Name,parts} |
    -          {Name,undecoded} |
    -          {Name,ElementList}
    +Element = {Name,parts} |
    +          {Name,undecoded} |
    +          {Name,ElementList}
     
    -TopType = atom()
    +TopType = atom()
     
    -Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is +Name = atom()

    The instruction must be a valid Erlang term terminated by a dot.

    In TypeList the path from the top type to each undecoded subcomponent is described. TopType is the name of a top-level type in the ASN.1 specification. The action for each component in ElementList is described by one of:

    • {Name,parts}
    • {Name,undecoded}
    • {Name,ElementList}

    The use and effect of the actions are as follows:

    • {Name,undecoded} - Leaves the element undecoded. The type of Name can be any ASN.1 type. The value of element Name is returned as a tuple (as @@ -261,78 +261,78 @@

      ['Button',[{number,undecoded}]]}]}}.

    The following figure shows the bytes of a Window:status message. The components buttonList and actions are excluded from decode. Only state and enabled are decoded when decode__Window_exclusive is called.

    Bytes of a Window:status Message

    Here follows an example of how the module. Note that option no_ok_wrapper is -used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
    +used to make the example more concise.

    1> asn1ct:compile('GUI', [ber,asn1config,no_ok_wrapper]).
     ok
    -2> rr('GUI').
    -['Action','Button','Status']
    -3> ButtonMsg = #'Button'{number=123,on=true}.
    -#'Button'{number = 123,on = true}
    -4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
    +2> rr('GUI').
    +['Action','Button','Status']
    +3> ButtonMsg = #'Button'{number=123,on=true}.
    +#'Button'{number = 123,on = true}
    +4> ButtonBytes = 'GUI':encode('Button', ButtonMsg).
     <<48,6,128,1,123,129,1,255>>
    -5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    -#'Button'{number = {'Button_number',<<128,1,123>>},
    -          on = true}
    -6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    -{'Button_number',<<128,1,123>>}
    -7> 'GUI':decode_part(UndecKey, UndecBytes).
    +5> ExclusiveMsgButton = 'GUI':decode_Button_exclusive(ButtonBytes).
    +#'Button'{number = {'Button_number',<<128,1,123>>},
    +          on = true}
    +6> {UndecKey,UndecBytes} = ExclusiveMsgButton#'Button'.number.
    +{'Button_number',<<128,1,123>>}
    +7> 'GUI':decode_part(UndecKey, UndecBytes).
     123
     8> WindowMsg =
    -{status,{'Status',35,
    -   [{'Button',3,true},
    -    {'Button',4,false},
    -    {'Button',5,true},
    -    {'Button',6,true},
    -    {'Button',7,false}],
    +{status,{'Status',35,
    +   [{'Button',3,true},
    +    {'Button',4,false},
    +    {'Button',5,true},
    +    {'Button',6,true},
    +    {'Button',7,false}],
        false,
    -   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    -{status,#'Status'{state = 35,
    -        buttonList = [#'Button'{number = 3,on = true},
    -                      #'Button'{number = 4,on = false},
    -                      #'Button'{number = 5,on = true},
    -                      #'Button'{number = 6,on = true},
    -                      #'Button'{number = 7,on = false}],
    +   {possibleActions,[{'Action',16,{'Button',17,true}}]}}}.
    +{status,#'Status'{state = 35,
    +        buttonList = [#'Button'{number = 3,on = true},
    +                      #'Button'{number = 4,on = false},
    +                      #'Button'{number = 5,on = true},
    +                      #'Button'{number = 6,on = true},
    +                      #'Button'{number = 7,on = false}],
             enabled = false,
    -        actions = {possibleActions,[#'Action'{number = 16,
    -                                              handle = #'Button'{number = 17,on = true}}]}}}
    -9> WindowBytes = 'GUI':encode('Window', WindowMsg).
    +        actions = {possibleActions,[#'Action'{number = 16,
    +                                              handle = #'Button'{number = 17,on = true}}]}}}
    +9> WindowBytes = 'GUI':encode('Window', WindowMsg).
     <<161,65,128,1,35,161,40,48,6,128,1,3,129,1,255,48,6,128,
       1,4,129,1,0,48,6,128,1,5,129,...>>
    -10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    -'GUI':decode_Window_exclusive(WindowBytes).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +10> {status,#'Status'{buttonList={UndecWindowKey,UndecWindowParts}}} =
    +'GUI':decode_Window_exclusive(WindowBytes).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
                                                            255>>,
                                                          <<48,6,128,1,4,129,1,0>>,
                                                          <<48,6,128,1,5,129,1,255>>,
                                                          <<48,6,128,1,6,129,1,255>>,
    -                                                     <<48,6,128,1,7,129,1,0>>]},
    +                                                     <<48,6,128,1,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    -[#'Button'{number = 3,on = true},
    - #'Button'{number = 4,on = false},
    - #'Button'{number = 5,on = true},
    - #'Button'{number = 6,on = true},
    - #'Button'{number = 7,on = false}]
    -12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    -#'Button'{number = 3,on = true}
    -13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    -{status,#'Status'{state = 35,
    -                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
    +                                                1,255>>}}}
    +11> 'GUI':decode_part(UndecWindowKey, UndecWindowParts).
    +[#'Button'{number = 3,on = true},
    + #'Button'{number = 4,on = false},
    + #'Button'{number = 5,on = true},
    + #'Button'{number = 6,on = true},
    + #'Button'{number = 7,on = false}]
    +12> 'GUI':decode_part(UndecWindowKey, hd(UndecWindowParts)).
    +#'Button'{number = 3,on = true}
    +13> {status,#'Status'{actions={ChoiceKey,ChoiceUndec}}} = v(10).
    +{status,#'Status'{state = 35,
    +                  buttonList = {'Status_buttonList',[<<48,6,128,1,3,129,1,
                                                            255>>,
                                                          <<48,6,128,1,4,129,1,0>>,
                                                          <<48,6,128,1,5,129,1,255>>,
                                                          <<48,6,128,1,6,129,1,255>>,
    -                                                     <<48,6,128,1,7,129,1,0>>]},
    +                                                     <<48,6,128,1,7,129,1,0>>]},
                       enabled = false,
    -                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
    +                  actions = {'Status_actions',<<163,15,160,13,48,11,128,
                                                     1,16,161,6,128,1,17,129,
    -                                                1,255>>}}}
    -14> 'GUI':decode_part(ChoiceKey, ChoiceUndec).
    -{possibleActions,[#'Action'{number = 16,
    -                            handle = #'Button'{number = 17,on = true}}]}

    + 1,255>>}}} +14> 'GUI':decode_part(ChoiceKey, ChoiceUndec). +{possibleActions,[#'Action'{number = 16, + handle = #'Button'{number = 17,on = true}}]}

    @@ -369,23 +369,23 @@

    Writing a Selective Decode Instruction

    One or more selective decode functions can be described in a configuration file. -Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
    +Use the following notation:

    SelectiveDecodeInstruction = {selective_decode,{ModuleName,DecodeInstructions}}.
     
    -ModuleName = atom()
    +ModuleName = atom()
     
    -DecodeInstructions = [DecodeInstruction]+
    +DecodeInstructions = [DecodeInstruction]+
     
    -DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
    +DecodeInstruction = {SelectiveDecodeFunctionName,TypeList}
     
    -SelectiveDecodeFunctionName = atom()
    +SelectiveDecodeFunctionName = atom()
     
    -TypeList = [TopType|ElementList]
    +TypeList = [TopType|ElementList]
     
     ElementList = Name|ListSelector
     
    -Name = atom()
    +Name = atom()
     
    -ListSelector = [integer()]

    The instruction must be a valid Erlang term terminated by a dot.

    • ModuleName is the same as the name of the ASN.1 specification, but without +ListSelector = [integer()]

    The instruction must be a valid Erlang term terminated by a dot.

    The default StatisticsSpec is:

    • For sequential commands:

      [{"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    • For parallel commands:

      [{"Distribution sequential/parallel", fun sequential_parallel/1},
      + {"Function calls", fun cmnd_names/1},
      + {"Length of command sequences", fun print_frequency_ranges/0,
      +                                                  fun num_calls/1}]
    diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/ct_property_test_chapter.html b/prs/9277/lib/common_test-1.27.5/doc/html/ct_property_test_chapter.html index 6276730749be3..cef17803b91a3 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/ct_property_test_chapter.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/ct_property_test_chapter.html @@ -147,51 +147,51 @@

    Introductory Example

    Assume that we want to test the lists:sort/1 function.

    We need a property to test the function. In normal way, we create -property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    --export([prop_sort/0]).
    +property_test/ct_prop.erl module in the test directory in our application:

    -module(ct_prop).
    +-export([prop_sort/0]).
     
     %%% This will include the .hrl file for the installed testing tool:
    --include_lib("common_test/include/ct_property_test.hrl").
    +-include_lib("common_test/include/ct_property_test.hrl").
     
     %%% The property we want to check:
     %%%   For all possibly unsorted lists,
     %%%   the result of lists:sort/1 is sorted.
    -prop_sort() ->
    -    ?FORALL(UnSorted, list(),
    -            is_sorted(lists:sort(UnSorted))
    -           ).
    +prop_sort() ->
    +    ?FORALL(UnSorted, list(),
    +            is_sorted(lists:sort(UnSorted))
    +           ).
     
     %%% Function to check that a list is sorted:
    -is_sorted([]) ->
    +is_sorted([]) ->
         true;
    -is_sorted([_]) ->
    +is_sorted([_]) ->
         true;
    -is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    -    is_sorted([H2|SortedTail]);
    -is_sorted(_) ->
    -    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    --compile(export_all). % Only in tests!
    +is_sorted([H1,H2|SortedTail]) when H1 =< H2 ->
    +    is_sorted([H2|SortedTail]);
    +is_sorted(_) ->
    +    false.

    We also need a CommonTest test suite:

    -module(ct_property_test_SUITE).
    +-compile(export_all). % Only in tests!
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
    -all() -> [prop_sort
    -         ].
    +all() -> [prop_sort
    +         ].
     
     %%% First prepare Config and compile the property tests for the found tool:
    -init_per_suite(Config) ->
    -    ct_property_test:init_per_suite(Config).
    +init_per_suite(Config) ->
    +    ct_property_test:init_per_suite(Config).
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         Config.
     
     %%%================================================================
     %%% Test suites
     %%%
    -prop_sort(Config) ->
    -    ct_property_test:quickcheck(
    -      ct_prop:prop_sort(),
    +prop_sort(Config) ->
    +    ct_property_test:quickcheck(
    +      ct_prop:prop_sort(),
           Config
    -     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
    +     ).

    We run it as usual, for example with ct_run in the OS shell:

    ..../test$ ct_run -suite ct_property_test_SUITE
     .....
     Common Test: Running make in test directories...
     
    @@ -221,13 +221,13 @@ 

    A stateful testing example

    Assume a test that generates some parallel stateful commands, and runs 300 -tests:

    prop_parallel(Config) ->
    -    numtests(300,
    -             ?FORALL(Cmds, parallel_commands(?MODULE),
    +tests:

    prop_parallel(Config) ->
    +    numtests(300,
    +             ?FORALL(Cmds, parallel_commands(?MODULE),
                          begin
    -                         RunResult = run_parallel_commands(?MODULE, Cmds),
    -                         ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
    -                     end)).

    The ct_property_test:present_result/4 is a help function for printing some + RunResult = run_parallel_commands(?MODULE, Cmds), + ct_property_test:present_result(?MODULE, Cmds, RunResult, Config) + end)).

    The ct_property_test:present_result/4 is a help function for printing some statistics in the CommonTest log file.

    Our example test could for example be a simple test of an ftp server, where we perform get, put and delete requests, some of them in parallel. Per default, the result has three sections:

    *** User 2019-12-11 13:28:17.504 ***
    diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/ct_run_cmd.html b/prs/9277/lib/common_test-1.27.5/doc/html/ct_run_cmd.html
    index d3ea0260a9ab9..c20eff9a15e0b 100644
    --- a/prs/9277/lib/common_test-1.27.5/doc/html/ct_run_cmd.html
    +++ b/prs/9277/lib/common_test-1.27.5/doc/html/ct_run_cmd.html
    @@ -251,10 +251,10 @@ 

    Run Common Test in Interactive Mode

     ct_run -shell
    -  [-config ConfigFile1 ConfigFile2 ... ConfigFileN]
    -  [-userconfig CallbackModule1 ConfigString1 and CallbackModule2
    -   ConfigString2 and .. and CallbackModuleN ConfigStringN]
    -  [-decrypt_key Key] | [-decrypt_file KeyFile]

    + [-config ConfigFile1 ConfigFile2 ... ConfigFileN] + [-userconfig CallbackModule1 ConfigString1 and CallbackModule2 + ConfigString2 and .. and CallbackModuleN ConfigStringN] + [-decrypt_key Key] | [-decrypt_file KeyFile]

    diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/ct_snmp.html b/prs/9277/lib/common_test-1.27.5/doc/html/ct_snmp.html index 1d027457fddd3..846ca9742a691 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/ct_snmp.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/ct_snmp.html @@ -150,15 +150,15 @@

    Optional.

  • {agent_target_param_def, [term()] | {data_dir_file, rel_path()}} - Optional.

  • Parameter MgrAgentConfName in the functions is to be a name you allocate in your test suite using a require statement. Example (where -MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be +MgrAgentConfName = snmp_mgr_agent):

    suite() -> [{require, snmp_mgr_agent, snmp}].

    or

    ct:require(snmp_mgr_agent, snmp).

    Notice that USM users are needed for SNMPv3 configuration and are not to be confused with users.

    SNMP traps, inform, and report messages are handled by the user callback module. For details, see the SNMP application.

    It is recommended to use the .hrl files created by the Erlang/OTP MIB compiler to define the Object Identifiers (OIDs). For example, to get the Erlang node -name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, +name from erlNodeTable in the OTP-MIB:

    Oid = ?erlNodeEntry ++ [?erlNodeName, 1]

    Furthermore, values can be set for SNMP application configuration parameters, config, server, net_if, and so on (for a list of valid parameters and types, see the User's Guide for the SNMP application). -This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    -            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the +This is done by defining a configuration data variable on the following form:

    {snmp_app, [{manager, [snmp_app_manager_params()]},
    +            {agent, [snmp_app_agent_params()]}]}.

    A name for the data must be allocated in the suite using require (see the example above). Pass this name as argument SnmpAppConfName to ct_snmp:start/3. ct_snmp specifies default values for some SNMP application configuration parameters (such as {verbosity,trace} for diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/ct_ssh.html b/prs/9277/lib/common_test-1.27.5/doc/html/ct_ssh.html index 3b8d8513e19b9..401e9ab3fa51d 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/ct_ssh.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/ct_ssh.html @@ -133,14 +133,14 @@

    that have been started on existing SSH connections (that is, when the original connection type is ssh). Whenever the connection type is sftp, use the SSH connection reference only.

    The following options are valid for specifying an SSH/SFTP connection (that is, -can be used as configuration elements):

    [{ConnType, Addr},
    - {port, Port},
    - {user, UserName}
    - {password, Pwd}
    - {user_dir, String}
    - {public_key_alg, PubKeyAlg}
    - {connect_timeout, Timeout}
    - {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    +can be used as configuration elements):

    [{ConnType, Addr},
    + {port, Port},
    + {user, UserName}
    + {password, Pwd}
    + {user_dir, String}
    + {public_key_alg, PubKeyAlg}
    + {connect_timeout, Timeout}
    + {key_cb, KeyCallbackMod}]

    ConnType = ssh | sftp.

    For other types, see ssh.

    All time-out parameters in ct_ssh functions are values in milliseconds.

    diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/ct_telnet.html b/prs/9277/lib/common_test-1.27.5/doc/html/ct_telnet.html index 1cb8916bead8e..2e87c64a4c3b3 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/ct_telnet.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/ct_telnet.html @@ -136,14 +136,14 @@

    true
  • Polling limit (max number of times to poll to get a remaining string terminated) = 0
  • Polling interval (sleep time between polls) = 1 second
  • The TCP_NODELAY option for the telnet socket is disabled (set to false) per default
  • These parameters can be modified by the user with the following configuration -term:

    {telnet_settings, [{connect_timeout,Millisec},
    -                   {command_timeout,Millisec},
    -                   {reconnection_attempts,N},
    -                   {reconnection_interval,Millisec},
    -                   {keep_alive,Bool},
    -                   {poll_limit,N},
    -                   {poll_interval,Millisec},
    -                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test +term:

    {telnet_settings, [{connect_timeout,Millisec},
    +                   {command_timeout,Millisec},
    +                   {reconnection_attempts,N},
    +                   {reconnection_interval,Millisec},
    +                   {keep_alive,Bool},
    +                   {poll_limit,N},
    +                   {poll_interval,Millisec},
    +                   {tcp_nodelay,Bool}]}.

    Millisec = integer(), N = integer()

    Enter the telnet_settings term in a configuration file included in the test and ct_telnet retrieves the information automatically.

    keep_alive can be specified per connection, if necessary. For details, see unix_telnet.

    @@ -158,8 +158,8 @@

    such as expect/3. However, ct_telnet can be configured to use a special purpose event handler, implemented in ct_conn_log_h, for logging all Telnet traffic. To use this handler, install a Common Test hook named -cth_conn_log. Example (using the test suite information function):

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection +cth_conn_log. Example (using the test suite information function):

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, [{conn_mod(),hook_options()}]}]}].

    conn_mod() is the name of the Common Test module implementing the connection protocol, that is, ct_telnet.

    The cth_conn_log hook performs unformatted logging of Telnet data to a separate text file. All Telnet communication is captured and printed, including any data sent from the server. The link to this text file is located at the top @@ -176,15 +176,15 @@

    disabled, which results with no prefix data. If the value is set to full prefix contains timestamp and additonal information. If the value is set to short prefix includes only human readable timestamp.

    All cth_conn_log hook options described can also be specified in a -configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    -                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook +configuration file with configuration variable ct_conn_log.

    Example:

    {ct_conn_log, [{ct_telnet,[{log_type,raw},
    +                           {hosts,[key_or_name()]}]}]}

    Note

    Hook options specified in a configuration file overwrite any hard-coded hook options in the test suite.

    Logging Example:

    The following ct_hooks statement causes printing of Telnet traffic to separate logs for the connections server1 and server2. Traffic for any other -connections is logged in the default Telnet log.

    suite() ->
    -    [{ct_hooks,
    -      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry -like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    -    [{ct_hooks, [{cth_conn_log, []}]}].

    +connections is logged in the default Telnet log.

    suite() ->
    +    [{ct_hooks,
    +      [{cth_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}]}].

    As previously explained, this specification can also be provided by an entry +like the following in a configuration file:

    {ct_conn_log, [{ct_telnet,[{hosts,[server1,server2]}]}]}.

    In this case the ct_hooks statement in the test suite can look as follows:

    suite() ->
    +    [{ct_hooks, [{cth_conn_log, []}]}].

    @@ -893,9 +893,9 @@

    expect(Connection, Patterns, Opts)

    instead of only one Match. Also HaltReason is returned.

  • sequence - All patterns must be matched in a sequence. A match is not concluded until all patterns are matched. This option can be interrupted by one or more HaltPatterns. MatchList is always returned, that is, a list of -Match instead of only one Match. Also HaltReason is returned.

  • Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the +Match instead of only one Match. Also HaltReason is returned.

    Example 1:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[sequence,{halt,[{nnn,"NNN"}]}])

    First this tries to match "ABC", and then "XYZ", but if "NNN" appears, the function returns {error,{nnn,["NNN"]}}. If both "ABC" and "XYZ" are -matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function +matched, the function returns {ok,[AbcMatch,XyzMatch]}.

    Example 2:

    expect(Connection,[{abc,"ABC"},{xyz,"XYZ"}],[{repeat,2},{halt,[{nnn,"NNN"}]}])

    This tries to match "ABC" or "XYZ" twice. If "NNN" appears, the function returns HaltReason = {nnn,["NNN"]}.

    Options repeat and sequence can be combined to match a sequence multiple times.

    diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/dependencies_chapter.html b/prs/9277/lib/common_test-1.27.5/doc/html/dependencies_chapter.html index dceecffdbb117..70b91cc945a5d 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/dependencies_chapter.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/dependencies_chapter.html @@ -161,65 +161,65 @@

    start and stop functionality separately.) The configuration can also be implemented as a common function, maybe grouped with the start function. Finally, the testing of connecting and disconnecting a client can be grouped -into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +into one test case. The resulting suite can look as follows:

    -module(my_server_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -suite() -> [{require,my_server_cfg}].
    +suite() -> [{require,my_server_cfg}].
     
    -init_per_testcase(start_and_stop, Config) ->
    +init_per_testcase(start_and_stop, Config) ->
         Config;
     
    -init_per_testcase(config, Config) ->
    -    [{server_pid,start_server()} | Config];
    +init_per_testcase(config, Config) ->
    +    [{server_pid,start_server()} | Config];
     
    -init_per_testcase(_, Config) ->
    -    ServerPid = start_server(),
    -    configure_server(),
    -    [{server_pid,ServerPid} | Config].
    +init_per_testcase(_, Config) ->
    +    ServerPid = start_server(),
    +    configure_server(),
    +    [{server_pid,ServerPid} | Config].
     
    -end_per_testcase(start_and_stop, _) ->
    +end_per_testcase(start_and_stop, _) ->
         ok;
     
    -end_per_testcase(_, Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    stop_server(ServerPid).
    +end_per_testcase(_, Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    stop_server(ServerPid).
     
     %%% test cases...
     
    -all() -> [start_and_stop, config, connect_and_disconnect].
    +all() -> [start_and_stop, config, connect_and_disconnect].
     
     %% test that starting and stopping works
    -start_and_stop(_) ->
    -    ServerPid = start_server(),
    -    stop_server(ServerPid).
    +start_and_stop(_) ->
    +    ServerPid = start_server(),
    +    stop_server(ServerPid).
     
     %% configuration test
    -config(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    configure_server(ServerPid).
    +config(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    configure_server(ServerPid).
     
     %% test connecting and disconnecting client
    -connect_and_disconnect(Config) ->
    -    ServerPid = proplists:get_value(server_pid, Config),
    -    {ok,SessionId} = my_server:connect(ServerPid),
    -    ok = my_server:disconnect(ServerPid, SessionId).
    +connect_and_disconnect(Config) ->
    +    ServerPid = proplists:get_value(server_pid, Config),
    +    {ok,SessionId} = my_server:connect(ServerPid),
    +    ok = my_server:disconnect(ServerPid, SessionId).
     
     %%% common functions...
     
    -start_server() ->
    -    {ok,ServerPid} = my_server:start(),
    +start_server() ->
    +    {ok,ServerPid} = my_server:start(),
         ServerPid.
     
    -stop_server(ServerPid) ->
    -    ok = my_server:stop(),
    +stop_server(ServerPid) ->
    +    ok = my_server:stop(),
         ok.
     
    -configure_server(ServerPid) ->
    -    ServerCfgData = ct:get_config(my_server_cfg),
    -    ok = my_server:configure(ServerPid, ServerCfgData),
    +configure_server(ServerPid) ->
    +    ServerCfgData = ct:get_config(my_server_cfg),
    +    ok = my_server:configure(ServerPid, ServerCfgData),
         ok.

    @@ -247,40 +247,40 @@

    data is to be saved by finction end_per_suite and read by function init_per_suite in the suite that follows. When passing data between suites, Saver carries the name -of the test suite.

    Example:

    -module(server_b_SUITE).
    --compile(export_all).
    --include_lib("ct.hrl").
    +of the test suite.

    Example:

    -module(server_b_SUITE).
    +-compile(export_all).
    +-include_lib("ct.hrl").
     
     %%% init and end functions...
     
    -init_per_suite(Config) ->
    +init_per_suite(Config) ->
         %% read config saved by previous test suite
    -    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
    +    {server_a_SUITE,OldConfig} = proplists:get_value(saved_config, Config),
         %% extract server identity (comes from server_a_SUITE)
    -    ServerId = proplists:get_value(server_id, OldConfig),
    -    SessionId = connect_to_server(ServerId),
    -    [{ids,{ServerId,SessionId}} | Config].
    +    ServerId = proplists:get_value(server_id, OldConfig),
    +    SessionId = connect_to_server(ServerId),
    +    [{ids,{ServerId,SessionId}} | Config].
     
    -end_per_suite(Config) ->
    +end_per_suite(Config) ->
         %% save config for server_c_SUITE (session_id and server_id)
    -    {save_config,Config}
    +    {save_config,Config}
     
     %%% test cases...
     
    -all() -> [allocate, deallocate].
    +all() -> [allocate, deallocate].
     
    -allocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {ok,Handle} = allocate_resource(ServerId, SessionId),
    +allocate(Config) ->
    +    {ServerId,SessionId} = proplists:get_value(ids, Config),
    +    {ok,Handle} = allocate_resource(ServerId, SessionId),
         %% save handle for deallocation test
    -    NewConfig = [{handle,Handle}],
    -    {save_config,NewConfig}.
    -
    -deallocate(Config) ->
    -    {ServerId,SessionId} = proplists:get_value(ids, Config),
    -    {allocate,OldConfig} = proplists:get_value(saved_config, Config),
    -    Handle = proplists:get_value(handle, OldConfig),
    -    ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple + NewConfig = [{handle,Handle}], + {save_config,NewConfig}. + +deallocate(Config) -> + {ServerId,SessionId} = proplists:get_value(ids, Config), + {allocate,OldConfig} = proplists:get_value(saved_config, Config), + Handle = proplists:get_value(handle, OldConfig), + ok = deallocate_resource(ServerId, SessionId, Handle).

    To save Config data from a test case that is to be skipped, return tuple {skip_and_save,Reason,ConfigList}.

    The result is that the test case is skipped with Reason printed to the log file (as described earlier) and ConfigList is saved for the next test case. ConfigList can be read using proplists:get_value(saved_config, Config), as @@ -300,22 +300,22 @@

    property. Test case groups are defined through function groups/0 in the test suite (for details, see section Test Case Groups.

    For example, to ensure that if allocate in server_b_SUITE crashes, -deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is -independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, +deallocate is skipped, the following sequence can be defined:

    groups() -> [{alloc_and_dealloc, [sequence], [alloc,dealloc]}].

    Assume that the suite contains the test case get_resource_status that is +independent of the other two cases, then function all can look as follows:

    all() -> [{group,alloc_and_dealloc}, get_resource_status].

    If alloc succeeds, dealloc is also executed. If alloc fails however, dealloc is not executed but marked as SKIPPED in the HTML log. get_resource_status runs no matter what happens to the alloc_and_dealloc cases.

    Test cases in a sequence are executed in order until all succeed or one fails. If one fails, all following cases in the sequence are skipped. The cases in the sequence that have succeeded up to that point are reported as successful in the -log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    -             {scenarioB, [sequence], [testB1, testB2, testB3]}].
    +log. Any number of sequences can be specified.

    Example:

    groups() -> [{scenarioA, [sequence], [testA1, testA2]},
    +             {scenarioB, [sequence], [testB1, testB2, testB3]}].
     
    -all() -> [test1,
    +all() -> [test1,
               test2,
    -          {group,scenarioA},
    +          {group,scenarioA},
               test3,
    -          {group,scenarioB},
    -          test4].

    A sequence group can have subgroups. Such subgroups can have any property, that + {group,scenarioB}, + test4].

    A sequence group can have subgroups. Such subgroups can have any property, that is, they are not required to also be sequences. If you want the status of the subgroup to affect the sequence on the level above, return {return_group_result,Status} from diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/event_handler_chapter.html b/prs/9277/lib/common_test-1.27.5/doc/html/event_handler_chapter.html index 0ba4fccc92742..867bde7c21fe3 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/event_handler_chapter.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/event_handler_chapter.html @@ -168,12 +168,12 @@

    ct_run -event_handler_init instead of -event_handler.

    Note

    All event handler modules must have gen_event behavior. These modules must be precompiled and their locations must be added explicitly to the Erlang code server search path (as in the previous example).

    An event_handler tuple in argument Opts has the following definition (see -ct:run_test/1):

    {event_handler,EventHandlers}
    +ct:run_test/1):

    {event_handler,EventHandlers}
     
    -EventHandlers = EH | [EH]
    -EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs}
    -InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are -installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. +EventHandlers = EH | [EH] +EH = atom() | {atom(),InitArgs} | {[atom()],InitArgs} +InitArgs = [term()]

    In the following example, two event handlers for the my_SUITE test are +installed:

    1> ct:run_test([{suite,"test/my_SUITE"},{event_handler,[my_evh1,{my_evh2,[node()]}]}]).

    Event handler my_evh1 is started with [] as argument to the init function. Event handler my_evh2 is started with the name of the current node in the init argument list.

    Event handlers can also be plugged in using one of the following test specification terms:

    • {event_handler, EventHandlers}
    • {event_handler, EventHandlers, InitArgs}
    • {event_handler, NodeRefs, EventHandlers}
    • {event_handler, NodeRefs, EventHandlers, InitArgs}

    EventHandlers is a list of module names. Before a test session starts, the diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/example_chapter.html b/prs/9277/lib/common_test-1.27.5/doc/html/example_chapter.html index c92e56ca13d23..afd4d108bd6f2 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/example_chapter.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/example_chapter.html @@ -131,19 +131,19 @@

    Test Suite Example

    -

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
    +

    The following example test suite shows some tests of a database server:

    -module(db_data_type_SUITE).
     
    --include_lib("common_test/include/ct.hrl").
    +-include_lib("common_test/include/ct.hrl").
     
     %% Test server callbacks
    --export([suite/0, all/0,
    +-export([suite/0, all/0,
              init_per_suite/1, end_per_suite/1,
    -         init_per_testcase/2, end_per_testcase/2]).
    +         init_per_testcase/2, end_per_testcase/2]).
     
     %% Test cases
    --export([string/1, integer/1]).
    +-export([string/1, integer/1]).
     
    --define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
    +-define(CONNECT_STR, "DSN=sqlserver;UID=alladin;PWD=sesame").
     
     %%--------------------------------------------------------------------
     %% COMMON TEST CALLBACK FUNCTIONS
    @@ -158,8 +158,8 @@ 

    %% Description: Returns list of tuples to set default properties %% for the suite. %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{minutes,1}}]. +suite() -> + [{timetrap,{minutes,1}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> Config1 @@ -169,10 +169,10 @@

    %% %% Description: Initialization before the suite. %%-------------------------------------------------------------------- -init_per_suite(Config) -> - {ok, Ref} = db:connect(?CONNECT_STR, []), - TableName = db_lib:unique_table_name(), - [{con_ref, Ref },{table_name, TableName}| Config]. +init_per_suite(Config) -> + {ok, Ref} = db:connect(?CONNECT_STR, []), + TableName = db_lib:unique_table_name(), + [{con_ref, Ref },{table_name, TableName}| Config]. %%-------------------------------------------------------------------- %% Function: end_per_suite(Config) -> term() @@ -182,9 +182,9 @@

    %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(Config) -> - Ref = proplists:get_value(con_ref, Config), - db:disconnect(Ref), +end_per_suite(Config) -> + Ref = proplists:get_value(con_ref, Config), + db:disconnect(Ref), ok. %%-------------------------------------------------------------------- @@ -197,10 +197,10 @@

    %% %% Description: Initialization before each test case. %%-------------------------------------------------------------------- -init_per_testcase(Case, Config) -> - Ref = proplists:get_value(con_ref, Config), - TableName = proplists:get_value(table_name, Config), - ok = db:create_table(Ref, TableName, table_type(Case)), +init_per_testcase(Case, Config) -> + Ref = proplists:get_value(con_ref, Config), + TableName = proplists:get_value(table_name, Config), + ok = db:create_table(Ref, TableName, table_type(Case)), Config. %%-------------------------------------------------------------------- @@ -213,10 +213,10 @@

    %% %% Description: Cleanup after each test case. %%-------------------------------------------------------------------- -end_per_testcase(_Case, Config) -> - Ref = proplists:get_value(con_ref, Config), - TableName = proplists:get_value(table_name, Config), - ok = db:delete_table(Ref, TableName), +end_per_testcase(_Case, Config) -> + Ref = proplists:get_value(con_ref, Config), + TableName = proplists:get_value(table_name, Config), + ok = db:delete_table(Ref, TableName), ok. %%-------------------------------------------------------------------- @@ -231,28 +231,28 @@

    %% Description: Returns the list of groups and test cases that %% are to be executed. %%-------------------------------------------------------------------- -all() -> - [string, integer]. +all() -> + [string, integer]. %%-------------------------------------------------------------------- %% TEST CASES %%-------------------------------------------------------------------- -string(Config) -> - insert_and_lookup(dummy_key, "Dummy string", Config). +string(Config) -> + insert_and_lookup(dummy_key, "Dummy string", Config). -integer(Config) -> - insert_and_lookup(dummy_key, 42, Config). +integer(Config) -> + insert_and_lookup(dummy_key, 42, Config). -insert_and_lookup(Key, Value, Config) -> - Ref = proplists:get_value(con_ref, Config), - TableName = proplists:get_value(table_name, Config), - ok = db:insert(Ref, TableName, Key, Value), - [Value] = db:lookup(Ref, TableName, Key), - ok = db:delete(Ref, TableName, Key), - [] = db:lookup(Ref, TableName, Key), +insert_and_lookup(Key, Value, Config) -> + Ref = proplists:get_value(con_ref, Config), + TableName = proplists:get_value(table_name, Config), + ok = db:insert(Ref, TableName, Key, Value), + [Value] = db:lookup(Ref, TableName, Key), + ok = db:delete(Ref, TableName, Key), + [] = db:lookup(Ref, TableName, Key), ok.

    @@ -270,12 +270,12 @@

    %%% %%% Created : %%%------------------------------------------------------------------- --module(example_SUITE). +-module(example_SUITE). %% Note: This directive should only be used in test suites. --compile(export_all). +-compile(export_all). --include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/include/ct.hrl"). %%-------------------------------------------------------------------- %% COMMON TEST CALLBACK FUNCTIONS @@ -293,8 +293,8 @@

    %% Note: The suite/0 function is only meant to be used to return %% default data values, not perform any other operations. %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{minutes,10}}]. +suite() -> + [{timetrap,{minutes,10}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> @@ -310,7 +310,7 @@

    %% Note: This function is free to add any key/value pairs to the Config %% variable, but should NOT alter/remove any existing entries. %%-------------------------------------------------------------------- -init_per_suite(Config) -> +init_per_suite(Config) -> Config. %%-------------------------------------------------------------------- @@ -321,7 +321,7 @@

    %% %% Description: Cleanup after the suite. %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -337,7 +337,7 @@

    %% %% Description: Initialization before each test case group. %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -351,7 +351,7 @@

    %% %% Description: Cleanup after each test case group. %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. %%-------------------------------------------------------------------- @@ -370,7 +370,7 @@

    %% Note: This function is free to add any key/value pairs to the Config %% variable, but should NOT alter/remove any existing entries. %%-------------------------------------------------------------------- -init_per_testcase(_TestCase, Config) -> +init_per_testcase(_TestCase, Config) -> Config. %%-------------------------------------------------------------------- @@ -386,7 +386,7 @@

    %% %% Description: Cleanup after each test case. %%-------------------------------------------------------------------- -end_per_testcase(_TestCase, _Config) -> +end_per_testcase(_TestCase, _Config) -> ok. %%-------------------------------------------------------------------- @@ -410,8 +410,8 @@

    %% %% Description: Returns a list of test case group definitions. %%-------------------------------------------------------------------- -groups() -> - []. +groups() -> + []. %%-------------------------------------------------------------------- %% Function: all() -> GroupsAndTestCases | {skip,Reason} @@ -427,8 +427,8 @@

    %% Description: Returns the list of groups and test cases that %% are to be executed. %%-------------------------------------------------------------------- -all() -> - [my_test_case]. +all() -> + [my_test_case]. %%-------------------------------------------------------------------- @@ -447,8 +447,8 @@

    %% Note: This function is only meant to be used to return a list of %% values, not perform any other operations. %%-------------------------------------------------------------------- -my_test_case() -> - []. +my_test_case() -> + []. %%-------------------------------------------------------------------- %% Function: TestCase(Config0) -> @@ -466,7 +466,7 @@

    %% the all/0 list or in a test case group for the test case %% to be executed). %%-------------------------------------------------------------------- -my_test_case(_Config) -> +my_test_case(_Config) -> ok.

    Small Common Test Suite

    %%%-------------------------------------------------------------------
     %%% File    : example_SUITE.erl
     %%% Author  :
    @@ -474,18 +474,18 @@ 

    %%% %%% Created : %%%------------------------------------------------------------------- --module(example_SUITE). +-module(example_SUITE). --compile(export_all). +-compile(export_all). --include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/include/ct.hrl"). %%-------------------------------------------------------------------- %% Function: suite() -> Info %% Info = [tuple()] %%-------------------------------------------------------------------- -suite() -> - [{timetrap,{seconds,30}}]. +suite() -> + [{timetrap,{seconds,30}}]. %%-------------------------------------------------------------------- %% Function: init_per_suite(Config0) -> @@ -493,14 +493,14 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -init_per_suite(Config) -> +init_per_suite(Config) -> Config. %%-------------------------------------------------------------------- %% Function: end_per_suite(Config0) -> term() | {save_config,Config1} %% Config0 = Config1 = [tuple()] %%-------------------------------------------------------------------- -end_per_suite(_Config) -> +end_per_suite(_Config) -> ok. %%-------------------------------------------------------------------- @@ -510,7 +510,7 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -init_per_group(_GroupName, Config) -> +init_per_group(_GroupName, Config) -> Config. %%-------------------------------------------------------------------- @@ -519,7 +519,7 @@

    %% GroupName = atom() %% Config0 = Config1 = [tuple()] %%-------------------------------------------------------------------- -end_per_group(_GroupName, _Config) -> +end_per_group(_GroupName, _Config) -> ok. %%-------------------------------------------------------------------- @@ -529,7 +529,7 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -init_per_testcase(_TestCase, Config) -> +init_per_testcase(_TestCase, Config) -> Config. %%-------------------------------------------------------------------- @@ -539,7 +539,7 @@

    %% Config0 = Config1 = [tuple()] %% Reason = term() %%-------------------------------------------------------------------- -end_per_testcase(_TestCase, _Config) -> +end_per_testcase(_TestCase, _Config) -> ok. %%-------------------------------------------------------------------- @@ -554,8 +554,8 @@

    %% repeat_until_any_ok | repeat_until_any_fail %% N = integer() | forever %%-------------------------------------------------------------------- -groups() -> - []. +groups() -> + []. %%-------------------------------------------------------------------- %% Function: all() -> GroupsAndTestCases | {skip,Reason} @@ -564,15 +564,15 @@

    %% TestCase = atom() %% Reason = term() %%-------------------------------------------------------------------- -all() -> - [my_test_case]. +all() -> + [my_test_case]. %%-------------------------------------------------------------------- %% Function: TestCase() -> Info %% Info = [tuple()] %%-------------------------------------------------------------------- -my_test_case() -> - []. +my_test_case() -> + []. %%-------------------------------------------------------------------- %% Function: TestCase(Config0) -> @@ -582,7 +582,7 @@

    %% Reason = term() %% Comment = term() %%-------------------------------------------------------------------- -my_test_case(_Config) -> +my_test_case(_Config) -> ok.

    diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/getting_started_chapter.html b/prs/9277/lib/common_test-1.27.5/doc/html/getting_started_chapter.html index 0561545dd5962..ac15708107768 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/getting_started_chapter.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/getting_started_chapter.html @@ -169,14 +169,14 @@

    the test suite module implements callback functions (mandatory or optional) for various purposes, for example:

    • Init/end configuration function for the test suite
    • Init/end configuration function for a test case
    • Init/end configuration function for a test case group
    • Test cases

    The configuration functions are optional. The following example is a test suite without configuration functions, including one simple test case, to check that -module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    --compile(export_all).
    +module mymod exists (that is, can be successfully loaded by the code server):

    -module(my1st_SUITE).
    +-compile(export_all).
     
    -all() ->
    -    [mod_exists].
    +all() ->
    +    [mod_exists].
     
    -mod_exists(_) ->
    -    {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    +mod_exists(_) -> + {module,mymod} = code:load_file(mymod).

    If the operation fails, a bad match error occurs that terminates the test case.

    @@ -189,33 +189,33 @@

    through configuration functions on "lower level"). The data flow looks as follows:

    Configuration Data Flow in a Suite

    The following example shows a test suite that uses configuration functions to open and close a log file for the test cases (an operation that is unnecessary -and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    --export([all/0, init_per_suite/1, end_per_suite/1]).
    --export([check_restart_result/1, check_no_errors/1]).
    +and irrelevant to perform by each test case):

    -module(check_log_SUITE).
    +-export([all/0, init_per_suite/1, end_per_suite/1]).
    +-export([check_restart_result/1, check_no_errors/1]).
     
    --define(value(Key,Config), proplists:get_value(Key,Config)).
    +-define(value(Key,Config), proplists:get_value(Key,Config)).
     
    -all() -> [check_restart_result, check_no_errors].
    +all() -> [check_restart_result, check_no_errors].
     
    -init_per_suite(InitConfigData) ->
    -    [{logref,open_log()} | InitConfigData].
    +init_per_suite(InitConfigData) ->
    +    [{logref,open_log()} | InitConfigData].
     
    -end_per_suite(ConfigData) ->
    -    close_log(?value(logref, ConfigData)).
    +end_per_suite(ConfigData) ->
    +    close_log(?value(logref, ConfigData)).
     
    -check_restart_result(ConfigData) ->
    -    TestData = read_log(restart, ?value(logref, ConfigData)),
    -    {match,_Line} = search_for("restart successful", TestData).
    +check_restart_result(ConfigData) ->
    +    TestData = read_log(restart, ?value(logref, ConfigData)),
    +    {match,_Line} = search_for("restart successful", TestData).
     
    -check_no_errors(ConfigData) ->
    -    TestData = read_log(all, ?value(logref, ConfigData)),
    -    case search_for("error", TestData) of
    -        {match,Line} -> ct:fail({error_found_in_log,Line});
    +check_no_errors(ConfigData) ->
    +    TestData = read_log(all, ?value(logref, ConfigData)),
    +    case search_for("error", TestData) of
    +        {match,Line} -> ct:fail({error_found_in_log,Line});
             nomatch -> ok
         end.

    The test cases verify, by parsing a log file, that our SUT has performed a successful restart and that no unexpected errors are printed.

    To execute the test cases in the recent test suite, type the following on the UNIX/Linux command line (assuming that the suite module is in the current -working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored +working directory):

    $ ct_run -dir .

    or:

    $ ct_run -suite check_log_SUITE

    To use the Erlang shell to run our test, you can evaluate the following call:

    1> ct:run_test([{dir, "."}]).

    or:

    1> ct:run_test([{suite, "check_log_SUITE"}]).

    The result from running the test is printed in log files in HTML format (stored in unique log directories on a different level). The following illustration shows the log file structure:

    HTML Log File Structure

    diff --git a/prs/9277/lib/common_test-1.27.5/doc/html/run_test_chapter.html b/prs/9277/lib/common_test-1.27.5/doc/html/run_test_chapter.html index 1a94733d56929..ad26e3592ef84 100644 --- a/prs/9277/lib/common_test-1.27.5/doc/html/run_test_chapter.html +++ b/prs/9277/lib/common_test-1.27.5/doc/html/run_test_chapter.html @@ -279,7 +279,7 @@

    With the ct_run flag, or ct:run_test/1 option group, one or more test case groups can be specified, optionally in combination with specific test cases. The -syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or +syntax for specifying groups on the command line is as follows:

    $ ct_run -group <group_names_or_paths> [-case <cases>]

    The syntax in the Erlang shell is as follows:

    1> ct:run_test([{group,GroupsNamesOrPaths}, {case,Cases}]).

    Parameter group_names_or_paths specifies one or more group names and/or one or more group paths. At startup, Common Test searches for matching groups in the group definitions tree (that is, the list returned from Suite:groups/0; for details, see section Test Case Groups.

    Given a group name, say g, Common Test searches for all paths leading to @@ -311,30 +311,30 @@

    paths if an incomplete group path is specified.

    Note

    Group names and group paths can be combined with parameter group_names_or_paths. Each element is treated as an individual specification in combination with parameter cases. The following examples illustrates -this.

    Examples:

    -module(x_SUITE).
    +this.

    Examples:

    -module(x_SUITE).
     ...
     %% The group definitions:
    -groups() ->
    -  [{top1,[],[tc11,tc12,
    -             {sub11,[],[tc12,tc13]},
    -             {sub12,[],[tc14,tc15,
    -       		 {sub121,[],[tc12,tc16]}]}]},
    -
    -   {top2,[],[{group,sub21},{group,sub22}]},
    -   {sub21,[],[tc21,{group,sub2X2}]},
    -   {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]},
    -   {sub221,[],[tc21,tc23]},
    -   {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under -top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under -top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that -this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same +groups() -> + [{top1,[],[tc11,tc12, + {sub11,[],[tc12,tc13]}, + {sub12,[],[tc14,tc15, + {sub121,[],[tc12,tc16]}]}]}, + + {top2,[],[{group,sub21},{group,sub22}]}, + {sub21,[],[tc21,{group,sub2X2}]}, + {sub22,[],[{group,sub221},tc21,tc22,{group,sub2X2}]}, + {sub221,[],[tc21,tc23]}, + {sub2X2,[],[tc21,tc24]}].

    The following executes two tests, one for all cases and all subgroups under +top1, and one for all under top2:

    $ ct_run -suite "x_SUITE" -group all
    1> ct:run_test([{suite,"x_SUITE"}, {group,all}]).

    Using -group top1 top2, or {group,[top1,top2]} gives the same result.

    The following executes one test for all cases and subgroups under top1:

    $ ct_run -suite "x_SUITE" -group top1
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}]).

    The following runs a test executing tc12 in top1 and any subgroup under +top1 where it can be found (sub11 and sub121):

    $ ct_run -suite "x_SUITE" -group top1 -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc12]}]).

    The following executes tc12 only in group top1:

    $ ct_run -suite "x_SUITE" -group [top1] -case tc12
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[top1]]}, {testcase,[tc12]}]).

    The following searches top1 and all its subgroups for tc16 resulting in that +this test case executes in group sub121:

    $ ct_run -suite "x_SUITE" -group top1 -case tc16
    1> ct:run_test([{suite,"x_SUITE"}, {group,[top1]}, {testcase,[tc16]}]).

    Using the specific path -group [sub121] or {group,[[sub121]]} gives the same result in this example.

    The following executes two tests, one including all cases and subgroups under -sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for +sub12, and one with only the test cases in sub12:

    $ ct_run -suite "x_SUITE" -group sub12 [sub12]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub12,[sub12]]}]).

    In the following example, Common Test finds and executes two tests, one for the path from top2 to sub2X2 through sub21, and one from top2 to -sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path +sub2X2 through sub22:

    $ ct_run -suite "x_SUITE" -group sub2X2
    1> ct:run_test([{suite,"x_SUITE"}, {group,[sub2X2]}]).

    In the following example, by specifying the unique path top2 -> sub21 -> sub2X2, only one test is executed. The second possible path, -from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order -compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is +from top2 to sub2X2 (from the former example) is discarded:

    $ ct_run -suite "x_SUITE" -group [sub21,sub2X2]
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub21,sub2X2]]}]).

    The following executes only the test cases for sub22 and in reverse order +compared to the group definition:

    $ ct_run -suite "x_SUITE" -group [sub22] -case tc22 tc21
    1> ct:run_test([{suite,"x_SUITE"}, {group,[[sub22]]}, {testcase,[tc22,tc21]}]).

    If a test case belonging to a group (according to the group definition) is executed without a group specification, that is, simply by (using the command line):

    $ ct_run -suite "my_SUITE" -case my_tc

    or (using the Erlang shell):

    1> ct:run_test([{suite,"my_SUITE"}, {testcase,my_tc}]).

    then Common Test ignores the group definition and executes the test case in the scope of the test suite only (no group configuration functions are called).

    The group specification feature, as presented in this section, can also be used @@ -362,12 +362,12 @@

    configuration data with ct:require/1,2. This is equivalent to a require statement in the Test Suite Information Function or in the -Test Case Information Function.

    Example:

    1> ct:require(unix_telnet, unix).
    +Test Case Information Function.

    Example:

    1> ct:require(unix_telnet, unix).
     ok
    -2> ct_telnet:open(unix_telnet).
    -{ok,<0.105.0>}
    -4> ct_telnet:cmd(unix_telnet, "ls .").
    -{ok,["ls .","file1  ...",...]}

    Everything that Common Test normally prints in the test case logs, are in the +2> ct_telnet:open(unix_telnet). +{ok,<0.105.0>} +4> ct_telnet:cmd(unix_telnet, "ls ."). +{ok,["ls .","file1 ...",...]}

    Everything that Common Test normally prints in the test case logs, are in the interactive mode written to a log named ctlog.html in directory ct_run.<timestamp>. A link to this file is available in the file named last_interactive.html in the directory from which you execute ct_run. @@ -454,8 +454,8 @@

    included specification can either be joined with the source specification or used to produce a separate test run (as with start flag/option join_specs above).

    Example:

    %% In specification file "a.spec"
    -{specs, join, ["b.spec", "c.spec"]}.
    -{specs, separate, ["d.spec", "e.spec"]}.
    +{specs, join, ["b.spec", "c.spec"]}.
    +{specs, separate, ["d.spec", "e.spec"]}.
     %% Config and test terms follow
     ...

    In this example, the test terms defined in files "b.spec" and "c.spec" are joined with the terms in source specification "a.spec" (if any). The inclusion @@ -517,154 +517,154 @@

    available start flags (as most flags have a corresponding configuration term)
  • Logging (for terms verbosity, stylesheet, basic_html and esc_chars)
  • External Configuration Data (for terms config and userconfig)
  • Event Handling (for the -event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
    +event_handler term)
  • Common Test Hooks (for term ct_hooks)
  • Configuration terms:

    {merge_tests, Bool}.
     
    -{define, Constant, Value}.
    +{define, Constant, Value}.
     
    -{specs, InclSpecsOption, TestSpecs}.
    +{specs, InclSpecsOption, TestSpecs}.
     
    -{node, NodeAlias, Node}.
    +{node, NodeAlias, Node}.
     
    -{init, InitOptions}.
    -{init, [NodeAlias], InitOptions}.
    +{init, InitOptions}.
    +{init, [NodeAlias], InitOptions}.
     
    -{label, Label}.
    -{label, NodeRefs, Label}.
    +{label, Label}.
    +{label, NodeRefs, Label}.
     
    -{verbosity, VerbosityLevels}.
    -{verbosity, NodeRefs, VerbosityLevels}.
    +{verbosity, VerbosityLevels}.
    +{verbosity, NodeRefs, VerbosityLevels}.
     
    -{stylesheet, CSSFile}.
    -{stylesheet, NodeRefs, CSSFile}.
    +{stylesheet, CSSFile}.
    +{stylesheet, NodeRefs, CSSFile}.
     
    -{silent_connections, ConnTypes}.
    -{silent_connections, NodeRefs, ConnTypes}.
    +{silent_connections, ConnTypes}.
    +{silent_connections, NodeRefs, ConnTypes}.
     
    -{multiply_timetraps, N}.
    -{multiply_timetraps, NodeRefs, N}.
    +{multiply_timetraps, N}.
    +{multiply_timetraps, NodeRefs, N}.
     
    -{scale_timetraps, Bool}.
    -{scale_timetraps, NodeRefs, Bool}.
    +{scale_timetraps, Bool}.
    +{scale_timetraps, NodeRefs, Bool}.
     
    -{cover, CoverSpecFile}.
    -{cover, NodeRefs, CoverSpecFile}.
    +{cover, CoverSpecFile}.
    +{cover, NodeRefs, CoverSpecFile}.
     
    -{cover_stop, Bool}.
    -{cover_stop, NodeRefs, Bool}.
    +{cover_stop, Bool}.
    +{cover_stop, NodeRefs, Bool}.
     
    -{include, IncludeDirs}.
    -{include, NodeRefs, IncludeDirs}.
    +{include, IncludeDirs}.
    +{include, NodeRefs, IncludeDirs}.
     
    -{auto_compile, Bool},
    -{auto_compile, NodeRefs, Bool},
    +{auto_compile, Bool},
    +{auto_compile, NodeRefs, Bool},
     
    -{abort_if_missing_suites, Bool},
    -{abort_if_missing_suites, NodeRefs, Bool},
    +{abort_if_missing_suites, Bool},
    +{abort_if_missing_suites, NodeRefs, Bool},
     
    -{config, ConfigFiles}.
    -{config, ConfigDir, ConfigBaseNames}.
    -{config, NodeRefs, ConfigFiles}.
    -{config, NodeRefs, ConfigDir, ConfigBaseNames}.
    +{config, ConfigFiles}.
    +{config, ConfigDir, ConfigBaseNames}.
    +{config, NodeRefs, ConfigFiles}.
    +{config, NodeRefs, ConfigDir, ConfigBaseNames}.
     
    -{userconfig, {CallbackModule, ConfigStrings}}.
    -{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
    +{userconfig, {CallbackModule, ConfigStrings}}.
    +{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
     
    -{logdir, LogDir}.
    -{logdir, NodeRefs, LogDir}.
    +{logdir, LogDir}.
    +{logdir, NodeRefs, LogDir}.
     
    -{logopts, LogOpts}.
    -{logopts, NodeRefs, LogOpts}.
    +{logopts, LogOpts}.
    +{logopts, NodeRefs, LogOpts}.
     
    -{create_priv_dir, PrivDirOption}.
    -{create_priv_dir, NodeRefs, PrivDirOption}.
    +{create_priv_dir, PrivDirOption}.
    +{create_priv_dir, NodeRefs, PrivDirOption}.
     
    -{event_handler, EventHandlers}.
    -{event_handler, NodeRefs, EventHandlers}.
    -{event_handler, EventHandlers, InitArgs}.
    -{event_handler, NodeRefs, EventHandlers, InitArgs}.
    +{event_handler, EventHandlers}.
    +{event_handler, NodeRefs, EventHandlers}.
    +{event_handler, EventHandlers, InitArgs}.
    +{event_handler, NodeRefs, EventHandlers, InitArgs}.
     
    -{ct_hooks, CTHModules}.
    -{ct_hooks, NodeRefs, CTHModules}.
    +{ct_hooks, CTHModules}.
    +{ct_hooks, NodeRefs, CTHModules}.
     
    -{ct_hooks_order, CTHOrder}.
    +{ct_hooks_order, CTHOrder}.
     
    -{enable_builtin_hooks, Bool}.
    +{enable_builtin_hooks, Bool}.
     
    -{basic_html, Bool}.
    -{basic_html, NodeRefs, Bool}.
    +{basic_html, Bool}.
    +{basic_html, NodeRefs, Bool}.
     
    -{esc_chars, Bool}.
    -{esc_chars, NodeRefs, Bool}.
    +{esc_chars, Bool}.
    +{esc_chars, NodeRefs, Bool}.
     
    -{release_shell, Bool}.

    Test terms:

    {suites, Dir, Suites}.
    -{suites, NodeRefs, Dir, Suites}.
    +{release_shell, Bool}.

    Test terms:

    {suites, Dir, Suites}.
    +{suites, NodeRefs, Dir, Suites}.
     
    -{groups, Dir, Suite, Groups}.
    -{groups, NodeRefs, Dir, Suite, Groups}.
    +{groups, Dir, Suite, Groups}.
    +{groups, NodeRefs, Dir, Suite, Groups}.
     
    -{groups, Dir, Suite, Groups, {cases,Cases}}.
    -{groups, NodeRefs, Dir, Suite, Groups, {cases,Cases}}.
    +{groups, Dir, Suite, Groups, {cases,Cases}}.
    +{groups, NodeRefs, Dir, Suite, Groups, {cases,Cases}}.
     
    -{cases, Dir, Suite, Cases}.
    -{cases, NodeRefs, Dir, Suite, Cases}.
    +{cases, Dir, Suite, Cases}.
    +{cases, NodeRefs, Dir, Suite, Cases}.
     
    -{skip_suites, Dir, Suites, Comment}.
    -{skip_suites, NodeRefs, Dir, Suites, Comment}.
    +{skip_suites, Dir, Suites, Comment}.
    +{skip_suites, NodeRefs, Dir, Suites, Comment}.
     
    -{skip_groups, Dir, Suite, GroupNames, Comment}.
    -{skip_groups, NodeRefs, Dir, Suite, GroupNames, Comment}.
    +{skip_groups, Dir, Suite, GroupNames, Comment}.
    +{skip_groups, NodeRefs, Dir, Suite, GroupNames, Comment}.
     
    -{skip_cases, Dir, Suite, Cases, Comment}.
    -{skip_cases, NodeRefs, Dir, Suite, Cases, Comment}.

    Types:

    Bool            = true | false
    -Constant        = atom()
    -Value           = term()
    +{skip_cases, Dir, Suite, Cases, Comment}.
    +{skip_cases, NodeRefs, Dir, Suite, Cases, Comment}.

    Types:

    Bool            = true | false
    +Constant        = atom()
    +Value           = term()
     InclSpecsOption = join | separate
    -TestSpecs       = string() | [string()]
    -NodeAlias       = atom()
    -Node            = node()
    +TestSpecs       = string() | [string()]
    +NodeAlias       = atom()
    +Node            = node()
     NodeRef         = NodeAlias | Node | master
    -NodeRefs        = all_nodes | [NodeRef] | NodeRef
    -InitOptions     = term()
    -Label           = atom() | string()
    -VerbosityLevels = integer() | [{Category,integer()}]
    -Category        = atom()
    -CSSFile         = string()
    -ConnTypes       = all | [atom()]
    -N               = integer()
    -CoverSpecFile   = string()
    -IncludeDirs     = string() | [string()]
    -ConfigFiles     = string() | [string()]
    -ConfigDir       = string()
    -ConfigBaseNames = string() | [string()]
    -CallbackModule  = atom()
    -ConfigStrings   = string() | [string()]
    -LogDir          = string()
    -LogOpts         = [term()]
    +NodeRefs        = all_nodes | [NodeRef] | NodeRef
    +InitOptions     = term()
    +Label           = atom() | string()
    +VerbosityLevels = integer() | [{Category,integer()}]
    +Category        = atom()
    +CSSFile         = string()
    +ConnTypes       = all | [atom()]
    +N               = integer()
    +CoverSpecFile   = string()
    +IncludeDirs     = string() | [string()]
    +ConfigFiles     = string() | [string()]
    +ConfigDir       = string()
    +ConfigBaseNames = string() | [string()]
    +CallbackModule  = atom()
    +ConfigStrings   = string() | [string()]
    +LogDir          = string()
    +LogOpts         = [term()]
     PrivDirOption   = auto_per_run | auto_per_tc | manual_per_tc
    -EventHandlers   = atom() | [atom()]
    -InitArgs        = [term()]
    -CTHModules      = [CTHModule |
    -       	    {CTHModule, CTHInitArgs} |
    -       	    {CTHModule, CTHInitArgs, CTHPriority}]
    -CTHModule       = atom()
    -CTHInitArgs     = term()
    +EventHandlers   = atom() | [atom()]
    +InitArgs        = [term()]
    +CTHModules      = [CTHModule |
    +       	    {CTHModule, CTHInitArgs} |
    +       	    {CTHModule, CTHInitArgs, CTHPriority}]
    +CTHModule       = atom()
    +CTHInitArgs     = term()
     CTHOrder        = test | config
    -Dir             = string()
    -Suites          = atom() | [atom()] | all
    -Suite           = atom()
    -Groups          = GroupPath | GroupSpec | [GroupSpec] | all
    -GroupPath       = [[GroupSpec]]
    -GroupSpec       = GroupName | {GroupName,Properties} | {GroupName,Properties,[GroupSpec]}
    -GroupName       = atom()
    -GroupNames      = GroupName | [GroupName]
    -Cases           = atom() | [atom()] | all
    -Comment         = string() | ""

    The difference between the config terms above is that with ConfigDir, +Dir = string() +Suites = atom() | [atom()] | all +Suite = atom() +Groups = GroupPath | GroupSpec | [GroupSpec] | all +GroupPath = [[GroupSpec]] +GroupSpec = GroupName | {GroupName,Properties} | {GroupName,Properties,[GroupSpec]} +GroupName = atom() +GroupNames = GroupName | [GroupName] +Cases = atom() | [atom()] | all +Comment = string() | ""

    The difference between the config terms above is that with ConfigDir, ConfigBaseNames is a list of base names, that is, without directory paths. ConfigFiles must be full names, including paths. For example, the following -two terms have the same meaning:

    {config, ["/home/testuser/tests/config/nodeA.cfg",
    -          "/home/testuser/tests/config/nodeB.cfg"]}.
    +two terms have the same meaning:

    {config, ["/home/testuser/tests/config/nodeA.cfg",
    +          "/home/testuser/tests/config/nodeB.cfg"]}.
     
    -{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.

    Note

    Any relative paths, specified in the test specification, are relative to the +{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.

    Note

    Any relative paths, specified in the test specification, are relative to the directory containing the test specification file if ct_run -spec TestSpecFile ... or ct:run:test([{spec,TestSpecFile},...]) executes the test.

    The path is relative to the top-level log directory if @@ -684,36 +684,36 @@

    an uppercase letter, or a $, ?, or _. This means that it must always be single quoted (as the constant name is an atom, not text).

    The main benefit of constants is that they can be used to reduce the size (and avoid repetition) of long strings, such as file paths.

    Examples:

    %% 1a. no constant
    -{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, "/home/testuser/tests/suites", all}.
    +{config, "/home/testuser/tests/config", ["nodeA.cfg","nodeB.cfg"]}.
    +{suites, "/home/testuser/tests/suites", all}.
     
     %% 1b. with constant
    -{define, 'TESTDIR', "/home/testuser/tests"}.
    -{config, "'TESTDIR'/config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, "'TESTDIR'/suites", all}.
    +{define, 'TESTDIR', "/home/testuser/tests"}.
    +{config, "'TESTDIR'/config", ["nodeA.cfg","nodeB.cfg"]}.
    +{suites, "'TESTDIR'/suites", all}.
     
     %% 2a. no constants
    -{config, [testnode@host1, testnode@host2], "../config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, [testnode@host1, testnode@host2], "../suites", [x_SUITE, y_SUITE]}.
    +{config, [testnode@host1, testnode@host2], "../config", ["nodeA.cfg","nodeB.cfg"]}.
    +{suites, [testnode@host1, testnode@host2], "../suites", [x_SUITE, y_SUITE]}.
     
     %% 2b. with constants
    -{define, 'NODE', testnode}.
    -{define, 'NODES', ['NODE'@host1, 'NODE'@host2]}.
    -{config, 'NODES', "../config", ["nodeA.cfg","nodeB.cfg"]}.
    -{suites, 'NODES', "../suites", [x_SUITE, y_SUITE]}.

    Constants make the test specification term alias, in previous versions of +{define, 'NODE', testnode}. +{define, 'NODES', ['NODE'@host1, 'NODE'@host2]}. +{config, 'NODES', "../config", ["nodeA.cfg","nodeB.cfg"]}. +{suites, 'NODES', "../suites", [x_SUITE, y_SUITE]}.

    Constants make the test specification term alias, in previous versions of Common Test, redundant. This term is deprecated but remains supported in upcoming Common Test releases. Replacing alias terms with define is strongly recommended though. An example of such replacement follows:

    %% using the old alias term
    -{config, "/home/testuser/tests/config/nodeA.cfg"}.
    -{alias, suite_dir, "/home/testuser/tests/suites"}.
    -{groups, suite_dir, x_SUITE, group1}.
    +{config, "/home/testuser/tests/config/nodeA.cfg"}.
    +{alias, suite_dir, "/home/testuser/tests/suites"}.
    +{groups, suite_dir, x_SUITE, group1}.
     
     %% replacing with constants
    -{define, 'TestDir', "/home/testuser/tests"}.
    -{define, 'CfgDir', "'TestDir'/config"}.
    -{define, 'SuiteDir', "'TestDir'/suites"}.
    -{config, 'CfgDir', "nodeA.cfg"}.
    -{groups, 'SuiteDir', x_SUITE, group1}.

    Constants can well replace term node also, but this still has a declarative +{define, 'TestDir', "/home/testuser/tests"}. +{define, 'CfgDir', "'TestDir'/config"}. +{define, 'SuiteDir', "'TestDir'/suites"}. +{config, 'CfgDir', "nodeA.cfg"}. +{groups, 'SuiteDir', x_SUITE, group1}.

    Constants can well replace term node also, but this still has a declarative value, mainly when used in combination with NodeRefs == all_nodes (see Types).

    @@ -721,25 +721,25 @@

    Example

    -

    Here follows a simple test specification example:

    {define, 'Top', "/home/test"}.
    -{define, 'T1', "'Top'/t1"}.
    -{define, 'T2', "'Top'/t2"}.
    -{define, 'T3', "'Top'/t3"}.
    -{define, 'CfgFile', "config.cfg"}.
    +

    Here follows a simple test specification example:

    {define, 'Top', "/home/test"}.
    +{define, 'T1', "'Top'/t1"}.
    +{define, 'T2', "'Top'/t2"}.
    +{define, 'T3', "'Top'/t3"}.
    +{define, 'CfgFile', "config.cfg"}.
     
    -{logdir, "'Top'/logs"}.
    +{logdir, "'Top'/logs"}.
     
    -{config, ["'T1'/'CfgFile'", "'T2'/'CfgFile'", "'T3'/'CfgFile'"]}.
    +{config, ["'T1'/'CfgFile'", "'T2'/'CfgFile'", "'T3'/'CfgFile'"]}.
     
    -{suites, 'T1', all}.
    -{skip_suites, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    -{skip_cases, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    -{skip_cases, 'T1', t1C_SUITE, [test1], "Ignore"}.
    +{suites, 'T1', all}.
    +{skip_suites, 'T1', [t1B_SUITE,t1D_SUITE], "Not implemented"}.
    +{skip_cases, 'T1', t1A_SUITE, [test3,test4], "Irrelevant"}.
    +{skip_cases, 'T1', t1C_SUITE, [test1], "Ignore"}.
     
    -{suites, 'T2', [t2B_SUITE,t2C_SUITE]}.
    -{cases, 'T2', t2A_SUITE, [test4,test1,test7]}.
    +{suites, 'T2', [t2B_SUITE,t2C_SUITE]}.
    +{cases, 'T2', t2A_SUITE, [test4,test1,test7]}.
     
    -{skip_suites, 'T3', all, "Not implemented"}.

    The example specifies the following:

    • The specified logdir directory is used for storing the HTML log files (in +{skip_suites, 'T3', all, "Not implemented"}.

    The example specifies the following:

    For more information about require, see section +test case information list (the position in the list is irrelevant).

    Examples:

    testcase1() ->
    +    [{require, ftp},
    +     {default_config, ftp, [{ftp, "my_ftp_host"},
    +                            {username, "aladdin"},
    +                            {password, "sesame"}]}}].
    testcase2() ->
    +    [{require, unix_telnet, unix},
    +     {require, {unix, [telnet, username, password]}},
    +     {default_config, unix, [{telnet, "my_telnet_host"},
    +                             {username, "aladdin"},
    +                             {password, "sesame"}]}}].

    For more information about require, see section Requiring and Reading Configuration Data in section External Configuration Data and function ct:require/1/2.

    Note

    Specifying a default value for a required variable can result in a test case always getting executed. This might not be a desired behavior.

    If timetrap or require, or both, is not set specifically for a particular test case, default values specified by function -suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    -    [
    -     {timetrap,{seconds,60}},
    -     {require,interfaces},
    -     {userdata,
    -         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    -          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    -    ].

    +suite/0 are used.

    Tags other than the earlier mentioned are ignored by the test server.

    An example of a test case information function follows:

    reboot_node() ->
    +    [
    +     {timetrap,{seconds,60}},
    +     {require,interfaces},
    +     {userdata,
    +         [{description,"System Upgrade: RpuAddition Normal RebootNode"},
    +          {fts,"http://someserver.ericsson.se/test_doc4711.pdf"}]}
    +    ].

    @@ -302,14 +302,14 @@

    Test Case Information Function and Test Case Groups.

    The following options can also be specified with the suite information list:

    An example of the suite information function follows:

    suite() ->
    -    [
    -     {timetrap,{minutes,10}},
    -     {require,global_names},
    -     {userdata,[{info,"This suite tests database transactions."}]},
    -     {silent_connections,[telnet]},
    -     {stylesheet,"db_testing.css"}
    -    ].

    +Silent Connections

    An example of the suite information function follows:

    suite() ->
    +    [
    +     {timetrap,{minutes,10}},
    +     {require,global_names},
    +     {userdata,[{info,"This suite tests database transactions."}]},
    +     {silent_connections,[telnet]},
    +     {stylesheet,"db_testing.css"}
    +    ].

    @@ -331,20 +331,20 @@

    TCRepeatProps = [{repeat,N} | {repeat_until_ok,N} | {repeat_until_fail,N}]

    GroupName is the name of the group and must be unique within the test suite module. Groups can be nested, by including a group definition within the GroupsAndTestCases list of another group. Properties is the list of -execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    -Shuffle = shuffle | {shuffle,Seed}
    -Seed = {integer(),integer(),integer()}
    +execution properties for the group. The possible values are as follows:

    Properties = [parallel | sequence | Shuffle | {GroupRepeatType,N}]
    +Shuffle = shuffle | {shuffle,Seed}
    +Seed = {integer(),integer(),integer()}
     GroupRepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |
                       repeat_until_any_ok | repeat_until_any_fail
    -N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in +N = integer() | forever

    Explanations:

    • parallel - Common Test executes all test cases in the group in parallel.

    • sequence - The cases are executed in a sequence as described in section Sequences in section Dependencies Between Test Cases and Suites.

    • shuffle - The cases in the group are executed in random order.

    • repeat, repeat_until_* - Orders Common Test to repeat execution of all the cases in the group a given number of times, or until any, or all, cases -fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    -             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test +fail or succeed.

    Example:

    groups() -> [{group1, [parallel], [test1a,test1b]},
    +             {group2, [shuffle,sequence], [test2a,test2b,test2c]}].

    To specify in which order groups are to be executed (also with respect to test cases that are not part of any group), add tuples on the form -{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: +{group,GroupName} to the all/0 list.

    Example:

    all() -> [testcase1, {group,group1}, {testcase,testcase2,[{repeat,10}]}, {group,group2}].

    Execution properties with a group tuple in all/0: {group,GroupName,Properties} can also be specified. These properties override those specified in the group definition (see groups/0 earlier). This way, the same set of tests can be run, but with different properties, without having to @@ -353,33 +353,33 @@

    SubGroups is a list of tuples, {GroupName,Properties} or {GroupName,Properties,SubGroups} representing the subgroups. Any subgroups defined in groups/0 for a group, that are not specified in the SubGroups -list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    -                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each -time:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    -   [{group, tests1, default, [{tests2, [parallel]},
    -                              {tests3, default}]},
    -    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    -                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply -nested groups:

    groups() ->
    -   [{tests1, [], [{group, tests2}]},
    -    {tests2, [], [{group, tests3}]},
    -    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
    -
    -all() ->
    -   [{group, tests1, default,
    -     [{tests2, default,
    -       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function -call whose return value should match the expected syntax case.

    Example:

    all() ->
    -   [{group, tests1, default, test_cases()},
    -    {group, tests1, default, [shuffle_test(),
    -                              {tests3, default}]}].
    -test_cases() ->
    -   [{tests2, [parallel]}, {tests3, default}].
    -
    -shuffle_test() ->
    -   {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group +list, executes with their predefined properties.

    Example:

    groups() -> [{tests1, [], [{tests2, [], [t2a,t2b]},
    +                          {tests3, [], [t31,t3b]}]}].

    To execute group tests1 twice with different properties for tests2 each +time:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]}]}].

    This is equivalent to the following specification:

    all() ->
    +   [{group, tests1, default, [{tests2, [parallel]},
    +                              {tests3, default}]},
    +    {group, tests1, default, [{tests2, [shuffle,{repeat,10}]},
    +                              {tests3, default}]}].

    Value default states that the predefined properties are to be used.

    The following example shows how to override properties in a scenario with deeply +nested groups:

    groups() ->
    +   [{tests1, [], [{group, tests2}]},
    +    {tests2, [], [{group, tests3}]},
    +    {tests3, [{repeat,2}], [t3a,t3b,t3c]}].
    +
    +all() ->
    +   [{group, tests1, default,
    +     [{tests2, default,
    +       [{tests3, [parallel,{repeat,100}]}]}]}].

    For ease of readability, all syntax definitions can be replaced by a function +call whose return value should match the expected syntax case.

    Example:

    all() ->
    +   [{group, tests1, default, test_cases()},
    +    {group, tests1, default, [shuffle_test(),
    +                              {tests3, default}]}].
    +test_cases() ->
    +   [{tests2, [parallel]}, {tests3, default}].
    +
    +shuffle_test() ->
    +   {tests2, [shuffle,{repeat,10}]}.

    The described syntax can also be used in test specifications to change group properties at the time of execution, without having to edit the test suite. For more information, see section Test Specifications in section @@ -405,13 +405,13 @@

    bottom of the log for end_per_group/2.

    Test case groups can be nested so sets of groups can be configured with the same init_per_group/2 and end_per_group/2 functions. Nested groups can be defined by including a group definition, or a group name reference, in the test case -list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    -                                  {group2, [], [test2a,test2b]},
    -                                  test1b]},
    -             {group3, [], [{group,group4},
    -                           {group,group5}]},
    -             {group4, [parallel], [test4a,test4b]},
    -             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order +list of another group.

    Example:

    groups() -> [{group1, [shuffle], [test1a,
    +                                  {group2, [], [test2a,test2b]},
    +                                  test1b]},
    +             {group3, [], [{group,group4},
    +                           {group,group5}]},
    +             {group4, [parallel], [test4a,test4b]},
    +             {group5, [sequence], [test5a,test5b,test5c]}].

    In the previous example, if all/0 returns group name references in the order [{group,group1},{group,group3}], the order of the configuration functions and test cases becomes the following (notice that init_per_testcase/2 and end_per_testcase/2: are also always called, but not included in this example @@ -484,25 +484,25 @@

    account by Common Test when evaluating if execution of a group is to be repeated or not (unless the basic repeat property is used).

    The value of tc_group_properties is a list of status tuples, each with the key ok, skipped, and failed. The value of a status tuple is a list with names -of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    -    Status = proplists:get_value(tc_group_result, Config),
    -    case proplists:get_value(failed, Status) of
    -        [] ->                                   % no failed cases
    -            {return_group_result,ok};
    +of test cases that have been executed with the corresponding status as result.

    The following is an example of how to return the status from a group:

    end_per_group(_Group, Config) ->
    +    Status = proplists:get_value(tc_group_result, Config),
    +    case proplists:get_value(failed, Status) of
    +        [] ->                                   % no failed cases
    +            {return_group_result,ok};
             _Failed ->                              % one or more failed
    -            {return_group_result,failed}
    +            {return_group_result,failed}
         end.

    It is also possible, in end_per_group/2, to check the status of a subgroup (maybe to determine what status the current group is to return). This is as simple as illustrated in the previous example, only the group name is stored in a tuple {group_result,GroupName}, which can be searched for in the status -lists.

    Example:

    end_per_group(group1, Config) ->
    -    Status = proplists:get_value(tc_group_result, Config),
    -    Failed = proplists:get_value(failed, Status),
    -    case lists:member({group_result,group2}, Failed) of
    +lists.

    Example:

    end_per_group(group1, Config) ->
    +    Status = proplists:get_value(tc_group_result, Config),
    +    Failed = proplists:get_value(failed, Status),
    +    case lists:member({group_result,group2}, Failed) of
               true ->
    -              {return_group_result,failed};
    +              {return_group_result,failed};
               false ->
    -              {return_group_result,ok}
    +              {return_group_result,ok}
         end;
     ...

    Note

    When a test case group is repeated, the configuration functions init_per_group/2 and end_per_group/2 are also always called with each @@ -534,9 +534,9 @@

    The test case group information function, group(GroupName), serves the same purpose as the suite- and test case information functions previously described. However, the scope for the group information function, is all test cases and -subgroups in the group in question (GroupName).

    Example:

    group(connection_tests) ->
    -   [{require,login_data},
    -    {timetrap,1000}].

    The group information properties override those set with the suite information +subgroups in the group in question (GroupName).

    Example:

    group(connection_tests) ->
    +   [{require,login_data},
    +    {timetrap,1000}].

    The group information properties override those set with the suite information function, and can in turn be overridden by test case information properties. For a list of valid information properties and more general information, see the Test Case Information Function.

    @@ -666,23 +666,23 @@

    (except from printouts made by Common Test itself).

    The general verbosity level is not associated with any particular category. This level sets the threshold for the standard I/O printouts, uncategorized ct:log/print/pal printouts, and printouts for categories with undefined -verbosity level.

    Examples:

    Some printouts during test case execution:

    io:format("1. Standard IO, importance = ~w~n", [?STD_IMPORTANCE]),
    -ct:log("2. Uncategorized, importance = ~w", [?STD_IMPORTANCE]),
    - ct:log(info, "3. Categorized info, importance = ~w", [?STD_IMPORTANCE]),
    - ct:log(info, ?LOW_IMPORTANCE, "4. Categorized info, importance = ~w", [?LOW_IMPORTANCE]),
    - ct:log(error, ?HI_IMPORTANCE, "5. Categorized error, importance = ~w", [?HI_IMPORTANCE]),
    - ct:log(error, ?MAX_IMPORTANCE, "6. Categorized error, importance = ~w", [?MAX_IMPORTANCE]),

    If starting the test with a general verbosity level of 50 (?STD_VERBOSITY):

    $ ct_run -verbosity 50

    the following is printed:

    1. Standard IO, importance = 50
    +verbosity level.

    Examples:

    Some printouts during test case execution:

    io:format("1. Standard IO, importance = ~w~n", [?STD_IMPORTANCE]),
    +ct:log("2. Uncategorized, importance = ~w", [?STD_IMPORTANCE]),
    + ct:log(info, "3. Categorized info, importance = ~w", [?STD_IMPORTANCE]),
    + ct:log(info, ?LOW_IMPORTANCE, "4. Categorized info, importance = ~w", [?LOW_IMPORTANCE]),
    + ct:log(error, ?HI_IMPORTANCE, "5. Categorized error, importance = ~w", [?HI_IMPORTANCE]),
    + ct:log(error, ?MAX_IMPORTANCE, "6. Categorized error, importance = ~w", [?MAX_IMPORTANCE]),

    If starting the test with a general verbosity level of 50 (?STD_VERBOSITY):

    $ ct_run -verbosity 50

    the following is printed:

    1. Standard IO, importance = 50
     2. Uncategorized, importance = 50
     3. Categorized info, importance = 50
     5. Categorized error, importance = 75
     6. Categorized error, importance = 99

    If starting the test with:

    $ ct_run -verbosity 1 and info 75

    the following is printed:

    3. Categorized info, importance = 50
     4. Categorized info, importance = 25
     6. Categorized error, importance = 99

    Note that the category argument is not required in order to only specify the -importance of a printout. Example:

    ct:pal(?LOW_IMPORTANCE, "Info report: ~p", [Info])

    Or perhaps in combination with constants:

    -define(INFO, ?LOW_IMPORTANCE).
    --define(ERROR, ?HI_IMPORTANCE).
    +importance of a printout. Example:

    ct:pal(?LOW_IMPORTANCE, "Info report: ~p", [Info])

    Or perhaps in combination with constants:

    -define(INFO, ?LOW_IMPORTANCE).
    +-define(ERROR, ?HI_IMPORTANCE).
     
    -ct:log(?INFO, "Info report: ~p", [Info])
    -ct:pal(?ERROR, "Error report: ~p", [Error])

    The functions ct:set_verbosity/2 and ct:get_verbosity/1 may be used to +ct:log(?INFO, "Info report: ~p", [Info]) +ct:pal(?ERROR, "Error report: ~p", [Error])

    The functions ct:set_verbosity/2 and ct:get_verbosity/1 may be used to modify and read verbosity levels during test execution.

    The arguments Format and FormatArgs in ct:log/print/pal are always passed on to the STDLIB function io:format/3 (For details, see the io manual page).

    ct:pal/4 and ct:log/5 add headers to strings being printed to the log file. diff --git a/prs/9277/lib/compiler-8.5.4/doc/html/beam_ssa.html b/prs/9277/lib/compiler-8.5.4/doc/html/beam_ssa.html index 5618c6560a83d..7da2485f0d54e 100644 --- a/prs/9277/lib/compiler-8.5.4/doc/html/beam_ssa.html +++ b/prs/9277/lib/compiler-8.5.4/doc/html/beam_ssa.html @@ -188,8 +188,8 @@

    br ^common_end_of_catch common_end_of_catch: - @tmp = phi { @catched_val, ^landing_pad_block }, - { @successful_result, ^protected_blockN } + @tmp = phi { @catched_val, ^landing_pad_block }, + { @successful_result, ^protected_blockN } @result_of_catch_expr = catch_end @tag, @tmp

    Just as for a try-catch expression all code that can cause an exception in one of the protected blocks must have explicit control flow edges to the landing pad block.

    @@ -234,7 +234,7 @@

    Variable Naming

    A variable name in BEAM SSA is either an atom or a non-negative -integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler +integer:

    atom() | non_neg_integer()

    In order to generate fresh unused variable names, all compiler transforms maintain a counter, the cnt-field in the b_function and opt_st records, which is incremented each time a new variable or label is created. In the following description the value of the diff --git a/prs/9277/lib/compiler-8.5.4/doc/html/compile.html b/prs/9277/lib/compiler-8.5.4/doc/html/compile.html index 9ad8fd0ecd1af..1ec9b37ac2b69 100644 --- a/prs/9277/lib/compiler-8.5.4/doc/html/compile.html +++ b/prs/9277/lib/compiler-8.5.4/doc/html/compile.html @@ -153,7 +153,7 @@

    Options given in the compile() attribute in the source code take precedence over options given to the compiler, which in turn take precedence over options given in the environment.

    A later compiler option takes precedence over an earlier one in the -option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless +option list. Example:

    compile:file(something, [nowarn_missing_spec,warn_missing_spec]).

    Warnings will be emitted for functions without specifications, unless the source code for module something contains a compile(nowarn_missing_spec) attribute.

    Change

    In Erlang/OTP 26 and earlier, the option order was the opposite of what is described here.

    @@ -177,14 +177,14 @@

    which functions to inline, or {inline,[{Name,Arity},...]} to have the compiler inline all calls to the given functions. If the option is given inside a compile directive in an Erlang module, {Name,Arity} can be written as -Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
    +Name/Arity.

    Example of explicit inlining:

    -compile({inline,[pi/0]}).
     
    -pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to +pi() -> 3.1416.

    Example of implicit inlining:

    -compile(inline).

    The option {inline_size,Size} controls how large functions that are allowed to be inlined. Default is 24, which keeps the size of the inlined code roughly the same as the un-inlined version (only relatively small functions are inlined).

    Example:

    %% Aggressive inlining - will increase code size.
    --compile(inline).
    --compile({inline_size,100}).

    +-compile(inline). +-compile({inline_size,100}).

    @@ -932,10 +932,10 @@

    file(File, Options)

    function definitions. This is the preferred method of enabling and disabling features, since it is a local property of a module.

  • makedep - Produces a Makefile rule to track headers dependencies. No object file is produced.

    By default, this rule is written to <File>.Pbeam. However, if option -binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
    +binary is set, nothing is written and the rule is returned in Binary.

    The output will be encoded in UTF-8.

    For example, if you have the following module:

    -module(module).
     
    --include_lib("eunit/include/eunit.hrl").
    --include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
    +-include_lib("eunit/include/eunit.hrl").
    +-include("header.hrl").

    The Makefile rule generated by this option looks as follows:

    module.beam: module.erl \
       /usr/local/lib/erlang/lib/eunit/include/eunit.hrl \
       header.hrl
  • makedep_side_effect - The dependencies are created as a side effect to the normal compilation process. This means that the object file will also be @@ -1001,7 +1001,7 @@

    file(File, Options)

    before Erlang/OTP R14A when calling a local function with the same name as an auto-imported BIF without module prefix.

    If the BIF is to be called, use the erlang module prefix in the call, not {no_auto_import,[{F,A}, ...]}.

    If this option is written in the source code, as a -compile directive, the -syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly +syntax F/A can be used instead of {F,A}. For example:

    -compile({no_auto_import,[error/1]}).
  • no_auto_import - Do not auto-import any functions from erlang module.

  • no_line_info - Omits line number information to produce a slightly smaller output file.

  • no_lint - Skips the pass that checks for errors and warnings. Only applicable together with the from_abstr option. This is mainly for implementations of other languages on top of Erlang, which have already done diff --git a/prs/9277/lib/compiler-8.5.4/doc/html/compiler.epub b/prs/9277/lib/compiler-8.5.4/doc/html/compiler.epub index d056ba1523618..7ead72fec8343 100644 Binary files a/prs/9277/lib/compiler-8.5.4/doc/html/compiler.epub and b/prs/9277/lib/compiler-8.5.4/doc/html/compiler.epub differ diff --git a/prs/9277/lib/compiler-8.5.4/doc/html/notes.html b/prs/9277/lib/compiler-8.5.4/doc/html/notes.html index 48349d1981e14..65243badf2cf2 100644 --- a/prs/9277/lib/compiler-8.5.4/doc/html/notes.html +++ b/prs/9277/lib/compiler-8.5.4/doc/html/notes.html @@ -139,8 +139,8 @@

    • Fixed a crash in the common sub-expression elimination pass.

      Own Id: OTP-19243 Aux Id: GH-8818, PR-8838

    • Fixed a bug where bogus code was generated for consecutive calls to erlang:setelement/2, potentially crashing the runtime system.

      Own Id: OTP-19270 Aux Id: GH-8783, PR-8898

    • When the line_coverage option was used, exceptions could show the wrong line for where the exception was raised.

      Own Id: OTP-19282 Aux Id: PR-8907

    • The line_coverage option would be ignored if given in a compile() attribute within a module.

      Own Id: OTP-19309 Aux Id: GH-8942, PR-8970

    • A segment matching a float in a binary generator will now skip any invalid float (such as a NaN) and continue matching the rest of the binary. Before this correction, the comprehension would stop as soon as an invalid float was encountered.

      Example:

      1> BadFloat = <<-1:64>>.
       <<"ÿÿÿÿÿÿÿÿ">>
      -2> [X || <<X:64/float>> <= <<0.0/float,BadFloat/binary,42.0/float>>].
      -[0.0,42.0]

      Own Id: OTP-19331 Aux Id: PR-8978

    +2> [X || <<X:64/float>> <= <<0.0/float,BadFloat/binary,42.0/float>>]. +[0.0,42.0]

  • Own Id: OTP-19331 Aux Id: PR-8978

    @@ -188,13 +188,13 @@

    Fixed Bugs and Malfunctions

    -
    • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

      As an example, consider this module:

      -module(t).
      --export([f/0]).
      +
      • Generators for binary comprehensions could be evaluated before it was known that they would be needed. That could result in a binary comprehensions failing if a generator that should not be evaluated until later failed.

        As an example, consider this module:

        -module(t).
        +-export([f/0]).
         
        -f() ->
        -    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
        +f() ->
        +    <<0 || _ <- [], _ <- ok, false>>.

        In Erlang/OTP 26 it would fail like so:

        1> t:f().
         ** exception error: bad generator ok
        -     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
        +     in function  t:f/0 (t.erl, line 6)

        In Erlang/OTP 27 it returns an empty binary:

        1> t:f().
         <<>>

        Own Id: OTP-18703 Aux Id: GH-7494, PR-7538

      • The documentation for the preprocessor now mentions that defined(Name) can be called in the condition for an -if or -elif directive to test whether Name is the name of a defined macro. (This feature was implemented in OTP 21.)

        If a function call in an -if or -elif with a name that is not the name of a guard BIF, there would not be a compilation error, but would instead cause the lines following the directive to be skipped. This has now been changed to be a compilation error.

        POTENTIAL INCOMPATIBILITY

        Own Id: OTP-18784 Aux Id: GH-7706, PR-7726

      @@ -202,39 +202,39 @@

      Improvements and New Features

      Own Id: OTP-18680 Aux Id: PR-7491, PR-8086, ERIERL-967

    • Improved the performance of the alias analysis pass.

      Own Id: OTP-18714 Aux Id: PR-7528, GH-7432

    • -spec attributes are now used for documentation.

      Own Id: OTP-18801 Aux Id: PR-7739

    • Native coverage support has been implemented in the JIT. It will automatically be used by the cover tool to reduce the execution overhead when running cover-compiled code.

      There are also new APIs to support native coverage without using the cover tool.

      To instrument code for native coverage it must be compiled with the line_coverage option.

      To enable native coverage in the runtime system, start it like so:

      $ erl +JPcover true

      There are also the following new functions for supporting native coverage:

      Own Id: OTP-18856 Aux Id: PR-7856

    • EEP-59 - Documentation Attributes has been implemented.

      Documentation attributes can be used to document functions, types, callbacks, and modules. The keyword -moduledoc "Documentation here". is used to document modules, while -doc "Documentation here". can be used on top of functions, types, and callbacks to document them, respectively.

      • Types, callbacks, and function documentation can be set to hidden either via -doc false or -doc hidden. When documentation attributes mark a type as hidden, they will not be part of the documentation.

      • The documentation from moduledoc and doc gets added by default to the binary beam file, following the format of EEP-48.

      • Using the compiler flag warn_missing_doc will raise a warning when -doc attributes are missing in exported functions, types, and callbacks.

      • Using the compiler flag warn_missing_spec_documented will raise a warning when -spec attributes are missing in documented functions, types, and callbacks.

      • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

      • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

      Own Id: OTP-18916 Aux Id: PR-7936

    • The documentation has been migrated to use Markdown and ExDoc.

      Own Id: OTP-18955 Aux Id: PR-8026

    • The order in which the compiler looks up options has changed.

      When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

      Example:

      If some_module.erl has the following attribute:

      -compile([nowarn_missing_spec]).

      and the compiler is invoked like so:

      % erlc +warn_missing_spec some_module.erl

      no warnings will be issued for functions that do not have any specs.

      POTENTIAL INCOMPATIBILITY

      Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

    • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

      Example:

      -record(rec, {a,b,c}).
      +spec attributes are missing in documented functions, types, and callbacks.

    • moduledocs and docs may refer to external files to be embedded, such as -doc {file, "README.md"}., which refers to the file README.md found in the current working directory.

    • The compiler warns about exported functions whose specs refer to hidden types. Thus, there will be warnings when a hidden type (meaning, the type is not part of the documentation) gets used in an exported function.

    Own Id: OTP-18916 Aux Id: PR-7936

  • The documentation has been migrated to use Markdown and ExDoc.

    Own Id: OTP-18955 Aux Id: PR-8026

  • The order in which the compiler looks up options has changed.

    When there is a conflict in the compiler options given in the -compile() attribute and options given to the compiler, the options given in the -compile() attribute overrides the option given to the compiler, which in turn overrides options given in the ERL_COMPILER_OPTIONS environment variable.

    Example:

    If some_module.erl has the following attribute:

    -compile([nowarn_missing_spec]).

    and the compiler is invoked like so:

    % erlc +warn_missing_spec some_module.erl

    no warnings will be issued for functions that do not have any specs.

    POTENTIAL INCOMPATIBILITY

    Own Id: OTP-18968 Aux Id: GH-6979, PR-8093

  • Safe destructive update of tuples has been implemented in the compiler and runtime system. This allows the VM to update tuples in-place when it is safe to do so, thus improving performance by doing less copying but also by producing less garbage.

    Example:

    -record(rec, {a,b,c}).
     
    -update(#rec{a=needs_update,b=N}=R0) ->
    -    R = R0#rec{a=up_to_date},
    +update(#rec{a=needs_update,b=N}=R0) ->
    +    R = R0#rec{a=up_to_date},
         if
             N < 0 ->
    -            R#rec{c=negative};
    +            R#rec{c=negative};
             N == 0 ->
    -            R#rec{c=zero};
    +            R#rec{c=zero};
             N > 0 ->
    -            R#rec{c=positive}
    +            R#rec{c=positive}
         end.

    The record updates in each of the three clauses of the if can safely be done in-place, because variable R is not used again.

    Own Id: OTP-18972 Aux Id: PR-8090

  • Improved the match context reuse optimization slightly, allowing match contexts to be passed as-is to bit_size/1 and byte_size/1.

    Own Id: OTP-18987

  • erl_lint (and by extension the compiler) will now warn for code using deprecated callbacks.

    The only callback currenly deprecated is format_status/2 in gen_server, gen_event and gen_statem.

    You can use nowarn_deprecated_callback to silence the warning.

    Own Id: OTP-19010 Aux Id: PR-8205

  • diff --git a/prs/9277/lib/compiler-8.5.4/doc/html/ssa_checks.html b/prs/9277/lib/compiler-8.5.4/doc/html/ssa_checks.html index ca4cf04808a33..409ee3803e99d 100644 --- a/prs/9277/lib/compiler-8.5.4/doc/html/ssa_checks.html +++ b/prs/9277/lib/compiler-8.5.4/doc/html/ssa_checks.html @@ -142,32 +142,32 @@

    SSA checks are embedded in the source code as comments starting with with one of %ssa%, %%ssa% or %%%ssa%. This is a short introduction the syntax, for the full syntax please refer to the -ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
    +ssa_check_when_clause production in erl_parse.yrl.

    SSA checks can be placed inside any Erlang function, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa%   ret(#{}).
    -  #{}.

    will check that t0/0 returns the literal #{}. If we want to check -that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
    +  #{}.

    will check that t0/0 returns the literal #{}. If we want to check +that a function returns its first formal parameter, we can write:

    t1(A, _B) ->
     %ssa% (X, _) when post_ssa_opt ->
     %ssa%   ret(X).
       A.

    Note how we match the first formal parameter using X. The reason for having our own formal parameters for the SSA check, is that we don't want to introduce new identifiers at the Erlang level to support SSA-level checks. Consider if t1/2 had been defined as t1([A|As], B) we would have had to introduce a new identifier for the aggregate -value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must +value [A|As].

    The full syntax for a SSA check clause is:

    <expected-result>? (<formals>) when <pipeline-location> -> <checks> '.'

    where <expected-result> can be one of pass (the check must succeed), fail and xfail (the check must fail). Omitting <expected-result> is parsed as an implicit pass.

    <formals> is a comma-separated list of variables.

    <pipeline-location> specifies when in the compiler pipeline to run the checks. For now the only supported value for <pipeline-location> is post_ssa_opt which runs the checks after the ssa_opt pass.

    <checks> is a comma-separated list of matches against the BEAM SSA -code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA -representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
    +code. For non-flow-control operations the syntax is:

    <variable> = <operation> ( <arguments> ) <annotation>?

    where <operation> is the #b_set.op field from the internal SSA +representation. BIFs are written as bif:<atom>.

    <arguments> is a comma-separated list of variables or literals.

    For flow control operations and labels, the syntax is as follows:

    br(<bool>, <true-label>, <false-label>)
     
    -switch(<value>, <fail-label>, [{<label>,<value>},...])
    +switch(<value>, <fail-label>, [{<label>,<value>},...])
     
    -ret(<value>)
    +ret(<value>)
     
     label <value>

    where <value> is a literal or a variable.

    A check can also include an assertion on operation annotations. The assertion is written as a map-like pattern following the argument -list, for example:

    t0() ->
    +list, for example:

    t0() ->
     %ssa% () when post_ssa_opt ->
     %ssa% _ = call(fun return_int/0) { result_type => {t_integer,{17,17}},
     %ssa%                              location => {_,32} },
    @@ -175,9 +175,9 @@ 

    %ssa% result_type => {t_tuple,2,true,#{1 => {t_integer,{1,1}}, %ssa% 2 => {t_integer,{2,2}}}} %ssa% }. - X = return_int(), - Y = return_tuple(), - {X, Y}.

    + X = return_int(), + Y = return_tuple(), + {X, Y}.

    diff --git a/prs/9277/lib/crypto-5.5.2/doc/html/crypto.epub b/prs/9277/lib/crypto-5.5.2/doc/html/crypto.epub index e3f7834131ca8..b6bfc666da475 100644 Binary files a/prs/9277/lib/crypto-5.5.2/doc/html/crypto.epub and b/prs/9277/lib/crypto-5.5.2/doc/html/crypto.epub differ diff --git a/prs/9277/lib/crypto-5.5.2/doc/html/crypto.html b/prs/9277/lib/crypto-5.5.2/doc/html/crypto.html index 60750641a5ba1..6e52362b38627 100644 --- a/prs/9277/lib/crypto-5.5.2/doc/html/crypto.html +++ b/prs/9277/lib/crypto-5.5.2/doc/html/crypto.html @@ -595,7 +595,7 @@

    -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -3119,7 +3119,7 @@

    rsa_params()

    -
    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private +

    rsa_public() = [E, N]
    rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]

    Where E is the public exponent, N is public modulus and D is the private exponent. The longer key format contains redundant information that will make the calculation faster. P1 and P2 are first and second prime factors. E1 and E2 are first and second exponents. C is the CRT coefficient. The terminology is @@ -5536,9 +5536,9 @@

    rand_seed()

    BN_rand_range).

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_s/0.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed(),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5604,9 +5604,9 @@

    rand_seed_alg(Alg)

    generate cryptographically strong random numbers.

    Saves the state in the process dictionary before returning it as well. See also rand:seed/1 and rand_seed_alg_s/1.

    When using the state object from this function the rand functions using it may raise exception error:low_entropy in case the random generator failed due -to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    -_IntegerValue = rand:uniform(42), % [1; 42]
    -_FloatValue = rand:uniform().     % [0.0; 1.0[
    +to lack of secure "randomness".

    Example

    _ = crypto:rand_seed_alg(crypto_cache),
    +_IntegerValue = rand:uniform(42), % [1; 42]
    +_FloatValue = rand:uniform().     % [0.0; 1.0[
    @@ -5638,12 +5638,12 @@

    rand_seed_alg(Alg, Seed)

    Creates a state object for random number generation, in order to generate cryptographically unpredictable random numbers.

    Saves the state in the process dictionary before returning it as well. See also -rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % [1; 42]
    -FloatValue = rand:uniform(),     % [0.0; 1.0[
    -_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    -IntegerValue = rand:uniform(42), % Same values
    -FloatValue = rand:uniform().     % again
    +rand_seed_alg_s/2.

    Example

    _ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % [1; 42]
    +FloatValue = rand:uniform(),     % [0.0; 1.0[
    +_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
    +IntegerValue = rand:uniform(42), % Same values
    +FloatValue = rand:uniform().     % again
    @@ -6140,12 +6140,12 @@

    info()

    -

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    -#{compile_type => normal,
    +

    Get information about crypto and the OpenSSL backend.

    Returns a map with information about the compilation and linking of crypto.

    Example:

    1> crypto:info().
    +#{compile_type => normal,
       cryptolib_version_compiled => "OpenSSL 3.0.0 7 sep 2021",
       cryptolib_version_linked => "OpenSSL 3.0.0 7 sep 2021",
       link_type => dynamic,
    -  otp_crypto_version => "5.0.2"}
    +  otp_crypto_version => "5.0.2"}
     2>

    More association types than documented may be present in the map.

    @@ -6212,8 +6212,8 @@

    info_lib()

    Get the name and version of the libraries used by crypto.

    Name is the name of the library. VerNum is the numeric version according to the library's own versioning scheme. VerStr contains a text variant of the -version.

    > info_lib().
    -[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL +version.

    > info_lib().
    +[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c  10 Nov 2016"">>}]

    Note

    From OTP R16 the numeric version represents the version of the OpenSSL header files (openssl/opensslv.h) used when crypto was compiled. The text variant represents the libcrypto library used at runtime. In earlier OTP versions both numeric and text was taken from the library.

    diff --git a/prs/9277/lib/crypto-5.5.2/doc/html/engine_keys.html b/prs/9277/lib/crypto-5.5.2/doc/html/engine_keys.html index 21dec271d7275..4958bde60db64 100644 --- a/prs/9277/lib/crypto-5.5.2/doc/html/engine_keys.html +++ b/prs/9277/lib/crypto-5.5.2/doc/html/engine_keys.html @@ -161,13 +161,13 @@

    Sign with an engine stored private key

    This example shows how to construct a key reference that is used in a sign -operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
    +operation. The actual key is stored in the engine that is loaded at prompt 1.

    1> {ok, EngineRef} = crypto:engine_load(....).
     ...
    -{ok,#Ref<0.2399045421.3028942852.173962>}
    -2> PrivKey = #{engine => EngineRef,
    -               key_id => "id of the private key in Engine"}.
    +{ok,#Ref<0.2399045421.3028942852.173962>}
    +2> PrivKey = #{engine => EngineRef,
    +               key_id => "id of the private key in Engine"}.
     ...
    -3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
    +3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
     <<65,6,125,254,54,233,84,77,83,63,168,28,169,214,121,76,
       207,177,124,183,156,185,160,243,36,79,125,230,231,...>>

    @@ -177,10 +177,10 @@

    Here the signature and message in the last example is verifyed using the public key. The public key is stored in an engine, only to exemplify that it is -possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    -                 key_id => "id of the public key in Engine"}.
    +possible. The public key could of course be handled openly as usual.

    4> PublicKey = #{engine => EngineRef,
    +                 key_id => "id of the public key in Engine"}.
     ...
    -5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
    +5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
     true
     6>

    @@ -189,11 +189,11 @@

    Using a password protected private key

    The same example as the first sign example, except that a password protects the -key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
    +key down in the Engine.

    6> PrivKeyPwd = #{engine => EngineRef,
                       key_id => "id of the pwd protected private key in Engine",
    -		  password => "password"}.
    +		  password => "password"}.
     ...
    -7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
    +7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
     <<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
       175,106,77,241,141,120,72,149,181,181,194,154,175,76,
       223,...>>
    diff --git a/prs/9277/lib/crypto-5.5.2/doc/html/engine_load.html b/prs/9277/lib/crypto-5.5.2/doc/html/engine_load.html
    index ee49aca396baf..42d5f6340ffb1 100644
    --- a/prs/9277/lib/crypto-5.5.2/doc/html/engine_load.html
    +++ b/prs/9277/lib/crypto-5.5.2/doc/html/engine_load.html
    @@ -152,35 +152,35 @@ 

    Dynamically load an engine from default directory

    If the engine is located in the OpenSSL/LibreSSL installation engines -directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    - {ok, #Ref}

    +directory.

    1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
    + {ok, #Ref}

    Load an engine with the dynamic engine

    Load an engine with the help of the dynamic engine by giving the path to the -library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    - {ok, #Ref}

    +library.

     2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    + {ok, #Ref}

    Load an engine and replace some methods

    Load an engine with the help of the dynamic engine and just replace some engine -methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    -                                      [{<<"SO_PATH">>,
    -                                        <<"/some/path/otp_test_engine.so">>},
    -                                       {<<"ID">>, <<"MD5">>},
    -                                       <<"LOAD">>],
    -                                      []).
    -{ok, #Ref}
    -4> ok = crypto:engine_register(Engine, [engine_method_digests]).
    +methods.

     3> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
    +                                      [{<<"SO_PATH">>,
    +                                        <<"/some/path/otp_test_engine.so">>},
    +                                       {<<"ID">>, <<"MD5">>},
    +                                       <<"LOAD">>],
    +                                      []).
    +{ok, #Ref}
    +4> ok = crypto:engine_register(Engine, [engine_method_digests]).
     ok

    @@ -189,19 +189,19 @@

    5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>, - <<"/some/path/otp_test_engine.so">>). - {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
    +check if the ID is loaded and then just get a new reference to the engine.

     5> {ok, Engine} = crypto:ensure_engine_loaded(<<"MD5">>,
    +                                               <<"/some/path/otp_test_engine.so">>).
    + {ok, #Ref}

    To remove the tag from the OpenSSL engine list use crypto:engine_remove/1.

     6> crypto:engine_remove(Engine).
      ok

    To unload it use crypto:engine_unload/1 which removes the references to the -engine.

     6> crypto:engine_unload(Engine).
    +engine.

     6> crypto:engine_unload(Engine).
      ok

    List all engines currently loaded

    -
     8> crypto:engine_list().
    -[<<"dynamic">>, <<"MD5">>]
    +
     8> crypto:engine_list().
    +[<<"dynamic">>, <<"MD5">>]
    diff --git a/prs/9277/lib/crypto-5.5.2/doc/html/new_api.html b/prs/9277/lib/crypto-5.5.2/doc/html/new_api.html index 78010a11e843b..83eacbe1f4197 100644 --- a/prs/9277/lib/crypto-5.5.2/doc/html/new_api.html +++ b/prs/9277/lib/crypto-5.5.2/doc/html/new_api.html @@ -192,41 +192,41 @@

    initialises the crypto context. One or more calls crypto_update/2 does the actual encryption or decryption for each block.

    This example shows first the encryption of two blocks and then decryptions of the cipher text, but divided into three blocks just to show that it is possible -to divide the plain text and cipher text differently for some ciphers:

    	1> crypto:start().
    +to divide the plain text and cipher text differently for some ciphers:

    	1> crypto:start().
     	ok
     	2> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
     	3> IV = <<0:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>
    -	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
    +	4> StateEnc = crypto:crypto_init(aes_128_ctr, Key, IV, true). % encrypt -> true
     	#Ref<0.3768901617.1128660993.124047>
    -	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
    +	5> crypto:crypto_update(StateEnc, <<"First bytes">>).
     	<<67,44,216,166,25,130,203,5,66,6,162>>
    -	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
    +	6> crypto:crypto_update(StateEnc, <<"Second bytes">>).
     	<<16,79,94,115,234,197,94,253,16,144,151,41>>
     	7>
    -	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
    +	7> StateDec = crypto:crypto_init(aes_128_ctr, Key, IV, false). % decrypt -> false
     	#Ref<0.3768901617.1128660994.124255>
    -	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
    +	8> crypto:crypto_update(StateDec, <<67,44,216,166,25,130,203>>).
     	<<"First b">>
    -	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    -        94,253,16,144,151>>).
    +	9> crypto:crypto_update(StateDec, <<5,66,6,162,16,79,94,115,234,197,
    +        94,253,16,144,151>>).
     	<<"ytesSecond byte">>
    -	10> crypto:crypto_update(StateDec, <<41>>).
    +	10> crypto:crypto_update(StateDec, <<41>>).
     	<<"s">>
     	11>

    Note that the internal data that the StateEnc and StateDec references are destructivly updated by the calls to crypto_update/2. This is to gain time in the calls of the nifs interfacing the cryptolib. In a loop where the state is saved in the loop's state, it also saves one update of the loop state per crypto operation.

    For example, a simple server receiving text parts to encrypt and send the result -back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    -	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
    +back to the one who sent them (the Requester):

    	encode(Crypto, Key, IV) ->
    +	crypto_loop(crypto:crypto_init(Crypto, Key, IV, true)).
     
    -	crypto_loop(State) ->
    +	crypto_loop(State) ->
     	receive
    -        {Text, Requester} ->
    -        Requester ! crypto:crypto_update(State, Text),
    -	loop(State)
    +        {Text, Requester} ->
    +        Requester ! crypto:crypto_update(State, Text),
    +	loop(State)
     	end.

    @@ -239,9 +239,9 @@

    <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] - 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] + 4> crypto:crypto_one_time(aes_128_ctr, Key, IV, Txt, true). <<67,44,216,166,25,130,203,5,66,6,162,16,79,94,115,234, 197,94,253,16,144,151,41>> 5>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one @@ -257,14 +257,14 @@

    <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> 2> IV = <<0:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>> - 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. - [<<"First bytes">>,<<"Second bytes">>] + 3> Txt = [<<"First bytes">>,<<"Second bytes">>]. + [<<"First bytes">>,<<"Second bytes">>] 4> AAD = <<"Some additional auth data">>. <<"Some additional auth data">> - 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). - {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, + 5> crypto:crypto_one_time_aead(aes_128_gcm, Key, IV, Txt, AAD, true). + {<<240,130,38,96,130,241,189,52,3,190,179,213,132,1,72, 192,103,176,90,104,15,71,158>>, - <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} + <<131,47,45,91,142,85,9,244,21,141,214,71,31,135,2,155>>} 6>

    The [<<"First bytes">>,<<"Second bytes">>] could of course have been one single binary: <<"First bytesSecond bytes">>.

    @@ -274,21 +274,21 @@

    	1> Key = <<1:128>>.
     	<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>>
    -	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
    +	2> StateMac = crypto:mac_init(cmac, aes_128_cbc, Key).
     	#Ref<0.2424664121.2781478916.232610>
    -	3> crypto:mac_update(StateMac, <<"First bytes">>).
    +	3> crypto:mac_update(StateMac, <<"First bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	4> crypto:mac_update(StateMac, " ").
    +	4> crypto:mac_update(StateMac, " ").
     	#Ref<0.2424664121.2781478916.232610>
    -	5> crypto:mac_update(StateMac, <<"last bytes">>).
    +	5> crypto:mac_update(StateMac, <<"last bytes">>).
     	#Ref<0.2424664121.2781478916.232610>
    -	6> crypto:mac_final(StateMac).
    +	6> crypto:mac_final(StateMac).
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
    +	7>

    and compare the result with a single calculation just for this example:

    	7> crypto:mac(cmac, aes_128_cbc, Key, "First bytes last bytes").
     	<<68,191,219,128,84,77,11,193,197,238,107,6,214,141,160,
     	249>>
    -	8> v(7) == v(6).
    +	8> v(7) == v(6).
     	true
     	9>

    diff --git a/prs/9277/lib/debugger-5.5/doc/html/debugger.epub b/prs/9277/lib/debugger-5.5/doc/html/debugger.epub index aab535fa6998b..18b5009c6fccc 100644 Binary files a/prs/9277/lib/debugger-5.5/doc/html/debugger.epub and b/prs/9277/lib/debugger-5.5/doc/html/debugger.epub differ diff --git a/prs/9277/lib/debugger-5.5/doc/html/debugger_chapter.html b/prs/9277/lib/debugger-5.5/doc/html/debugger_chapter.html index 15273eec22b5d..70e836ad11129 100644 --- a/prs/9277/lib/debugger-5.5/doc/html/debugger_chapter.html +++ b/prs/9277/lib/debugger-5.5/doc/html/debugger_chapter.html @@ -164,12 +164,12 @@

    To have an effect, a breakpoint must be set at an executable line, which is a line of code containing an executable expression such as a matching or a function call. A blank line or a line containing a comment, function head, or -pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    -2:   case get_file(Module,Compiled) of
    -3:     {ok,File} ->
    -4:       case code:which(Module) of
    +pattern in a case statement or receive statement is not executable.

    In the following example, lines 2, 4, 6, 8, and 11 are executable lines:

    1: is_loaded(Module,Compiled) ->
    +2:   case get_file(Module,Compiled) of
    +3:     {ok,File} ->
    +4:       case code:which(Module) of
     5:         ?TAG ->
    -6:           {loaded,File};
    +6:           {loaded,File};
     7:         _ ->
     8:           unloaded
     9:       end;
    @@ -208,13 +208,13 @@ 

    returns unbound or {value,Value}.

    Conditional Break Dialog Window

    Right-click the Module entry to open a popup menu from which the appropriate module can be selected.

    Example:

    A conditional breakpoint calling c_test:c_break/1 is added at line 6 in module fact. Each time the breakpoint is reached, the function is called. When N is -equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    -6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    --export([c_break/1]).
    +equal to 3, the function returns true and the process stops.

    Extract from fact.erl:

    5. fac(0) -> 1;
    +6. fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

    Definition of c_test:c_break/1:

    -module(c_test).
    +-export([c_break/1]).
     
    -c_break(Bindings) ->
    -    case int:get_binding('N', Bindings) of
    -        {value, 3} ->
    +c_break(Bindings) ->
    +    case int:get_binding('N', Bindings) of
    +        {value, 3} ->
                 true;
             _ ->
                 false
    @@ -235,12 +235,12 @@ 

    The Erlang emulator keeps track of a stack trace, information about recent function calls. This information is used if an error occurs, for example:

    1> catch a+1.
    -{'EXIT',{badarith,[{erlang,'+',[a,1],[]},
    -                   {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]},
    -                   {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]},
    -                   {shell,exprs,7,[{file,"shell.erl"},{line,674}]},
    -                   {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]},
    -                   {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section +{'EXIT',{badarith,[{erlang,'+',[a,1],[]}, + {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,573}]}, + {erl_eval,expr,5,[{file,"erl_eval.erl"},{line,357}]}, + {shell,exprs,7,[{file,"shell.erl"},{line,674}]}, + {shell,eval_exprs,7,[{file,"shell.erl"},{line,629}]}, + {shell,eval_loop,3,[{file,"shell.erl"},{line,614}]}]}}

    For details about the stack trace, see section Errors and Error Handling in the Erlang Reference Manual.

    Debugger emulates the stack trace by keeping track of recently called interpreted functions. (The real stack trace cannot be used, as it shows which diff --git a/prs/9277/lib/debugger-5.5/doc/html/i.html b/prs/9277/lib/debugger-5.5/doc/html/i.html index 6fb0e8b2a13b3..6107892b8bf21 100644 --- a/prs/9277/lib/debugger-5.5/doc/html/i.html +++ b/prs/9277/lib/debugger-5.5/doc/html/i.html @@ -134,9 +134,9 @@

    interpreted processes and break points.

    It is possible to attach to interpreted processes by only giving the corresponding process identity. By default, an attachment window is displayed. Processes at other Erlang nodes can be attached manually or automatically.

    The functions in this module are defined in the Erlang shell. That is, -they can be called without the i: prefix. For example:

    1> ii(t).
    -{module,t}
    -2> iaa([init]).
    +they can be called without the i: prefix. For example:

    1> ii(t).
    +{module,t}
    +2> iaa([init]).
     true
    diff --git a/prs/9277/lib/debugger-5.5/doc/html/int.html b/prs/9277/lib/debugger-5.5/doc/html/int.html index f0848242a305a..dbebba511a6c6 100644 --- a/prs/9277/lib/debugger-5.5/doc/html/int.html +++ b/prs/9277/lib/debugger-5.5/doc/html/int.html @@ -686,7 +686,7 @@

    auto_attach(Flags, Function)

    Sets when and how to attach automatically to a process executing code in interpreted modules.

    By default when the interpreter is started, automatic attach is disabled.

    If Flags is an empty list, automatic attach is disabled.

    Otherwise Flags should be a list containing at least one of the following flags:

    • init - Attach when a process for the first time calls an interpreted -function.
    • break - Attach whenever a process reaches a breakpoint.
    • exit - Attach when a process terminates.

    When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    +function.
  • break - Attach whenever a process reaches a breakpoint.
  • exit - Attach when a process terminates.
  • When the specified event occurs, the function Function is called as:

    spawn(Module, Name, [Pid | Args])

    Pid is the pid of the process executing interpreted code.

    diff --git a/prs/9277/lib/debugger-5.5/doc/html/notes.html b/prs/9277/lib/debugger-5.5/doc/html/notes.html index c2c22c90e33c2..22ab70147f644 100644 --- a/prs/9277/lib/debugger-5.5/doc/html/notes.html +++ b/prs/9277/lib/debugger-5.5/doc/html/notes.html @@ -139,15 +139,15 @@

    • Defining a fun in the shell using the syntax fun Name/Arity would fail. This has been corrected so that the following now works:

      1> F = fun is_atom/1.
       #Fun.erl.42.18682967>
      -> F(a).
      +> F(a).
       true
       3> Id = fun id/1.
       #Fun.erl.42.18682967>
      -4> Id(42).
      +4> Id(42).
       ** exception error: undefined shell command id/1
      -5> id(I) -> I.
      +5> id(I) -> I.
       ok
      -6> Id(42).
      +6> Id(42).
       42

      The Debugger has also been corrected to correctly handle this syntax for a BIF.

      Own Id: OTP-19322 Aux Id: GH-8963, PR-8987

    diff --git a/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.epub b/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.epub index 093cfe624fc44..faf30e878e5e1 100644 Binary files a/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.epub and b/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.epub differ diff --git a/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.html b/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.html index 826d19b7e15c3..2d08d7904e321 100644 --- a/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.html +++ b/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer.html @@ -270,13 +270,13 @@

    repeating options which would otherwise need to be given explicitly to Dialyzer on every invocation.

    The location of the configuration file can be set via the DIALYZER_CONFIG environment variable, and defaults to within the user_config from -filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    -        {default_apps,[stdlib,kernel,erts]},
    -        {default_warning_apps,[stdlib]}
    -      }.
    -      {warnings, [no_improper_lists]}.
    -      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    -      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    +filename:basedir/3.

    An example configuration file's contents might be:

          {incremental,
    +        {default_apps,[stdlib,kernel,erts]},
    +        {default_warning_apps,[stdlib]}
    +      }.
    +      {warnings, [no_improper_lists]}.
    +      {add_pathsa,["/users/samwise/potatoes/ebin"]}.
    +      {add_pathsz,["/users/smeagol/fish/ebin"]}.

    @@ -284,13 +284,13 @@

    Attribute -dialyzer() can be used for turning off warnings in a module by specifying functions or warning options. For example, to turn off all warnings -for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source +for the function f/0, include the following line:

    -dialyzer({nowarn_function, f/0}).

    To turn off warnings for improper lists, add the following line to the source file:

    -dialyzer(no_improper_lists).

    Attribute -dialyzer() is allowed after function declarations. Lists of warning -options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in +options or functions are allowed:

    -dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).

    Warning options can be restricted to functions:

    -dialyzer({no_improper_lists, g/0}).
    -dialyzer({[no_return, no_match], [g/0, h/0]}).

    The warning option for underspecified functions, -Wunderspecs, can result in useful warnings, but often functions with specifications that are strictly more allowing than the success typing cannot easily be modified to be less allowing. To turn off the warning for underspecified function f/0, include the following -line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also +line:

    -dialyzer({no_underspecs, f/0}).

    For help on the warning options, use dialyzer -Whelp. The options are also enumerated, see type warn_option/0.

    Attribute -dialyzer() can also be used for turning on warnings. For example, if a module has been fixed regarding unmatched returns, adding the following line can help in assuring that no new unmatched return warnings are introduced:

    -dialyzer(unmatched_returns).
    diff --git a/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer_chapter.html b/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer_chapter.html index 7b70106975ebd..2e1bcbaa8419b 100644 --- a/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer_chapter.html +++ b/prs/9277/lib/dialyzer-5.3/doc/html/dialyzer_chapter.html @@ -209,29 +209,29 @@

    deduce). One implication of this is that if the user gives a spec for a function which overlaps with Dialyzer's inferred type, but is more restrictive, Dialyzer will trust those restrictions. This may then generate an error elsewhere that -follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
    +follows from the erroneously restricted spec.

    Examples:

    Non-overlapping argument:

    -spec foo(boolean()) -> string().
     %% Dialyzer will infer: foo(integer()) -> string().
    -foo(N) ->
    -    integer_to_list(N).

    Since the type of the argument in the spec is different from the type that +foo(N) -> + integer_to_list(N).

    Since the type of the argument in the spec is different from the type that Dialyzer inferred, Dialyzer will generate the following warning:

    some_module.erl:7:2: Invalid type specification for function some_module:foo/1.
      The success typing is some_module:foo
    -          (integer()) -> string()
    +          (integer()) -> string()
      But the spec is some_module:foo
    -          (boolean()) -> string()
    - They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
    +          (boolean()) -> string()
    + They do not overlap in the 1st argument

    Non-overlapping return:

    -spec bar(a | b) -> atom().
     %% Dialyzer will infer: bar(a | b) -> binary().
    -bar(a) -> <<"a">>;
    -bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are +bar(a) -> <<"a">>; +bar(b) -> <<"b">>.

    Since the return value in the spec and the return value inferred by Dialyzer are different, Dialyzer will generate the following warning:

    some_module.erl:11:2: Invalid type specification for function some_module:bar/1.
      The success typing is some_module:bar
    -          ('a' | 'b') -> <<_:8>>
    +          ('a' | 'b') -> <<_:8>>
      But the spec is some_module:bar
    -          ('a' | 'b') -> atom()
    - The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
    +          ('a' | 'b') -> atom()
    + The return types do not overlap

    Overlapping spec and inferred type:

    -spec baz(a | b) -> non_neg_integer().
     %% Dialyzer will infer: baz(b | c | d) -> -1 | 0 | 1.
    -baz(b) -> -1;
    -baz(c) -> 0;
    -baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and +baz(b) -> -1; +baz(c) -> 0; +baz(d) -> 1.

    Dialyzer will "trust" the spec and using the intersection of the spec and inferred type:

    baz(b) -> 0 | 1.

    Notice how the c and d from the argument to baz/1 and the -1 in the return from the inferred type were dropped once the spec and inferred type were intersected. This could result in warnings being emitted for later functions.

    For example, if baz/1 is called like this:

    call_baz1(A) ->
    diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/.build b/prs/9277/lib/diameter-2.4.1/doc/html/.build
    index 9604dc9f44842..c3d0e57a330b8 100644
    --- a/prs/9277/lib/diameter-2.4.1/doc/html/.build
    +++ b/prs/9277/lib/diameter-2.4.1/doc/html/.build
    @@ -32,7 +32,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2
     dist/lato-latin-ext-400-normal-N27NCBWW.woff2
     dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2
     dist/remixicon-NKANDIL5.woff2
    -dist/search_data-C06240AF.js
    +dist/search_data-FE8C9D8B.js
     dist/sidebar_items-BFA5481A.js
     index.html
     notes.html
    diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/diameter.epub b/prs/9277/lib/diameter-2.4.1/doc/html/diameter.epub
    index a15069a8d6e86..3eddd6cb029ad 100644
    Binary files a/prs/9277/lib/diameter-2.4.1/doc/html/diameter.epub and b/prs/9277/lib/diameter-2.4.1/doc/html/diameter.epub differ
    diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/diameter.html b/prs/9277/lib/diameter-2.4.1/doc/html/diameter.html
    index 4c4031b20947d..1172580bd6aff 100644
    --- a/prs/9277/lib/diameter-2.4.1/doc/html/diameter.html
    +++ b/prs/9277/lib/diameter-2.4.1/doc/html/diameter.html
    @@ -229,14 +229,14 @@ 

    containing only 0 (NO_INBAND_SECURITY). If 1 (TLS) is specified then TLS is selected if the CER/CEA received from the peer offers it.

  • {'Acct-Application-Id', [Unsigned32()]}

  • {'Vendor-Specific-Application-Id', [Grouped()]}

  • {'Firmware-Revision',Unsigned32()}

  • Note that each tuple communicates one or more AVP values. It is an error to specify duplicate tuples.

  • eval() = {M,F,A} | fun() | [eval() | A] - An expression that can be -evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    -    apply(M, F, T ++ A);
    -eval([[F|A] | T]) ->
    -    eval([F | T ++ A]);
    -eval([F|A]) ->
    -    apply(F, A);
    -eval(F) ->
    -    eval([F]).

    Applying an eval() E to an argument list A is meant +evaluated as a function in the following sense.

    eval([{M,F,A} | T]) ->
    +    apply(M, F, T ++ A);
    +eval([[F|A] | T]) ->
    +    eval([F | T ++ A]);
    +eval([F|A]) ->
    +    apply(F, A);
    +eval(F) ->
    +    eval([F]).

    Applying an eval() E to an argument list A is meant in the sense of eval([E|A]).

    Warning

    Beware of using fun expressions of the form fun Name/Arity in situations in which the fun is not short-lived and code is to be upgraded at runtime since any processes retaining such a fun will have a reference to old code. @@ -279,10 +279,10 @@

    service_event() record. Can have one of the following types.

    • start

    • stop - The service is being started or stopped. No event precedes a start event. No event follows a stop event, and this event implies the -termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      -Peer   = diameter_app:peer()
      -Config = {connect|listen, [transport_opt()]}
      -Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of +termination of all transport processes.

    • {up, Ref, Peer, Config, Pkt}

    • {up, Ref, Peer, Config}

    • {down, Ref, Peer, Config}

      Ref    = transport_ref()
      +Peer   = diameter_app:peer()
      +Config = {connect|listen, [transport_opt()]}
      +Pkt    = #diameter_packet{}

      The RFC 3539 watchdog state machine has transitioned into (up) or out of (down) the OKAY state. If a #diameter_packet{} is present in an up event then there has been a capabilities exchange on a newly established transport connection and the record contains the received CER or CEA.

      Note that a single up or down event for a given peer corresponds to @@ -308,20 +308,20 @@

      Pkt = #diameter_packet{}

  • An incoming CER contained errors and has been answered with the indicated result code. Caps contains values for the local node only. Pkt contains the CER in question.

  • {'CER', timeout} - An expected CER was not received within -capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    -Caps = #diameter_caps{}
    -Pkt  = #diameter_packet{}
    -ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An +capx_timeout of connection establishment.

  • {'CEA', Result, Caps, Pkt}

    Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}
    +Caps = #diameter_caps{}
    +Pkt  = #diameter_packet{}
    +ResultCode = integer()

    An incoming CEA has been rejected for the indicated reason. An integer-valued Result indicates the result code sent by the peer. Caps contains pairs of values for the local node and remote peer. Pkt contains the CEA in question. In the case of rejection by a capabilities callback, the tuple contains the rejecting callback.

  • {'CEA', Caps, Pkt}

    Caps = #diameter_caps{}
     Pkt  = #diameter_packet{}

    An incoming CEA contained errors and has been rejected. Caps contains only values for the local node. Pkt contains the CEA in question.

  • {'CEA', timeout} - An expected CEA was not received within -capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    -PeerRef = diameter_app:peer_ref()
    +capx_timeout of connection establishment.

  • {watchdog, Ref, PeerRef, {From, To}, Config}

    Ref = transport_ref()
    +PeerRef = diameter_app:peer_ref()
     From, To = initial | okay | suspect | down | reopen
    -Config = {connect|listen, [transport_opt()]}

    An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared +Config = {connect|listen, [transport_opt()]}

  • An RFC 3539 watchdog state machine has changed state.

  • any/0 - For forward compatibility, a subscriber should be prepared to receive info fields of forms other than the above.

  • service_name() = term() - Name of a service as passed to start_service/2 and with which the service is identified. There can be at most one service with a given name on a given node. Note that @@ -569,10 +569,10 @@

    which a started transport process should be terminated if it has not yet established a connection. For example, the following options on a connecting transport request a connection with one peer over SCTP or another (typically -the same) over TCP.

    {transport_module, diameter_sctp}
    -{transport_config, SctpOpts, 5000}
    -{transport_module, diameter_tcp}
    -{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing +the same) over TCP.

    {transport_module, diameter_sctp}
    +{transport_config, SctpOpts, 5000}
    +{transport_module, diameter_tcp}
    +{transport_config, TcpOpts}

    To listen on both SCTP and TCP, define one transport for each.

  • {transport_module, atom()} - Module implementing a transport process as defined in diameter_transport. Defaults to diameter_tcp.

    Multiple transport_module and transport_config options are allowed. The @@ -2559,13 +2559,13 @@

    remove_transport(SvcName, Pred)

    Remove previously added transports.

    Pred determines which transports to remove. An arity-3-valued Pred removes all transports for which Pred(Ref, Type, Opts) returns true, where Type and Opts are as passed to add_transport/2 and Ref is as returned by it. -The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    -Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    -Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    -Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    -Pred = true:                          fun(_, _, _) -> true end
    -Pred = false:                         fun(_, _, _) -> false end
    -Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be +The remaining forms are equivalent to an arity-3 fun as follows.

    Pred = fun(transport_ref(), list()):  fun(Ref, _, Opts) -> Pred(Ref, Opts) end
    +Pred = fun(list()):                   fun(_, _, Opts) -> Pred(Opts) end
    +Pred = transport_ref():               fun(Ref, _, _)  -> Pred == Ref end
    +Pred = list():                        fun(_, _, Opts) -> [] == Pred -- Opts end
    +Pred = true:                          fun(_, _, _) -> true end
    +Pred = false:                         fun(_, _, _) -> false end
    +Pred = {M,F,A}:  fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end

    Removing a transport causes the corresponding transport processes to be terminated. Whether or not a DPR message is sent to a peer is controlled by value of disconnect_cb configured on the transport.

    @@ -2609,52 +2609,52 @@

    service_info(SvcName, Option)

    containing both configuration and information about established peer connections. An example return value with for a client service with Origin-Host "client.example.com" configured with a single transport connected -to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    -  {type,connect},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{ip,{127,0,0,1}},
    -                               {raddr,{127,0,0,1}},
    -                               {rport,3868},
    -                               {reuseaddr,true}]}]},
    -  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    -  {peer,{<0.67.0>,-576460736357885808}},
    -  {apps,[{0,common}]},
    -  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    -         {origin_realm,{"example.com","example.com"}},
    -         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -         {vendor_id,{0,193}},
    -         {product_name,{"Client","Server"}},
    -         {origin_state_id,{[],[]}},
    -         {supported_vendor_id,{[],[]}},
    -         {auth_application_id,{[0],[0]}},
    -         {inband_security_id,{[],[0]}},
    -         {acct_application_id,{[],[]}},
    -         {vendor_specific_application_id,{[],[]}},
    -         {firmware_revision,{[],[]}},
    -         {avp,{[],[]}}]},
    -  {port,[{owner,<0.69.0>},
    -         {module,diameter_tcp},
    -         {socket,{{127,0,0,1},48758}},
    -         {peer,{{127,0,0,1},3868}},
    -         {statistics,[{recv_oct,656},
    -                      {recv_cnt,6},
    -                      {recv_max,148},
    -                      {recv_avg,109},
    -                      {recv_dvi,19},
    -                      {send_oct,836},
    -                      {send_cnt,6},
    -                      {send_max,184},
    -                      {send_avg,139},
    -                      {send_pend,0}]}]},
    -  {statistics,[{{{0,258,0},recv},3},
    -               {{{0,258,1},send},3},
    -               {{{0,258,0},recv,{'Result-Code',2001}},3},
    -               {{{0,257,0},recv},1},
    -               {{{0,257,1},send},1},
    -               {{{0,257,0},recv,{'Result-Code',2001}},1},
    -               {{{0,280,1},recv},2},
    -               {{{0,280,0},send},2},
    -               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options +to "server.example.com" might look as follows.

    [[{ref,#Ref<0.0.0.93>},
    +  {type,connect},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{ip,{127,0,0,1}},
    +                               {raddr,{127,0,0,1}},
    +                               {rport,3868},
    +                               {reuseaddr,true}]}]},
    +  {watchdog,{<0.66.0>,-576460736368485571,okay}},
    +  {peer,{<0.67.0>,-576460736357885808}},
    +  {apps,[{0,common}]},
    +  {caps,[{origin_host,{"client.example.com","server.example.com"}},
    +         {origin_realm,{"example.com","example.com"}},
    +         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +         {vendor_id,{0,193}},
    +         {product_name,{"Client","Server"}},
    +         {origin_state_id,{[],[]}},
    +         {supported_vendor_id,{[],[]}},
    +         {auth_application_id,{[0],[0]}},
    +         {inband_security_id,{[],[0]}},
    +         {acct_application_id,{[],[]}},
    +         {vendor_specific_application_id,{[],[]}},
    +         {firmware_revision,{[],[]}},
    +         {avp,{[],[]}}]},
    +  {port,[{owner,<0.69.0>},
    +         {module,diameter_tcp},
    +         {socket,{{127,0,0,1},48758}},
    +         {peer,{{127,0,0,1},3868}},
    +         {statistics,[{recv_oct,656},
    +                      {recv_cnt,6},
    +                      {recv_max,148},
    +                      {recv_avg,109},
    +                      {recv_dvi,19},
    +                      {send_oct,836},
    +                      {send_cnt,6},
    +                      {send_max,184},
    +                      {send_avg,139},
    +                      {send_pend,0}]}]},
    +  {statistics,[{{{0,258,0},recv},3},
    +               {{{0,258,1},send},3},
    +               {{{0,258,0},recv,{'Result-Code',2001}},3},
    +               {{{0,257,0},recv},1},
    +               {{{0,257,1},send},1},
    +               {{{0,257,0},recv,{'Result-Code',2001}},1},
    +               {{{0,280,1},recv},2},
    +               {{{0,280,0},send},2},
    +               {{{0,280,0},send,{'Result-Code',2001}},2}]}]]

    Here ref is a transport_ref() and options the corresponding transport_opt() list passed to add_transport/2. The watchdog entry shows the state of a connection's RFC 3539 watchdog state machine. The peer entry identifies the @@ -2673,55 +2673,55 @@

    service_info(SvcName, Option)

    transport configuration.

    A listening transport presents its information slightly differently since there may be multiple accepted connections for the same transport_ref(). The transport info returned -by a server with a single client connection might look as follows.

    [[{ref,#Ref<0.0.0.61>},
    -  {type,listen},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{reuseaddr,true},
    -                               {ip,{127,0,0,1}},
    -                               {port,3868}]}]},
    -  {accept,[[{watchdog,{<0.56.0>,-576460739249514012,okay}},
    -            {peer,{<0.58.0>,-576460638229179167}},
    -            {apps,[{0,common}]},
    -            {caps,[{origin_host,{"server.example.com","client.example.com"}},
    -                   {origin_realm,{"example.com","example.com"}},
    -                   {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -                   {vendor_id,{193,0}},
    -                   {product_name,{"Server","Client"}},
    -                   {origin_state_id,{[],[]}},
    -                   {supported_vendor_id,{[],[]}},
    -                   {auth_application_id,{[0],[0]}},
    -                   {inband_security_id,{[],[]}},
    -                   {acct_application_id,{[],[]}},
    -                   {vendor_specific_application_id,{[],[]}},
    -                   {firmware_revision,{[],[]}},
    -                   {avp,{[],[]}}]},
    -            {port,[{owner,<0.62.0>},
    -                   {module,diameter_tcp},
    -                   {socket,{{127,0,0,1},3868}},
    -                   {peer,{{127,0,0,1},48758}},
    -                   {statistics,[{recv_oct,1576},
    -                                {recv_cnt,16},
    -                                {recv_max,184},
    -                                {recv_avg,98},
    -                                {recv_dvi,26},
    -                                {send_oct,1396},
    -                                {send_cnt,16},
    -                                {send_max,148},
    -                                {send_avg,87},
    -                                {send_pend,0}]}]}],
    -           [{watchdog,{<0.72.0>,-576460638229717546,initial}}]]},
    -  {statistics,[{{{0,280,0},recv},7},
    -               {{{0,280,1},send},7},
    -               {{{0,280,0},recv,{'Result-Code',2001}},7},
    -               {{{0,258,1},recv},3},
    -               {{{0,258,0},send},3},
    -               {{{0,258,0},send,{'Result-Code',2001}},3},
    -               {{{0,280,1},recv},5},
    -               {{{0,280,0},send},5},
    -               {{{0,280,0},send,{'Result-Code',2001}},5},
    -               {{{0,257,1},recv},1},
    -               {{{0,257,0},send},1},
    -               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    The information presented here is as in the connect case except that the +by a server with a single client connection might look as follows.

    [[{ref,#Ref<0.0.0.61>},
    +  {type,listen},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{reuseaddr,true},
    +                               {ip,{127,0,0,1}},
    +                               {port,3868}]}]},
    +  {accept,[[{watchdog,{<0.56.0>,-576460739249514012,okay}},
    +            {peer,{<0.58.0>,-576460638229179167}},
    +            {apps,[{0,common}]},
    +            {caps,[{origin_host,{"server.example.com","client.example.com"}},
    +                   {origin_realm,{"example.com","example.com"}},
    +                   {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +                   {vendor_id,{193,0}},
    +                   {product_name,{"Server","Client"}},
    +                   {origin_state_id,{[],[]}},
    +                   {supported_vendor_id,{[],[]}},
    +                   {auth_application_id,{[0],[0]}},
    +                   {inband_security_id,{[],[]}},
    +                   {acct_application_id,{[],[]}},
    +                   {vendor_specific_application_id,{[],[]}},
    +                   {firmware_revision,{[],[]}},
    +                   {avp,{[],[]}}]},
    +            {port,[{owner,<0.62.0>},
    +                   {module,diameter_tcp},
    +                   {socket,{{127,0,0,1},3868}},
    +                   {peer,{{127,0,0,1},48758}},
    +                   {statistics,[{recv_oct,1576},
    +                                {recv_cnt,16},
    +                                {recv_max,184},
    +                                {recv_avg,98},
    +                                {recv_dvi,26},
    +                                {send_oct,1396},
    +                                {send_cnt,16},
    +                                {send_max,148},
    +                                {send_avg,87},
    +                                {send_pend,0}]}]}],
    +           [{watchdog,{<0.72.0>,-576460638229717546,initial}}]]},
    +  {statistics,[{{{0,280,0},recv},7},
    +               {{{0,280,1},send},7},
    +               {{{0,280,0},recv,{'Result-Code',2001}},7},
    +               {{{0,258,1},recv},3},
    +               {{{0,258,0},send},3},
    +               {{{0,258,0},send,{'Result-Code',2001}},3},
    +               {{{0,280,1},recv},5},
    +               {{{0,280,0},send},5},
    +               {{{0,280,0},send,{'Result-Code',2001}},5},
    +               {{{0,257,1},recv},1},
    +               {{{0,257,0},send},1},
    +               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    The information presented here is as in the connect case except that the client connections are grouped under an accept tuple.

    Whether or not the transport_opt() pool_size has been configured affects the format of the listing in the case of a connecting transport, since a value greater than 1 implies multiple transport @@ -2732,54 +2732,54 @@

    service_info(SvcName, Option)

    This is a flat view of transport info which lists only active connections and for which Diameter-level statistics are accumulated only for the lifetime of the transport connection. A return value for the server above might look as -follows.

    [[{ref,#Ref<0.0.0.61>},
    -  {type,accept},
    -  {options,[{transport_module,diameter_tcp},
    -            {transport_config,[{reuseaddr,true},
    -                               {ip,{127,0,0,1}},
    -                               {port,3868}]}]},
    -  {watchdog,{<0.56.0>,-576460739249514012,okay}},
    -  {peer,{<0.58.0>,-576460638229179167}},
    -  {apps,[{0,common}]},
    -  {caps,[{origin_host,{"server.example.com","client.example.com"}},
    -         {origin_realm,{"example.com","example.com"}},
    -         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    -         {vendor_id,{193,0}},
    -         {product_name,{"Server","Client"}},
    -         {origin_state_id,{[],[]}},
    -         {supported_vendor_id,{[],[]}},
    -         {auth_application_id,{[0],[0]}},
    -         {inband_security_id,{[],[]}},
    -         {acct_application_id,{[],[]}},
    -         {vendor_specific_application_id,{[],[]}},
    -         {firmware_revision,{[],[]}},
    -         {avp,{[],[]}}]},
    -  {port,[{owner,<0.62.0>},
    -         {module,diameter_tcp},
    -         {socket,{{127,0,0,1},3868}},
    -         {peer,{{127,0,0,1},48758}},
    -         {statistics,[{recv_oct,10124},
    -                      {recv_cnt,132},
    -                      {recv_max,184},
    -                      {recv_avg,76},
    -                      {recv_dvi,9},
    -                      {send_oct,10016},
    -                      {send_cnt,132},
    -                      {send_max,148},
    -                      {send_avg,75},
    -                      {send_pend,0}]}]},
    -  {statistics,[{{{0,280,0},recv},62},
    -               {{{0,280,1},send},62},
    -               {{{0,280,0},recv,{'Result-Code',2001}},62},
    -               {{{0,258,1},recv},3},
    -               {{{0,258,0},send},3},
    -               {{{0,258,0},send,{'Result-Code',2001}},3},
    -               {{{0,280,1},recv},66},
    -               {{{0,280,0},send},66},
    -               {{{0,280,0},send,{'Result-Code',2001}},66},
    -               {{{0,257,1},recv},1},
    -               {{{0,257,0},send},1},
    -               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    Note that there may be multiple entries with the same ref, in contrast to +follows.

    [[{ref,#Ref<0.0.0.61>},
    +  {type,accept},
    +  {options,[{transport_module,diameter_tcp},
    +            {transport_config,[{reuseaddr,true},
    +                               {ip,{127,0,0,1}},
    +                               {port,3868}]}]},
    +  {watchdog,{<0.56.0>,-576460739249514012,okay}},
    +  {peer,{<0.58.0>,-576460638229179167}},
    +  {apps,[{0,common}]},
    +  {caps,[{origin_host,{"server.example.com","client.example.com"}},
    +         {origin_realm,{"example.com","example.com"}},
    +         {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},
    +         {vendor_id,{193,0}},
    +         {product_name,{"Server","Client"}},
    +         {origin_state_id,{[],[]}},
    +         {supported_vendor_id,{[],[]}},
    +         {auth_application_id,{[0],[0]}},
    +         {inband_security_id,{[],[]}},
    +         {acct_application_id,{[],[]}},
    +         {vendor_specific_application_id,{[],[]}},
    +         {firmware_revision,{[],[]}},
    +         {avp,{[],[]}}]},
    +  {port,[{owner,<0.62.0>},
    +         {module,diameter_tcp},
    +         {socket,{{127,0,0,1},3868}},
    +         {peer,{{127,0,0,1},48758}},
    +         {statistics,[{recv_oct,10124},
    +                      {recv_cnt,132},
    +                      {recv_max,184},
    +                      {recv_avg,76},
    +                      {recv_dvi,9},
    +                      {send_oct,10016},
    +                      {send_cnt,132},
    +                      {send_max,148},
    +                      {send_avg,75},
    +                      {send_pend,0}]}]},
    +  {statistics,[{{{0,280,0},recv},62},
    +               {{{0,280,1},send},62},
    +               {{{0,280,0},recv,{'Result-Code',2001}},62},
    +               {{{0,258,1},recv},3},
    +               {{{0,258,0},send},3},
    +               {{{0,258,0},send,{'Result-Code',2001}},3},
    +               {{{0,280,1},recv},66},
    +               {{{0,280,0},send},66},
    +               {{{0,280,0},send,{'Result-Code',2001}},66},
    +               {{{0,257,1},recv},1},
    +               {{{0,257,0},send},1},
    +               {{{0,257,0},send,{'Result-Code',2001}},1}]}]]

    Note that there may be multiple entries with the same ref, in contrast to transport info.

  • statistics - Return a {{Counter, Ref}, non_neg_integer()} list of counter values. Ref can be either a transport_ref() or a @@ -2791,12 +2791,12 @@

    service_info(SvcName, Option)

    configuration associated with a single peer, as passed to add_transport/2. The returned list is empty if the peer is unknown. Otherwise it contains the ref, type and options tuples as in transport and connections info -above. For example:

    [{ref,#Ref<0.0.0.61>},
    - {type,accept},
    - {options,[{transport_module,diameter_tcp},
    -           {transport_config,[{reuseaddr,true},
    -                              {ip,{127,0,0,1}},
    -                              {port,3868}]}]}]
  • +above. For example:

    [{ref,#Ref<0.0.0.61>},
    + {type,accept},
    + {options,[{transport_module,diameter_tcp},
    +           {transport_config,[{reuseaddr,true},
    +                              {ip,{127,0,0,1}},
    +                              {port,3868}]}]}]
    diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/diameter_app.html b/prs/9277/lib/diameter-2.4.1/doc/html/diameter_app.html index c44e6d33d85c4..cb1c5edf7f25f 100644 --- a/prs/9277/lib/diameter-2.4.1/doc/html/diameter_app.html +++ b/prs/9277/lib/diameter-2.4.1/doc/html/diameter_app.html @@ -719,12 +719,12 @@

    handle_request(Packet, SvcName, Peer)

    diameter:start_service/2) is determined by the Application Identifier in the header of the incoming request message, the selected module being the one whose corresponding dictionary declares itself as defining either the application in -question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    -                 avps   = [#diameter_avp{}],
    -                 msg    = record() | undefined,
    -                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    -                 bin    = binary(),
    -                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the +question or the Relay application.

    The argument packet() has the following signature.

    #diameter_packet{header = #diameter_header{},
    +                 avps   = [#diameter_avp{}],
    +                 msg    = record() | undefined,
    +                 errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],
    +                 bin    = binary(),
    +                 transport_data = term()}

    The msg field will be undefined in case the request has been received in the relay application. Otherwise it contains the record representing the request as outlined in diameter_dict(4).

    The errors field specifies any results codes identifying errors found while decoding the request. This is used to set Result-Code and/or Failed-AVP in a diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/diameter_codec.html b/prs/9277/lib/diameter-2.4.1/doc/html/diameter_codec.html index ae733c4021605..1be8e664e0cb9 100644 --- a/prs/9277/lib/diameter-2.4.1/doc/html/diameter_codec.html +++ b/prs/9277/lib/diameter-2.4.1/doc/html/diameter_codec.html @@ -139,7 +139,7 @@

    results may differ from those returned by the functions documented here, depending on configuration.

    The header() and packet() records below are defined in diameter.hrl, -which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from +which can be included as follows.

    -include_lib("diameter/include/diameter.hrl").

    Application-specific records are defined in the hrl files resulting from dictionary file compilation.

    diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/diameter_dict.html b/prs/9277/lib/diameter-2.4.1/doc/html/diameter_dict.html index f8e7aa2709464..d6e3d0f459a64 100644 --- a/prs/9277/lib/diameter-2.4.1/doc/html/diameter_dict.html +++ b/prs/9277/lib/diameter-2.4.1/doc/html/diameter_dict.html @@ -309,14 +309,14 @@

    an incoming request.

    In cases in which there is a choice between string() and binary() types for OctetString() and derived types, the representation is determined by the value of diameter:service_opt() -string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    -Integer32()   = -2147483647..2147483647
    -Integer64()   = -9223372036854775807..9223372036854775807
    -Unsigned32()  = 0..4294967295
    -Unsigned64()  = 0..18446744073709551615
    -Float32()     = '-infinity' | float() | infinity
    -Float64()     = '-infinity' | float() | infinity
    -Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large +string_decode.

    Basic AVP Data Formats

    OctetString() = string() | binary()
    +Integer32()   = -2147483647..2147483647
    +Integer64()   = -9223372036854775807..9223372036854775807
    +Unsigned32()  = 0..4294967295
    +Unsigned64()  = 0..18446744073709551615
    +Float32()     = '-infinity' | float() | infinity
    +Float64()     = '-infinity' | float() | infinity
    +Grouped()     = record()

    On encode, an OctetString() can be specified as an iolist(), excessively large floats (in absolute value) are equivalent to infinity or '-infinity' and excessively large integers result in encode failure. The records for grouped AVPs are as discussed in the previous section.

    Derived AVP Data Formats

    Address() = OctetString()
    @@ -324,14 +324,14 @@ 

    while an IPv6 address is parsed in any of the formats specified by section 2.2 of RFC 2373, "Text Representation of Addresses". An IPv4 tuple() has length 4 and contains values of type 0..255. An IPv6 tuple() has length 8 and contains -values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
    +values of type 0..65535. The tuple representation is used on decode.

    Time() = {date(), time()}
     
     where
     
    -  date() = {Year, Month, Day}
    -  time() = {Hour, Minute, Second}
    +  date() = {Year, Month, Day}
    +  time() = {Hour, Minute, Second}
     
    -  Year   = integer()
    +  Year   = integer()
       Month  = 1..12
       Day    = 1..31
       Hour   = 0..23
    @@ -359,8 +359,8 @@ 

    diameter respectively. The grammar of an OctetString-valued DiameterURI() is as specified in section 4.3 of RFC 6733. The record representation is used on decode.

    Enumerated() = Integer32()

    On encode, values can be specified using the macros defined in a dictionary's -hrl file.

    IPFilterRule()  = OctetString()
    -QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    +hrl file.

    IPFilterRule()  = OctetString()
    +QoSFilterRule() = OctetString()

    Values of these types are not currently parsed by diameter.

    diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/diameterc_cmd.html b/prs/9277/lib/diameter-2.4.1/doc/html/diameterc_cmd.html index f75f1ac04a067..689864a6be272 100644 --- a/prs/9277/lib/diameter-2.4.1/doc/html/diameterc_cmd.html +++ b/prs/9277/lib/diameter-2.4.1/doc/html/diameterc_cmd.html @@ -131,7 +131,7 @@

    Synopsis

    -
    diameterc [<options>] <file>

    +
    diameterc [<options>] <file>

    diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/dist/search_data-C06240AF.js b/prs/9277/lib/diameter-2.4.1/doc/html/dist/search_data-C06240AF.js deleted file mode 100644 index 438958f179a9d..0000000000000 --- a/prs/9277/lib/diameter-2.4.1/doc/html/dist/search_data-C06240AF.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","title":"diameter","doc":"Main API of the diameter application.\n\nThis module provides the interface with which a user can implement a Diameter\nnode that sends and receives messages using the Diameter protocol as defined in\nRFC 6733.\n\nBasic usage consists of creating a representation of a locally implemented\nDiameter node and its capabilities with `start_service/2`, adding transport\ncapability using `add_transport/2` and sending Diameter requests and receiving\nDiameter answers with `call/4`. Incoming Diameter requests are communicated as\ncallbacks to a `m:diameter_app` callback modules as specified in the service\nconfiguration.\n\nBeware the difference between _diameter_ (not capitalized) and _Diameter_\n(capitalized). The former refers to the Erlang application named diameter whose\nmain api is defined here, the latter to Diameter protocol in the sense of\nRFC 6733.\n\nThe diameter application must be started before calling most functions in this\nmodule.","ref":"diameter.html"},{"type":"module","title":"DATA TYPES - diameter","doc":"- **`Address()`**\n\n- **`DiameterIdentity()`**\n\n- **`Grouped()`**\n\n- **`OctetString()`**\n\n- **`Time()`**\n\n- **`Unsigned32()`**\n\n- **`UTF8String()`** - Types corresponding to RFC 6733 AVP Data Formats. Defined\n in [diameter_dict(4)](diameter_dict.md#DATA_TYPES).\n\n- **`elapsed_time()`** - Elapsed time since a given time.\n\n [](){: #application_alias }\n\n- **`application_alias() = term()`** - Name identifying a Diameter application\n in service configuration. Passed to `call/4` when sending requests defined by\n the application.\n\n [](){: #application_module }\n\n- **`application_module() = Mod | [Mod | ExtraArgs] | #diameter_callback{}`**\n\n ```text\n Mod = atom()\n ExtraArgs = list()\n ```\n\n Module implementing the callback interface defined in `m:diameter_app`, along\n with any extra arguments to be appended to those documented. Note that extra\n arguments specific to an outgoing request can be specified to `call/4`, in\n which case those are appended to any module-specific extra arguments.\n\n Specifying a `#diameter_callback{}` record allows individual functions to be\n configured in place of the usual `m:diameter_app` callbacks. See\n `diameter_callback.erl` for details.\n\n [](){: #application_opt }\n\n- **`application_opt()`** - Options defining a Diameter application. Has one of\n the following types.\n\n - **`{alias, `[`application_alias()`](`m:diameter#application_alias`)`}`** -\n Unique identifier for the application in the scope of the service. Defaults\n to the value of the `dictionary` option.\n\n - **`{dictionary, atom()}`** - Name of an encode/decode module for the\n Diameter messages defined by the application. These modules are generated\n from files whose format is documented in\n [diameter_dict(4)](diameter_dict.md).\n\n - **`{module, `[`application_module()`](`m:diameter#application_module`)`}`** -\n Callback module in which messages of the Diameter application are handled.\n See `m:diameter_app` for the required interface and semantics.\n\n - **`{state, term()}`** - Initial callback state. The prevailing state is\n passed to some `m:diameter_app` callbacks, which can then return a new\n state. Defaults to the value of the `alias` option.\n\n - **`{call_mutates_state, true|false}`** - Whether or not the\n [pick_peer/4](`c:diameter_app:pick_peer/4`) application callback can modify\n the application state. Defaults to `false`.\n\n > #### Warning {: .warning }\n >\n > [pick_peer/4](`c:diameter_app:pick_peer/4`) callbacks are serialized when\n > this option is `true`, which is a potential performance bottleneck. A\n > simple Diameter client may suffer no ill effects from using mutable state\n > but a server or agent that responds to incoming request should probably\n > avoid it.\n\n - **`{answer_errors, callback|report|discard}`** - Manner in which incoming\n answer messages containing decode errors are handled.\n\n If `callback` then errors result in a\n [handle_answer/4](`c:diameter_app:handle_answer/4`) callback in the same\n fashion as for [handle_request/3](`c:diameter_app:handle_request/3`), with\n errors communicated in the `errors` field of the `#diameter_packet{}` passed\n to the callback. If `report` then an answer containing errors is discarded\n without a callback and a warning report is written to the log. If `discard`\n then an answer containing errors is silently discarded without a callback.\n In both the `report` and `discard` cases the return value for the `call/4`\n invocation in question is as if a callback had taken place and returned\n `{error, failure}`.\n\n Defaults to `discard`.\n\n - **`{request_errors, answer_3xxx|answer|callback}`** - Manner in which\n incoming requests are handled when an error other than 3007\n (DIAMETER_APPLICATION_UNSUPPORTED, which cannot be associated with an\n application callback module), is detected.\n\n If `answer_3xxx` then requests are answered without a\n [handle_request/3](`c:diameter_app:handle_request/3`) callback taking place.\n If `answer` then even 5xxx errors are answered without a callback unless the\n connection in question has configured the RFC 3588 common dictionary as\n noted below. If `callback` then a\n [handle_request/3](`c:diameter_app:handle_request/3`) callback always takes\n place and its return value determines the answer sent to the peer, if any.\n\n Defaults to `answer_3xxx`.\n\n > #### Note {: .info }\n >\n > Answers sent by diameter set the E-bit in the Diameter Header. Since RFC\n > 3588 allows only 3xxx result codes in an `answer-message`, `answer` has\n > the same semantics as `answer_3xxx` when the transport in question has\n > been configured with `diameter_gen_base_rfc3588` as its common dictionary.\n > Since RFC 6733 allows both 3xxx and 5xxx result codes in an\n > `answer-message`, a transport with `diameter_gen_base_rfc6733` as its\n > common dictionary does distinguish between `answer_3xxx` and `answer`.\n\n [](){: #call_opt }\n\n- **`call_opt()`** - Options available to `call/4` when sending an outgoing\n Diameter request. Has one of the following types.\n\n - **`{extra, list()}`** - Extra arguments to append to callbacks to the\n callback module in question. These are appended to any extra arguments\n configured on the callback itself. Multiple options append to the argument\n list.\n\n - **`{filter, `[`peer_filter()`](`m:diameter#peer_filter`)`}`** - Filter to\n apply to the list of available peers before passing it to the\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callback for the application in\n question. Multiple options are equivalent a single `all` filter on the\n corresponding list of filters. Defaults to `none`.\n\n - **`{peer, `[`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`)`}`** -\n Peer to which the request in question can be sent, preempting the selection\n of peers having advertised support for the Diameter application in question.\n Multiple options can be specified, and their order is respected in the\n candidate lists passed to a subsequent\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callback.\n\n - **`{timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`** - Number of\n milliseconds after which the request should timeout. Defaults to 5000.\n\n - **`detach`** - Cause `call/4` to return `ok` as soon as the request in\n question has been encoded, instead of waiting for and returning the result\n from a subsequent [handle_answer/4](`c:diameter_app:handle_answer/4`) or\n [handle_error/4](`c:diameter_app:handle_error/4`) callback.\n\n An invalid option will cause `call/4` to fail.\n\n [](){: #capability }\n\n- **`capability()`** - AVP values sent in outgoing CER or CEA messages during\n capabilities exchange. Can be configured both on a service and a transport,\n values on the latter taking precedence. Has one of the following types.\n\n - **`{'Origin-Host', `[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Origin-Realm', `[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Host-IP-Address', [`[`Address()`](diameter_dict.md#DATA_TYPES)`]}`** -\n An address list is available to the start function of a\n [transport module](`m:diameter_transport`), which can return a new list for\n use in the subsequent CER or CEA. Host-IP-Address need not be specified if\n the transport module in question communicates an address list as described\n in `m:diameter_transport`\n\n - **`{'Vendor-Id', `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Product-Name', `[`UTF8String()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Origin-State-Id', `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`** -\n Origin-State-Id is optional but, if configured, will be included in outgoing\n CER/CEA and DWR/DWA messages. Setting a value of `0` (zero) is equivalent to\n not setting a value, as documented in RFC 6733. The function\n `origin_state_id/0` can be used as to retrieve a value that is computed when\n the diameter application is started.\n\n - **`{'Supported-Vendor-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Auth-Application-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Inband-Security-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`** -\n Inband-Security-Id defaults to the empty list, which is equivalent to a list\n containing only 0 (NO_INBAND_SECURITY). If 1 (TLS) is specified then TLS is\n selected if the CER/CEA received from the peer offers it.\n\n - **`{'Acct-Application-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Vendor-Specific-Application-Id', [`[`Grouped()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Firmware-Revision', `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`**\n\n Note that each tuple communicates one or more AVP values. It is an error to\n specify duplicate tuples.\n\n [](){: #eval }\n\n- **`eval() = {M,F,A} | fun() | [eval() | A]`** - An expression that can be\n evaluated as a function in the following sense.\n\n ```erlang\n eval([{M,F,A} | T]) ->\n apply(M, F, T ++ A);\n eval([[F|A] | T]) ->\n eval([F | T ++ A]);\n eval([F|A]) ->\n apply(F, A);\n eval(F) ->\n eval([F]).\n ```\n\n Applying an [`eval()`](`m:diameter#eval`) `E` to an argument list `A` is meant\n in the sense of `eval([E|A])`.\n\n > #### Warning {: .warning }\n >\n > Beware of using fun expressions of the form `fun Name/Arity` in situations\n > in which the fun is not short-lived and code is to be upgraded at runtime\n > since any processes retaining such a fun will have a reference to old code.\n > In particular, such a value is typically inappropriate in configuration\n > passed to `start_service/2` or `add_transport/2`.\n\n [](){: #peer_filter }\n\n- **`peer_filter() = term()`** - Filter passed to `call/4` in order to select\n candidate peers for a [pick_peer/4](`c:diameter_app:pick_peer/4`) callback.\n Has one of the following types.\n\n - **`none`** - Matches any peer. This is a convenience that provides a filter\n equivalent to no filter.\n\n - **`host`** - Matches only those peers whose Origin-Host has the same value\n as Destination-Host in the outgoing request in question, or any peer if the\n request does not contain a Destination-Host AVP.\n\n - **`realm`** - Matches only those peers whose Origin-Realm has the same value\n as Destination-Realm in the outgoing request in question, or any peer if the\n request does not contain a Destination-Realm AVP.\n\n - **`{host, any|`[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`** -\n Matches only those peers whose Origin-Host has the specified value, or all\n peers if the atom `any`.\n\n - **`{realm, any|`[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`** -\n Matches only those peers whose Origin-Realm has the specified value, or all\n peers if the atom `any`.\n\n - **`{eval, `[`eval()`](`m:diameter#eval`)`}`** - Matches only those peers for\n which the specified [`eval()`](`m:diameter#eval`) returns `true` when\n applied to the connection's `diameter_caps` record. Any other return value\n or exception is equivalent to `false`.\n\n - **`{neg, `[`peer_filter()`](`m:diameter#peer_filter`)`}`** - Matches only\n those peers not matched by the specified filter.\n\n - **`{all, [`[`peer_filter()`](`m:diameter#peer_filter`)`]}`** - Matches only\n those peers matched by each filter in the specified list.\n\n - **`{any, [`[`peer_filter()`](`m:diameter#peer_filter`)`]}`** - Matches only\n those peers matched by at least one filter in the specified list. The\n resulting list will be in match order, peers matching the first filter of\n the list sorting before those matched by the second, and so on.\n\n - **`{first, [`[`peer_filter()`](`m:diameter#peer_filter`)`]}`** - Like `any`,\n but stops at the first filter for which there are matches, which can be much\n more efficient when there are many peers. For example, the following filter\n causes only peers best matching both the host and realm filters to be\n presented.\n\n ```text\n {first, [{all, [host, realm]}, realm]}\n ```\n\n An invalid filter is equivalent to `{any,[]}`, a filter that matches no peer.\n\n > #### Note {: .info }\n >\n > The `host` and `realm` filters cause the Destination-Host and\n > Destination-Realm AVPs to be extracted from the outgoing request, assuming\n > it to be a record- or list-valued\n > [`diameter_codec:message()`](`m:diameter_codec#message`), and assuming at\n > most one of each AVP. If this is not the case then the\n > `{host|realm, `[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`\n > filters must be used to achieve the desired result. An empty\n > [`DiameterIdentity()`](diameter_dict.md#DATA_TYPES) (which should not be\n > typical) matches all hosts/realms for the purposes of filtering.\n\n > #### Warning {: .warning }\n >\n > A `host` filter is not typically desirable when setting Destination-Host\n > since it will remove peer agents from the candidates list.\n\n [](){: #service_event }\n\n- **`service_event() = #diameter_event{service = `[`service_name()`](`m:diameter#service_name`)`, info = `[`service_event_info()`](`m:diameter#service_event_info`)`}`** -\n An event message sent to processes that have subscribed to these using\n `subscribe/1`.\n\n [](){: #service_event_info }\n\n- **`service_event_info() = term()`** - The `info` field of a\n [service_event()](`m:diameter#service_event`) record. Can have one of the\n following types.\n\n - **`start`**\n\n - **`stop`** - The service is being started or stopped. No event precedes a\n `start` event. No event follows a `stop` event, and this event implies the\n termination of all transport processes.\n\n - **`{up, Ref, Peer, Config, Pkt}`**\n\n - **`{up, Ref, Peer, Config}`**\n\n - **`{down, Ref, Peer, Config}`**\n\n ```c\n Ref = transport_ref()\n Peer = diameter_app:peer()\n Config = {connect|listen, [transport_opt()]}\n Pkt = #diameter_packet{}\n ```\n\n The RFC 3539 watchdog state machine has transitioned into (`up`) or out of\n (`down`) the OKAY state. If a `#diameter_packet{}` is present in an `up`\n event then there has been a capabilities exchange on a newly established\n transport connection and the record contains the received CER or CEA.\n\n Note that a single `up` or `down` event for a given peer corresponds to\n multiple [peer_up/3](`c:diameter_app:peer_up/3`) or\n [peer_down/3](`c:diameter_app:peer_down/3`) callbacks, one for each of the\n Diameter applications negotiated during capabilities exchange. That is, the\n event communicates connectivity with the peer as a whole while the callbacks\n communicate connectivity with respect to individual Diameter applications.\n\n - **`{reconnect, Ref, Opts}`**\n\n ```text\n Ref = transport_ref()\n Opts = [transport_opt()]\n ```\n\n A connecting transport is attempting to establish/reestablish a transport\n connection with a peer following [connect_timer](`m:diameter#connect_timer`)\n or [watchdog_timer](`m:diameter#watchdog_timer`) expiry.\n\n - **`{closed, Ref, Reason, Config}`**\n\n ```text\n Ref = transport_ref()\n Config = {connect|listen, [transport_opt()]}\n ```\n\n Capabilities exchange has failed. `Reason` can have one of the following\n types.\n\n - **`{'CER', Result, Caps, Pkt}`**\n\n ```text\n Result = ResultCode | {capabilities_cb, CB, ResultCode|discard}\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ResultCode = integer()\n CB = eval()\n ```\n\n An incoming CER has been answered with the indicated result code, or\n discarded. `Caps` contains pairs of values, for the local node and remote\n peer respectively. `Pkt` contains the CER in question. In the case of\n rejection by a capabilities callback, the tuple contains the rejecting\n callback.\n\n - **`{'CER', Caps, {ResultCode, Pkt}}`**\n\n ```text\n ResultCode = integer()\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ```\n\n An incoming CER contained errors and has been answered with the indicated\n result code. `Caps` contains values for the local node only. `Pkt`\n contains the CER in question.\n\n - **`{'CER', timeout}`** - An expected CER was not received within\n [capx_timeout](`m:diameter#capx_timeout`) of connection establishment.\n\n - **`{'CEA', Result, Caps, Pkt}`**\n\n ```erlang\n Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ResultCode = integer()\n ```\n\n An incoming CEA has been rejected for the indicated reason. An\n integer-valued `Result` indicates the result code sent by the peer. `Caps`\n contains pairs of values for the local node and remote peer. `Pkt`\n contains the CEA in question. In the case of rejection by a capabilities\n callback, the tuple contains the rejecting callback.\n\n - **`{'CEA', Caps, Pkt}`**\n\n ```text\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ```\n\n An incoming CEA contained errors and has been rejected. `Caps` contains\n only values for the local node. `Pkt` contains the CEA in question.\n\n - **`{'CEA', timeout}`** - An expected CEA was not received within\n [capx_timeout](`m:diameter#capx_timeout`) of connection establishment.\n\n - **`{watchdog, Ref, PeerRef, {From, To}, Config}`**\n\n ```c\n Ref = transport_ref()\n PeerRef = diameter_app:peer_ref()\n From, To = initial | okay | suspect | down | reopen\n Config = {connect|listen, [transport_opt()]}\n ```\n\n An RFC 3539 watchdog state machine has changed state.\n\n - **`t:any/0`** - For forward compatibility, a subscriber should be prepared\n to receive info fields of forms other than the above.\n\n [](){: #service_name }\n\n- **`service_name() = term()`** - Name of a service as passed to\n `start_service/2` and with which the service is identified. There can be at\n most one service with a given name on a given node. Note that\n `erlang:make_ref/0` can be used to generate a service name that is somewhat\n unique.\n\n [](){: #service_opt }\n\n- **`service_opt()`** - Option passed to `start_service/2`. Can be any\n [`capability()`](`m:diameter#capability`) as well as the following.\n\n - **`{application, [`[`application_opt()`](`m:diameter#application_opt`)`]}`** -\n A Diameter application supported by the service.\n\n A service must configure one tuple for each Diameter application it intends\n to support. For an outgoing request, the relevant\n [`application_alias()`](`m:diameter#application_alias`) is passed to\n `call/4`, while for an incoming request the application identifier in the\n message header determines the application, the identifier being specified in\n the application's [dictionary](diameter_dict.md) file.\n\n > #### Warning {: .warning }\n >\n > The capabilities advertised by a node must match its configured\n > applications. In particular, `application` configuration must be matched\n > by corresponding [capability()](`m:diameter#capability`) configuration, of\n > \\*-Application-Id AVPs in particular.\n\n - **`{decode_format, record | list | map | none}`{: #decode_format }** - The\n format of decoded messages and grouped AVPs in the `msg` field of\n diameter_packet records and `value` field of diameter_avp records\n respectively. If `record` then a record whose definition is generated from\n the dictionary file in question. If `list` or `map` then a `[Name | Avps]`\n pair where `Avps` is a list of AVP name/values pairs or a map keyed on AVP\n names respectively. If `none` then the atom-value message name, or\n `undefined` for a Grouped AVP. See also\n [diameter_codec:message()](`m:diameter_codec#message`).\n\n Defaults to `record`.\n\n > #### Note {: .info }\n >\n > AVPs are decoded into a list of diameter_avp records in `avps` field of\n > diameter_packet records independently of `decode_format`.\n\n - **`{restrict_connections, false | node | nodes | [node()] | eval()}`** - The\n degree to which the service allows multiple transport connections to the\n same peer, as identified by its Origin-Host at capabilities exchange.\n\n If `[node()]` then a connection is rejected if another already exists on any\n of the specified nodes. Types `false`, `node`, `nodes` and\n [eval()](`m:diameter#eval`) are equivalent to `[]`, `[node()]`,\n `[node()|nodes()]` and the evaluated value respectively, evaluation of each\n expression taking place whenever a new connection is to be established. Note\n that `false` allows an unlimited number of connections to be established\n with the same peer.\n\n Multiple connections are independent and governed by their own peer and\n watchdog state machines.\n\n Defaults to `nodes`.\n\n - **`{sequence, {H,N} | `[`eval()`](`m:diameter#eval`)`}`** - A constant value\n `H` for the topmost `32-N` bits of of 32-bit End-to-End and Hop-by-Hop\n Identifiers generated by the service, either explicitly or as a return value\n of a function to be evaluated at `start_service/2`. In particular, an\n identifier `Id` is mapped to a new identifier as follows.\n\n ```text\n (H bsl N) bor (Id band ((1 bsl N) - 1))\n ```\n\n Note that RFC 6733 requires that End-to-End Identifiers remain unique for a\n period of at least 4 minutes and that this and the call rate places a lower\n bound on appropriate values of `N`: at a rate of `R` requests per second, an\n `N`\\-bit counter traverses all of its values in `(1 bsl N) div (R*60)`\n minutes, so the bound is `4*R*60 =< 1 bsl N`.\n\n `N` must lie in the range `0..32` and `H` must be a non-negative integer\n less than `1 bsl (32-N)`.\n\n Defaults to `{0,32}`.\n\n > #### Warning {: .warning }\n >\n > Multiple Erlang nodes implementing the same Diameter node should be\n > configured with different sequence masks to ensure that each node uses a\n > unique range of End-to-End and Hop-by-Hop Identifiers for outgoing\n > requests.\n\n - **`{share_peers, boolean() | [node()] | eval()}`** - Nodes to which peer\n connections established on the local Erlang node are communicated. Shared\n peers become available in the remote candidates list passed to\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callbacks on remote nodes whose\n services are configured to use them: see `use_shared_peers` below.\n\n If `false` then peers are not shared. If `[node()]` then peers are shared\n with the specified list of nodes. If `eval()` then peers are shared with the\n nodes returned by the specified function, evaluated whenever a peer\n connection becomes available or a remote service requests information about\n local connections. The value `true` is equivalent to `fun ``erlang:nodes/0`.\n The value `node/0` in a list is ignored, so a collection of services can all\n be configured to share with the same list of nodes.\n\n Defaults to `false`.\n\n > #### Note {: .info }\n >\n > Peers are only shared with services of the same name for the purpose of\n > sending outgoing requests. Since the value of the\n > [application_opt()](`m:diameter#application_opt`) `alias`, passed to\n > `call/4`, is the handle for identifying a peer as a suitable candidate,\n > services that share peers must use the same aliases to identify their\n > supported applications. They should typically also configure identical\n > [capabilities()](`m:diameter#capabilities`), since by sharing peer\n > connections they are distributing the implementation of a single Diameter\n > node across multiple Erlang nodes.\n\n - **`{strict_arities, boolean() | encode | decode}`{: #strict_arities }** -\n Whether or not to require that the number of AVPs in a message or grouped\n AVP agree with those specified in the dictionary in question when passing\n messages to `m:diameter_app` callbacks. If `true` then mismatches in an\n outgoing messages cause message encoding to fail, while mismatches in an\n incoming message are reported as 5005/5009 errors in the errors field of the\n diameter_packet record passed to\n [handle_request/3](`c:diameter_app:handle_request/3`) or\n [handle_answer/4](`c:diameter_app:handle_answer/4`) callbacks. If `false`\n then neither error is enforced/detected. If `encode` or `decode` then errors\n are only enforced/detected on outgoing or incoming messages respectively.\n\n Defaults to `true`.\n\n > #### Note {: .info }\n >\n > Disabling arity checks affects the form of messages at encode/decode. In\n > particular, decoded AVPs are represented as lists of values, regardless of\n > the AVP's arity (ie. expected number in the message/AVP grammar in\n > question), and values are expected to be supplied as lists at encode. This\n > differs from the historic decode behaviour of representing AVPs of arity 1\n > as bare values, not wrapped in a list.\n\n - **`{string_decode, boolean()}`{: #string_decode }** - Whether or not to\n decode AVPs of type [OctetString()](diameter_dict.md#DATA_TYPES) and its\n derived types [DiameterIdentity()](diameter_dict.md#DATA_TYPES),\n [DiameterURI()](diameter_dict.md#DATA_TYPES),\n [IPFilterRule()](diameter_dict.md#DATA_TYPES),\n [QoSFilterRule()](diameter_dict.md#DATA_TYPES), and\n [UTF8String()](diameter_dict.md#DATA_TYPES). If `true` then AVPs of these\n types are decoded to string(). If `false` then values are retained as\n binary().\n\n Defaults to `true`.\n\n > #### Warning {: .warning }\n >\n > This option should be set to `false` since a sufficiently malicious peer\n > can otherwise cause large amounts of memory to be consumed when decoded\n > Diameter messages are passed between processes. The default value is for\n > backwards compatibility.\n\n - **`{traffic_counters, boolean()}`{: #traffic_counters }** - Whether or not\n to count application-specific messages; those for which `m:diameter_app`\n callbacks take place. If false then only messages handled by diameter itself\n are counted: CER/CEA, DWR/DWA, DPR/DPA.\n\n Defaults to `true`.\n\n > #### Note {: .info }\n >\n > Disabling counters is a performance improvement, but means that the\n > omitted counters are not returned by `service_info/2`.\n\n - **`{use_shared_peers, boolean() | [node()] | eval()}`** - Nodes from which\n communicated peers are made available in the remote candidates list of\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callbacks.\n\n If `false` then remote peers are not used. If `[node()]` then only peers\n from the specified list of nodes are used. If `eval()` then only peers\n returned by the specified function are used, evaluated whenever a remote\n service communicates information about an available peer connection. The\n value `true` is equivalent to `fun ``erlang:nodes/0`. The value `node/0` in\n a list is ignored.\n\n Defaults to `false`.\n\n > #### Note {: .info }\n >\n > A service that does not use shared peers will always pass the empty list\n > as the second argument of [pick_peer/4](`c:diameter_app:pick_peer/4`)\n > callbacks.\n\n > #### Warning {: .warning }\n >\n > Sending a request over a peer connection on a remote node is less\n > efficient than sending it over a local connection. It may be preferable to\n > make use of the [service_opt()](`m:diameter#service_opt`)\n > `restrict_connections` and maintain a dedicated connection on each node\n > from which requests are sent.\n\n - **[`transport_opt()`](`m:diameter#transport_opt`)** - Any transport option\n except `applications`, `capabilities`, `transport_config`, and\n `transport_module`. Used as defaults for transport configuration, values\n passed to `add_transport/2` overriding values configured on the service.\n\n [](){: #transport_opt }\n\n- **`transport_opt()`** - Option passed to `add_transport/2`. Has one of the\n following types.\n\n - **`{applications, [`[`application_alias()`](`m:diameter#application_alias`)`]}`{:\n #applications }** - Diameter applications to which the transport should be\n restricted. Defaults to all applications configured on the service in\n question. Applications not configured on the service in question are\n ignored.\n\n > #### Warning {: .warning }\n >\n > The capabilities advertised by a node must match its configured\n > applications. In particular, setting `applications` on a transport\n > typically implies having to set matching \\*-Application-Id AVPs in a\n > [capabilities()](`m:diameter#capabilities`) tuple.\n\n - **`{avp_dictionaries, [module()]}`{: #avp_dictionaries }** - A list of\n alternate dictionary modules with which to encode/decode AVPs that are not\n defined by the dictionary of the application in question. At decode, such\n AVPs are represented as diameter_avp records in the `'AVP'` field of a\n decoded message or Grouped AVP, the first alternate that succeeds in\n decoding the AVP setting the record's value field. At encode, values in an\n `'AVP'` list can be passed as AVP name/value 2-tuples, and it is an encode\n error for no alternate to define the AVP of such a tuple.\n\n Defaults to the empty list.\n\n > #### Note {: .info }\n >\n > The motivation for alternate dictionaries is RFC 7683, Diameter Overload\n > Indication Conveyance (DOIC), which defines AVPs to be piggybacked onto\n > existing application messages rather than defining an application of its\n > own. The DOIC dictionary is provided by the diameter application, as\n > module `diameter_gen_doic_rfc7683`, but alternate dictionaries can be used\n > to encode/decode any set of AVPs not known to an application dictionary.\n\n - **`{capabilities, [`[`capability()`](`m:diameter#capability`)`]}`{:\n #capabilities }** - AVPs used to construct outgoing CER/CEA messages. Values\n take precedence over any specified on the service in question.\n\n Specifying a capability as a transport option may be particularly\n appropriate for Inband-Security-Id, in case TLS is desired over TCP as\n implemented by `m:diameter_tcp`.\n\n - **`{capabilities_cb, `[`eval()`](`m:diameter#eval`)`}`{: #capabilities_cb\n }** - Callback invoked upon reception of CER/CEA during capabilities\n exchange in order to ask whether or not the connection should be accepted.\n Applied to the [`transport_ref()`](`m:diameter#transport_ref`) and\n `#diameter_caps{}` record of the connection.\n\n The return value can have one of the following types.\n\n - **`ok`** - Accept the connection.\n\n - **`t:integer/0`** - Causes an incoming CER to be answered with the\n specified Result-Code.\n\n - **`discard`** - Causes an incoming CER to be discarded without CEA being\n sent.\n\n - **`unknown`** - Equivalent to returning `3010`, DIAMETER_UNKNOWN_PEER.\n\n Returning anything but `ok` or a 2xxx series result code causes the\n transport connection to be broken. Multiple\n [capabilities_cb](`m:diameter#capabilities_cb`) options can be specified, in\n which case the corresponding callbacks are applied until either all return\n `ok` or one does not.\n\n - **`{capx_timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`{:\n #capx_timeout }** - Number of milliseconds after which a transport process\n having an established transport connection will be terminated if the\n expected capabilities exchange message (CER or CEA) is not received from the\n peer. For a connecting transport, the timing of connection attempts is\n governed by [connect_timer](`m:diameter#connect_timer`) or\n [watchdog_timer](`m:diameter#watchdog_timer`) expiry. For a listening\n transport, the peer determines the timing.\n\n Defaults to 10000.\n\n - **`{connect_timer, Tc}`{: #connect_timer }**\n\n ```text\n Tc = Unsigned32()\n ```\n\n For a connecting transport, the RFC 6733 Tc timer, in milliseconds. This\n timer determines the frequency with which a transport attempts to establish\n an initial connection with its peer following transport configuration. Once\n an initial connection has been established,\n [watchdog_timer](`m:diameter#watchdog_timer`) determines the frequency of\n reconnection attempts, as required by RFC 3539.\n\n For a listening transport, the timer specifies the time after which a\n previously connected peer will be forgotten: a connection after this time is\n regarded as an initial connection rather than reestablishment, causing the\n RFC 3539 state machine to pass to state OKAY rather than REOPEN. Note that\n these semantics are not governed by the RFC and that a listening transport's\n [connect_timer](`m:diameter#connect_timer`) should be greater than its\n peer's Tw plus jitter.\n\n Defaults to 30000 for a connecting transport and 60000 for a listening\n transport.\n\n - **`{disconnect_cb, `[`eval()`](`m:diameter#eval`)`}`{: #disconnect_cb }** -\n Callback invoked prior to terminating the transport process of a transport\n connection having watchdog state `OKAY`. Applied to\n `application|service|transport` and the\n [`transport_ref()`](`m:diameter#transport_ref`) and\n [`diameter_app:peer()`](`t:diameter_app:peer/0`) in question: `application`\n indicates that the diameter application is being stopped, `service` that the\n service in question is being stopped by `stop_service/1`, and `transport`\n that the transport in question is being removed by `remove_transport/2`.\n\n The return value can have one of the following types.\n\n - **`{dpr, [option()]}`** - Send Disconnect-Peer-Request to the peer, the\n transport process being terminated following reception of\n Disconnect-Peer-Answer or timeout. An `option()` can be one of the\n following.\n\n - **`{cause, 0|rebooting|1|busy|2|goaway}`** - Disconnect-Cause to send,\n `REBOOTING`, `BUSY` and `DO_NOT_WANT_TO_TALK_TO_YOU` respectively.\n Defaults to `rebooting` for `Reason=service|application` and `goaway`\n for `Reason=transport`.\n\n - **`{timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`** -\n Number of milliseconds after which the transport process is terminated\n if DPA has not been received. Defaults to the value of\n [dpa_timeout](`m:diameter#dpa_timeout`).\n\n - **`dpr`** - Equivalent to `{dpr, []}`.\n\n - **`close`** - Terminate the transport process without\n Disconnect-Peer-Request being sent to the peer.\n\n - **`ignore`** - Equivalent to not having configured the callback.\n\n Multiple [disconnect_cb](`m:diameter#disconnect_cb`) options can be\n specified, in which case the corresponding callbacks are applied until one\n of them returns a value other than `ignore`. All callbacks returning\n `ignore` is equivalent to not having configured them.\n\n Defaults to a single callback returning `dpr`.\n\n - **`{dpa_timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`{:\n #dpa_timeout }** - Number of milliseconds after which a transport connection\n is terminated following an outgoing DPR if DPA is not received.\n\n Defaults to 1000.\n\n - **`{dpr_timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`{:\n #dpr_timeout }** - Number of milliseconds after which a transport connection\n is terminated following an incoming DPR if the peer does not close the\n connection.\n\n Defaults to 5000.\n\n - **`{incoming_maxlen, 0..16777215}`{: #incoming_maxlen }** - Bound on the\n expected size of incoming Diameter messages. Messages larger than the\n specified number of bytes are discarded.\n\n Defaults to `16777215`, the maximum value of the 24-bit Message Length field\n in a Diameter Header.\n\n - **`{length_errors, exit|handle|discard}`{: #length_errors }** - How to deal\n with errors in the Message Length field of the Diameter Header in an\n incoming message. An error in this context is that the length is not at\n least 20 bytes (the length of a Header), is not a multiple of 4 (a valid\n length) or is not the length of the message in question, as received over\n the transport interface documented in `m:diameter_transport`.\n\n If `exit` then the transport process in question exits. If `handle` then the\n message is processed as usual, a resulting\n [handle_request/3](`c:diameter_app:handle_request/3`) or\n [handle_answer/4](`c:diameter_app:handle_answer/4`) callback (if one takes\n place) indicating the `5015` error (DIAMETER_INVALID_MESSAGE_LENGTH). If\n `discard` then the message in question is silently discarded.\n\n Defaults to `exit`.\n\n > #### Note {: .info }\n >\n > The default value reflects the fact that a transport module for a\n > stream-oriented transport like TCP may not be able to recover from a\n > message length error since such a transport must use the Message Length\n > header to divide the incoming byte stream into individual Diameter\n > messages. An invalid length leaves it with no reliable way to rediscover\n > message boundaries, which may result in the failure of subsequent\n > messages. See `m:diameter_tcp` for the behaviour of that module.\n\n - **`{pool_size, pos_integer()}`** - Number of transport processes to start.\n For a listening transport, determines the size of the pool of accepting\n transport processes, a larger number being desirable for processing multiple\n concurrent peer connection attempts. For a connecting transport, determines\n the number of connections to the peer in question that will be attempted to\n be establshed: the [service_opt()](`m:diameter#service_opt`):\n `restrict_connections` should also be configured on the service in question\n to allow multiple connections to the same peer.\n\n - **`{spawn_opt, [term()] | {M,F,A}}`{: #spawn_opt }** - An options list\n passed to `erlang:spawn_opt/2` to spawn a handler process for an incoming\n Diameter request on the local node, or an MFA that returns the pid of a\n handler process.\n\n Options `monitor` and `link` are ignored in the list-valued case. An MFA is\n applied with an additional term prepended to its argument list, and should\n return either the pid of the handler process that invokes\n `diameter_traffic:request/1` on the argument in order to process the\n request, or the atom `discard`. The handler process need not be local, and\n diameter need not be started on the remote node, but diameter and relevant\n application callbacks must be on the code path.\n\n Defaults to the empty list.\n\n - **`{strict_capx, boolean()]}`{: #strict_capx }** - Whether or not to enforce\n the RFC 6733 requirement that any message before capabilities exchange\n should close the peer connection. If false then unexpected messages are\n discarded.\n\n Defaults to true. Changing this results in non-standard behaviour, but can\n be useful in case peers are known to be behave badly.\n\n - **`{strict_mbit, boolean()}`{: #strict_mbit }** - Whether or not to regard\n an AVP setting the M-bit as erroneous when the command grammar in question\n does not explicitly allow the AVP. If `true` then such AVPs are regarded as\n 5001 errors, DIAMETER_AVP_UNSUPPORTED. If `false` then the M-bit is ignored\n and policing it becomes the receiver's responsibility.\n\n Defaults to `true`.\n\n > #### Warning {: .warning }\n >\n > RFC 6733 is unclear about the semantics of the M-bit. One the one hand,\n > the CCF specification in section 3.2 documents AVP in a command grammar as\n > meaning _any_ arbitrary AVP; on the other hand, 1.3.4 states that AVPs\n > setting the M-bit cannot be added to an existing command: the modified\n > command must instead be placed in a new Diameter application.\n >\n > The reason for the latter is presumably interoperability: allowing\n > arbitrary AVPs setting the M-bit in a command makes its interpretation\n > implementation-dependent, since there's no guarantee that all\n > implementations will understand the same set of arbitrary AVPs in the\n > context of a given command. However, interpreting `AVP` in a command\n > grammar as any AVP, regardless of M-bit, renders 1.3.4 meaningless, since\n > the receiver can simply ignore any AVP it thinks isn't relevant,\n > regardless of the sender's intent.\n >\n > Beware of confusing mandatory in the sense of the M-bit with mandatory in\n > the sense of the command grammar. The former is a semantic requirement:\n > that the receiver understand the semantics of the AVP in the context in\n > question. The latter is a syntactic requirement: whether or not the AVP\n > must occur in the message in question.\n\n - **`{transport_config, term()}`{: #transport_config }**\n\n - **`{transport_config, term(), `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)` | infinity}`** -\n Term passed as the third argument to the\n [start/3](`c:diameter_transport:start/3`) function of the relevant\n [transport module](`m:diameter_transport`) in order to start a transport\n process. Defaults to the empty list.\n\n The 3-tuple form additionally specifies an interval, in milliseconds, after\n which a started transport process should be terminated if it has not yet\n established a connection. For example, the following options on a connecting\n transport request a connection with one peer over SCTP or another (typically\n the same) over TCP.\n\n ```erlang\n {transport_module, diameter_sctp}\n {transport_config, SctpOpts, 5000}\n {transport_module, diameter_tcp}\n {transport_config, TcpOpts}\n ```\n\n To listen on both SCTP and TCP, define one transport for each.\n\n - **`{transport_module, atom()}`{: #transport_module }** - Module implementing\n a transport process as defined in `m:diameter_transport`. Defaults to\n `diameter_tcp`.\n\n Multiple `transport_module` and\n [transport_config](`m:diameter#transport_config`) options are allowed. The\n order of these is significant in this case (and only in this case), a\n `transport_module` being paired with the first\n [transport_config](`m:diameter#transport_config`) following it in the\n options list, or the default value for trailing modules. Transport starts\n will be attempted with each of the modules in order until one establishes a\n connection within the corresponding timeout (see below) or all fail.\n\n - **`{watchdog_config, [{okay|suspect, non_neg_integer()}]}`{:\n #watchdog_config }** - Configuration that alters the behaviour of the\n watchdog state machine. On key `okay`, the non-negative number of answered\n DWR messages before transitioning from REOPEN to OKAY. On key `suspect`, the\n number of watchdog timeouts before transitioning from OKAY to SUSPECT when\n DWR is unanswered, or 0 to not make the transition.\n\n Defaults to `[{okay, 3}, {suspect, 1}]`. Not specifying a key is equivalent\n to specifying the default value for that key.\n\n > #### Warning {: .warning }\n >\n > The default value is as required by RFC 3539: changing it results in\n > non-standard behaviour that should only be used to simulate misbehaving\n > nodes during test.\n\n - **`{watchdog_timer, TwInit}`{: #watchdog_timer }**\n\n ```text\n TwInit = Unsigned32()\n | {M,F,A}\n ```\n\n The RFC 3539 watchdog timer. An integer value is interpreted as the RFC's\n TwInit in milliseconds, a jitter of ± 2 seconds being added at each rearming\n of the timer to compute the RFC's Tw. An MFA is expected to return the RFC's\n Tw directly, with jitter applied, allowing the jitter calculation to be\n performed by the callback.\n\n An integer value must be at least 6000 as required by RFC 3539. Defaults\n to 30000.\n\n Unrecognized options are silently ignored but are returned unmodified by\n `service_info/2` and can be referred to in predicate functions passed to\n `remove_transport/2`.\n\n- **`transport_ref() = reference()`{: #transport_ref }** - Reference returned by\n `add_transport/2` that identifies the configuration.","ref":"diameter.html#module-data-types"},{"type":"module","title":"SEE ALSO - diameter","doc":"`m:diameter_app`, `m:diameter_transport`, [diameter_dict(4)](diameter_dict.md)","ref":"diameter.html#module-see-also"},{"type":"function","title":"diameter.add_transport/2","doc":"Add transport capability to a service.\n\nThe service will start transport processes as required in order to establish a\nconnection with the peer, either by connecting to the peer (`connect`) or by\naccepting incoming connection requests (`listen`). A connecting transport\nestablishes transport connections with at most one peer, an listening transport\npotentially with many.\n\nThe diameter application takes responsibility for exchanging CER/CEA with the\npeer. Upon successful completion of capabilities exchange the service calls each\nrelevant application module's [peer_up/3](`c:diameter_app:peer_up/3`) callback\nafter which the caller can exchange Diameter messages with the peer over the\ntransport. In addition to CER/CEA, the service takes responsibility for the\nhandling of DWR/DWA and required by RFC 3539, as well as for DPR/DPA.\n\nThe returned reference uniquely identifies the transport within the scope of the\nservice. Note that the function returns before a transport connection has been\nestablished.\n\n> #### Note {: .info }\n>\n> It is not an error to add a transport to a service that has not yet been\n> configured: a service can be started after configuring its transports.","ref":"diameter.html#add_transport/2"},{"type":"function","title":"diameter.call/4","doc":"Send a Diameter request message.\n\n`App` specifies the Diameter application in which the request is defined and\ncallbacks to the corresponding callback module will follow as described below\nand in `m:diameter_app`. Unless the `detach` option is specified, the call\nreturns either when an answer message is received from the peer or an error\noccurs. In the answer case, the return value is as returned by a\n[handle_answer/4](`c:diameter_app:handle_answer/4`) callback. In the error case,\nwhether or not the error is returned directly by diameter or from a\n[handle_error/4](`c:diameter_app:handle_error/4`) callback depends on whether or\nnot the outgoing request is successfully encoded for transmission to the peer,\nthe cases being documented below.\n\nIf there are no suitable peers, or if\n[pick_peer/4](`c:diameter_app:pick_peer/4`) rejects them by returning `false`,\nthen `{error,no_connection}` is returned. Otherwise\n[pick_peer/4](`c:diameter_app:pick_peer/4`) is followed by a\n[prepare_request/3](`c:diameter_app:prepare_request/3`) callback, the message is\nencoded and then sent.\n\nThere are several error cases which may prevent an answer from being received\nand passed to a [handle_answer/4](`c:diameter_app:handle_answer/4`) callback:\n\n- If the initial encode of the outgoing request fails, then the request process\n fails and `{error,encode}` is returned.\n- If the request is successfully encoded and sent but the answer times out then\n a [handle_error/4](`c:diameter_app:handle_error/4`) callback takes place with\n `Reason = timeout`.\n- If the request is successfully encoded and sent but the service in question is\n stopped before an answer is received then a\n [handle_error/4](`c:diameter_app:handle_error/4`) callback takes place with\n `Reason = cancel`.\n- If the transport connection with the peer goes down after the request has been\n sent but before an answer has been received then an attempt is made to resend\n the request to an alternate peer. If no such peer is available, or if the\n subsequent [pick_peer/4](`c:diameter_app:pick_peer/4`) callback rejects the\n candidates, then a [handle_error/4](`c:diameter_app:handle_error/4`) callback\n takes place with `Reason = failover`. If a peer is selected then a\n [prepare_retransmit/3](`c:diameter_app:prepare_retransmit/3`) callback takes\n place, after which the semantics are the same as following an initial\n [prepare_request/3](`c:diameter_app:prepare_request/3`) callback.\n- If an encode error takes place during retransmission then the request process\n fails and `{error,failure}` is returned.\n- If an application callback made in processing the request fails (pick_peer,\n prepare_request, prepare_retransmit, handle_answer or handle_error) then\n either `{error,encode}` or `{error,failure}` is returned depending on whether\n or not there has been an attempt to send the request over the transport.\n\nNote that `{error,encode}` is the only return value which guarantees that the\nrequest has _not_ been sent over the transport connection.","ref":"diameter.html#call/4"},{"type":"function","title":"diameter.origin_state_id/0","doc":"Return a reasonable value for use as Origin-State-Id in outgoing messages.\n\nThe value returned is the number of seconds since 19680120T031408Z, the first\nvalue that can be encoded as a Diameter [`Time()`](diameter_dict.md#DATA_TYPES),\nat the time the diameter application was started.","ref":"diameter.html#origin_state_id/0"},{"type":"function","title":"diameter.remove_transport/2","doc":"Remove previously added transports.\n\n`Pred` determines which transports to remove. An arity-3-valued `Pred` removes\nall transports for which `Pred(Ref, Type, Opts)` returns `true`, where `Type`\nand `Opts` are as passed to `add_transport/2` and `Ref` is as returned by it.\nThe remaining forms are equivalent to an arity-3 fun as follows.\n\n```erlang\nPred = fun(transport_ref(), list()): fun(Ref, _, Opts) -> Pred(Ref, Opts) end\nPred = fun(list()): fun(_, _, Opts) -> Pred(Opts) end\nPred = transport_ref(): fun(Ref, _, _) -> Pred == Ref end\nPred = list(): fun(_, _, Opts) -> [] == Pred -- Opts end\nPred = true: fun(_, _, _) -> true end\nPred = false: fun(_, _, _) -> false end\nPred = {M,F,A}: fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end\n```\n\nRemoving a transport causes the corresponding transport processes to be\nterminated. Whether or not a DPR message is sent to a peer is controlled by\nvalue of [disconnect_cb](`m:diameter#disconnect_cb`) configured on the\ntransport.","ref":"diameter.html#remove_transport/2"},{"type":"function","title":"diameter.service_info/2","doc":"Return information about a started service. Requesting info for an unknown\nservice causes `undefined` to be returned. Requesting a list of items causes a\ntagged list to be returned.\n\n`Item` can be one of the following.\n\n- **`'Origin-Host'`**\n\n- **`'Origin-Realm'`**\n\n- **`'Vendor-Id'`**\n\n- **`'Product-Name'`**\n\n- **`'Origin-State-Id'`**\n\n- **`'Host-IP-Address'`**\n\n- **`'Supported-Vendor'`**\n\n- **`'Auth-Application-Id'`**\n\n- **`'Inband-Security-Id'`**\n\n- **`'Acct-Application-Id'`**\n\n- **`'Vendor-Specific-Application-Id'`**\n\n- **`'Firmware-Revision'`** - Return a capability value as configured with\n `start_service/2`.\n\n- **`applications`** - Return the list of applications as configured with\n `start_service/2`.\n\n- **`capabilities`** - Return a tagged list of all capabilities values as\n configured with `start_service/2`.\n\n- **`transport`** - Return a list containing one entry for each of the service's\n transport as configured with `add_transport/2`. Each entry is a tagged list\n containing both configuration and information about established peer\n connections. An example return value with for a client service with\n Origin-Host \"client.example.com\" configured with a single transport connected\n to \"server.example.com\" might look as follows.\n\n ```erlang\n [[{ref,#Ref<0.0.0.93>},\n {type,connect},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{ip,{127,0,0,1}},\n {raddr,{127,0,0,1}},\n {rport,3868},\n {reuseaddr,true}]}]},\n {watchdog,{<0.66.0>,-576460736368485571,okay}},\n {peer,{<0.67.0>,-576460736357885808}},\n {apps,[{0,common}]},\n {caps,[{origin_host,{\"client.example.com\",\"server.example.com\"}},\n {origin_realm,{\"example.com\",\"example.com\"}},\n {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},\n {vendor_id,{0,193}},\n {product_name,{\"Client\",\"Server\"}},\n {origin_state_id,{[],[]}},\n {supported_vendor_id,{[],[]}},\n {auth_application_id,{[0],[0]}},\n {inband_security_id,{[],[0]}},\n {acct_application_id,{[],[]}},\n {vendor_specific_application_id,{[],[]}},\n {firmware_revision,{[],[]}},\n {avp,{[],[]}}]},\n {port,[{owner,<0.69.0>},\n {module,diameter_tcp},\n {socket,{{127,0,0,1},48758}},\n {peer,{{127,0,0,1},3868}},\n {statistics,[{recv_oct,656},\n {recv_cnt,6},\n {recv_max,148},\n {recv_avg,109},\n {recv_dvi,19},\n {send_oct,836},\n {send_cnt,6},\n {send_max,184},\n {send_avg,139},\n {send_pend,0}]}]},\n {statistics,[{{{0,258,0},recv},3},\n {{{0,258,1},send},3},\n {{{0,258,0},recv,{'Result-Code',2001}},3},\n {{{0,257,0},recv},1},\n {{{0,257,1},send},1},\n {{{0,257,0},recv,{'Result-Code',2001}},1},\n {{{0,280,1},recv},2},\n {{{0,280,0},send},2},\n {{{0,280,0},send,{'Result-Code',2001}},2}]}]]\n ```\n\n Here `ref` is a [`transport_ref()`](`m:diameter#transport_ref`) and `options`\n the corresponding [`transport_opt()`](`m:diameter#transport_opt`) list passed\n to `add_transport/2`. The `watchdog` entry shows the state of a connection's\n RFC 3539 watchdog state machine. The `peer` entry identifies the\n [`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`) for which there will\n have been [peer_up/3](`c:diameter_app:peer_up/3`) callbacks for the Diameter\n applications identified by the `apps` entry, `common` being the\n [`application_alias()`](`m:diameter#application_alias`). The `caps` entry\n identifies the capabilities sent by the local node and received from the peer\n during capabilities exchange. The `port` entry displays socket-level\n information about the transport connection. The `statistics` entry presents\n Diameter-level counters, an entry like `{{{0,280,1},recv},2}` saying that the\n client has received 2 DWR messages:\n `{0,280,1} = {Application_Id, Command_Code, R_Flag}`.\n\n Note that `watchdog`, `peer`, `apps`, `caps` and `port` entries depend on\n connectivity with the peer and may not be present. Note also that the\n `statistics` entry presents values accumulated during the lifetime of the\n transport configuration.\n\n A listening transport presents its information slightly differently since\n there may be multiple accepted connections for the same\n [`transport_ref()`](`m:diameter#transport_ref`). The `transport` info returned\n by a server with a single client connection might look as follows.\n\n ```erlang\n [[{ref,#Ref<0.0.0.61>},\n {type,listen},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{reuseaddr,true},\n {ip,{127,0,0,1}},\n {port,3868}]}]},\n {accept,[[{watchdog,{<0.56.0>,-576460739249514012,okay}},\n {peer,{<0.58.0>,-576460638229179167}},\n {apps,[{0,common}]},\n {caps,[{origin_host,{\"server.example.com\",\"client.example.com\"}},\n {origin_realm,{\"example.com\",\"example.com\"}},\n {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},\n {vendor_id,{193,0}},\n {product_name,{\"Server\",\"Client\"}},\n {origin_state_id,{[],[]}},\n {supported_vendor_id,{[],[]}},\n {auth_application_id,{[0],[0]}},\n {inband_security_id,{[],[]}},\n {acct_application_id,{[],[]}},\n {vendor_specific_application_id,{[],[]}},\n {firmware_revision,{[],[]}},\n {avp,{[],[]}}]},\n {port,[{owner,<0.62.0>},\n {module,diameter_tcp},\n {socket,{{127,0,0,1},3868}},\n {peer,{{127,0,0,1},48758}},\n {statistics,[{recv_oct,1576},\n {recv_cnt,16},\n {recv_max,184},\n {recv_avg,98},\n {recv_dvi,26},\n {send_oct,1396},\n {send_cnt,16},\n {send_max,148},\n {send_avg,87},\n {send_pend,0}]}]}],\n [{watchdog,{<0.72.0>,-576460638229717546,initial}}]]},\n {statistics,[{{{0,280,0},recv},7},\n {{{0,280,1},send},7},\n {{{0,280,0},recv,{'Result-Code',2001}},7},\n {{{0,258,1},recv},3},\n {{{0,258,0},send},3},\n {{{0,258,0},send,{'Result-Code',2001}},3},\n {{{0,280,1},recv},5},\n {{{0,280,0},send},5},\n {{{0,280,0},send,{'Result-Code',2001}},5},\n {{{0,257,1},recv},1},\n {{{0,257,0},send},1},\n {{{0,257,0},send,{'Result-Code',2001}},1}]}]]\n ```\n\n The information presented here is as in the `connect` case except that the\n client connections are grouped under an `accept` tuple.\n\n Whether or not the [transport_opt()](`m:diameter#transport_opt`) `pool_size`\n has been configured affects the format of the listing in the case of a\n connecting transport, since a value greater than 1 implies multiple transport\n processes for the same [`transport_ref()`](`m:diameter#transport_ref`), as in\n the listening case. The format in this case is similar to the listening case,\n with a `pool` tuple in place of an `accept` tuple.\n\n- **`connections`** - Return a list containing one entry for every established\n transport connection whose watchdog state machine is not in the `down` state.\n This is a flat view of `transport` info which lists only active connections\n and for which Diameter-level statistics are accumulated only for the lifetime\n of the transport connection. A return value for the server above might look as\n follows.\n\n ```erlang\n [[{ref,#Ref<0.0.0.61>},\n {type,accept},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{reuseaddr,true},\n {ip,{127,0,0,1}},\n {port,3868}]}]},\n {watchdog,{<0.56.0>,-576460739249514012,okay}},\n {peer,{<0.58.0>,-576460638229179167}},\n {apps,[{0,common}]},\n {caps,[{origin_host,{\"server.example.com\",\"client.example.com\"}},\n {origin_realm,{\"example.com\",\"example.com\"}},\n {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},\n {vendor_id,{193,0}},\n {product_name,{\"Server\",\"Client\"}},\n {origin_state_id,{[],[]}},\n {supported_vendor_id,{[],[]}},\n {auth_application_id,{[0],[0]}},\n {inband_security_id,{[],[]}},\n {acct_application_id,{[],[]}},\n {vendor_specific_application_id,{[],[]}},\n {firmware_revision,{[],[]}},\n {avp,{[],[]}}]},\n {port,[{owner,<0.62.0>},\n {module,diameter_tcp},\n {socket,{{127,0,0,1},3868}},\n {peer,{{127,0,0,1},48758}},\n {statistics,[{recv_oct,10124},\n {recv_cnt,132},\n {recv_max,184},\n {recv_avg,76},\n {recv_dvi,9},\n {send_oct,10016},\n {send_cnt,132},\n {send_max,148},\n {send_avg,75},\n {send_pend,0}]}]},\n {statistics,[{{{0,280,0},recv},62},\n {{{0,280,1},send},62},\n {{{0,280,0},recv,{'Result-Code',2001}},62},\n {{{0,258,1},recv},3},\n {{{0,258,0},send},3},\n {{{0,258,0},send,{'Result-Code',2001}},3},\n {{{0,280,1},recv},66},\n {{{0,280,0},send},66},\n {{{0,280,0},send,{'Result-Code',2001}},66},\n {{{0,257,1},recv},1},\n {{{0,257,0},send},1},\n {{{0,257,0},send,{'Result-Code',2001}},1}]}]]\n ```\n\n Note that there may be multiple entries with the same `ref`, in contrast to\n `transport` info.\n\n- **`statistics`** - Return a `{{Counter, Ref}, non_neg_integer()}` list of\n counter values. `Ref` can be either a\n [`transport_ref()`](`m:diameter#transport_ref`) or a\n [`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`). Entries for the latter\n are folded into corresponding entries for the former as peer connections go\n down. Entries for both are removed at `remove_transport/2`. The Diameter-level\n statistics returned by `transport` and `connections` info are based upon these\n entries.\n\n- **[`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`)** - Return transport\n configuration associated with a single peer, as passed to `add_transport/2`.\n The returned list is empty if the peer is unknown. Otherwise it contains the\n `ref`, `type` and `options` tuples as in `transport` and `connections` info\n above. For example:\n\n ```erlang\n [{ref,#Ref<0.0.0.61>},\n {type,accept},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{reuseaddr,true},\n {ip,{127,0,0,1}},\n {port,3868}]}]}]\n ```","ref":"diameter.html#service_info/2"},{"type":"function","title":"diameter.services/0","doc":"Return the list of started services.","ref":"diameter.html#services/0"},{"type":"function","title":"diameter.session_id/1","doc":"Return a value for a Session-Id AVP.\n\nThe value has the form required by section 8.8 of RFC 6733. Ident should be the\nOrigin-Host of the peer from which the message containing the returned value\nwill be sent.","ref":"diameter.html#session_id/1"},{"type":"function","title":"diameter.start/0","doc":"Start the diameter application.\n\nThe diameter application must be started before starting a service. In a\nproduction system this is typically accomplished by a boot file, not by calling\n`start/0` explicitly.","ref":"diameter.html#start/0"},{"type":"function","title":"diameter.start_service/2","doc":"Start a diameter service.\n\nA service defines a locally-implemented Diameter node, specifying the\ncapabilities to be advertised during capabilities exchange. Transports are added\nto a service using `add_transport/2`.\n\n> #### Note {: .info }\n>\n> A transport can both override its service's capabilities and restrict its\n> supported Diameter applications so \"service = Diameter node as identified by\n> Origin-Host\" is not necessarily the case.","ref":"diameter.html#start_service/2"},{"type":"function","title":"diameter.stop/0","doc":"Stop the diameter application.","ref":"diameter.html#stop/0"},{"type":"function","title":"diameter.stop_service/1","doc":"Stop a diameter service.\n\nStopping a service causes all associated transport connections to be broken. A\nDPR message will be sent as in the case of `remove_transport/2`.\n\n> #### Note {: .info }\n>\n> Stopping a service does not remove any associated transports:\n> `remove_transport/2` must be called to remove transport configuration.","ref":"diameter.html#stop_service/1"},{"type":"function","title":"diameter.subscribe/1","doc":"Subscribe to [`service_event()`](`m:diameter#service_event`) messages from a\nservice.\n\nIt is not an error to subscribe to events from a service that does not yet\nexist. Doing so before adding transports is required to guarantee the reception\nof all transport-related events.","ref":"diameter.html#subscribe/1"},{"type":"function","title":"diameter.unsubscribe/1","doc":"Unsubscribe to event messages from a service.","ref":"diameter.html#unsubscribe/1"},{"type":"function","title":"diameter.which_connections/0","doc":"Return a list of _all_ connections, grouped by the service they\nare associated with.","ref":"diameter.html#which_connections/0"},{"type":"function","title":"diameter.which_connections/1","doc":"Return a list of connections associated with the service 'SvcName'.","ref":"diameter.html#which_connections/1"},{"type":"function","title":"diameter.which_transports/0","doc":"Return a list of _all_ transports.","ref":"diameter.html#which_transports/0"},{"type":"function","title":"diameter.which_transports/1","doc":"Return a list of transports associated with the service 'SvcName'.","ref":"diameter.html#which_transports/1"},{"type":"function","title":"diameter.which_watchdogs/0","doc":"Return a list of _all_ watchdogs.","ref":"diameter.html#which_watchdogs/0"},{"type":"function","title":"diameter.which_watchdogs/1","doc":"Return a list of watchdogs associated with the service 'SvcName'.","ref":"diameter.html#which_watchdogs/1"},{"type":"type","title":"diameter.Address/0","doc":"","ref":"diameter.html#t:Address/0"},{"type":"type","title":"diameter.app_alias/0","doc":"","ref":"diameter.html#t:app_alias/0"},{"type":"type","title":"diameter.app_module/0","doc":"","ref":"diameter.html#t:app_module/0"},{"type":"type","title":"diameter.application_opt/0","doc":"","ref":"diameter.html#t:application_opt/0"},{"type":"type","title":"diameter.call_opt/0","doc":"","ref":"diameter.html#t:call_opt/0"},{"type":"type","title":"diameter.capability/0","doc":"","ref":"diameter.html#t:capability/0"},{"type":"type","title":"diameter.common_opt/0","doc":"","ref":"diameter.html#t:common_opt/0"},{"type":"type","title":"diameter.DiameterIdentity/0","doc":"","ref":"diameter.html#t:DiameterIdentity/0"},{"type":"type","title":"diameter.DiameterURI/0","doc":"","ref":"diameter.html#t:DiameterURI/0"},{"type":"type","title":"diameter.decode_format/0","doc":"","ref":"diameter.html#t:decode_format/0"},{"type":"type","title":"diameter.Enumerated/0","doc":"","ref":"diameter.html#t:Enumerated/0"},{"type":"type","title":"diameter.elapsed_time/0","doc":"","ref":"diameter.html#t:elapsed_time/0"},{"type":"type","title":"diameter.eval/0","doc":"","ref":"diameter.html#t:eval/0"},{"type":"type","title":"diameter.evaluable/0","doc":"","ref":"diameter.html#t:evaluable/0"},{"type":"type","title":"diameter.Float32/0","doc":"","ref":"diameter.html#t:Float32/0"},{"type":"type","title":"diameter.Float64/0","doc":"","ref":"diameter.html#t:Float64/0"},{"type":"type","title":"diameter.Grouped/0","doc":"","ref":"diameter.html#t:Grouped/0"},{"type":"type","title":"diameter.Integer32/0","doc":"","ref":"diameter.html#t:Integer32/0"},{"type":"type","title":"diameter.Integer64/0","doc":"","ref":"diameter.html#t:Integer64/0"},{"type":"type","title":"diameter.IPFilterRule/0","doc":"","ref":"diameter.html#t:IPFilterRule/0"},{"type":"type","title":"diameter.message_length/0","doc":"","ref":"diameter.html#t:message_length/0"},{"type":"type","title":"diameter.OctetString/0","doc":"","ref":"diameter.html#t:OctetString/0"},{"type":"type","title":"diameter.peer_filter/0","doc":"","ref":"diameter.html#t:peer_filter/0"},{"type":"opaque","title":"diameter.peer_ref/0","doc":"","ref":"diameter.html#t:peer_ref/0"},{"type":"type","title":"diameter.QoSFilterRule/0","doc":"","ref":"diameter.html#t:QoSFilterRule/0"},{"type":"type","title":"diameter.remotes/0","doc":"","ref":"diameter.html#t:remotes/0"},{"type":"type","title":"diameter.restriction/0","doc":"","ref":"diameter.html#t:restriction/0"},{"type":"type","title":"diameter.sequence/0","doc":"","ref":"diameter.html#t:sequence/0"},{"type":"type","title":"diameter.service_name/0","doc":"","ref":"diameter.html#t:service_name/0"},{"type":"type","title":"diameter.service_opt/0","doc":"","ref":"diameter.html#t:service_opt/0"},{"type":"type","title":"diameter.strict_arities/0","doc":"","ref":"diameter.html#t:strict_arities/0"},{"type":"type","title":"diameter.Time/0","doc":"","ref":"diameter.html#t:Time/0"},{"type":"type","title":"diameter.transport_opt/0","doc":"","ref":"diameter.html#t:transport_opt/0"},{"type":"type","title":"diameter.transport_pred/0","doc":"","ref":"diameter.html#t:transport_pred/0"},{"type":"type","title":"diameter.transport_ref/0","doc":"","ref":"diameter.html#t:transport_ref/0"},{"type":"type","title":"diameter.Unsigned32/0","doc":"","ref":"diameter.html#t:Unsigned32/0"},{"type":"type","title":"diameter.Unsigned64/0","doc":"","ref":"diameter.html#t:Unsigned64/0"},{"type":"type","title":"diameter.UTF8String/0","doc":"","ref":"diameter.html#t:UTF8String/0"},{"type":"behaviour","title":"diameter_app","doc":"Callback module of a Diameter application.\n\nA diameter service as started by `diameter:start_service/2` configures one of\nmore Diameter applications, each of whose configuration specifies a callback\nthat handles messages specific to the application. The messages and AVPs of the\napplication are defined in a dictionary file whose format is documented in\n[diameter_dict(4)](diameter_dict.md) while the callback module is documented\nhere. The callback module implements the Diameter application-specific\nfunctionality of a service.\n\nA callback module must export all of the functions documented below. The\nfunctions themselves are of three distinct flavours:\n\n- `c:peer_up/3` and `c:peer_down/3` signal the attainment or loss of\n connectivity with a Diameter peer.\n- `c:pick_peer/4`, `c:prepare_request/3`, `c:prepare_retransmit/3`,\n `c:handle_answer/4` and `c:handle_error/4` are (or may be) called as a\n consequence of a call to `diameter:call/4` to send an outgoing Diameter\n request message.\n- `c:handle_request/3` is called in response to an incoming Diameter request\n message.\n\nThe arities for the the callback functions here assume no extra arguments. All\nfunctions will also be passed any extra arguments configured with the callback\nmodule itself when calling `diameter:start_service/2` and, for the call-specific\ncallbacks, any extra arguments passed to `diameter:call/4`.","ref":"diameter_app.html"},{"type":"callback","title":"diameter_app.handle_answer/4","doc":"Invoked when an answer message is received from a peer. The return value is\nreturned from `diameter:call/4` unless the `detach` option was specified.\n\nThe decoded answer record and undecoded binary are in the `msg` and `bin` fields\nof the argument [packet()](`t:packet/0`) respectively. `Request` is\nthe outgoing request message as was returned from `c:prepare_request/3` or\n`c:prepare_retransmit/3`.\n\nFor any given call to `diameter:call/4` there is at most one `c:handle_answer/4`\ncallback: any duplicate answer (due to retransmission or otherwise) is\ndiscarded. Similarly, only one of `c:handle_answer/4` or `c:handle_error/4` is\ncalled.\n\nBy default, an incoming answer message that cannot be successfully decoded\ncauses the request process to fail, causing `diameter:call/4` to return\n`{error, failure}` unless the `detach` option was specified. In particular,\nthere is no `c:handle_error/4` callback in this case. The\n[diameter:application_opt()](`m:diameter#application_opt`) `answer_errors` can\nbe set to change this behaviour.","ref":"diameter_app.html#c:handle_answer/4"},{"type":"callback","title":"diameter_app.handle_error/4","doc":"Invoked when an error occurs before an answer message is received in response to\nan outgoing request. The return value is returned from `diameter:call/4` unless\nthe `detach` option was specified.\n\nReason `timeout` indicates that an answer message has not been received within\nthe time specified with the corresponding\n[diameter:call_opt()](`m:diameter#call_opt`). Reason `failover` indicates that\nthe transport connection to the peer to which the request has been sent has\nbecome unavailable and that not alternate peer was not selected.","ref":"diameter_app.html#c:handle_error/4"},{"type":"callback","title":"diameter_app.handle_request/3","doc":"Invoked when a request message is received from a peer. The application in which\nthe callback takes place (that is, the callback module as configured with\n`diameter:start_service/2`) is determined by the Application Identifier in the\nheader of the incoming request message, the selected module being the one whose\ncorresponding dictionary declares itself as defining either the application in\nquestion or the Relay application.\n\nThe argument [packet()](`t:packet/0`) has the following signature.\n\n```erlang\n#diameter_packet{header = #diameter_header{},\n avps = [#diameter_avp{}],\n msg = record() | undefined,\n errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],\n bin = binary(),\n transport_data = term()}\n```\n\nThe `msg` field will be `undefined` in case the request has been received in the\nrelay application. Otherwise it contains the record representing the request as\noutlined in [diameter_dict(4)](diameter_dict.md#MESSAGE_RECORDS).\n\nThe `errors` field specifies any results codes identifying errors found while\ndecoding the request. This is used to set Result-Code and/or Failed-AVP in a\nreturned answer unless the callback returns a `#diameter_packet{}` whose\n`errors` field is set to either a non-empty list of its own, in which case this\nlist is used instead, or the atom `false` to disable any setting of Result-Code\nand Failed-AVP. Note that the errors detected by diameter are of the 3xxx and\n5xxx series, Protocol Errors and Permanent Failures respectively. The `errors`\nlist is empty if the request has been received in the relay application.\n\nThe `transport_data` field contains an arbitrary term passed into diameter from\nthe transport module in question, or the atom `undefined` if the transport\nspecified no data. The term is preserved if a\n[message()](`t:message/0`) is returned but must be set explicitly in\na returned [packet()](`t:packet/0`).\n\nThe semantics of each of the possible return values are as follows.\n\n- **`{reply, `[`packet()`](`t:packet/0`)`|`[`message()`](`t:message/0`)`}`** -\n Send the specified answer message to the peer. In the case of a\n [packet()](`t:packet/0`), the message to be sent must be set in the\n `msg` field and the `header` field can be set to a `#diameter_header{}` to\n specify values that should be preserved in the outgoing answer, appropriate\n values otherwise being set by diameter.\n\n- **`{answer_message, 3000..3999|5000..5999}`** - Send an answer message to the\n peer containing the specified Result-Code. Equivalent to\n\n ```text\n {reply, ['answer-message' | Avps]\n ```\n\n where `Avps` sets the Origin-Host, Origin-Realm, the specified Result-Code and\n (if the request contained one) Session-Id AVPs, and possibly Failed-AVP as\n described below.\n\n Returning a value other than 3xxx or 5xxx will cause the request process in\n question to fail, as will returning a 5xxx value if the peer connection in\n question has been configured with the RFC 3588 common dictionary\n `diameter_gen_base_rfc3588`. (Since RFC 3588 only allows 3xxx values in an\n answer-message.)\n\n When returning 5xxx, Failed-AVP will be populated with the AVP of the first\n matching Result-Code/AVP pair in the `errors` field of the argument\n [packet()](`t:packet/0`), if found. If this is not appropriate then\n an answer-message should be constructed explicitly and returned in a `reply`\n tuple instead.\n\n- **`{relay, Opts}`** - Relay a request to another peer in the role of a\n Diameter relay agent. If a routing loop is detected then the request is\n answered with 3005 (DIAMETER_LOOP_DETECTED). Otherwise a Route-Record AVP\n (containing the sending peer's Origin-Host) is added to the request and\n `c:pick_peer/4` and subsequent callbacks take place just as if\n `diameter:call/4` had been called explicitly. The End-to-End Identifier of the\n incoming request is preserved in the header of the relayed request.\n\n The returned `Opts` should not specify `detach`. A subsequent\n `c:handle_answer/4` callback for the relayed request must return its first\n argument, the [packet()](`t:packet/0`) containing the answer\n message. Note that the `extra` option can be specified to supply arguments\n that can distinguish the relay case from others if so desired. Any other\n return value (for example, from a `c:handle_error/4` callback) causes the\n request to be answered with 3002 (DIAMETER_UNABLE_TO_DELIVER).\n\n- **`discard`** - Discard the request. No answer message is sent to the peer.\n\n- **`{eval, Action, PostF}`** - Handle the request as if `Action` has been\n returned and then evaluate `PostF` in the request process. The return value is\n ignored.\n\n- **`{eval_packet, Action, PostF}`** - Like `eval` but evaluate `PostF` on any\n encoded `#diameter_packet{}` prior to transmission, the `bin` field containing\n the encoded binary. The return value is ignored.\n\n- **`{protocol_error, 3000..3999}`** - Equivalent to\n `{answer_message, 3000..3999}`.\n\n> #### Note {: .info }\n>\n> Requests containing errors may be answered by diameter, without a callback\n> taking place, depending on the value of the\n> [diameter:application_opt()](`m:diameter#application_opt`) `request_errors`.","ref":"diameter_app.html#c:handle_request/3"},{"type":"callback","title":"diameter_app.peer_down/3","doc":"Invoked to signal that a peer connection on the local Erlang node is no longer\navailable following a previous call to `c:peer_up/3`. In particular, that the\nRFC 3539 watchdog state machine for the connection has left state `OKAY` and the\npeer will no longer be a candidate in `c:pick_peer/4` callbacks.","ref":"diameter_app.html#c:peer_down/3"},{"type":"callback","title":"diameter_app.peer_up/3","doc":"Invoked to signal the availability of a peer connection on the local Erlang\nnode. In particular, capabilities exchange with the peer has indicated support\nfor the application in question, the RFC 3539 watchdog state machine for the\nconnection has reached state `OKAY` and Diameter messages can be both sent and\nreceived.\n\n> #### Note {: .info }\n>\n> A watchdog state machine can reach state `OKAY` from state `SUSPECT` without a\n> new capabilities exchange taking place. A new transport connection (and\n> capabilities exchange) results in a new peer_ref().\n\n> #### Note {: .info }\n>\n> There is no requirement that a callback return before incoming requests are\n> received: `c:handle_request/3` callbacks must be handled independently of\n> `c:peer_up/3` and `c:peer_down/3`.","ref":"diameter_app.html#c:peer_up/3"},{"type":"callback","title":"diameter_app.pick_peer/4","doc":"Invoked as a consequence of a call to `diameter:call/4` to select a destination\npeer for an outgoing request. The return value indicates the selected peer.\n\nThe candidate lists contain only those peers that have advertised support for\nthe Diameter application in question during capabilities exchange, that have not\nbe excluded by a `filter` option in the call to `diameter:call/4` and whose\nwatchdog state machine is in the `OKAY` state. The order of the elements is\nunspecified except that any peers whose Origin-Host and Origin-Realm matches\nthat of the outgoing request (in the sense of a `{filter, {all, [host, realm]}}`\noption to `diameter:call/4`) will be placed at the head of the list.\n`LocalCandidates` contains peers whose transport process resides on the local\nErlang node while `RemoteCandidates` contains peers that have been communicated\nfrom other nodes by services of the same name.\n\nA callback that returns a peer() will be followed by a `c:prepare_request/3`\ncallback and, if the latter indicates that the request should be sent, by either\n`c:handle_answer/4` or `c:handle_error/4` depending on whether or not an answer\nmessage is received from the peer. If the transport becomes unavailable after\n`c:prepare_request/3` then a new `c:pick_peer/4` callback may take place to\nfailover to an alternate peer, after which `c:prepare_retransmit/3` takes the\nplace of `c:prepare_request/3` in resending the request. There is no guarantee\nthat a `c:pick_peer/4` callback to select an alternate peer will be followed by\nany additional callbacks since a retransmission to an alternate peer is\nabandoned if an answer is received from a previously selected peer.\n\nThe return values `false` and `{false, State}` (that is, `NewState = State`) are\nequivalent, as are `{ok, Peer}` and `{Peer, State}`.\n\n> #### Note {: .info }\n>\n> The [diameter:service_opt()](`m:diameter#service_opt`) `use_shared_peers`\n> determines whether or not a service uses peers shared from other nodes. If not\n> then `RemoteCandidates` is the empty list.\n\n> #### Warning {: .warning }\n>\n> The return value `{Peer, NewState}` is only allowed if the Diameter\n> application in question was configured with the\n> [diameter:application_opt()](`m:diameter#application_opt`)\n> `{call_mutates_state, true}`. Otherwise, the `State` argument is always the\n> initial value as configured on the application, not any subsequent value\n> returned by a `c:peer_up/3` or `c:peer_down/3` callback.","ref":"diameter_app.html#c:pick_peer/4"},{"type":"callback","title":"diameter_app.prepare_request/3","doc":"Invoked to return a request for encoding and transport. Allows the sender to use\nthe selected peer's capabilities to modify the outgoing request. Many\nimplementations may simply want to return `{send, Packet}`\n\nA returned [packet()](`t:packet/0`) should set the request to be\nencoded in its `msg` field and can set the `transport_data` field in order to\npass information to the transport process. Extra arguments passed to\n`diameter:call/4` can be used to communicate transport (or any other) data to\nthe callback.\n\nA returned [packet()](`t:packet/0`) can set the `header` field to a\n`#diameter_header{}` to specify values that should be preserved in the outgoing\nrequest, values otherwise being those in the header record contained in\n`Packet`. A returned `length`, `cmd_code` or `application_id` is ignored.\n\nA returned `PostF` will be evaluated on any encoded `#diameter_packet{}` prior\nto transmission, the `bin` field containing the encoded binary. The return value\nis ignored.\n\nReturning `{discard, Reason}` causes the request to be aborted and the\n`diameter:call/4` for which the callback has taken place to return\n`{error, Reason}`. Returning `discard` is equivalent to returning\n`{discard, discarded}`.","ref":"diameter_app.html#c:prepare_request/3"},{"type":"callback","title":"diameter_app.prepare_retransmit/3","doc":"Invoked to return a request for encoding and retransmission. Has the same role\nas `c:prepare_request/3` in the case that a peer connection is lost an an\nalternate peer selected but the argument [packet()](`t:packet/0`) is\nas returned by the initial `c:prepare_request/3`.\n\nReturning `{discard, Reason}` causes the request to be aborted and a\n`c:handle_error/4` callback to take place with `Reason` as initial argument.\nReturning `discard` is equivalent to returning `{discard, discarded}`.","ref":"diameter_app.html#c:prepare_retransmit/3"},{"type":"type","title":"diameter_app.capabilities/0","doc":"A record containing the identities of the local Diameter node and the remote Diameter\npeer having an established transport connection, as well as the capabilities\nas determined by capabilities exchange. Each field of the record is a 2-tuple\nconsisting of values for the (local) host and (remote) peer. Optional or\npossibly multiple values are encoded as lists of values, mandatory values as\nthe bare value.","ref":"diameter_app.html#t:capabilities/0"},{"type":"type","title":"diameter_app.message/0","doc":"The representation of a Diameter message as passed to `diameter:call/4` or\nreturned from a `c:handle_request/3` callback.","ref":"diameter_app.html#t:message/0"},{"type":"type","title":"diameter_app.packet/0","doc":"A container for incoming and outgoing Diameter messages that's passed through\nencode/decode and transport. Fields should not be set in return values except\nas documented.","ref":"diameter_app.html#t:packet/0"},{"type":"type","title":"diameter_app.peer/0","doc":"A tuple representing a Diameter peer connection.","ref":"diameter_app.html#t:peer/0"},{"type":"type","title":"diameter_app.peer_ref/0","doc":"A term identifying a transport connection with a Diameter peer.","ref":"diameter_app.html#t:peer_ref/0"},{"type":"type","title":"diameter_app.state/0","doc":"The state maintained by the application\ncallback functions `c:peer_up/3`, `c:peer_down/3` and (optionally)\n`c:pick_peer/4`. The initial state is configured in the call to\n`diameter:start_service/2` that configures the application on a service.\nCallback functions returning a state are evaluated in a common\nservice-specific process while those not returning state are evaluated in a\nrequest-specific process.","ref":"diameter_app.html#t:state/0"},{"type":"module","title":"diameter_codec","doc":"Decode and encode of Diameter messages.\n\nIncoming Diameter messages are decoded from binary() before being communicated\nto `m:diameter_app` callbacks. Similarly, outgoing Diameter messages are encoded\ninto binary() before being passed to the appropriate `m:diameter_transport`\nmodule for transmission. The functions documented here implement the default\nencode/decode.\n\n> #### Warning {: .warning }\n>\n> The diameter user does not need to call functions here explicitly when sending\n> and receiving messages using `diameter:call/4` and the callback interface\n> documented in `m:diameter_app`: diameter itself provides encode/decode as a\n> consequence of configuration passed to `diameter:start_service/2`, and the\n> results may differ from those returned by the functions documented here,\n> depending on configuration.\n\nThe [header()](`m:diameter_codec#header`) and\n[packet()](`m:diameter_codec#packet`) records below are defined in diameter.hrl,\nwhich can be included as follows.\n\n```erlang\n-include_lib(\"diameter/include/diameter.hrl\").\n```\n\nApplication-specific records are defined in the hrl files resulting from\ndictionary file compilation.","ref":"diameter_codec.html"},{"type":"module","title":"DATA TYPES - diameter_codec","doc":"- **`uint8()  = 0..255`{: #integers }**\n\n- **`uint24() = 0..16777215`**\n\n- **`uint32() = 0..4294967295`** - 8-bit, 24-bit and 32-bit integers occurring\n in Diameter and AVP headers.\n\n- **`avp() = #diameter_avp{}`{: #avp }** - The application-neutral\n representation of an AVP. Primarily intended for use by relay applications\n that need to handle arbitrary Diameter applications. A service implementing a\n specific Diameter application (for which it configures a dictionary) can\n manipulate values of type [message()](`m:diameter_codec#message`) instead.\n\n Fields have the following types.\n\n - **`code = uint32()`**\n\n - **`is_mandatory = boolean()`**\n\n - **`need_encryption = boolean()`**\n\n - **`vendor_id = uint32() | undefined`** - Values in the AVP header,\n corresponding to AVP Code, the M flag, P flags and Vendor-ID respectively. A\n Vendor-ID other than `undefined` implies a set V flag.\n\n - **`data = iolist()`** - The data bytes of the AVP.\n\n - **`name = atom()`** - The name of the AVP as defined in the dictionary file\n in question, or `undefined` if the AVP is unknown to the dictionary file in\n question.\n\n - **`value = term()`** - The decoded value of an AVP. Will be `undefined` on\n decode if the data bytes could not be decoded, the AVP is unknown, or if the\n [decode format](`m:diameter#decode_format`) is `none`. The type of a decoded\n value is as document in [diameter_dict(4)](diameter_dict.md#DATA_TYPES).\n\n - **`type = atom()`** - The type of the AVP as specified in the dictionary\n file in question (or one it inherits). Possible types are `undefined` and\n the Diameter types: `OctetString`, `Integer32`, `Integer64`, `Unsigned32`,\n `Unsigned64`, `Float32`, `Float64`, `Grouped`, `Enumerated`, `Address`,\n `Time`, `UTF8String`, `DiameterIdentity`, `DiameterURI`, `IPFilterRule` and\n `QoSFilterRule`.\n\n- **`dictionary() = module()`{: #dictionary }** - The name of a generated\n dictionary module as generated by [diameterc(1)](diameterc_cmd.md) or\n `diameter_make:codec/2`. The interface provided by a dictionary module is an\n implementation detail that may change.\n\n- **`header() = #diameter_header{}`{: #header }** - The record representation of\n the Diameter header. Values in a [packet()](`m:diameter_codec#packet`)\n returned by `decode/2` are as extracted from the incoming message. Values set\n in an [packet()](`m:diameter_codec#packet`) passed to `encode/2` are preserved\n in the encoded binary(), with the exception of `length`, `cmd_code` and\n `application_id`, all of which are determined by the\n [dictionary()](`m:diameter_codec#dictionary`) in question.\n\n > #### Note {: .info }\n >\n > It is not necessary to set header fields explicitly in outgoing messages as\n > diameter itself will set appropriate values. Setting inappropriate values\n > can be useful for test purposes.\n\n Fields have the following types.\n\n - **`version = uint8()`**\n\n - **`length = uint24()`**\n\n - **`cmd_code = uint24()`**\n\n - **`application_id = uint32()`**\n\n - **`hop_by_hop_id = uint32()`**\n\n - **`end_to_end_id = uint32()`** - Values of the Version, Message Length,\n Command-Code, Application-ID, Hop-by-Hop Identifier and End-to-End\n Identifier fields of the Diameter header.\n\n - **`is_request = boolean()`**\n\n - **`is_proxiable = boolean()`**\n\n - **`is_error = boolean()`**\n\n - **`is_retransmitted = boolean()`** - Values corresponding to the R(equest),\n P(roxiable), E(rror) and T(Potentially re-transmitted message) flags of the\n Diameter header.\n\n- **`message() = record() | maybe_improper_list()`{: #message }** - The\n representation of a Diameter message as passed to `diameter:call/4` or\n returned from a [handle_request/3](`c:diameter_app:handle_request/3`)\n callback. The record representation is as outlined in\n [diameter_dict(4)](diameter_dict.md#MESSAGE_RECORDS): a message as defined in\n a dictionary file is encoded as a record with one field for each component\n AVP. Equivalently, a message can also be encoded as a list whose head is the\n atom-valued message name (as specified in the relevant dictionary file) and\n whose tail is either a list of AVP name/values pairs or a map with values\n keyed on AVP names. The format at decode is determined by\n [diameter:service_opt()](`m:diameter#service_opt`)\n [decode_format](`m:diameter#decode_format`). Any of the formats is accepted at\n encode.\n\n Another list-valued representation allows a message to be specified as a list\n whose head is a [header()](`m:diameter_codec#header`) and whose tail is an\n [avp()](`m:diameter_codec#avp`) list. This representation is used by diameter\n itself when relaying requests as directed by the return value of a\n [handle_request/3](`c:diameter_app:handle_request/3`) callback. It differs\n from the other two in that it bypasses the checks for messages that do not\n agree with their definitions in the dictionary in question: messages are sent\n exactly as specified.\n\n- **`packet() = #diameter_packet{}`{: #packet }** - A container for incoming and\n outgoing Diameter messages. Fields have the following types.\n\n - **`header = `[`header()`](`m:diameter_codec#header`)` | undefined`** - The\n Diameter header of the message. Can be (and typically should be) `undefined`\n for an outgoing message in a non-relay application, in which case diameter\n provides appropriate values.\n\n - **`avps = [`[`avp()`](`m:diameter_codec#avp`)`] | undefined`** - The AVPs of\n the message. Ignored for an outgoing message if the `msg` field is set to a\n value other than `undefined`.\n\n - **`msg = `[`message()`](`m:diameter_codec#message`)` | undefined`** - The\n incoming/outgoing message. For an incoming message, a term corresponding to\n the configured [decode format](`m:diameter#decode_format`) if the message\n can be decoded in a non-relay application, `undefined` otherwise. For an\n outgoing message, setting a\n `[`[`header()`](`m:diameter_codec#header`)`|`[`avp()`](`m:diameter_codec#avp`)`]`\n list is equivalent to setting the `header` and `avps` fields to the\n corresponding values.\n\n > #### Warning {: .warning }\n >\n > A value in the `msg` field does _not_ imply an absence of decode errors.\n > The `errors` field should also be examined.\n\n - **`bin = binary()`** - The incoming message prior to encode or the outgoing\n message after encode.\n\n - **`errors = [5000..5999 | {5000..5999, avp()}]`** - Errors detected at\n decode of an incoming message, as identified by a corresponding 5xxx series\n Result-Code (Permanent Failures). For an incoming request, these should be\n used to formulate an appropriate answer as documented for the\n [handle_request/3](`c:diameter_app:handle_request/3`) callback in\n `m:diameter_app`. For an incoming answer, the\n [diameter:application_opt()](`m:diameter#application_opt`) `answer_errors`\n determines the behaviour.\n\n - **`transport_data = term()`** - An arbitrary term of meaning only to the\n transport process in question, as documented in `m:diameter_transport`.","ref":"diameter_codec.html#module-data-types"},{"type":"module","title":"SEE ALSO - diameter_codec","doc":"[diameterc(1)](diameterc_cmd.md), `m:diameter_app`,\n[diameter_dict(4)](diameter_dict.md), `m:diameter_make`","ref":"diameter_codec.html#module-see-also"},{"type":"function","title":"diameter_codec.decode/2","doc":"Decode a Diameter message.","ref":"diameter_codec.html#decode/2"},{"type":"function","title":"diameter_codec.encode/2","doc":"Encode a Diameter message.","ref":"diameter_codec.html#encode/2"},{"type":"type","title":"diameter_codec.dictionary/0","doc":"The name of a generated [dictionary module](`m:diameter_codec#dictionary`)\nas generated by [diameterc(1)](diameterc_cmd.md) or `diameter_make:codec/2`.\nThe interface provided by a dictionary module is an\nimplementation detail that may change.","ref":"diameter_codec.html#t:dictionary/0"},{"type":"type","title":"diameter_codec.message/0","doc":"The representation of a Diameter [message](`m:diameter_codec#message`)\nas passed to `diameter:call/4` or returned from a\n[handle_request/3](`c:diameter_app:handle_request/3`) callback.","ref":"diameter_codec.html#t:message/0"},{"type":"type","title":"diameter_codec.packet/0","doc":"A [container](`m:diameter_codec#packet`) for incoming and outgoing\nDiameter messages.","ref":"diameter_codec.html#t:packet/0"},{"type":"type","title":"diameter_codec.record/0","doc":"","ref":"diameter_codec.html#t:record/0"},{"type":"module","title":"diameter_make","doc":"Diameter dictionary compilation.\n\nThe function `codec/2` is used to compile a diameter\n[dictionary file](diameter_dict.md) into Erlang source. The resulting source\nimplements the interface diameter requires to encode and decode the dictionary's\nmessages and AVPs.\n\nThe utility [diameterc(1)](diameterc_cmd.md) provides an alternate compilation\ninterface.","ref":"diameter_make.html"},{"type":"module","title":"BUGS - diameter_make","doc":"Unrecognized options are silently ignored.","ref":"diameter_make.html#module-bugs"},{"type":"module","title":"SEE ALSO - diameter_make","doc":"[diameterc(1)](diameterc_cmd.md), [diameter_dict(4)](diameter_dict.md)","ref":"diameter_make.html#module-see-also"},{"type":"function","title":"diameter_make.codec/2","doc":"Compile a single dictionary file.\n\nThe input `File` can be either a path or a literal dictionary, the occurrence\nof newline (ascii NL) or carriage return (ascii CR) identifying the latter.\n`Opt` determines the format of the results and whether they are written to\nfile or returned, and can have the following types.\n\n- **`parse | forms | erl | hrl`** - Specifies an output format. Whether the\n output is returned or written to file depends on whether or not option\n `return` is specified. When written to file, the resulting file(s) will have\n extensions `.D`, `.F`, `.erl`, and `.hrl` respectively, basenames defaulting\n to `dictionary` if the input dictionary is literal and does not specify\n [`@name`](diameter_dict.md#name). When returned, results are in the order of\n the corresponding format options. Format options default to `erl` and `hrl`\n (in this order) if unspecified.\n\n The `parse` format is an internal representation that can be passed to\n `flatten/1` and `format/1`, while the `forms` format can be passed to\n `compile:forms/2`. The `erl` and `hrl` formats are returned as iolists.\n\n- **`{include, string()}`** - Prepend the specified directory to the code path.\n Use to point at beam files compiled from inherited dictionaries,\n [`@inherits`](diameter_dict.md#inherits) in a dictionary file creating a beam\n dependency, not an erl/hrl dependency.\n\n Multiple `include` options can be specified.\n\n- **`{outdir, string()}`** - Write generated source to the specified directory.\n Defaults to the current working directory. Has no effect if option `return` is\n specified.\n\n- **`return`** - Return results in a `{ok, [Out]}` tuple instead of writing to\n file and returning `ok`.\n\n- **`{name|prefix, string()}`** - Transform the input dictionary before\n compilation, setting [`@name`](diameter_dict.md#name) or\n [`@prefix`](diameter_dict.md#prefix) to the specified string.\n\n- **`{inherits, string()}`** - Transform the input dictionary before\n compilation, appending [`@inherits`](diameter_dict.md#inherits) of the\n specified string.\n\n Two forms have special meaning:\n\n ```text\n {inherits, \"-\"}\n {inherits, \"Prev/Mod\"}\n ```\n\n The first has the effect of clearing any previous inherits, the second of\n replacing a previous inherits of `Prev` to one of `Mod`. This allows the\n semantics of the input dictionary to be changed without modifying the file\n itself.\n\n Multiple `inherits` options can be specified.\n\nNote that a dictionary's [`@name`](diameter_dict.md#name), together with the\n`outdir` option, determine the output paths when the `return` option is not\nspecified. The [`@name`](diameter_dict.md#name) of a literal input dictionary\ndefaults to `dictionary`.\n\nA returned error reason can be converted into a readable string using\n`format_error/1`.","ref":"diameter_make.html#codec/2"},{"type":"function","title":"diameter_make.flatten/1","doc":"Reconstitute a parsed dictionary, as returned by `codec/2`, without using\n[`@inherits`](diameter_dict.md#inherits). That is, construct an equivalent\ndictionary in which all AVP's are definined in the dictionary itself. The return\nvalue is also a parsed dictionary.","ref":"diameter_make.html#flatten/1"},{"type":"function","title":"diameter_make.format/1","doc":"Turns a parsed dictionary, as returned by `codec/2`, back into the dictionary\nformat.","ref":"diameter_make.html#format/1"},{"type":"function","title":"diameter_make.format_error/1","doc":"Turn an error reason returned by `codec/2` into a readable string.","ref":"diameter_make.html#format_error/1"},{"type":"type","title":"diameter_make.dict/0","doc":"","ref":"diameter_make.html#t:dict/0"},{"type":"type","title":"diameter_make.opt/0","doc":"","ref":"diameter_make.html#t:opt/0"},{"type":"type","title":"diameter_make.parsed/0","doc":"","ref":"diameter_make.html#t:parsed/0"},{"type":"module","title":"diameter_sctp","doc":"Diameter transport over SCTP.\n\nThis module implements diameter transport over SCTP using `m:gen_sctp`. It can\nbe specified as the value of a transport_module option to\n`diameter:add_transport/2` and implements the behaviour documented in\n`m:diameter_transport`.\n\n[](){: #start }","ref":"diameter_sctp.html"},{"type":"module","title":"SEE ALSO - diameter_sctp","doc":"`m:diameter`, `m:diameter_transport`, `m:gen_sctp`, `m:inet`","ref":"diameter_sctp.html#module-see-also"},{"type":"function","title":"diameter_sctp.start/3","doc":"The start function required by `m:diameter_transport`.\n\nOptions `raddr` and `rport` specify the remote address and port for a connecting\ntransport and not valid for a listening transport: the former is required while\nlatter defaults to 3868 if unspecified. Multiple `raddr` options can be\nspecified, in which case the connecting transport in question attempts each in\nsequence until an association is established.\n\nOption `accept` specifies remote addresses for a listening transport and is not\nvalid for a connecting transport. If specified, a remote address that does not\nmatch one of the specified addresses causes the association to be aborted.\nMultiple `accept` options can be specified. A string-valued `Match` that does\nnot parse as an address is interpreted as a regular expression.\n\nOption `unordered` specifies whether or not to use unordered delivery, integer\n`N` being equivalent to `N = #### Warning {: .warning }\n>\n> An small receive buffer may result in a peer having to resend incoming\n> messages: set the `m:inet` option `recbuf` to increase the buffer size.\n>\n> An small send buffer may result in outgoing messages being discarded: set the\n> `m:inet` option `sndbuf` to increase the buffer size.","ref":"diameter_sctp.html#start/3"},{"type":"type","title":"diameter_sctp.connect_option/0","doc":"","ref":"diameter_sctp.html#t:connect_option/0"},{"type":"type","title":"diameter_sctp.listen_option/0","doc":"","ref":"diameter_sctp.html#t:listen_option/0"},{"type":"type","title":"diameter_sctp.match/0","doc":"","ref":"diameter_sctp.html#t:match/0"},{"type":"type","title":"diameter_sctp.option/0","doc":"","ref":"diameter_sctp.html#t:option/0"},{"type":"module","title":"diameter_service","doc":"","ref":"diameter_service.html"},{"type":"type","title":"diameter_service.wd_state/0","doc":"State of the watchdog","ref":"diameter_service.html#t:wd_state/0"},{"type":"module","title":"diameter_tcp","doc":"Diameter transport over TCP.\n\nThis module implements diameter transport over TCP using `m:gen_tcp`. It can be\nspecified as the value of a `transport_module` option to\n`diameter:add_transport/2` and implements the behaviour documented in\n`m:diameter_transport`. TLS security is supported, either as an upgrade\nfollowing capabilities exchange or at connection establishment.\n\nNote that the ssl application is required for TLS and must be started before\nconfiguring TLS capability on diameter transports.\n\n[](){: #start }","ref":"diameter_tcp.html"},{"type":"module","title":"SEE ALSO - diameter_tcp","doc":"`m:diameter`, `m:diameter_transport`, `m:gen_tcp`, `m:inet`, `m:ssl`","ref":"diameter_tcp.html#module-see-also"},{"type":"function","title":"diameter_tcp.start/3","doc":"start({Type, Ref}, Svc, [Opt]) -> {ok, Pid} | {ok, Pid, [LAddr]} | {error,\nReason}\n\nThe start function required by `m:diameter_transport`.\n\nOptions `raddr` and `rport` specify the remote address and port for a connecting\ntransport and are not valid for a listening transport.\n\nOption `accept` specifies remote addresses for a listening transport and is not\nvalid for a connecting transport. If specified, a remote address that does not\nmatch one of the specified addresses causes the connection to be aborted.\nMultiple `accept` options can be specified. A string-valued `Match` that does\nnot parse as an address is interpreted as a regular expression.\n\nOption `ssl_options` must be specified for a transport that should support TLS:\na value of `true` results in a TLS handshake immediately upon connection\nestablishment while `t:list/0` specifies options to be passed to `ssl:connect/2`\nor `ssl:handshake/2` after capabilities exchange if TLS is negotiated.\n\nOption `fragment_timer` specifies the timeout, in milliseconds, of a timer used\nto flush messages from the incoming byte stream even if the number of bytes\nindicated in the Message Length field of its Diameter Header have not yet been\naccumulated: such a message is received over the transport interface after two\nsuccessive timeouts without the reception of additional bytes. Defaults to 1000.\n\n[](){: #sender }\n\nOption `sender` specifies whether or not to use a dedicated process for sending\noutgoing messages, which avoids the possibility of send blocking reception.\nDefaults to `false`. If set to `true` then a `message_cb` that avoids the\npossibility of messages being queued in the sender process without bound should\nbe configured.\n\nOption `message_cb` specifies a callback that is invoked on incoming and\noutgoing messages, that can be used to implement flow control. It is applied to\ntwo arguments: an atom indicating the reason for the callback (`send`, `recv`,\nor `ack` after a completed send), and the message in question (binary() on\n`recv`, binary() or diameter*packet record on `send` or `ack`, or `false` on\n`ack` when an incoming request has been discarded). It should return a list of\nactions and a new callback as tail; eg. `[fun cb/3, State]`. Valid actions are\nthe atoms `send` or `recv`, to cause a following message-valued action to be\nsent/received, a message to send/receive (binary() or diameter_packet record),\nor a boolean() to enable/disable reading on the socket. More than one\n`send`/`recv`/message sequence can be returned from the same callback, and an\ninitial `send`/`recv` can be omitted if the same as the value passed as the\ncallback's first argument. Reading is initially enabled, and returning `false`\ndoes not imply there cannot be subsequent `recv` callbacks since messages may\nalready have been read. An empty tail is equivalent to the prevailing callback.\nDefaults to a callback equivalent to `fun(ack, *) -> []; (\\_, Msg) -> [Msg]\nend`.\n\nRemaining options are any accepted by `ssl:connect/3` or `gen_tcp:connect/3` for\na connecting transport, or `ssl:listen/2` or `gen_tcp:listen/2` for a listening\ntransport, depending on whether or not `{ssl_options, true}` has been specified.\nOptions `binary`, `packet` and `active` cannot be specified. Also, option `port`\ncan be specified for a listening transport to specify the local listening port,\nthe default being the standardized 3868. Note that the option `ip` specifies the\nlocal address.\n\nAn `ssl_options` list must be specified if and only if the transport in question\nhas set `Inband-Security-Id` to 1 (`TLS`), as specified to either\n`diameter:start_service/2` or `diameter:add_transport/2`, so that the transport\nprocess will receive notification of whether or not to commence with a TLS\nhandshake following capabilities exchange. Failing to specify an options list on\na TLS-capable transport for which TLS is negotiated will cause TLS handshake to\nfail. Failing to specify TLS capability when `ssl_options` has been specified\nwill cause the transport process to wait for a notification that will not be\nforthcoming, which will eventually cause the RFC 3539 watchdog to take down the\nconnection.\n\nThe first element of a non-empty `Host-IP-Address` list in `Svc` provides the\nlocal IP address if an `ip` option is not specified. The local address is either\nreturned from`start/3` or passed in a `connected` message over the transport\ninterface.","ref":"diameter_tcp.html#start/3"},{"type":"type","title":"diameter_tcp.connect_option/0","doc":"","ref":"diameter_tcp.html#t:connect_option/0"},{"type":"type","title":"diameter_tcp.listen_option/0","doc":"","ref":"diameter_tcp.html#t:listen_option/0"},{"type":"type","title":"diameter_tcp.match/0","doc":"","ref":"diameter_tcp.html#t:match/0"},{"type":"type","title":"diameter_tcp.option/0","doc":"","ref":"diameter_tcp.html#t:option/0"},{"type":"behaviour","title":"diameter_transport","doc":"Diameter transport interface.\n\nA module specified as a `transport_module` to `diameter:add_transport/2` must\nimplement the interface documented here. The interface consists of a function\nwith which diameter starts a transport process and a message interface with\nwhich the transport process communicates with the process that starts it (aka\nits parent).","ref":"diameter_transport.html"},{"type":"behaviour","title":"DATA TYPES - diameter_transport","doc":"- **`message() = binary() | `[`diameter_codec:packet()`](`m:diameter_codec#packet`)**{: #message } -\n A Diameter message as passed over the transport interface.\n\n For an inbound message from a transport process, a\n [diameter_codec:packet()](`m:diameter_codec#packet`) must contain the received\n message in its `bin` field. In the case of an inbound request, any value set\n in the `transport_data` field will passed back to the transport module in the\n corresponding answer message, unless the sender supplies another value.\n\n For an outbound message to a transport process, a\n [diameter_codec:packet()](`m:diameter_codec#packet`) has a value other than\n `undefined` in its `transport_data` field and has the binary() to send in its\n `bin` field.\n\n[](){: #MESSAGES }","ref":"diameter_transport.html#module-data-types"},{"type":"behaviour","title":"MESSAGES - diameter_transport","doc":"All messages sent over the transport interface are of the form\n`{diameter, term()}`.\n\nA transport process can expect messages of the following types from its parent.\n\n- **`{diameter, {send, `[`message()`](`m:diameter_transport#message`)` | false}}`** -\n An outbound Diameter message. The atom `false` can only be received when\n request acknowledgements have been requests: see the `ack` message below.\n\n- **`{diameter, {close, Pid}}`** - A request to terminate the transport process\n after having received DPA in response to DPR. The transport process should\n exit. `Pid` is the pid() of the parent process.\n\n- **`{diameter, {tls, Ref, Type, Bool}}`** - Indication of whether or not\n capabilities exchange has selected inband security using TLS. `Ref` is a\n reference() that must be included in the `{diameter, {tls, Ref}}` reply\n message to the transport's parent process (see below). `Type` is either\n `connect` or `accept` depending on whether the process has been started for a\n connecting or listening transport respectively. `Bool` is a boolean()\n indicating whether or not the transport connection should be upgraded to TLS.\n\n If TLS is requested (`Bool=true`) then a connecting process should initiate a\n TLS handshake with the peer and an accepting process should prepare to accept\n a handshake. A successful handshake should be followed by a\n `{diameter, {tls, Ref}}` message to the parent process. A failed handshake\n should cause the process to exit.\n\n This message is only sent to a transport process over whose\n `Inband-Security-Id` configuration has indicated support for TLS.\n\nA transport process should send messages of the following types to its parent.\n\n- **`{diameter, {self(), connected}}`** - Inform the parent that the transport\n process with `Type=accept` has established a connection with the peer. Not\n sent if the transport process has `Type=connect`.\n\n- **`{diameter, {self(), connected, Remote}}`**\n\n- **`{diameter, {self(), connected, Remote, [LocalAddr]}}`** - Inform the parent\n that the transport process with `Type=connect` has established a connection\n with a peer. Not sent if the transport process has `Type=accept`.  `Remote` is\n an arbitrary term that uniquely identifies the remote endpoint to which the\n transport has connected. A `LocalAddr` list has the same semantics as one\n returned from `c:start/3`.\n\n- **`{diameter, ack}`** - Request acknowledgements of unanswered requests. A\n transport process should send this once before passing incoming Diameter\n messages into diameter. As a result, every Diameter request passed into\n diameter with a `recv` message (below) will be answered with a `send` message\n (above), either a [message()](`m:diameter_transport#message`) for the\n transport process to send or the atom `false` if the request has been\n discarded or otherwise not answered.\n\n This is to allow a transport process to keep count of the number of incoming\n request messages that have not yet been answered or discarded, to allow it to\n regulate the amount of incoming traffic. Both diameter_tcp and diameter_sctp\n request acknowledgements when a `message_cb` is configured, turning send/recv\n message into callbacks that can be used to regulate traffic.\n\n- **`{diameter, {recv, `[`message()`](`m:diameter_transport#message`)`}}`** - An\n inbound Diameter message.\n\n- **`{diameter, {tls, Ref}}`** - Acknowledgment of a successful TLS handshake.\n `Ref` is the reference() received in the `{diameter, {tls, Ref, Type, Bool}}`\n message in response to which the reply is sent. A transport must exit if a\n handshake is not successful.","ref":"diameter_transport.html#module-messages"},{"type":"behaviour","title":"SEE ALSO - diameter_transport","doc":"`m:diameter_tcp`, `m:diameter_sctp`","ref":"diameter_transport.html#module-see-also"},{"type":"callback","title":"diameter_transport.start/3","doc":"Start a transport process. Called by diameter as a consequence of a call to\n`diameter:add_transport/2` in order to establish or accept a transport\nconnection respectively. A transport process maintains a connection with a\nsingle remote peer.\n\n`Type` indicates whether the transport process in question is being started for\na connecting (`Type=connect`) or listening (`Type=accept`) transport. In the\nlatter case, transport processes are started as required to accept connections\nfrom multiple peers.\n\nRef is the value that was returned from the call to `diameter:add_transport/2`\nthat has lead to starting of a transport process.\n\n`Svc` contains capabilities passed to `diameter:start_service/2` and\n`diameter:add_transport/2`, values passed to the latter overriding those passed\nto the former.\n\n`Config` is as passed in `transport_config` tuple in the\n[diameter:transport_opt()](`m:diameter#transport_opt`) list passed to\n`diameter:add_transport/2`.\n\nThe start function should use the `Host-IP-Address` list in `Svc` and/or\n`Config` to select and return an appropriate list of local IP addresses. In the\nconnecting case, the local address list can instead be communicated in a\n`connected` message (see [MESSAGES](`m:diameter_transport#MESSAGES`) below)\nfollowing connection establishment. In either case, the local address list is\nused to populate `Host-IP-Address` AVPs in outgoing capabilities exchange\nmessages if `Host-IP-Address` is unspecified.\n\nA transport process must implement the message interface documented below. It\nshould retain the pid of its parent, monitor the parent and terminate if it\ndies. It should not link to the parent. It should exit if its transport\nconnection with its peer is lost.","ref":"diameter_transport.html#c:start/3"},{"type":"extras","title":"Release Notes","doc":"\n# Release Notes\n\nReleases are listed in reverse chronological order, most recent first.","ref":"notes.html"},{"type":"extras","title":"diameter 2.4.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Function specs for the main API module has been updated.\n\n Own Id: OTP-19126 Aux Id: [#8399]\n\n- Man pages are now available for `erl`, `erlc`, `dialyzer`, and all other programs that are included in Erlang/OTP.\n\n Own Id: OTP-19201 Aux Id: [PR-8740]\n\n- `diameter:stop_service/1` has been made more synchronous.\n\n Own Id: OTP-19206 Aux Id: ERIERL-1102\n\n[#8399]: https://github.com/erlang/otp/issues/8399\n[PR-8740]: https://github.com/erlang/otp/pull/8740","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.4 - Release Notes","doc":"","ref":"notes.html#diameter-2-4"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- `-callback` attributes have been added to `m:diameter_app` and `m:diameter_transport`.\n\n Own Id: OTP-18783 Aux Id: [PR-7699]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- Pick peer can now also handle request of type `#diameter_packet{}`.\n\n Own Id: OTP-19090 Aux Id: [PR-8399]\n\n[PR-7699]: https://github.com/erlang/otp/pull/7699\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8399]: https://github.com/erlang/otp/pull/8399","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 2.3.2.2 - Release Notes","doc":"","ref":"notes.html#diameter-2-3-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"* Stop service has been made more synchronous.\n\n Own Id: OTP-19206 Aux Id: ERIERL-1102","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.3.2.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-3-2-1"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"* Pick peer can now also handle request of type #diameter_packet\\{\\}.\n\n Own Id: OTP-19090 Aux Id: PR-8399","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 2.3.2 - Release Notes","doc":"","ref":"notes.html#diameter-2-3-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"* Reduce the impact of calling service_info by not counting the binaries (on the heap) info, This is done by introducing an option, bins_info, which controls this.\n\n Own Id: OTP-19040 Aux Id: ERIERL-1060","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.3.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Replaced unintentional Erlang Public License 1.1 headers in some files with\n the intended Apache License 2.0 header.\n\n Own Id: OTP-18815 Aux Id: PR-7780","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.3 - Release Notes","doc":"","ref":"notes.html#diameter-2-3"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18405 Aux Id:\n GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814\n\n- Deprecates `dbg:stop_clear/0` because it is simply a function alias to\n `dbg:stop/0`\n\n Own Id: OTP-18478 Aux Id: GH-6903\n\n- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n appropriate, instead of `proc_lib:init_ack/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 2.2.7.2 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-7-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"* \\`diameter:stop_service/1\\` has been made more synchronous.\n\n Own Id: OTP-19206 Aux Id: ERIERL-1102","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2.7.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-7-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"* Reduce the impact of calling service_info by not counting the binaries (on the heap) info, This is done by introducing an option, bins_info, which controls this.\n\n Own Id: OTP-19040 Aux Id: ERIERL-1060","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2.7 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-7"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- There is a new configure option, `--enable-deterministic-build`, which will\n apply the `deterministic` compiler option when building Erlang/OTP. The\n `deterministic` option has been improved to eliminate more sources of\n non-determinism in several applications.\n\n Own Id: OTP-18165 Aux Id: PR-5965","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 2.2.6 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix decode of non-IP address types; that is, of values of the derived AVP data\n format Address whose first two octets specify an address family other than 1\n (IP) or 2 (IP6). Such values have never been decoded, and were treated as\n decode errors. They're now decoded to a 2-tuple of the integer() address\n family and binary() remaining octets, with no family-specific decode. The\n 2-tuple distinguishes the decode from the 4-tuple and 8-tuple IP address\n decodes. 2-tuples are also now encoded.\n\n Note that even currently unassigned address families are decoded: only the\n reserved values, 0 and 65535, are treated as errors.\n\n Own Id: OTP-17976 Aux Id: GH-5463","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2.5 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- The compilation time is no longer recorded in BEAM files. There remained\n several undocumented functions that attempted to retrieve compilation times.\n Those have now been removed.\n\n Own Id: OTP-17962","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2.4 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- The unordered option was ignored on a client diameter_sctp transport, causing\n all delivery to be ordered.\n\n The association id was not specified to gen_sctp when requesting unordered\n delivery, causing the setting to be applied to the whole endpoint.\n\n Thanks to Bengt Kleberg and Andreas Schultz.\n\n Own Id: OTP-17366 Aux Id: GH-4775","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2.3 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Add the 'first' tuple to type diameter:peer_filter/0. The filter was added in\n OTP-17.5.6.8 and OTP-18.3, but neither release updated the type specification.\n\n Own Id: OTP-16548 Aux Id: ERL-1191","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2.2 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- The possibility of choosing a handler process for an incoming Diameter request\n with a configured MFA was documented in OTP 20.0, but counters (with\n \\{traffic_counters, true\\}) were not incremented when this process was on a\n remote node. Counters are now incremented on the node that configures the\n transport in question.\n\n Introduced in OTP 21.3.\n\n Own Id: OTP-16457\n\n- Transport options differing from those passed to diameter:add_transport/2 were\n used in several situations: when starting a transport process after\n connect_timer expiry after an initial connection attempt has failed, when\n starting a transport process after a connection has been accepted, when\n sending events, when returning options in diameter:service_info/2, and\n possibly more. In particular, the following configuration options to\n diameter:add_transport/2 were dropped: avp_dictionaries, incoming_maxlen,\n spawn_opt, strict_mbit.\n\n Moreover, any service options mistakenly passed to diameter:add_transport/2\n were interpreted as such, instead of being ignored as the documentation\n states, with the consequence that outgoing and incoming requests saw different\n values of some options, some were always taken from transport options, and\n others from service options.\n\n diameter:add_transport/2 must be called in new code for the fix to have\n effect.\n\n Introduced in OTP 20.1.\n\n Own Id: OTP-16459","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix inadvertently broad monitor that resulted in gen_server cast messages to\n hidden nodes from module diameter_dist.\n\n Own Id: OTP-15768","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.2 - Release Notes","doc":"","ref":"notes.html#diameter-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix failure of incoming answer message with faulty Experimental-Result-Code.\n Failure to decode the AVP resulted in an uncaught exception, with no no\n handle_answer/error callback as a consequence.\n\n Own Id: OTP-15569 Aux Id: ERIERL-302","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Add spawn_opt MFA configuration to allow a callback to spawn a handler process\n for an incoming Diameter request on an an arbitrary node. Module diameter_dist\n provides a route_session/2 that can be used to distribute requests based on\n Session-Id, although this module is currently only documented in the module\n itself and may change.\n\n Own Id: OTP-15398","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 2.1.6 - Release Notes","doc":"","ref":"notes.html#diameter-2-1-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix function_clause when sending an outgoing request after DPA has been sent\n in response to an incoming DPR. The caused the diameter_peer_fsm gen_server\n associated with the peer connection to fail, which could then result in the\n transport connection being reset before the peer closed it upon reception of\n DPA.\n\n Own Id: OTP-15198 Aux Id: ERIERL-213","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.1.5 - Release Notes","doc":"","ref":"notes.html#diameter-2-1-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix documentation typos.\n\n Own Id: OTP-15045","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.1.4.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-1-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix failure of incoming answer message with faulty Experimental-Result-Code.\n Failure to decode the AVP resulted in an uncaught exception, with no no\n handle_answer/error callback as a consequence.\n\n Own Id: OTP-15569 Aux Id: ERIERL-302","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.1.4 - Release Notes","doc":"","ref":"notes.html#diameter-2-1-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix close of diameter_tcp/sctp listening socket at\n diameter:remove_transport/2, that was broken in diameter 2.1. A reconfigured\n transport could not listen on the same endpoint as a result.\n\n Own Id: OTP-14839\n\n- Fix handling of SUSPECT connections at service termination. A connection with\n this watchdog state caused diameter_service:terminate/2 to fail.\n\n Own Id: OTP-14947 Aux Id: ERIERL-124","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.1.3 - Release Notes","doc":"","ref":"notes.html#diameter-2-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix documentation typo: peer_up/3 was written where peer_down/3 was intended.\n\n Own Id: OTP-14805","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.1.2 - Release Notes","doc":"","ref":"notes.html#diameter-2-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- A fault introduced in diameter 2.1 could cause decode errors to be ignored in\n AVPs following the header of a Grouped AVP.\n\n Own Id: OTP-14684 Aux Id: ERIERL-85","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.1.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- An inadvertently removed monitor in diameter 2.1 caused the ets table\n diameter_reg to leak entries, and caused service restart and more to fail.\n\n Own Id: OTP-14668 Aux Id: ERIERL-83","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 2.1 - Release Notes","doc":"","ref":"notes.html#diameter-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix handling of Proxy-Info in answer messages setting the E-bit.\n\n RFC 6733 requires that Proxy-Info AVPs in an incoming request be echoed in an\n outgoing answer. This was not done in answers formulated by diameter; for\n example, as a result of a handle_request callback having returned an\n 'answer-message' or protocol_error tuple.\n\n Own Id: OTP-9869\n\n- React to nodeup/nodedown when sharing peer connections.\n\n Service configuration share_peers and use_shared_peers did not respond to the\n coming and going of remote nodes.\n\n Own Id: OTP-14011\n\n- Fix inappropriate message callbacks.\n\n An incoming CER or DPR was regarded as discarded, resulting in a corresponding\n message callback (if configured) in diameter_tcp/sctp.\n\n Own Id: OTP-14486\n\n- Fix handling of 5009 errors (DIAMETER_AVP_OCCURS_TOO_MANY TIMES).\n\n RFC 6733 says that the first AVP that exceeds the bound should be reported,\n but the suggestions in the errors field of a diameter_packet record counted\n AVPs from the rear of the message, not the front. Additionally, diameter 2.0\n in OTP 20.0 broke the counting by accepting one more AVP than the message\n grammar in question allowed.\n\n Own Id: OTP-14512\n\n- Match case insensitively in diameter_tcp/sctp accept tuple.\n\n Matching of remote addresses when accepting connections in a listening\n transport was case-sensitive, causing the semantics to change as a consequence\n of (kernel) OTP-13006.\n\n Own Id: OTP-14535 Aux Id: OTP-13006\n\n- Fix backwards incompatibility of remote send when sharing transports.\n\n The sending of requests over a transport connection on a remote node running\n an older version of diameter was broken by diameter 2.0 in OTP 20.0.\n\n Own Id: OTP-14552\n\n- Fix diameter_packet.avps decode of Grouped AVP errors in Failed-AVP.\n\n Decode didn't produce a list of diameter_avp records, so information about\n faulty component AVPs was lost.\n\n Own Id: OTP-14607","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Let unordered delivery be configured in diameter_sctp.\n\n With option \\{unordered, boolean() | pos_integer()\\}, with false the default,\n and N equivalent to OS =< N, where OS is the number of outbound streams\n negotiated on the association in question. If configured, unordered sending\n commences upon reception of a second message, outgoing messages being sent on\n stream 0 before this.\n\n The default false is for backwards compatibility, but false or 1 should be set\n to follow RFC 6733's recommendation on the use of unordered sending to avoid\n head-of-line blocking. There is typically no meaningful order to preserve,\n since the order in which outgoing messages are received by a transport process\n isn't known to the sender.\n\n Own Id: OTP-10889\n\n- Complete/simplify Standards Compliance in User's Guide.\n\n Own Id: OTP-10927\n\n- Add service option decode_format.\n\n To allow incoming messages to be decoded into maps or lists instead of\n records. Messages can be presented in any of the formats for encode.\n\n Decode performance has also been improved.\n\n Own Id: OTP-14511 Aux Id: OTP-14343\n\n- Add service option traffic_counters.\n\n To let message-related counters be disabled, which can be a performance\n improvement in some usecases.\n\n Own Id: OTP-14521\n\n- Allow loopback/any as local addresses in diameter_tcp/sctp.\n\n The atoms were implied by documentation, but not handled in code.\n\n Own Id: OTP-14544\n\n- Add transport option strict_capx.\n\n To allow the RFC 6733 requirement that a transport connection be closed if a\n message is received before capabilities exchange to be relaxed.\n\n Own Id: OTP-14546\n\n- Be consistent with service/transport configuration.\n\n For options for which it's meaningful, defaults values for transport options\n can now be configured on a service. This was previously the case only for an\n arbitrary subset of options.\n\n Own Id: OTP-14555\n\n- Add service/transport option avp_dictionaries.\n\n To provide better support for AVPs that are not defined in the application\n dictionary: configuring additional dictionaries in an avp_dictionaries tuple\n allows their AVPs to be encoded/decoded in much the same fashion as\n application AVPs.\n\n The motivation is RFC 7683 Diameter Overload, Indicator Conveyance (DOIC),\n that defines AVPs intended to be piggybacked onto arbitrary messages. A DOIC\n dictionary has been included in the installation, in module\n diameter_gen_doic_rfc7683.\n\n Own Id: OTP-14588\n\n- Decode application AVPs in answers setting the E-bit.\n\n AVPs defined in the application of the message being sent were previously not\n decoded, only those in the common application that defines the answer-message\n grammar.\n\n Own Id: OTP-14596","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 2.0 - Release Notes","doc":"","ref":"notes.html#diameter-2-0"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Let candidate peers be passed to diameter:call/4\n\n With call option peer, to allow a request to be sent to a peer that hasn't\n advertised support for the application in question.\n\n RFC 6733 2.4 requires a node to send the application identifiers of all\n locally supported applications at capabilities exchange, but not all nodes\n respect this for the common application, and diameter itself will send\n D\\[WP]\\[RA] without the common application having been explicitly advertised.\n Regarding the common application as implicit renders Result-Code 5010\n (DIAMETER_NO_COMMON_APPLICATION) meaningless however, so allow any request to\n be sent as long as there is a configured dictionary to support it.\n\n Own Id: OTP-14338\n\n- Improve performance of message encode/decode and related handling.\n\n Dictionaries using @custom_types or @codecs will need to adapt the\n corresponding functions to accept an additional argument that is now passed\n through encode/decode, which was required to remove various process\n dictionary-based workarounds that have been used to solve problems in the\n past.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14343\n\n- Add transport options to avoid deadlock and allow for load regulation.\n\n Both diameter_tcp and diameter_sctp now accept two new configuration options:\n sender and message_cb. The former causes outgoing sends to take place in a\n dedicated process, to avoid the possibility of deadlock when both the\n transport process and its peer block in send. The latter allows a callback to\n control the reading of messages on the socket, to allow for backpressure\n towards peers when the rate of incoming traffic is greater than can otherwise\n be handled.\n\n Neither of these options are yet documented, but are unlikely to change unless\n problems are discovered. The sender option is not the default since it should\n probably always be used in combination with message_cb, to prevent incoming\n requests from being read at a higher rate than a peer allows outgoing answers\n to be sent.\n\n Own Id: OTP-14455 Aux Id: ERL-332","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.12.2 - Release Notes","doc":"","ref":"notes.html#diameter-1-12-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- An improvement in the handling of peer failover in diameter 1.12.1 adversely\n affected performance when sending requests. Further, the inefficient use of a\n public table to route incoming answers has been removed.\n\n Own Id: OTP-14206\n\n- Fixed xml issues in old release notes\n\n Own Id: OTP-14269","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.12.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-12-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Close diameter_tcp/sctp listening sockets at diameter:stop_service/1.\n\n Broken by OTP-13611.\n\n Own Id: OTP-13787 Aux Id: OTP-13611\n\n- Update build scripts to not make assumptions about where env, cp and perl are\n located.\n\n Own Id: OTP-13800","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.12 - Release Notes","doc":"","ref":"notes.html#diameter-1-12"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Ensure listening socket is closed at transport removal.\n\n Transport removal did not immediately close a `diameter_tcp/sctp` listening\n socket, and a subsequent peer connection caused it to remain open.\n\n Own Id: OTP-13611","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Add `diameter:peer_info/1`.\n\n That retrieves information in the style of `diameter:service_info/2`, but for\n a single peer connection.\n\n Own Id: OTP-13508","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.11.2 - Release Notes","doc":"","ref":"notes.html#diameter-1-11-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Make peer handling more efficient.\n\n Inefficient lookup and manipulation of peer lists could result in poor\n performance when many outgoing requests were sent simultaneously, or when many\n peers connected simultaneously. Filtering peer lists on realm/host is now also\n more efficient in many cases.\n\n Own Id: OTP-13164\n\n- Fix handling of shared peer connections in watchdog state SUSPECT.\n\n A peer connection shared from a remote node was regarded as being up for the\n lifetime of the connection, ignoring watchdog transitions into state SUSPECT.\n\n Own Id: OTP-13342","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.11.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-11-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix request table leaks\n\n The End-to-End and Hop-by-Hop identifiers of outgoing Diameter requests are\n stored in a table in order for the caller to be located when the corresponding\n answer message is received. Entries were orphaned if the handler was\n terminated by an exit signal as a consequence of actions taken by callback\n functions, or if callbacks modified identifiers in retransmission cases.\n\n Own Id: OTP-13137","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.11 - Release Notes","doc":"","ref":"notes.html#diameter-1-11"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix relay encode of nested, Grouped AVPs.\n\n A fault in OTP-12475 caused encode to fail if the first AVP in a Grouped AVP\n was itself Grouped.\n\n Own Id: OTP-12879 Aux Id: OTP-12475\n\n- Match acceptable peer addresses case insensitively.\n\n Regular expressions passed in an 'accept' tuple to diameter_tcp or\n diameter_sctp inappropriately matched case.\n\n Own Id: OTP-12902\n\n- Fix diameter_watchdog function clause.\n\n OTP-12912 introduced an error with accepting transports setting\n `{restrict_connections, false}`, causing processes to fail when peer\n connections were terminated.\n\n Own Id: OTP-12969","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Don't report 5005 (DIAMETER_AVP_MISSING) errors unnecessarily.\n\n An AVP whose decode failed was reported as missing, despite having been\n reported with another error as a consequence of the failure.\n\n Own Id: OTP-12871\n\n- Improve decode performance.\n\n The time required to decode a message increased quadratically with the number\n of AVPs in the worst case, leading to extremely long execution times.\n\n Own Id: OTP-12891\n\n- Improve watchdog and statistics performance.\n\n Inefficient use of timers contributed to poor performance at high load, as did\n ordering of the table statistics are written to.\n\n Own Id: OTP-12912\n\n- Add service_opt() strict_mbit.\n\n There are differing opinions on whether or not reception of an arbitrary AVP\n setting the M-bit is an error. The default interpretation is strict: if a\n command grammar doesn't explicitly allow an AVP setting the M-bit then\n reception of such an AVP is regarded as an error. Setting\n `{strict_mbit, false}` disables this check.\n\n Own Id: OTP-12947","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.10 - Release Notes","doc":"","ref":"notes.html#diameter-1-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix decode of Grouped AVPs containing errors.\n\n RFC 6733 says this of Failed-AVP in 7.5:\n\n - \\_\\_\\_\\_ -\n `In the case where the offending AVP is embedded within a Grouped AVP, the Failed-AVP MAY contain the grouped AVP, which in turn contains the single offending AVP. The same method MAY be employed if the grouped AVP itself is embedded in yet another grouped AVP and so on. In this case, the Failed-AVP MAY contain the grouped AVP hierarchy up to the single offending AVP. This enables the recipient to detect the location of the offending AVP when embedded in a group.`\n\n It says this of DIAMETER_INVALID_AVP_LENGTH in 7.1.5:\n\n - \\_\\_\\_\\_ -\n `The request contained an AVP with an invalid length. A Diameter message indicating this error MUST include the offending AVPs within a Failed-AVP AVP. In cases where the erroneous AVP length value exceeds the message length or is less than the minimum AVP header length, it is sufficient to include the offending AVP header and a zero filled payload of the minimum required length for the payloads data type. If the AVP is a Grouped AVP, the Grouped AVP header with an empty payload would be sufficient to indicate the offending AVP. In the case where the offending AVP header cannot be fully decoded when the AVP length is less than the minimum AVP header length, it is sufficient to include an offending AVP header that is formulated by padding the incomplete AVP header with zero up to the minimum AVP header length.`\n\n The AVPs placed in the errors field of a diameter_packet record are intended\n to be appropriate for inclusion in a Failed-AVP, but neither of the above\n paragraphs has been followed in the Grouped case: the entire faulty AVP\n (non-faulty components and all) has been included. This made it difficult to\n identify the actual faulty AVP in all but simple cases.\n\n The decode is now adapted to the RFC, and implements the suggested single\n faulty AVP, nested in as many Grouped containers as required.\n\n Own Id: OTP-12721\n\n- Fix SCTP problems on Solaris.\n\n The allocation of association ids in Solaris was in conflict with an\n assumption made in diameter_sctp, resulting in failures when accepting\n multiple peer connections.\n\n Own Id: OTP-12768\n\n- Fix start order of alternate transports.\n\n A transport configured with diameter:add_transport/2 can be passed multiple\n transport_module/transport_config tuples in order to specify alternate\n configuration, modules being attempted in order until one succeeds. This is\n primarily for the connecting case; for example, to allow a transport to be\n configured to first attempt connection over SCTP, and then TCP in case SCTP\n fails. Multiple module tuples can be paired with a single config tuple, but in\n this case the start order was reversed relative to the order in which the\n modules were specified.\n\n Own Id: OTP-12851","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Change license text from Erlang Public License to Apache Public License v2.\n\n Own Id: OTP-12845","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.9.2 - Release Notes","doc":"","ref":"notes.html#diameter-1-9-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix broken relay counters.\n\n OTP-12654 in OTP 17.5.3 broke counters in the case of answer messages received\n in the relay application. Counters were accumulated as unknown messages or\n no_result_code instead of as relayed messages on the intended Result-Code and\n 'Experimental-Result' tuples.\n\n Own Id: OTP-12741\n\n- Fix diameter_sctp listener race.\n\n An oversight in OTP-12428 made it possible to start a transport process that\n could not establish associations.\n\n Own Id: OTP-12744","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.9.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-9-1"},{"type":"extras","title":"Known Bugs and Problems - Release Notes","doc":"- Don't leave extra bit in decoded AVP data.\n\n OTP-12074 in OTP 17.3 missed one case: a length error on a trailing AVP\n unknown to the dictionary in question.\n\n Own Id: OTP-12642\n\n- Don't confuse Result-Code and Experimental-Result.\n\n The errors field of a decoded diameter_packet record was populated with a\n Result-Code AVP when an Experimental-Result containing a 3xxx Result-Code was\n received in an answer not setting the E-bit. The correct AVP is now extracted\n from the incoming message.\n\n Own Id: OTP-12654\n\n- Don't count on unknown Application Id.\n\n OTP-11721 in OTP 17.1 missed the case of an Application Id not agreeing with\n that of the dictionary in question, causing counters to be accumulated on keys\n containing the unknown id.\n\n Own Id: OTP-12701","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"diameter 1.9 - Release Notes","doc":"","ref":"notes.html#diameter-1-9"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Don't discard outgoing answers unnecessarily.\n\n Answers missing a Result-Code AVP or setting an E-bit inappropriately were\n discarded even if encode was successful.\n\n Own Id: OTP-11492\n\n- Increase supervision timeouts.\n\n At diameter application shutdown, DPR could be omitted on open peer\n connections because of short supervision timeouts.\n\n Own Id: OTP-12412\n\n- Fix retransmission of messages sent as header/avps list.\n\n Extracting End-to-End and Hop-by-Hop Identifiers resulted in a function clause\n error, resulting in a handle_error callback.\n\n Own Id: OTP-12415\n\n- Fix diameter_avp decode of Grouped AVPs having decode errors.\n\n Components of such an AVP were not extracted, causing it to be represented by\n a single diameter_avp record instead of the intended list.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-12475\n\n- Fix ordering of AVPs in relayed messages.\n\n The order was reversed relative to the received order, with a Route-Record AVP\n prepended.\n\n Thanks to Andrzej Trawiński.\n\n Own Id: OTP-12551\n\n- Fix issues with DiameterURI encode/decode.\n\n RFC 6773 changed the default port and transport, but the RFC 3588 defaults\n were used even if the RFC 6733 common dictionary was in use. The RFC 3588\n defaults are now only used when the common dictionary is\n diameter_gen_base_rfc3588.\n\n Both RFC 3588 and 6733 disallow transport=udp;protocol=diameter. Encode of the\n combination now fails.\n\n Decode of ports numbers outside the range 0-65535 and fully qualified domain\n names longer than 255 octets now fails.\n\n Note that RFC 3588 is obsolete, and that there is a diameter_gen_base_rfc6733.\n The change in defaults is a potential interoperability problem when moving to\n RFC 6733 with peers that do not send all URI components. The fact that 6733\n allows 5xxx result codes in answer messages setting the E-bit, which RFC 3588\n doesn't, is another.\n\n Own Id: OTP-12589","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Add service_opt() string_decode.\n\n To disable the decode of potentially large binaries to string. This prevents\n large strings from being copied when incoming Diameter messages are passed\n between processes, a vulnerability that can lead to memory being exhausted\n given sufficiently malicious peers.\n\n The value is a boolean(), true being the default for backwards compatibility.\n Setting false causes both diameter_caps records and decoded messages to\n contain binary() in relevant places that previously had string():\n diameter_app(3) callbacks need to be prepared for the change.\n\n The Diameter types affected are OctetString and the derived types UTF8String,\n DiameterIdentity, DiameterURI, IPFilterRule, and QoSFilterRule. Time and\n Address are unaffected.\n\n Own Id: OTP-11952\n\n- Add transport_opt() pool_size.\n\n To allow for pools of accepting transport processes, which can better service\n multiple simultaneous peer connections. The option can also be used with\n connecting transports, to establish multiple connections to the same peer\n without having to configure multiple transports.\n\n Own Id: OTP-12428\n\n- Allow DPR to be sent with diameter:call/4.\n\n It has been possible to send, but the answer was regarded as unsolicited and\n discarded. DPA now causes the transport process in question to be terminated,\n as for DPR that diameter itself sends.\n\n Own Id: OTP-12542\n\n- Discard requests after DPR.\n\n RFC 6733 is imprecise, but the tone is that messages received after DPR are an\n exception to be dealt with only because of the possibility of unordered\n delivery over SCTP. As a consequence, and because a request following DPR is\n unlikely to be answered due to the impending loss of the peer connection,\n discard outgoing requests following an outgoing or incoming DPR. Incoming\n requests are also discarded, with the exception of DPR itself. Answers are\n sent and received as usual.\n\n Own Id: OTP-12543\n\n- Add transport_opt() dpr_timeout.\n\n To cause a peer connection to be closed following an outgoing DPA when the\n peer fails to do so. It is the recipient of DPA that should close the\n connection according to RFC 6733.\n\n Own Id: OTP-12609\n\n- Add service_opt() incoming_maxlen.\n\n To bound the expected size of incoming Diameter messages. Messages larger than\n the specified number of bytes are discarded, to prevent a malicious peer from\n generating excessive load.\n\n Own Id: OTP-12628","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.8 - Release Notes","doc":"","ref":"notes.html#diameter-1-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix remote diameter_request table leak.\n\n An outgoing request whose pick_peer callback selected a transport on another\n node resulted in an orphaned table entry on that node.\n\n Own Id: OTP-12196\n\n- Fix handling of 3xxx Result-Code without E-bit.\n\n OTP-12233 broke the population of the errors field of the diameter_packet\n record when an incoming request with an E-bit/Result-Code mismatch was\n detected, causing a 4-tuple to be inserted as Result-Code in a diameter_avp\n record.\n\n Own Id: OTP-12233\n\n- Fix ignored connect timer.\n\n There are two timers governing the establishment of peer connections:\n connect_timer and watchdog_timer. The former is the RFC 6733 Tc timer, and is\n used at initial connection establishment. The latter is RFC 3539 TwInit, and\n is used for connection reestablishment. A connecting transport erroneously\n used watchdog_timer in both cases.\n\n Own Id: OTP-12281 Aux Id: seq12728","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Order candidate peers in pick_peer callbacks.\n\n The order of candidate peers presented to a diameter_app(3) pick_peer callback\n has previously not been documented, but there are use cases that are\n simplified by an ordering. The order is now determined by the filter.\n\n Own Id: OTP-12308","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.7.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-7-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Don't leave extra bit in decoded AVP data.\n\n An extra bit could be communicated in the data field of a diameter_avp record\n in the case of length errors. Of no consequence for code using the record\n encoding of Diameter messages, but code examining diameter_avp records would\n see this bit.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-12074\n\n- Fix counting of outgoing requests and answers setting the E-bit.\n\n OTP-11721 broke these counters for all outgoing requests except DWR, and\n caused answers setting the E-bit to be counted as unknown messages.\n\n Own Id: OTP-12080\n\n- Fix Failed-AVP decode.\n\n The best-effort decode only worked for AVPs in the common dictionary, not for\n those in the dictionary of the application identified in the Diameter Header\n of the answer message in question.\n\n Failed-AVP in an answer decoded with the RFC 3588 common dictionary\n (diameter_gen_base_rfc3588) was regarded as an error. The RFC 6733 dictionary\n was unaffected.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-12094","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.7 - Release Notes","doc":"","ref":"notes.html#diameter-1-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Improve robustness.\n\n Counters returned by diameter:service_info/2 now only count messages known to\n the dictionary in question, so that an attacker cannot cause arbitrarily many\n counters to be created.\n\n Messages to the Erlang log have been minimized, and those related to traffic\n have been removed entirely since an attacker could cause a node to be logged\n to death. Consequently, the default answer_errors configuration has been\n changed from report to discard. A service needs to be restarted for the change\n in default to take effect.\n\n Own Id: OTP-11721\n\n- Fix request table leak.\n\n Outgoing Diameter requests are stored in a table until an answer is received\n or times out. Calling diameter:stop_service/1 before this took place would\n orphan the entries, resulting in a memory leak.\n\n Own Id: OTP-11893\n\n- Fix broken SCTP transport.\n\n OTP-11593 caused the sending of answer messages over SCTP to fail.\n\n Own Id: OTP-11901 Aux Id: OTP-11593\n\n- Fix watchdog process leak.\n\n A failed capabilities exchange on a listening transport would orphan a\n process, causing a memory leak.\n\n Own Id: OTP-11934\n\n- Fix incorrect handling of incoming DPR.\n\n In the case of a listening transport, a reconnection by a peer following DPR\n could transition the watchdog state to REOPEN instead of OKAY.\n\n Own Id: OTP-11938\n\n- Fix handling of AVP length errors on unknown AVPs.\n\n An AVP (Header) length that pointed past the end of the message was not\n flagged as a 5014 error in this case. Moreover, encoding such an AVP in the\n Failed-AVP of an answer message as a consequence of other errors (eg. M-bit,\n resulting in 5001) failed if the AVP contained a complete header.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-11946\n\n- Fix broken check in dictionary compilation.\n\n That an AVP specified in the content of a @codecs or @custom_types section was\n undefined went undetected, causing compilation to fail when attempting to\n lookup the AVP's type.\n\n Own Id: OTP-11958","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Add result code counters for CEA, DWA, and DPA.\n\n In addition to the existing result code counters on other answer messages.\n\n Own Id: OTP-11891\n\n- Add best-effort decode of AVPs within Failed-AVP.\n\n OTP-11007 disabled the decode of AVPs in Failed-AVP since errors could cause\n the decode of Failed-AVP itself to fail. Component AVPs are now decoded if\n possible, otherwise not. AVPs of type Grouped are decoded as much as possible,\n as deeply as possible.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-11936 Aux Id: OTP-11007\n\n- Add counters for encode errors in outgoing Diameter messages.\n\n In addition to the existing counters on decode errors. The latter now count\n independently of result codes in answer messages since decode errors do not\n preclude the presence of a result code.\n\n Own Id: OTP-11937","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.6 - Release Notes","doc":"","ref":"notes.html#diameter-1-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Add missing check at dictionary compilation.\n\n In particular, that an AVP defined as having type Grouped in an @avp_types\n section has a corresponding definition in a @grouped section.\n\n Own Id: OTP-11561\n\n- Correct documentation on the setting of Origin-State-Id\n\n It was incorrectly stated that the AVP would be set in an outgoing DPR/DPA.\n\n Own Id: OTP-11583\n\n- Change interface for communicating outbound stream id to diameter_sctp\n\n The module uses the transport_data field of record diameter_packet to\n communicate the stream on which the an incoming message is received and on\n which an outgoing message should be sent, the previous interface being that\n both are communicated as a tuple of the form \\{stream, Id\\}. However, since\n diameter retains the value of an incoming request's transport_data unless the\n corresponding answer message specifies otherwise, the behaviour in this case\n is to send an answer on the outbound stream with the same identifier as the\n that of the inbound stream on which the request was received. If the inbound\n stream id is greater than or equal to the number of outbound streams then this\n is guaranteed to fail, causing the transport process in question to terminate.\n There is no relationship between inbound and outbound stream identifiers so\n diameter_sctp's imposition of one is simply wrong.\n\n Outbound stream ids are now communicated with a different tuple: \\{outstream,\n Id\\}, interpreted modulo the number of outbound streams. Thus, retention of an\n inbound request's transport_data has no effect on the selection of an outbound\n stream.\n\n The change in interface is not strictly backwards compatible because of the\n new atom for the outbound stream. However, as there is currently no documented\n way of obtaining the available number of outbound streams for a peer\n connection, there is no way for a client to have known the range of ids from\n which it could reliably have chosen with the previous interface, so any\n setting of the outbound stream has probably been unintentional. Not explicitly\n specifying an outbound stream now results in a round-robin selection.\n\n Thanks to Sharmila Pillai for reporting the problem.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-11593\n\n- Fix unicode path failure in diameter_make:codec/2.\n\n A dictionary path containing a unicode codepoint > 255 caused the function to\n fail.\n\n Own Id: OTP-11655\n\n- Fix 'accept' config to diameter_sctp.\n\n OTP-10893 added support for \\{accept, Match\\} tuples to specify addresses or\n regexps that should be matched against peer addresses to decide whether or not\n a newly established association should be retained, but this hasn't been\n functional in the SCTP case because of missing support in inet(3).\n\n The display of both local and peer addresses in diameter:service_info/2 output\n has also been corrected.\n\n Own Id: OTP-11661 Aux Id: OTP-10229\n\n- Be lenient with the M-bit in Grouped AVPs.\n\n RFC 6733 says this, in 4.4:\n\n - \\_\\_\\_\\_ -\n `Receivers of a Grouped AVP that does not have the 'M' (mandatory) bit set and one or more of the encapsulated AVPs within the group has the 'M' (mandatory) bit set MAY simply be ignored if the Grouped AVP itself is unrecognized. The rule applies even if the encapsulated AVP with its 'M' (mandatory) bit set is further encapsulated within other sub-groups, i.e., other Grouped AVPs embedded within the Grouped AVP.`\n\n The first sentence is mangled but take it to mean this:\n\n - \\_\\_\\_\\_ -\n `An unrecognized AVP of type Grouped that does not set the 'M' bit MAY be ignored even if one of its encapsulated AVPs sets the 'M' bit.`\n\n This is a bit of a non-statement since if the AVP is unrecognized then its\n type is unknown. We therefore don't know that its data bytes contain\n encapsulated AVPs, so can't but ignore any of those that set the M-bit. Doing\n anything else when the type _is_ known would be inconsistent.\n\n OTP-11087 (R16B03) caused the M-bit on any unrecognized AVP to be regarded as\n an error, unrecognized being taken to mean \"not explicitly defined as a member\n of its container\". (That is, an AVP that can't be packed into a dedicated\n record field, which is slightly stronger than \"not defined\".) This fixed the\n original intention for top-level AVPs but broke the required leniency for\n Grouped AVPs whose type is known. This leniency is now restored.\n\n Note that dictionary files need to be recompiled for the change to have\n effect.\n\n Thanks to Rory McKeown for reporting the problem.\n\n Own Id: OTP-11675 Aux Id: OTP-11087\n\n- Fix pick_peer case clause failure.\n\n In the case of \\{call_mutates_state, true\\} configuration on the service in\n question, any peer selection that failed to select a peer resulted in a case\n clause failure. This was noticed in the case of a peer failover in which an\n alternate peer wasn't available.\n\n Own Id: OTP-11789","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.5 - Release Notes","doc":"","ref":"notes.html#diameter-1-5"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Rename reconnect_timer to connect_timer.\n\n The former is still accepted for backwards compatibility, but the name is\n misleading given the semantics of the timer.\n\n Own Id: OTP-11168\n\n- Extend diameter_make(3).\n\n Dictionaries can now be compiled from strings, not just filesystem paths, and\n results can be returned instead of written to the filesystem.\n\n Own Id: OTP-11348\n\n- Remove hardcoding of diameter_base as @prefix on dictionaries for application\n id 0.\n\n Own Id: OTP-11361","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.4.4 - Release Notes","doc":"","ref":"notes.html#diameter-1-4-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix setting of End-to-End and Hop-by-Hop Identifiers in outgoing DWA.\n\n Broken by OTP-11184, which caused the identifiers to be set anew, discarding\n the values from the incoming DWR.\n\n Own Id: OTP-11367\n\n- Fix handling of 5014, DIAMETER_INVALID_AVP_LENGTH.\n\n The error was detected as 5004, DIAMETER_INVALID_AVP_VALUE, for some Diameter\n types, in which case an AVP length that pointed past the end of a message\n resulted in encode failure.\n\n Own Id: OTP-11395","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.4.3 - Release Notes","doc":"","ref":"notes.html#diameter-1-4-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix UTF8String encode.\n\n Encode now accepts any nested list of codepoints and binaries. A list\n containing a binary was previously misinterpreted and the documentation was\n incomplete.\n\n Own Id: OTP-11172\n\n- Ensure DWR isn't sent immediately after DWA.\n\n This was possible if the timing was unfortunate. An incoming DWR now properly\n resets the watchdog timer.\n\n Own Id: OTP-11184\n\n- Fix faulty encode of Failed-AVP\n\n Reception of a CER, DWR or DPR that has decode failures caused encode of the\n corresponding answer message to fail.\n\n Own Id: OTP-11293\n\n- Fix broken service_opt() spawn_opt.\n\n The option was ignored.\n\n Own Id: OTP-11299","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.4.2 - Release Notes","doc":"","ref":"notes.html#diameter-1-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix handling of 5014 (INVALID_AVP_LENGTH) errors.\n\n This was in some cases reported as 3009 (INVALID_AVP_BITS).\n\n Note that the correction is partially implemented in modules generated by\n diameterc(1): a dictionary file must be recompiled for the correction to apply\n to any messages it defines.\n\n Own Id: OTP-11007\n\n- Fix faulty capitalization in release notes.\n\n Diameter = the protocol. \n diameter = the Erlang application.\n\n Own Id: OTP-11014\n\n- Fix watchdog memory leak.\n\n Entries were not removed from a service-specific ets table, causing them to be\n orphaned at connection reestablishment for listening transports, and\n diameter:remove_transport/2 for both listening and connecting transports.\n\n The fault was introduced by OTP-10692 in diameter-1.4.1 (R16B).\n\n Own Id: OTP-11019 Aux Id: OTP-10692\n\n- Fix decode failure on AVP Length < 8.\n\n The failure caused the message in question to be discarded.\n\n Own Id: OTP-11026\n\n- Respect Host-IP-Address configuration.\n\n Addresses returned from a transport module were always used to populate\n Host-IP-Address AVP's in an outgoing CER/CEA, which precluded the sending of a\n VIP address. Transport addresses are now only used if Host-IP-Address is\n unspecified.\n\n Own Id: OTP-11045\n\n- Fix mkdir race.\n\n Install could fail if examples/code and examples/dict were created in\n parallel. Noticed on FreeBSD.\n\n Own Id: OTP-11051\n\n- Fix recognition of 5001 on mandatory AVP's.\n\n An AVP setting the M-bit was not regarded as erroneous if it was defined in\n the dictionary in question and its container (message or Grouped AVP) had an\n 'AVP' field. It's now regarded as a 5001 error (AVP_UNSUPPORTED), as in the\n case that the AVP is not defined.\n\n Note that the correction is partially implemented in modules generated by\n diameterc(1): a dictionary file must be recompiled for the correction to apply\n to any messages it defines.\n\n Own Id: OTP-11087\n\n- Fix setting of Failed-AVP on handle_request \\{answer_message, 5xxx\\} return.\n\n Failed-AVP was never in the outgoing answer-message. It is now set with the\n AVP from the first entry with the specified Result-Code in the errors field of\n the incoming diameter_packet, if found.\n\n Own Id: OTP-11092\n\n- Fix watchdog function_clause\n\n A listening transport on a service that allowed multiple connections to the\n same peer could result in a function_clause error in module diameter_watchdog.\n The resulting crash was harmless but unseemly.\n\n Thanks to Aleksander Nycz.\n\n Own Id: OTP-11115\n\n- Fix population of Failed-AVP.\n\n In cases in which diameter populated this AVP, many values were sent instead\n of one as suggested by RFC 6733. This was partially corrected by OTP-11007.\n\n Own Id: OTP-11127 Aux Id: OTP-11007\n\n- Fix list-valued Vendor-Specific-Application-Id config\n\n R16B (specifically, OTP-10760) broke the handling of such configuration,\n resulting in a function clause error if the list was not of length 3, and\n faulty interpretation of the list's contents otherwise. Only record-valued\n configuration was properly interpreted.\n\n Own Id: OTP-11165","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Allow peer connections to be shared between Erlang nodes for the purpose of\n sending outgoing requests.\n\n A diameter_app(3) pick_peer/4 callback gets a list of remote candidates as\n argument, allowing a callback on one node to select a transport connection\n established on another node. The service_opt() share_peers controls the extent\n to which local connections are shared with remote nodes. The service_opt()\n use_shared_peers controls the extent to which connections shared from remote\n nodes are utilized on the local node.\n\n Own Id: OTP-9610\n\n- Allow listening diameter\\_\\{tcp,sctp\\} transports to be configured with remote\n addresses.\n\n Option 'accept' allows remote addresses to be configured as tuples or regular\n expressions. Remote addresses are matched against the configured values at\n connection establishment, any non-matching address causing the connection to\n be aborted.\n\n Own Id: OTP-10893\n\n- Detect more transport_opt() configuration errors at diameter:add_transport/2.\n\n Many errors would previously not be detected until transport start,\n diameter:add_transport/2 returning 'ok' but transport connections failing to\n be established. An error tuple is now returned.\n\n Own Id: OTP-10972\n\n- Make explicit local address configuration optional in diameter_tcp:start/3.\n\n The default address (as determined by gen_tcp) is now used when a local\n address is not explicitly configured.\n\n Own Id: OTP-10986\n\n- Improve handling of unrecognized service options.\n\n Such options were silently ignored by diameter:start_service/2. An error tuple\n is now returned.\n\n Own Id: OTP-11017\n\n- Don't send default Inband-Security-Id in CER/CEA.\n\n RFC 6733 recommends against the use of Inband-Security-Id. Only send a value\n that differs from the default, NO_INBAND_SECURITY = 0.\n\n Own Id: OTP-11050\n\n- Make spawn options for request processes configurable.\n\n Own Id: OTP-11060","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.4.1.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-4-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix broken Vendor-Specific-Application-Id configuration.\n\n RFC 6733 changed the definition of this Grouped AVP, changing the arity of\n Vendor-Id from 1\\* to 1. A component Vendor-Id can now be either list- or\n integer-valued in service and transport configuration, allowing it to be used\n with both RFC 3588 and RFC 6733 dictionaries.\n\n Own Id: OTP-10942","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Add transport_opt() watchdog_config to allow non-standard behaviour of the\n watchdog state machine.\n\n This can be useful during test but should not be used on nodes that must\n conform to RFC 3539.\n\n Own Id: OTP-10898","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.4.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix erroneous watchdog transition from DOWN to INITIAL.\n\n This transition took place when a peer connection was reestablished following\n a failed capabilities exchange. RFC 3539 requires DOWN to transition into\n REOPEN.\n\n Own Id: OTP-10692","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Add application_opt() request_errors to make the handling of incoming requests\n containing decode errors configurable.\n\n The value 'callback' ensures that a handle_request callback takes place for\n all such requests, the default being for diameter to answer 3xxx series errors\n itself.\n\n Own Id: OTP-10686\n\n- Add transport_opt() length_errors.\n\n The value determines how messages received over the transport interface with\n an incorrect Message Length are dealt with.\n\n Own Id: OTP-10687\n\n- Add commentary on RFC 6733 to Standards Compliance chapter of the User's\n Guide.\n\n Own Id: OTP-10688\n\n- Allow a 5xxx result code in an answer-message on peer connections using the\n RFC 6733 common dictionary.\n\n RFC 6733 allows this while RFC 3588 does not. A handle_request callback can\n return \\{answer_message, 3000..3999|5000..5999\\} in the simplest case.\n\n Own Id: OTP-10759\n\n- Add dictionaries for RFC 6733.\n\n Both the common and accounting dictionaries differ from their RFC 3588\n counterparts, which is reflected in generated record definitions. Application\n configuration on a service or transport determines the dictionary that will be\n used on a given peer connection.\n\n Own Id: OTP-10760\n\n- Allow a handle_request callback to control diameter's setting of Result-Code\n and Failed-AVP.\n\n Setting errors = false in a returned #diameter_packet\\{\\} disables the\n setting.\n\n Own Id: OTP-10761","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.4 - Release Notes","doc":"","ref":"notes.html#diameter-1-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Add registered server names to the app file.\n\n Own Id: OTP-10442\n\n- Fix #diameter_header\\{\\} handling broken by OTP-10445.\n\n The fault caused the the header of a \\[Header | Avps] request to be ignored if\n both end_to_end_id and hop_by_hop_id were undefined.\n\n Own Id: OTP-10609\n\n- Fix error handling for handle_request callback.\n\n A callback that returned a #diameter_packet\\{\\} would fail if the incoming\n request had decode errors.\n\n Own Id: OTP-10614\n\n- Fix timing of service start event.\n\n The event did not necessarily precede other events as documented.\n\n Own Id: OTP-10618\n\n- Fix setting of header T flag at peer failover.\n\n The flag is now set in the diameter_header record passed to a\n prepare_retransmit callback.\n\n Own Id: OTP-10619\n\n- Fix sending of CER/CEA timeout event at capx_timeout.\n\n The event was not sent as documented.\n\n Own Id: OTP-10628\n\n- Fix improper setting of Application-ID in the Diameter header of an answer\n message whose E flag is set.\n\n The value should be that of the request in question. The fault caused it\n always to be 0.\n\n Own Id: OTP-10655\n\n- Fix faulty handling of AVP length errors.\n\n An incorrect AVP length but no other errors caused an incoming request to\n fail.\n\n Own Id: OTP-10693","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.3.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-3-1"},{"type":"extras","title":"Known Bugs and Problems - Release Notes","doc":"- Fix function clause resulting from use of an eval callback.\n\n Own Id: OTP-10685","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"diameter 1.3 - Release Notes","doc":"","ref":"notes.html#diameter-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix faulty handling of Origin-State-Id and faulty config values.\n\n The former was expected in a list despite the documentation requiring\n (correctly) an integer. A bare value for a list-valued capability was not\n handled.\n\n Own Id: OTP-10440\n\n- Fix timing of up/down events.\n\n Previously, a call to diameter:call/4 following a peer_up callback might\n incorrectly return \\{error, no_connection\\}, depending on timing. Both events\n now follow the corresponding callbacks.\n\n Own Id: OTP-10459\n\n- Make diameter:service_info/2 usable in peer_up, peer_down and pick_peer\n callbacks.\n\n Except for in pick_peer when \\{call_mutates_state, false\\}, it would\n previously hang indefinitely.\n\n Own Id: OTP-10460\n\n- Verify that End-to-End and Hop-by-Hop Identifiers in an incoming CEA/DPA match\n those sent in the corresponding CER/DPR.\n\n The values were previously ignored. Answers whose identifiers do not match are\n handled as unexpected.\n\n Own Id: OTP-10565\n\n- Fix formatting problems in PDF documentation.\n\n In particular, text corresponding to links in HTML was omitted in preformatted\n blocks. There are still issues with indentation but this is not\n diameter-specific.\n\n Own Id: OTP-10583","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Let prepare_request, prepare_retransmit and handle_request callbacks return a\n function to be invoked on outgoing messages after encode.\n\n This allows encoded messages to be logged for example.\n\n Own Id: OTP-10441\n\n- Add service_opt() 'restrict_connections' to allow multiple transport\n connections with the same peer.\n\n Own Id: OTP-10443\n\n- Add service_opt() 'sequence' to allow the masking of a constant onto the\n topmost bits of End-to-End and Hop-by-Hop identifiers.\n\n This allows the same service on different nodes to use distinct values in\n outgoing request messages.\n\n Own Id: OTP-10445\n\n- Add diameter:service_info(PeerRef) to return the transport_ref() and\n transport_opt() list of the corresponding transport.\n\n This allows easy access to these from diameter_app callbacks that only get\n peer_ref() as an argument.\n\n Own Id: OTP-10470\n\n- Add reference pages diameter_codec(3) and diameter_make(3).\n\n Own Id: OTP-10471\n\n- Add events for service start and stop.\n\n Own Id: OTP-10492\n\n- Add transport_opt() 'disconnect_cb' to make the sending of DPR configurable.\n\n Whether or not DPR should be sent at application stop, service stop or\n transport removal is determined by the value returned by the callback, as is\n the Disconnect-Cause and timeout if DPA is not received.\n\n Own Id: OTP-10493\n\n- Add transport_opt() 'capx_timeout' for the timeout associated with\n non-reception of CER/CEA.\n\n Own Id: OTP-10554\n\n- Allow a handle_request callback to return a #diameter_packet\\{\\}.\n\n This allows an answer to set transport_data and header fields.\n\n Own Id: OTP-10566\n\n- Update documentation for RFC 6733.\n\n RFC 3588 is now obsolete.\n\n Own Id: OTP-10568","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.2 - Release Notes","doc":"","ref":"notes.html#diameter-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix broken Result-Code setting and Destination-Host/Realm extraction.\n\n Result-Code was assumed to have arity 1 when setting this value in an answer\n to a request containing AVP decode errors. Destination-Host/Realm were only\n correctly extracted from messages in the common application.\n\n Own Id: OTP-10202\n\n- Handle insufficient capabilities configuration more gracefully.\n\n A transport that does not have sufficient capabilities configuration in order\n to encode CER/CEA will now emit an error report noting the configuration error\n and exit instead of failing. The error is not detected at\n diameter:add_transport/2 since there is no requirement that a service be\n configured before its transports.\n\n Own Id: OTP-10203\n\n- Ensure a failing peer_up/down callback does not affect transport connections\n to other peers.\n\n Such a failure would previously have taken down all of a service's\n connections.\n\n Own Id: OTP-10215","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Statistics related to Diameter messages can be retrieved using\n diameter:service_info/2.\n\n Both Diameter and socket-level statistics are available, for both incoming and\n outgoing messages.\n\n Own Id: OTP-9608\n\n- Allow multiple transport_module/config to diameter:add_transport/2.\n\n Multiple values are attempted in sequence until one results in an established\n connection. This provides a way for a connecting transport to specify\n configuration in order of preference. (For example, SCTP before TCP.)\n\n Own Id: OTP-9885\n\n- Add events for state transitions in the RFC 3539 watchdog state machine.\n\n The watchdog state is also available through diameter:service_info/2.\n\n Own Id: OTP-10212\n\n- Add diameter:service_info(SvcName, connections).\n\n This provides an alternative to diameter:service_info(SvcName, transport) that\n presents information per established connection instead of per transport\n reference.\n\n Own Id: OTP-10213\n\n- Assorted documentation corrections/improvements.\n\n Own Id: OTP-10216","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 1.1 - Release Notes","doc":"","ref":"notes.html#diameter-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix fault in sending of 'closed' events.\n\n The fault made it possible for the 'closed' event not to be sent following a\n failed capabilities exchange.\n\n Own Id: OTP-9824\n\n- Fix faulty diameterc -name/-prefix.\n\n A minor blunder when introducing the new dictionary parser in diameter-1.0\n broke these options.\n\n Own Id: OTP-9826","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"diameter 1.0 - Release Notes","doc":"","ref":"notes.html#diameter-1-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Fix faulty cleanup after diameter:remove_transport/2.\n\n Removing a transport removed the configuration but did not prevent the\n transport process from being restarted.\n\n Own Id: OTP-9756","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- Add support for TLS over TCP.\n\n RFC 3588 requires that a Diameter server support TLS. In practice this seems\n to mean TLS over SCTP since there are limitations with running over SCTP: see\n RFC 6083 (DTLS over SCTP), which is a response to RFC 3436 (TLS over SCTP).\n The current RFC 3588 draft acknowledges this by equating TLS with TLS/TCP and\n DTLS/SCTP.\n\n TLS handshaking can take place either following a CER/CEA that negotiates TLS\n using the Inband-Security-Id AVP (the method documented in RFC 3588) or\n immediately following connection establishment (the method added to the\n current draft).\n\n Own Id: OTP-9605\n\n- Improvements to the dictionary parser.\n\n The dictionary parser now emits useful error messages in case of faults in the\n input file, also identifying the line number at which the fault was detected.\n There are semantic checks that were missing in the previous parser, a fault in\n the interpretation of vendor id's in combination with @inherits has been fixed\n and @end can be used to terminate parsing explicitly instead of always parsing\n to end of file.\n\n Own Id: OTP-9639\n\n- Improve dictionary reusability.\n\n Reusing a dictionary just to get a different generated module name or prefix\n previously required taking a copy of the source, which may consist of several\n files if inheritance is used, just to edit a couple of lines which don't\n affect the semantics of the Diameter application being defined. Options\n --name, --prefix and --inherits have been added to diameterc to allow\n corresponding values to be set at compile time.\n\n Own Id: OTP-9641\n\n- Add capabilities_cb transport option.\n\n Its value is a function that's applied to the transport reference and\n capabilities record after capabilities exchange. If a callback returns\n anything but 'ok' then the connection is closed. In the case of an incoming\n CER, the callback can return a result code with which to answer. Multiple\n callbacks can be specified and are applied until either all return 'ok' or one\n doesn't.\n\n This provides a way to reject a peer connection.\n\n Own Id: OTP-9654\n\n- Add @codecs to dictionary format.\n\n The semantics are similar to @custom_types but results in codec functions of\n the form TypeName(encode|decode, AvpName, Data) rather than\n AvpName(encode|decode, TypeName, Data). That is, the role of the AVP name and\n Diameter type name are reversed. This eliminates the need for exporting one\n function for each AVP sharing a common specialized encode/decode.\n\n Own Id: OTP-9708 Aux Id: OTP-9639\n\n- Add #diameter_callback\\{\\} for more flexible callback configuration.\n\n The record allows individual functions to be configured for each of the\n diameter_app(3) callbacks, as well as a default callback.\n\n Own Id: OTP-9777","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 0.10 - Release Notes","doc":"","ref":"notes.html#diameter-0-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Release Notes","doc":"- Handle #sctp_paddr_change and #sctp_pdapi_event from gen_sctp.\n\n The events are enabled by default but diameter_sctp neither disabled nor dealt\n with them. Reception of such an event caused a transport process to crash.\n\n Own Id: OTP-9538\n\n- Fix header folding bug.\n\n A prepare_request callback from diameter can return a diameter_header record\n in order to set values in the header of an outgoing request. A fault in\n diameter_lib:fold_tuple/3 caused the subsequent encode of the outgoing request\n to fail.\n\n Own Id: OTP-9577\n\n- Fix bugs in sending of answer-message replies.\n\n 3001 (DIAMETER_COMMAND_UNSUPPORTED) was not sent since the decode placed the\n AVP list in the wrong field of the diameter_packet, causing the subsequent\n encode to fail. Session-Id was also set improperly, causing encode to fail\n even in this case.\n\n Own Id: OTP-9578\n\n- Fix improper use of error_logger:info_report/2.\n\n Function doesn't take a format string and arguments as it was called. Instead\n use error_logger:info_report/1 and use the same report format as used for\n warning and error reports.\n\n Own Id: OTP-9579\n\n- Fix and clarify semantics of peer filters.\n\n An eval filter returning a non-true value caused the call process to fail and\n the doc was vague on how an exception was treated. Clarify that the non-tuple\n host/realm filters assume messages of a certain form.\n\n Own Id: OTP-9580\n\n- Fix and clarify relay behaviour.\n\n Implicit filtering of the sending peer in relaying a request could cause loop\n detection to be preempted in a manner not specified by RFC3588. Reply with\n 3002 (DIAMETER_UNABLE_TO_DELIVER) on anything but an answer to a relayed\n request.\n\n Own Id: OTP-9583","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Release Notes","doc":"- @id required in dictionary files only when @messages is specified.\n\n @id defines an application identifier and this is used only when sending or\n receiving messages. A dictionary can define only AVP's however, to be included\n by other dictionaries using @inherits, in which case it makes no sense to\n require @id.\n\n Note that message definitions are not inherited with @inherits, only AVP's\n\n Own Id: OTP-9467\n\n- Allow @enum when AVP is defined in an inherited dictionary.\n\n 3GPP standards (for one) extend the values allowed for RFC 3588 AVP's of type\n Enumerated. Previously, extending an AVP was only possible by completely\n redefining the AVP.\n\n Own Id: OTP-9469\n\n- Migrate testsuites to pure common test and add both suites and testcases.\n\n Own Id: OTP-9553\n\n- Requests of arbitrary form.\n\n diameter:call/4 can be passed anything, as long as the subsequent\n prepare_request callback returns a term that can be encoded.\n\n Own Id: OTP-9581","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"diameter 0.9 - Release Notes","doc":"Initial release of the diameter application.\n\nKnown issues or limitations:\n\n- Some agent-related functionality is not entirely complete. In particular,\n support for proxy agents, that advertise specific Diameter applications but\n otherwise relay messages in much the same way as relay agents (for which a\n handle_request callback can return a `relay` tuple), will be completed in an\n upcoming release. There may also be more explicit support for redirect agents,\n although redirect behaviour can be implemented with the current functionality.\n- There is some asymmetry in the treatment of messages sent as\n `diameter_header/avp` records and those sent in the \"normal\" fashion, and not\n all of this is documented. This is related to the previous point since this\n form of sending a message was introduced specifically to handle relay agent\n behaviour using the same callback interface as for client/server behaviour.\n- The User's Guide is currently quite thin. The introductory chapter followed by\n the examples (in the application `examples` subdirectory) may be sufficient\n for those having some familiarity with the Diameter protocol but the intention\n is to provide more introductory text. The reference documentation is quite\n complete, although some points could likely be expanded upon.\n- The function diameter:service_info/2 can be used to retrieve information about\n a started service (statistics, information about connected peers, etc) but\n this is not yet documented and both the input and output may change in the\n next release.\n\nSee [Standards Compliance](diameter_soc.md) for standards-related issues.","ref":"notes.html#diameter-0-9"},{"type":"extras","title":"Introduction","doc":"\n# Introduction\n\nThe diameter application is an implementation of the Diameter protocol as\ndefined by RFC 6733. It supports arbitrary Diameter applications by way of a\n_dictionary_ interface that allows messages and AVPs to be defined and input\ninto diameter as configuration. It has support for all roles defined in the RFC:\nclient, server and agent. This chapter provides a short overview of the\napplication.\n\nA Diameter node is implemented by configuring a _service_ and one or more\n_transports_ using the interface module `m:diameter`. The service configuration\ndefines the Diameter applications to be supported by the node and, typically,\nthe capabilities that it should send to remote peers at capabilities exchange\nupon the establishment of transport connections. A transport is configured on a\nservice and provides protocol-specific send/receive functionality by way of a\ntransport interface defined by diameter and implemented by a transport module.\nThe diameter application provides two transport modules: `m:diameter_tcp` and\n`m:diameter_sctp` for transport over TCP (using `m:gen_tcp`) and SCTP (using\n`m:gen_sctp`) respectively. Other transports can be provided by any module that\nimplements diameter's [transport interface](`m:diameter_transport`).\n\nWhile a service typically implements a single Diameter node (as identified by an\nOrigin-Host AVP), transports can themselves be associated with capabilities AVPs\nso that a single service can be used to implement more than one Diameter node.\n\nEach Diameter application defined on a service is configured with a callback\nmodule that implements the [application interface](`m:diameter_app`) through\nwhich diameter communicates the connectivity of remote peers, requests peer\nselection for outgoing requests, and communicates the reception of incoming\nDiameter request and answer messages. An application using diameter implements\nthese application callback modules to provide the functionality of the Diameter\nnode(s) it implements.\n\nEach Diameter application is also configured with a dictionary module that\nprovide encode/decode functionality for outgoing/incoming Diameter messages\nbelonging to the application. A dictionary module is generated from a\n[dictionary file](diameter_dict.md) using the [diameterc](diameterc_cmd.md)\nutility. Dictionaries for the RFC 6733 Diameter Common Messages, Base Accounting\nand Relay applications are provided with the diameter application.","ref":"diameter_intro.html"},{"type":"extras","title":"Usage","doc":"\n# Usage\n\nTo be written.","ref":"diameter_using.html"},{"type":"extras","title":"Examples","doc":"\n# Examples\n\nExample code can be found in the diameter application's `examples` subdirectory.","ref":"diameter_examples.html"},{"type":"extras","title":"Standards Compliance","doc":"\n# Standards Compliance\n\nThe table below summarizes the diameter application's compliance with RFC 6733.\nSince the diameter application isn't a Diameter node on its own, compliance is\nstrictly the responsibility of the user in many cases, diameter providing the\nmeans for the user to be compliant rather than being compliant on its own.\n\nThe Compliance column notes _C_ (Compliant) if the required functionality is\nimplemented, _PC_ (Partially Compliant) if there are limitations, _NC_ (Not\nCompliant) if functionality is not implemented, or a dash if text is\ninformational or only places requirements that must be met by the user's\nimplementation.\n\nCapitalized _Diameter_ refers to the protocol, lowercase _diameter_ to the\nErlang application.","ref":"diameter_soc.html"},{"type":"extras","title":"RFC 6733 - Diameter Base Protocol - Standards Compliance","doc":"| _Section_ | _Title_ | _Compliance_ | _Notes_ |\n| --------- | ----------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 1 | Introduction | — | |\n| 1\\.1 | Diameter Protocol | — | |\n| 1\\.1.1 | Description of the Document Set | — | |\n| 1\\.1.2 | Conventions Used in This Document | — | |\n| 1\\.1.3 | Changes from RFC 3588 | — | It is possible to configure a 3588 dictionary in order to get 3588 semantics, where the differ from 6733. |\n| 1\\.2 | Terminology | — | |\n| 1\\.3 | Approach to Extensibility | — | The dictionary interface documented in [diameter_dict(4)](diameter_dict.md) provides extensibility, allowing the user to defined new AVPs, commands, and applications. Ready dictionaries are provided for the RFC 6733 common message, base accounting, and relay applications, as well as for RFC 7683, Diameter Overload Indicator Conveyance. |\n| 1\\.3.1 | Defining New AVP Values | — | |\n| 1\\.3.2 | Creating New AVPs | — | New AVPs can be defined using the dictionary interface. Both RFC data formats and extensions are supported. |\n| 1\\.3.3 | Creating New Commands | — | New commands can be defined using the dictionary interface. |\n| 1\\.3.4 | Creating New Diameter Applications | — | New applications can be defined using the dictionary interface. |\n| 2 | Protocol Overview | — | Session state is the responsibility of the user.   The role of a Diameter node is determined by the user's implementation. |\n| 2\\.1 | Transport | PC | Ports are configured by the user: diameter places no restrictions.   The transport interface documented in `m:diameter_transport` allows the user to implement their own methods. Ready support is provided for TCP, TCP/TLS, and SCTP, but not DTLS/SCTP.   Multiple connections to the same peer is possible. ICMP messages are not interpreted. |\n| 2\\.1.1 | SCTP Guidelines | C | Unordered sending is configurable in `m:diameter_sctp`. There is no special handling of DPR/DPA: since a user that cares about pending answers should wait for them before initiating DPR.   A PPID can be configured with a a gen_sctp sctp_default_send_param option. |\n| 2\\.2 | Securing Diameter Messages | PC | DTLS is not supported by `m:diameter_sctp`. See also 2.1. |\n| 2\\.3 | Diameter Application Compliance | — | |\n| 2\\.4 | Application Identifiers | C | The user configures diameter with the identifiers to send at capabilities exchange, along with corresponding dictionaries defining the messages of the applications. |\n| 2\\.5 | Connections vs. Sessions | C | Connections are realized by configuring transport. Sessions are the responsibility of the user. |\n| 2\\.6 | Peer Table | PC | Routing is implemented by the user in callbacks documented in `m:diameter_app`. A peer table of the documented form is not exposed to the user. |\n| 2\\.7 | Routing Table | PC | See 2.6. A routing table of the documented form is not exposed to the user. |\n| 2\\.8 | Role of Diameter Agents | C | Most role-specific behaviour is implemented by the user. How a node advertises itself at capabilities exchange is determined by user configuration. |\n| 2\\.8.1 | Relay Agents | C | |\n| 2\\.8.2 | Proxy Agents | C | |\n| 2\\.8.3 | Redirect Agents | C | |\n| 2\\.8.4 | Translation Agents | C | |\n| 2\\.9 | Diameter Path Authorization | — | Authorization is the responsibility of the user. |\n| 3 | Diameter Header | C | Hop-by-Hop and End-to-End Identifiers are set by diameter when sending outgoing requests. |\n| 3\\.1 | Command Codes | C | |\n| 3\\.2 | Command Code Format Specification | C | Commands are defined as CCF specifications in dictionary files. |\n| 3\\.3 | Diameter Command Naming Conventions | — | |\n| 4 | Diameter AVPs | C | Any required padding is added by diameter when encoding outgoing messages. |\n| 4\\.1 | AVP Header | C | |\n| 4\\.1.1 | Optional Header Elements | C | |\n| 4\\.2 | Basic AVP Data Formats | C | |\n| 4\\.3 | Derived AVP Data Formats | C | Arbitrary derived data formats are supported by the dictionary interface. |\n| 4\\.3.1 | Common Derived AVP Data Formats | C | Beware that RFC 6733 changed the DiameterURI transport/port defaults specified in RFC3588. Relying on the defaults can result in interoperability problems. |\n| 4\\.4 | Grouped AVP Values | C | The M-bit on a component AVP of a Grouped AVP that does not set M is ignored: such AVPs are not regarded as erroneous at decode.   Grouped AVPs are defined as CCF specifications in dictionary files. |\n| 4\\.4.1 | Example AVP with a Grouped Data Type | — | |\n| 4\\.5 | Diameter Base Protocol AVPs | C | The base AVPs are defined in the common dictionary provided by diameter. There are common dictionaries for both RFC 3588 and RFC 6733 since the latter made changes to both syntax and semantics. |\n| 5 | Diameter Peers | — | |\n| 5\\.1 | Peer Connections | PC | A peer's DiameterIdentity is not required when initiating a connection: the identify is received at capabilities exchange, at which time the connection can be rejected if the identity is objectionable.   The number of connections established depends on the user's configuration. Multiple connections per peer is possible. |\n| 5\\.2 | Diameter Peer Discovery | NC | No form of peer discovery is implemented. The user can implement this independently of diameter if required. |\n| 5\\.3 | Capabilities Exchange | C | All supported applications are sent in CEA. The user can reject an incoming CER or CEA in a configured callback.   Both transport security at connection establishment and negotiated via an Inband-Security AVP are supported. |\n| 5\\.3.1 | Capabilities-Exchange-Request | C | CER is sent and received by diameter. |\n| 5\\.3.2 | Capabilities-Exchange-Answer | C | CEA is sent and received by diameter. |\n| 5\\.3.3 | Vendor-Id AVP | C | |\n| 5\\.3.4 | Firmware-Revision AVP | C | |\n| 5\\.3.5 | Host-IP-Address AVP | C | |\n| 5\\.3.6 | Supported-Vendor-Id AVP | C | |\n| 5\\.3.7 | Product-Name AVP | C | |\n| 5\\.4 | Disconnecting Peer Connections | C | DPA will not be answered with error: a peer that wants to a avoid a race can wait for pending answers before sending DPR. |\n| 5\\.4.1 | Disconnect-Peer-Request | C | DPR is sent by diameter in response to configuration changes requiring a connection to be broken. The user can also send DPR. |\n| 5\\.4.2 | Disconnect-Peer-Answer | C | DPR is answered by diameter. |\n| 5\\.4.3 | Disconnect-Cause AVP | C | |\n| 5\\.5 | Transport Failure Detection | — | |\n| 5\\.5.1 | Device-Watchdog-Request | C | DWR is sent and received by diameter. Callbacks notify the user of transitions into and out of the OKAY state. |\n| 5\\.5.2 | Device-Watchdog-Answer | C | DWA is sent and received by diameter. |\n| 5\\.5.3 | Transport Failure Algorithm | C | |\n| 5\\.5.4 | Failover and Failback Procedures | C | |\n| 5\\.6 | Peer State Machine | PC | The election process is modified as described in 5.6.4. |\n| 5\\.6.1 | Incoming Connections | C | |\n| 5\\.6.2 | Events | — | |\n| 5\\.6.3 | Actions | — | |\n| 5\\.6.4 | The Election Process | PC | As documented, the election assumes knowledge of a peer's DiameterIdentity when initiating a connection, which diameter doesn't require. Connections will be accepted if configuration allows multiple connections per peer to be established or there is no existing connection. Note that the election process is only applicable when multiple connections per peer is disallowed. |\n| 6 | Diameter Message Processing | — | |\n| 6\\.1 | Diameter Request Routing Overview | — | Routing is performed by the user. A callback from diameter provides a list of available suitable peer connections. |\n| 6\\.1.1 | Originating a Request | C | Requests are constructed by the user; diameter sets header fields as defined in the relevant dictionary. |\n| 6\\.1.2 | Sending a Request | C | |\n| 6\\.1.3 | Receiving Requests | C | Loops are detected by diameter when the return value of a request callback asks that a request be forwarded. Loop detection in other cases is the responsibility of the user. |\n| 6\\.1.4 | Processing Local Requests | C | The user decides whether or not to process a request locally in the request callback from diameter. |\n| 6\\.1.5 | Request Forwarding | PC | See 2.6. |\n| 6\\.1.6 | Request Routing | PC | See 2.7. |\n| 6\\.1.7 | Predictive Loop Avoidance | C | See 6.1.3. |\n| 6\\.1.8 | Redirecting Requests | PC | See 2.6. |\n| 6\\.1.9 | Relaying and Proxying Requests | C | A Route-Record AVP is appended by diameter when the return value of a request callback asks that a request be forwarded. Appending the AVP in other cases is the responsibility of the user. |\n| 6\\.2 | Diameter Answer Processing | C | Answer message are constructed by the user, except in the case of some protocol errors, in which case the procedures are followed. |\n| 6\\.2.1 | Processing Received Answers | C | Answers with an unknown Hop-by-Hop Identifier are discarded. |\n| 6\\.2.2 | Relaying and Proxying Answers | — | Modifying answers is the responsibility of the user in callbacks from diameter. |\n| 6\\.3 | Origin-Host AVP | C | The order of AVPs in an encoded message is determined by the CCF of the message in question.   AVPs defined in the RFC are defined in dictionaries provided by diameter. Their proper use in application messages is the responsibility of the user. |\n| 6\\.4 | Origin-Realm AVP | C | |\n| 6\\.5 | Destination-Host AVP | C | |\n| 6\\.6 | Destination-Realm AVP | C | |\n| 6\\.7 | Routing AVPs | — | |\n| 6\\.7.1 | Route-Record AVP | C | |\n| 6\\.7.2 | Proxy-Info AVP | C | |\n| 6\\.7.3 | Proxy-Host AVP | C | |\n| 6\\.7.4 | Proxy-State AVP | C | |\n| 6\\.8 | Auth-Application-Id AVP | C | |\n| 6\\.9 | Acct-Application-Id AVP | C | |\n| 6\\.10 | Inband-Security-Id AVP | C | See 2.1. |\n| 6\\.11 | Vendor-Specific-Application-Id AVP | C | Note that the CCF of this AVP is not the same as in RFC 3588. |\n| 6\\.12 | Redirect-Host AVP | C | |\n| 6\\.13 | Redirect-Host-Usage AVP | C | |\n| 6\\.14 | Redirect-Max-Cache-Time AVP | C | |\n| 7 | Error Handling | C | Answers are formulated by the user in most cases. Answers setting the E-bit can be sent by diameter itself in response to a request that cannot be handled by the user. |\n| 7\\.1 | Result-Code AVP | C | |\n| 7\\.1.1 | Informational | C | |\n| 7\\.1.2 | Success | C | |\n| 7\\.1.3 | Protocol Errors | C | Result codes 3001, 3002, 3005, and 3007 can be sent in answers formulated by diameter, if configured to do so. |\n| 7\\.1.4 | Transient Failures | C | Result code 4003 is sent in CEA if there is an existing connection to the peer in question and configuration does not allow more than one. |\n| 7\\.1.5 | Permanent Failures | C | Message reception detects 5001, 5004, 5005, 5008, 5009, 5010, 5011, 5014, 5015, and 5017 errors. It ignores 5013 errors at the admonition of sections 3 and 4.1.   Note that RFC 3588 did not allow 5xxx result codes in answers setting the E-bit, while RFC 6733 does. This is a potential interoperability problem since the Diameter protocol version has not changed. |\n| 7\\.2 | Error Bit | C | |\n| 7\\.3 | Error-Message AVP | C | The user can include this AVP as required. |\n| 7\\.4 | Error-Reporting-Host AVP | C | The user can include this AVP as required. |\n| 7\\.5 | Failed-AVP AVP | C | The user constructs application-specific messages, but diameter provides failed AVPs in message callbacks. Failed component AVPs are grouped within the relevant Grouped AVPs. |\n| 7\\.6 | Experimental-Result AVP | C | |\n| 7\\.7 | Experimental-Result-Code AVP | C | |\n| 8 | Diameter User Sessions | — | Authorization and accounting AVPs are defined in provided dictionaries. Their proper use is the responsibility of the user. |\n| 8\\.1 | Authorization Session State Machine | — | Authorization is the responsibility of the user: diameter does not implement this state machine. |\n| 8\\.2 | Accounting Session State Machine | — | Accounting is the responsibility of the user: diameter does not implement this state machine. |\n| 8\\.3 | Server-Initiated Re-Auth | — | |\n| 8\\.3.1 | Re-Auth-Request | C | |\n| 8\\.3.2 | Re-Auth-Answer | C | |\n| 8\\.4 | Session Termination | — | Session-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 8\\.4.1 | Session-Termination-Request | C | |\n| 8\\.4.2 | Session-Termination-Answer | C | |\n| 8\\.5 | Aborting a Session | — | Session-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 8\\.5.1 | Abort-Session-Request | C | |\n| 8\\.5.2 | Abort-Session-Answer | C | |\n| 8\\.6 | Inferring Session Termination from Origin-State-Id | — | Session-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 8\\.7 | Auth-Request-Type AVP | C | |\n| 8\\.8 | Session-Id AVP | C | |\n| 8\\.9 | Authorization-Lifetime AVP | C | |\n| 8\\.10 | Auth-Grace-Period AVP | C | |\n| 8\\.11 | Auth-Session-State AVP | C | |\n| 8\\.12 | Re-Auth-Request-Type AVP | C | |\n| 8\\.13 | Session-Timeout AVP | C | |\n| 8\\.14 | User-Name AVP | C | |\n| 8\\.15 | Termination-Cause AVP | C | |\n| 8\\.16 | Origin-State-Id AVP | C | |\n| 8\\.17 | Session-Binding AVP | C | |\n| 8\\.18 | Session-Server-Failover AVP | C | |\n| 8\\.19 | Multi-Round-Time-Out AVP | C | |\n| 8\\.20 | Class AVP | C | |\n| 8\\.21 | Event-Timestamp AVP | C | |\n| 9 | Accounting | — | Accounting-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 9\\.1 | Server Directed Model | — | |\n| 9\\.2 | Protocol Messages | — | |\n| 9\\.3 | Accounting Application Extension and Requirements | — | |\n| 9\\.4 | Fault Resilience | — | |\n| 9\\.5 | Accounting Records | — | |\n| 9\\.6 | Correlation of Accounting Records | — | |\n| 9\\.7 | Accounting Command Codes | — | |\n| 9\\.7.1 | Accounting-Request | C | |\n| 9\\.7.2 | Accounting-Answer | C | |\n| 9\\.8 | Accounting AVPs | — | |\n| 9\\.8.1 | Accounting-Record-Type AVP | C | |\n| 9\\.8.2 | Acct-Interim-Interval AVP | C | |\n| 9\\.8.3 | Accounting-Record-Number AVP | C | |\n| 9\\.8.4 | Acct-Session-Id AVP | C | |\n| 9\\.8.5 | Acct-Multi-Session-Id AVP | C | |\n| 9\\.8.6 | Accounting-Sub-Session-Id AVP | C | |\n| 9\\.8.7 | Accounting-Realtime-Required AVP | C | |\n| 10 | AVP Occurrence Tables | — | |\n| 10\\.1 | Base Protocol Command AVP Table | — | |\n| 10\\.2 | Accounting AVP Table | — | |\n| 11 | IANA Considerations | — | |\n| 11\\.1 | AVP Header | — | |\n| 11\\.1.1 | AVP Codes | — | |\n| 11\\.1.2 | AVP Flags | — | |\n| 11\\.2 | Diameter Header | — | |\n| 11\\.2.1 | Command Codes | — | |\n| 11\\.2.2 | Command Flags | | |\n| 11\\.3 | AVP Values | — | |\n| 11\\.3.1 | Experimental-Result-Code AVP | — | |\n| 11\\.3.2 | Result-Code AVP Values | — | |\n| 11\\.3.3 | Accounting-Record-Type AVP Values | — | |\n| 11\\.3.4 | Termination-Cause AVP Values | — | |\n| 11\\.3.5 | Redirect-Host-Usage AVP Values | — | |\n| 11\\.3.6 | Session-Server-Failover AVP Values | — | |\n| 11\\.3.7 | Session-Binding AVP Values | — | |\n| 11\\.3.8 | Disconnect-Cause AVP Values | — | |\n| 11\\.3.9 | Auth-Request-Type AVP Values | — | |\n| 11\\.3.10 | Auth-Session-State AVP Values | — | |\n| 11\\.3.11 | Re-Auth-Request-Type AVP Values | — | |\n| 11\\.3.12 | Accounting-Realtime-Required AVP Values | — | |\n| 11\\.3.13 | Inband-Security-Id AVP (code 299) | — | |\n| 11\\.4 | \\_diameters Service Name and Port Number Registration | — | |\n| 11\\.5 | SCTP Payload Protocol Identifiers | — | |\n| 11\\.6 | S-NAPTR Parameters | — | |\n| 12 | Diameter Protocol-Related Configurable Parameters | — | |\n| 13 | Security Considerations | PC | See 2.1.   IPsec is transparent to diameter. |\n| 13\\.1 | TLS/TCP and DTLS/SCTP Usage | PC | See 2.1. |\n| 13\\.2 | Peer-to-Peer Considerations | — | |\n| 13\\.3 | AVP Considerations | — | |\n| 14 | References | — | |\n| 14\\.1 | Normative References | — | |\n| 14\\.2 | Informative References | — | |\n\n_Table: RFC 6733 Compliance_","ref":"diameter_soc.html#rfc-6733-diameter-base-protocol"},{"type":"extras","title":"diameterc","doc":"\n# diameterc\n\nCompile a diameter dictionary to Erlang source.","ref":"diameterc_cmd.html"},{"type":"extras","title":"Synopsis - diameterc","doc":"```\ndiameterc [ ] \n```","ref":"diameterc_cmd.html#synopsis"},{"type":"extras","title":"Description - diameterc","doc":"The diameterc utility is used to compile a diameter\n[dictionary file](diameter_dict.md) into Erlang source. The resulting source\nimplements the interface diameter required to encode and decode the dictionary's\nmessages and AVPs.\n\nThe module `m:diameter_make` provides an alternate compilation interface.\n\n# USAGE\n\nCompile a single dictionary file to Erlang\nsource. Valid options are as follows.\n\n- **\\-i ** - Prepend the specified directory to the code path. Use to\n point at beam files compiled from inherited dictionaries,\n `[@inherits](diameter_dict.md#inherits)` in a dictionary file creating a\n beam dependency, not an erl/hrl dependency.\n\n Multiple `-i` options can be specified.\n\n- **\\-o ** - Write generated source to the specified directory. Defaults\n to the current working directory.\n\n- **\\-E** - Suppress `.erl` file generation.\n\n- **\\-H** - Suppress `.hrl` file generation.\n\n- **\\--name ** - Name the output module.\n\n- **\\--prefix ** - Transform the input dictionary before compilation,\n setting `[@name](diameter_dict.md#name)` or\n `[@prefix](diameter_dict.md#prefix)` to the specified string.\n\n- **\\--inherits ** - Transform the input dictionary before compilation,\n appending `[@inherits](diameter_dict.md#inherits)` of the specified string.\n\n Two forms of `--inherits` have special meaning:\n\n ```text\n --inherits -\n --inherits Prev/Mod\n ```\n\n The first has the effect of clearing any previous inherits, the second of\n replacing a previous inherits of `Prev` to one of `Mod`. This allows the\n semantics of the input dictionary to be changed without modifying the file\n itself.\n\n Multiple `--inherits` options can be specified.\n\n# EXIT STATUS\n\nReturns 0 on success, non-zero on failure.\n\n# SEE ALSO\n\n`m:diameter_make`, [diameter_dict(4)](diameter_dict.md)","ref":"diameterc_cmd.html#description"},{"type":"extras","title":"diameter_dict","doc":"\n# diameter_dict\n\nDictionary interface of the diameter application.","ref":"diameter_dict.html"},{"type":"extras","title":"Description - diameter_dict","doc":"A diameter service, as configured with `diameter:start_service/2`, specifies one\nor more supported Diameter applications. Each Diameter application specifies a\ndictionary module that knows how to encode and decode its messages and AVPs. The\ndictionary module is in turn generated from a file that defines these messages\nand AVPs. The format of such a file is defined in\n[FILE FORMAT](diameter_dict.md#FILE_FORMAT) below. Users add support for their\nspecific applications by creating dictionary files, compiling them to Erlang\nmodules using either [diameterc(1)](diameterc_cmd.md) or `m:diameter_make` and\nconfiguring the resulting dictionaries modules on a service.\n\nDictionary module generation also results in a hrl file that defines records for\nthe messages and Grouped AVPs defined by the dictionary, these records being\nwhat a user of the diameter application sends and receives, modulo other\npossible formats as discussed in `m:diameter_app`. These records and the\nunderlying Erlang data types corresponding to Diameter data formats are\ndiscussed in [MESSAGE RECORDS](diameter_dict.md#MESSAGE_RECORDS) and\n[DATA TYPES](diameter_dict.md#DATA_TYPES) respectively. The generated hrl also\ncontains macro definitions for the possible values of AVPs of type Enumerated.\n\nThe diameter application includes five dictionary modules corresponding to\napplications defined in section 2.4 of RFC 6733: `diameter_gen_base_rfc3588` and\n`diameter_gen_base_rfc6733` for the Diameter Common Messages application with\napplication identifier 0, `diameter_gen_accounting` (for RFC 3588) and\n`diameter_gen_acct_rfc6733` for the Diameter Base Accounting application with\napplication identifier 3 and `diameter_gen_relay` the Relay application with\napplication identifier 0xFFFFFFFF.\n\nThe Common Message and Relay applications are the only applications that\ndiameter itself has any specific knowledge of. The Common Message application is\nused for messages that diameter itself handles: CER/CEA, DWR/DWA and DPR/DPA.\nThe Relay application is given special treatment with regard to encode/decode\nsince the messages and AVPs it handles are not specifically defined.\n\n[](){: #FILE_FORMAT }","ref":"diameter_dict.html#description"},{"type":"extras","title":"FILE FORMAT - diameter_dict","doc":"A dictionary file consists of distinct sections. Each section starts with a tag\nfollowed by zero or more arguments and ends at the the start of the next section\nor end of file. Tags consist of an ampersand character followed by a keyword and\nare separated from their arguments by whitespace. Whitespace separates\nindividual tokens but is otherwise insignificant.\n\nThe tags, their arguments and the contents of each corresponding section are as\nfollows. Each section can occur multiple times unless otherwise specified. The\norder in which sections are specified is unimportant.\n\n- **`@id Number`{: #id }** - Defines the integer Number as the Diameter\n Application Id of the application in question. Can occur at most once and is\n required if the dictionary defines `@messages`. The section has empty content.\n\n The Application Id is set in the Diameter Header of outgoing messages of the\n application, and the value in the header of an incoming message is used to\n identify the relevant dictionary module.\n\n Example:\n\n ```text\n @id 16777231\n ```\n\n- **`@name Mod`{: #name }** - Defines the name of the generated dictionary\n module. Can occur at most once and defaults to the name of the dictionary file\n minus any extension. The section has empty content.\n\n Note that a dictionary module should have a unique name so as not collide with\n existing modules in the system.\n\n Example:\n\n ```text\n @name etsi_e2\n ```\n\n- **`@prefix Name`{: #prefix }** - Defines Name as the prefix to be added to\n record and constant names (followed by a `'_'` character) in the generated\n dictionary module and hrl. Can occur at most once. The section has empty\n content.\n\n A prefix is optional but can be be used to disambiguate between record and\n constant names resulting from similarly named messages and AVPs in different\n Diameter applications.\n\n Example:\n\n ```text\n @prefix etsi_e2\n ```\n\n- **`@vendor Number Name`{: #vendor }** - Defines the integer Number as the the\n default Vendor-Id of AVPs for which the V flag is set. Name documents the\n owner of the application but is otherwise unused. Can occur at most once and\n is required if an AVP sets the V flag and is not otherwise assigned a\n Vendor-Id. The section has empty content.\n\n Example:\n\n ```text\n @vendor 13019 ETSI\n ```\n\n- **`@avp_vendor_id Number`{: #avp_vendor_id }** - Defines the integer Number as\n the Vendor-Id of the AVPs listed in the section content, overriding the\n `@vendor` default. The section content consists of AVP names.\n\n Example:\n\n ```text\n @avp_vendor_id 2937\n\n WWW-Auth\n Domain-Index\n Region-Set\n ```\n\n- **`@inherits Mod`{: #inherits }** - Defines the name of a dictionary module\n containing AVP definitions that should be imported into the current\n dictionary. The section content consists of the names of those AVPs whose\n definitions should be imported from the dictionary, an empty list causing all\n to be imported. Any listed AVPs must not be defined in the current dictionary\n and it is an error to inherit the same AVP from more than one dictionary.\n\n Note that an inherited AVP that sets the V flag takes its Vendor-Id from\n either `@avp_vendor_id` in the inheriting dictionary or `@vendor` in the\n inherited dictionary. In particular, `@avp_vendor_id` in the inherited\n dictionary is ignored. Inheriting from a dictionary that specifies the\n required `@vendor` is equivalent to using `@avp_vendor_id` with a copy of the\n dictionary's definitions but the former makes for easier reuse.\n\n All dictionaries should typically inherit RFC 6733 AVPs from\n `diameter_gen_base_rfc6733`.\n\n Example:\n\n ```text\n @inherits diameter_gen_base_rfc6733\n ```\n\n- **`@avp_types`{: #avp_types }** - Defines the name, code, type and flags of\n individual AVPs. The section consists of definitions of the form\n\n `Name Code Type Flags`\n\n where Code is the integer AVP code, Type identifies an AVP Data Format as\n defined in section [DATA TYPES](diameter_dict.md#DATA_TYPES) below, and Flags\n is a string of V, M and P characters indicating the flags to be set on an\n outgoing AVP or a single `'-'` (minus) character if none are to be set.\n\n Example:\n\n ```text\n @avp_types\n\n Location-Information 350 Grouped MV\n Requested-Information 353 Enumerated V\n ```\n\n > #### Warning {: .warning }\n >\n > The P flag has been deprecated by RFC 6733.\n\n- **`@custom_types Mod`{: #custom_types }** - Specifies AVPs for which module\n Mod provides encode/decode functions. The section contents consists of AVP\n names. For each such name, `Mod:Name(encode|decode, Type, Data, Opts)` is\n expected to provide encode/decode for values of the AVP, where Name is the\n name of the AVP, Type is it's type as declared in the `@avp_types` section of\n the dictionary, Data is the value to encode/decode, and Opts is a term that is\n passed through encode/decode.\n\n Example:\n\n ```text\n @custom_types rfc4005_avps\n\n Framed-IP-Address\n ```\n\n- **`@codecs Mod`{: #codecs }** - Like `@custom_types` but requires the\n specified module to export `Mod:Type(encode|decode, Name, Data, Opts)` rather\n than `Mod:Name(encode|decode, Type, Data, Opts)`.\n\n Example:\n\n ```text\n @codecs rfc4005_avps\n\n Framed-IP-Address\n ```\n\n- **`@messages`{: #messages }** - Defines the messages of the application. The\n section content consists of definitions of the form specified in section 3.2\n of RFC 6733, \"Command Code Format Specification\".\n\n ```text\n @messages\n\n RTR ::= \n \n { Auth-Application-Id }\n { Auth-Session-State }\n { Origin-Host }\n { Origin-Realm }\n { Destination-Host }\n { SIP-Deregistration-Reason }\n [ Destination-Realm ]\n [ User-Name ]\n * [ SIP-AOR ]\n * [ Proxy-Info ]\n * [ Route-Record ]\n * [ AVP ]\n\n RTA ::= \n \n { Auth-Application-Id }\n { Result-Code }\n { Auth-Session-State }\n { Origin-Host }\n { Origin-Realm }\n [ Authorization-Lifetime ]\n [ Auth-Grace-Period ]\n [ Redirect-Host ]\n [ Redirect-Host-Usage ]\n [ Redirect-Max-Cache-Time ]\n * [ Proxy-Info ]\n * [ Route-Record ]\n * [ AVP ]\n ```\n\n- **`@grouped`** - Defines the contents of the AVPs of the\n application having type Grouped. The section content consists of definitions\n of the form specified in section 4.4 of RFC 6733, \"Grouped AVP Values\".\n\n Example:\n\n ```text\n @grouped\n\n SIP-Deregistration-Reason ::= \n { SIP-Reason-Code }\n [ SIP-Reason-Info ]\n * [ AVP ]\n ```\n\n Specifying a Vendor-Id in the definition of a grouped AVP is equivalent to\n specifying it with `@avp_vendor_id`.\n\n- **`@enum Name`{: #enum }** - Defines values of AVP Name having type\n Enumerated. Section content consists of names and corresponding integer\n values. Integer values can be prefixed with 0x to be interpreted as\n hexadecimal.\n\n Note that the AVP in question can be defined in an inherited dictionary in\n order to introduce additional values to an enumeration otherwise defined in\n another dictionary.\n\n Example:\n\n ```text\n @enum SIP-Reason-Code\n\n PERMANENT_TERMINATION 0\n NEW_SIP_SERVER_ASSIGNED 1\n SIP_SERVER_CHANGE 2\n REMOVE_SIP_SERVER 3\n ```\n\n- **`@end`{: #end }** - Causes parsing of the dictionary to terminate: any\n remaining content is ignored.\n\nComments can be included in a dictionary file using semicolon: characters from a\nsemicolon to end of line are ignored.\n\n[](){: #MESSAGE_RECORDS }","ref":"diameter_dict.html#file-format"},{"type":"extras","title":"MESSAGE RECORDS - diameter_dict","doc":"The hrl generated from a dictionary specification defines records for the\nmessages and grouped AVPs defined in `@messages` and `@grouped` sections. For\neach message or grouped AVP definition, a record is defined whose name is the\nmessage or AVP name, prefixed with any dictionary prefix defined with `@prefix`,\nand whose fields are the names of the AVPs contained in the message or grouped\nAVP in the order specified in the definition in question. For example, the\ngrouped AVP\n\n```text\nSIP-Deregistration-Reason ::= \n { SIP-Reason-Code }\n [ SIP-Reason-Info ]\n * [ AVP ]\n```\n\nwill result in the following record definition given an empty prefix.\n\n```text\n-record('SIP-Deregistration-Reason', {'SIP-Reason-Code',\n 'SIP-Reason-Info',\n 'AVP'}).\n```\n\nThe values encoded in the fields of generated records depends on the type and\nnumber of times the AVP can occur. In particular, an AVP which is specified as\noccurring exactly once is encoded as a value of the AVP's type while an AVP with\nany other specification is encoded as a list of values of the AVP's type. The\nAVP's type is as specified in the AVP definition, the RFC 6733 types being\ndescribed below.\n\n[](){: #DATA_TYPES }","ref":"diameter_dict.html#message-records"},{"type":"extras","title":"DATA TYPES - diameter_dict","doc":"The data formats defined in sections 4.2 (\"Basic AVP Data Formats\") and 4.3\n(\"Derived AVP Data Formats\") of RFC 6733 are encoded as values of the types\ndefined here. Values are passed to `diameter:call/4` in a request record when\nsending a request, returned in a resulting answer record and passed to a\n[handle_request/3](`c:diameter_app:handle_request/3`) callback upon reception of\nan incoming request.\n\nIn cases in which there is a choice between string() and binary() types for\nOctetString() and derived types, the representation is determined by the value\nof [diameter:service_opt()](`m:diameter#service_opt`)\n[string_decode](`m:diameter#string_decode`).\n\n_Basic AVP Data Formats_\n\n```erlang\nOctetString() = string() | binary()\nInteger32() = -2147483647..2147483647\nInteger64() = -9223372036854775807..9223372036854775807\nUnsigned32() = 0..4294967295\nUnsigned64() = 0..18446744073709551615\nFloat32() = '-infinity' | float() | infinity\nFloat64() = '-infinity' | float() | infinity\nGrouped() = record()\n```\n\nOn encode, an OctetString() can be specified as an iolist(), excessively large\nfloats (in absolute value) are equivalent to `infinity` or `'-infinity'` and\nexcessively large integers result in encode failure. The records for grouped\nAVPs are as discussed in the previous section.\n\n_Derived AVP Data Formats_\n\n[](){: #Address }\n\n```text\nAddress() = OctetString()\n | tuple()\n```\n\nOn encode, an OctetString() IPv4 address is parsed in the usual x.x.x.x format\nwhile an IPv6 address is parsed in any of the formats specified by section 2.2\nof RFC 2373, \"Text Representation of Addresses\". An IPv4 tuple() has length 4\nand contains values of type 0..255. An IPv6 tuple() has length 8 and contains\nvalues of type 0..65535. The tuple representation is used on decode.\n\n[](){: #Time }\n\n```erlang\nTime() = {date(), time()}\n\nwhere\n\n date() = {Year, Month, Day}\n time() = {Hour, Minute, Second}\n\n Year = integer()\n Month = 1..12\n Day = 1..31\n Hour = 0..23\n Minute = 0..59\n Second = 0..59\n```\n\nAdditionally, values that can be encoded are limited by way of their encoding as\nfour octets as required by RFC 6733 with the required extension from RFC 2030.\nIn particular, only values between `{{1968,1,20},{3,14,8}}` and\n`{{2104,2,26},{9,42,23}}` (both inclusive) can be encoded.\n\n[](){: #UTF8String }\n\n```text\nUTF8String() = [integer()] | binary()\n```\n\nList elements are the UTF-8 encodings of the individual characters in the\nstring. Invalid codepoints will result in encode/decode failure. On encode, a\nUTF8String() can be specified as a binary, or as a nested list of binaries and\ncodepoints.\n\n[](){: #DiameterIdentity }\n\n```text\nDiameterIdentity() = OctetString()\n```\n\nA value must have length at least 1.\n\n[](){: #DiameterURI }\n\n```text\nDiameterURI() = OctetString()\n | #diameter_URI{type = Type,\n fqdn = FQDN,\n port = Port,\n transport = Transport,\n protocol = Protocol}\n\nwhere\n\n Type = aaa | aaas\n FQDN = OctetString()\n Port = integer()\n Transport = sctp | tcp\n Protocol = diameter | radius | 'tacacs+'\n```\n\nOn encode, fields port, transport and protocol default to 3868, sctp and\ndiameter respectively. The grammar of an OctetString-valued DiameterURI() is as\nspecified in section 4.3 of RFC 6733. The record representation is used on\ndecode.\n\n[](){: #Enumerated }\n\n```text\nEnumerated() = Integer32()\n```\n\nOn encode, values can be specified using the macros defined in a dictionary's\nhrl file.\n\n[](){: #IPFilterRule } [](){: #QoSFilterRule }\n\n```erlang\nIPFilterRule() = OctetString()\nQoSFilterRule() = OctetString()\n```\n\nValues of these types are not currently parsed by diameter.","ref":"diameter_dict.html#data-types"},{"type":"extras","title":"SEE ALSO - diameter_dict","doc":"[diameterc(1)](diameterc_cmd.md), `m:diameter`, `m:diameter_app`,\n`m:diameter_codec`, `m:diameter_make`","ref":"diameter_dict.html#see-also"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/dist/search_data-FE8C9D8B.js b/prs/9277/lib/diameter-2.4.1/doc/html/dist/search_data-FE8C9D8B.js new file mode 100644 index 0000000000000..8cc2c4a6f86aa --- /dev/null +++ b/prs/9277/lib/diameter-2.4.1/doc/html/dist/search_data-FE8C9D8B.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","doc":"Main API of the diameter application.\n\nThis module provides the interface with which a user can implement a Diameter\nnode that sends and receives messages using the Diameter protocol as defined in\nRFC 6733.\n\nBasic usage consists of creating a representation of a locally implemented\nDiameter node and its capabilities with `start_service/2`, adding transport\ncapability using `add_transport/2` and sending Diameter requests and receiving\nDiameter answers with `call/4`. Incoming Diameter requests are communicated as\ncallbacks to a `m:diameter_app` callback modules as specified in the service\nconfiguration.\n\nBeware the difference between _diameter_ (not capitalized) and _Diameter_\n(capitalized). The former refers to the Erlang application named diameter whose\nmain api is defined here, the latter to Diameter protocol in the sense of\nRFC 6733.\n\nThe diameter application must be started before calling most functions in this\nmodule.","title":"diameter","ref":"diameter.html"},{"type":"module","doc":"- **`Address()`**\n\n- **`DiameterIdentity()`**\n\n- **`Grouped()`**\n\n- **`OctetString()`**\n\n- **`Time()`**\n\n- **`Unsigned32()`**\n\n- **`UTF8String()`** - Types corresponding to RFC 6733 AVP Data Formats. Defined\n in [diameter_dict(4)](diameter_dict.md#DATA_TYPES).\n\n- **`elapsed_time()`** - Elapsed time since a given time.\n\n [](){: #application_alias }\n\n- **`application_alias() = term()`** - Name identifying a Diameter application\n in service configuration. Passed to `call/4` when sending requests defined by\n the application.\n\n [](){: #application_module }\n\n- **`application_module() = Mod | [Mod | ExtraArgs] | #diameter_callback{}`**\n\n ```text\n Mod = atom()\n ExtraArgs = list()\n ```\n\n Module implementing the callback interface defined in `m:diameter_app`, along\n with any extra arguments to be appended to those documented. Note that extra\n arguments specific to an outgoing request can be specified to `call/4`, in\n which case those are appended to any module-specific extra arguments.\n\n Specifying a `#diameter_callback{}` record allows individual functions to be\n configured in place of the usual `m:diameter_app` callbacks. See\n `diameter_callback.erl` for details.\n\n [](){: #application_opt }\n\n- **`application_opt()`** - Options defining a Diameter application. Has one of\n the following types.\n\n - **`{alias, `[`application_alias()`](`m:diameter#application_alias`)`}`** -\n Unique identifier for the application in the scope of the service. Defaults\n to the value of the `dictionary` option.\n\n - **`{dictionary, atom()}`** - Name of an encode/decode module for the\n Diameter messages defined by the application. These modules are generated\n from files whose format is documented in\n [diameter_dict(4)](diameter_dict.md).\n\n - **`{module, `[`application_module()`](`m:diameter#application_module`)`}`** -\n Callback module in which messages of the Diameter application are handled.\n See `m:diameter_app` for the required interface and semantics.\n\n - **`{state, term()}`** - Initial callback state. The prevailing state is\n passed to some `m:diameter_app` callbacks, which can then return a new\n state. Defaults to the value of the `alias` option.\n\n - **`{call_mutates_state, true|false}`** - Whether or not the\n [pick_peer/4](`c:diameter_app:pick_peer/4`) application callback can modify\n the application state. Defaults to `false`.\n\n > #### Warning {: .warning }\n >\n > [pick_peer/4](`c:diameter_app:pick_peer/4`) callbacks are serialized when\n > this option is `true`, which is a potential performance bottleneck. A\n > simple Diameter client may suffer no ill effects from using mutable state\n > but a server or agent that responds to incoming request should probably\n > avoid it.\n\n - **`{answer_errors, callback|report|discard}`** - Manner in which incoming\n answer messages containing decode errors are handled.\n\n If `callback` then errors result in a\n [handle_answer/4](`c:diameter_app:handle_answer/4`) callback in the same\n fashion as for [handle_request/3](`c:diameter_app:handle_request/3`), with\n errors communicated in the `errors` field of the `#diameter_packet{}` passed\n to the callback. If `report` then an answer containing errors is discarded\n without a callback and a warning report is written to the log. If `discard`\n then an answer containing errors is silently discarded without a callback.\n In both the `report` and `discard` cases the return value for the `call/4`\n invocation in question is as if a callback had taken place and returned\n `{error, failure}`.\n\n Defaults to `discard`.\n\n - **`{request_errors, answer_3xxx|answer|callback}`** - Manner in which\n incoming requests are handled when an error other than 3007\n (DIAMETER_APPLICATION_UNSUPPORTED, which cannot be associated with an\n application callback module), is detected.\n\n If `answer_3xxx` then requests are answered without a\n [handle_request/3](`c:diameter_app:handle_request/3`) callback taking place.\n If `answer` then even 5xxx errors are answered without a callback unless the\n connection in question has configured the RFC 3588 common dictionary as\n noted below. If `callback` then a\n [handle_request/3](`c:diameter_app:handle_request/3`) callback always takes\n place and its return value determines the answer sent to the peer, if any.\n\n Defaults to `answer_3xxx`.\n\n > #### Note {: .info }\n >\n > Answers sent by diameter set the E-bit in the Diameter Header. Since RFC\n > 3588 allows only 3xxx result codes in an `answer-message`, `answer` has\n > the same semantics as `answer_3xxx` when the transport in question has\n > been configured with `diameter_gen_base_rfc3588` as its common dictionary.\n > Since RFC 6733 allows both 3xxx and 5xxx result codes in an\n > `answer-message`, a transport with `diameter_gen_base_rfc6733` as its\n > common dictionary does distinguish between `answer_3xxx` and `answer`.\n\n [](){: #call_opt }\n\n- **`call_opt()`** - Options available to `call/4` when sending an outgoing\n Diameter request. Has one of the following types.\n\n - **`{extra, list()}`** - Extra arguments to append to callbacks to the\n callback module in question. These are appended to any extra arguments\n configured on the callback itself. Multiple options append to the argument\n list.\n\n - **`{filter, `[`peer_filter()`](`m:diameter#peer_filter`)`}`** - Filter to\n apply to the list of available peers before passing it to the\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callback for the application in\n question. Multiple options are equivalent a single `all` filter on the\n corresponding list of filters. Defaults to `none`.\n\n - **`{peer, `[`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`)`}`** -\n Peer to which the request in question can be sent, preempting the selection\n of peers having advertised support for the Diameter application in question.\n Multiple options can be specified, and their order is respected in the\n candidate lists passed to a subsequent\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callback.\n\n - **`{timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`** - Number of\n milliseconds after which the request should timeout. Defaults to 5000.\n\n - **`detach`** - Cause `call/4` to return `ok` as soon as the request in\n question has been encoded, instead of waiting for and returning the result\n from a subsequent [handle_answer/4](`c:diameter_app:handle_answer/4`) or\n [handle_error/4](`c:diameter_app:handle_error/4`) callback.\n\n An invalid option will cause `call/4` to fail.\n\n [](){: #capability }\n\n- **`capability()`** - AVP values sent in outgoing CER or CEA messages during\n capabilities exchange. Can be configured both on a service and a transport,\n values on the latter taking precedence. Has one of the following types.\n\n - **`{'Origin-Host', `[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Origin-Realm', `[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Host-IP-Address', [`[`Address()`](diameter_dict.md#DATA_TYPES)`]}`** -\n An address list is available to the start function of a\n [transport module](`m:diameter_transport`), which can return a new list for\n use in the subsequent CER or CEA. Host-IP-Address need not be specified if\n the transport module in question communicates an address list as described\n in `m:diameter_transport`\n\n - **`{'Vendor-Id', `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Product-Name', `[`UTF8String()`](diameter_dict.md#DATA_TYPES)`}`**\n\n - **`{'Origin-State-Id', `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`** -\n Origin-State-Id is optional but, if configured, will be included in outgoing\n CER/CEA and DWR/DWA messages. Setting a value of `0` (zero) is equivalent to\n not setting a value, as documented in RFC 6733. The function\n `origin_state_id/0` can be used as to retrieve a value that is computed when\n the diameter application is started.\n\n - **`{'Supported-Vendor-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Auth-Application-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Inband-Security-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`** -\n Inband-Security-Id defaults to the empty list, which is equivalent to a list\n containing only 0 (NO_INBAND_SECURITY). If 1 (TLS) is specified then TLS is\n selected if the CER/CEA received from the peer offers it.\n\n - **`{'Acct-Application-Id', [`[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Vendor-Specific-Application-Id', [`[`Grouped()`](diameter_dict.md#DATA_TYPES)`]}`**\n\n - **`{'Firmware-Revision', `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`**\n\n Note that each tuple communicates one or more AVP values. It is an error to\n specify duplicate tuples.\n\n [](){: #eval }\n\n- **`eval() = {M,F,A} | fun() | [eval() | A]`** - An expression that can be\n evaluated as a function in the following sense.\n\n ```erlang\n eval([{M,F,A} | T]) ->\n apply(M, F, T ++ A);\n eval([[F|A] | T]) ->\n eval([F | T ++ A]);\n eval([F|A]) ->\n apply(F, A);\n eval(F) ->\n eval([F]).\n ```\n\n Applying an [`eval()`](`m:diameter#eval`) `E` to an argument list `A` is meant\n in the sense of `eval([E|A])`.\n\n > #### Warning {: .warning }\n >\n > Beware of using fun expressions of the form `fun Name/Arity` in situations\n > in which the fun is not short-lived and code is to be upgraded at runtime\n > since any processes retaining such a fun will have a reference to old code.\n > In particular, such a value is typically inappropriate in configuration\n > passed to `start_service/2` or `add_transport/2`.\n\n [](){: #peer_filter }\n\n- **`peer_filter() = term()`** - Filter passed to `call/4` in order to select\n candidate peers for a [pick_peer/4](`c:diameter_app:pick_peer/4`) callback.\n Has one of the following types.\n\n - **`none`** - Matches any peer. This is a convenience that provides a filter\n equivalent to no filter.\n\n - **`host`** - Matches only those peers whose Origin-Host has the same value\n as Destination-Host in the outgoing request in question, or any peer if the\n request does not contain a Destination-Host AVP.\n\n - **`realm`** - Matches only those peers whose Origin-Realm has the same value\n as Destination-Realm in the outgoing request in question, or any peer if the\n request does not contain a Destination-Realm AVP.\n\n - **`{host, any|`[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`** -\n Matches only those peers whose Origin-Host has the specified value, or all\n peers if the atom `any`.\n\n - **`{realm, any|`[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`** -\n Matches only those peers whose Origin-Realm has the specified value, or all\n peers if the atom `any`.\n\n - **`{eval, `[`eval()`](`m:diameter#eval`)`}`** - Matches only those peers for\n which the specified [`eval()`](`m:diameter#eval`) returns `true` when\n applied to the connection's `diameter_caps` record. Any other return value\n or exception is equivalent to `false`.\n\n - **`{neg, `[`peer_filter()`](`m:diameter#peer_filter`)`}`** - Matches only\n those peers not matched by the specified filter.\n\n - **`{all, [`[`peer_filter()`](`m:diameter#peer_filter`)`]}`** - Matches only\n those peers matched by each filter in the specified list.\n\n - **`{any, [`[`peer_filter()`](`m:diameter#peer_filter`)`]}`** - Matches only\n those peers matched by at least one filter in the specified list. The\n resulting list will be in match order, peers matching the first filter of\n the list sorting before those matched by the second, and so on.\n\n - **`{first, [`[`peer_filter()`](`m:diameter#peer_filter`)`]}`** - Like `any`,\n but stops at the first filter for which there are matches, which can be much\n more efficient when there are many peers. For example, the following filter\n causes only peers best matching both the host and realm filters to be\n presented.\n\n ```text\n {first, [{all, [host, realm]}, realm]}\n ```\n\n An invalid filter is equivalent to `{any,[]}`, a filter that matches no peer.\n\n > #### Note {: .info }\n >\n > The `host` and `realm` filters cause the Destination-Host and\n > Destination-Realm AVPs to be extracted from the outgoing request, assuming\n > it to be a record- or list-valued\n > [`diameter_codec:message()`](`m:diameter_codec#message`), and assuming at\n > most one of each AVP. If this is not the case then the\n > `{host|realm, `[`DiameterIdentity()`](diameter_dict.md#DATA_TYPES)`}`\n > filters must be used to achieve the desired result. An empty\n > [`DiameterIdentity()`](diameter_dict.md#DATA_TYPES) (which should not be\n > typical) matches all hosts/realms for the purposes of filtering.\n\n > #### Warning {: .warning }\n >\n > A `host` filter is not typically desirable when setting Destination-Host\n > since it will remove peer agents from the candidates list.\n\n [](){: #service_event }\n\n- **`service_event() = #diameter_event{service = `[`service_name()`](`m:diameter#service_name`)`, info = `[`service_event_info()`](`m:diameter#service_event_info`)`}`** -\n An event message sent to processes that have subscribed to these using\n `subscribe/1`.\n\n [](){: #service_event_info }\n\n- **`service_event_info() = term()`** - The `info` field of a\n [service_event()](`m:diameter#service_event`) record. Can have one of the\n following types.\n\n - **`start`**\n\n - **`stop`** - The service is being started or stopped. No event precedes a\n `start` event. No event follows a `stop` event, and this event implies the\n termination of all transport processes.\n\n - **`{up, Ref, Peer, Config, Pkt}`**\n\n - **`{up, Ref, Peer, Config}`**\n\n - **`{down, Ref, Peer, Config}`**\n\n ```c\n Ref = transport_ref()\n Peer = diameter_app:peer()\n Config = {connect|listen, [transport_opt()]}\n Pkt = #diameter_packet{}\n ```\n\n The RFC 3539 watchdog state machine has transitioned into (`up`) or out of\n (`down`) the OKAY state. If a `#diameter_packet{}` is present in an `up`\n event then there has been a capabilities exchange on a newly established\n transport connection and the record contains the received CER or CEA.\n\n Note that a single `up` or `down` event for a given peer corresponds to\n multiple [peer_up/3](`c:diameter_app:peer_up/3`) or\n [peer_down/3](`c:diameter_app:peer_down/3`) callbacks, one for each of the\n Diameter applications negotiated during capabilities exchange. That is, the\n event communicates connectivity with the peer as a whole while the callbacks\n communicate connectivity with respect to individual Diameter applications.\n\n - **`{reconnect, Ref, Opts}`**\n\n ```text\n Ref = transport_ref()\n Opts = [transport_opt()]\n ```\n\n A connecting transport is attempting to establish/reestablish a transport\n connection with a peer following [connect_timer](`m:diameter#connect_timer`)\n or [watchdog_timer](`m:diameter#watchdog_timer`) expiry.\n\n - **`{closed, Ref, Reason, Config}`**\n\n ```text\n Ref = transport_ref()\n Config = {connect|listen, [transport_opt()]}\n ```\n\n Capabilities exchange has failed. `Reason` can have one of the following\n types.\n\n - **`{'CER', Result, Caps, Pkt}`**\n\n ```text\n Result = ResultCode | {capabilities_cb, CB, ResultCode|discard}\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ResultCode = integer()\n CB = eval()\n ```\n\n An incoming CER has been answered with the indicated result code, or\n discarded. `Caps` contains pairs of values, for the local node and remote\n peer respectively. `Pkt` contains the CER in question. In the case of\n rejection by a capabilities callback, the tuple contains the rejecting\n callback.\n\n - **`{'CER', Caps, {ResultCode, Pkt}}`**\n\n ```text\n ResultCode = integer()\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ```\n\n An incoming CER contained errors and has been answered with the indicated\n result code. `Caps` contains values for the local node only. `Pkt`\n contains the CER in question.\n\n - **`{'CER', timeout}`** - An expected CER was not received within\n [capx_timeout](`m:diameter#capx_timeout`) of connection establishment.\n\n - **`{'CEA', Result, Caps, Pkt}`**\n\n ```erlang\n Result = ResultCode | atom() | {capabilities_cb, CB, ResultCode|discard}\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ResultCode = integer()\n ```\n\n An incoming CEA has been rejected for the indicated reason. An\n integer-valued `Result` indicates the result code sent by the peer. `Caps`\n contains pairs of values for the local node and remote peer. `Pkt`\n contains the CEA in question. In the case of rejection by a capabilities\n callback, the tuple contains the rejecting callback.\n\n - **`{'CEA', Caps, Pkt}`**\n\n ```text\n Caps = #diameter_caps{}\n Pkt = #diameter_packet{}\n ```\n\n An incoming CEA contained errors and has been rejected. `Caps` contains\n only values for the local node. `Pkt` contains the CEA in question.\n\n - **`{'CEA', timeout}`** - An expected CEA was not received within\n [capx_timeout](`m:diameter#capx_timeout`) of connection establishment.\n\n - **`{watchdog, Ref, PeerRef, {From, To}, Config}`**\n\n ```c\n Ref = transport_ref()\n PeerRef = diameter_app:peer_ref()\n From, To = initial | okay | suspect | down | reopen\n Config = {connect|listen, [transport_opt()]}\n ```\n\n An RFC 3539 watchdog state machine has changed state.\n\n - **`t:any/0`** - For forward compatibility, a subscriber should be prepared\n to receive info fields of forms other than the above.\n\n [](){: #service_name }\n\n- **`service_name() = term()`** - Name of a service as passed to\n `start_service/2` and with which the service is identified. There can be at\n most one service with a given name on a given node. Note that\n `erlang:make_ref/0` can be used to generate a service name that is somewhat\n unique.\n\n [](){: #service_opt }\n\n- **`service_opt()`** - Option passed to `start_service/2`. Can be any\n [`capability()`](`m:diameter#capability`) as well as the following.\n\n - **`{application, [`[`application_opt()`](`m:diameter#application_opt`)`]}`** -\n A Diameter application supported by the service.\n\n A service must configure one tuple for each Diameter application it intends\n to support. For an outgoing request, the relevant\n [`application_alias()`](`m:diameter#application_alias`) is passed to\n `call/4`, while for an incoming request the application identifier in the\n message header determines the application, the identifier being specified in\n the application's [dictionary](diameter_dict.md) file.\n\n > #### Warning {: .warning }\n >\n > The capabilities advertised by a node must match its configured\n > applications. In particular, `application` configuration must be matched\n > by corresponding [capability()](`m:diameter#capability`) configuration, of\n > \\*-Application-Id AVPs in particular.\n\n - **`{decode_format, record | list | map | none}`{: #decode_format }** - The\n format of decoded messages and grouped AVPs in the `msg` field of\n diameter_packet records and `value` field of diameter_avp records\n respectively. If `record` then a record whose definition is generated from\n the dictionary file in question. If `list` or `map` then a `[Name | Avps]`\n pair where `Avps` is a list of AVP name/values pairs or a map keyed on AVP\n names respectively. If `none` then the atom-value message name, or\n `undefined` for a Grouped AVP. See also\n [diameter_codec:message()](`m:diameter_codec#message`).\n\n Defaults to `record`.\n\n > #### Note {: .info }\n >\n > AVPs are decoded into a list of diameter_avp records in `avps` field of\n > diameter_packet records independently of `decode_format`.\n\n - **`{restrict_connections, false | node | nodes | [node()] | eval()}`** - The\n degree to which the service allows multiple transport connections to the\n same peer, as identified by its Origin-Host at capabilities exchange.\n\n If `[node()]` then a connection is rejected if another already exists on any\n of the specified nodes. Types `false`, `node`, `nodes` and\n [eval()](`m:diameter#eval`) are equivalent to `[]`, `[node()]`,\n `[node()|nodes()]` and the evaluated value respectively, evaluation of each\n expression taking place whenever a new connection is to be established. Note\n that `false` allows an unlimited number of connections to be established\n with the same peer.\n\n Multiple connections are independent and governed by their own peer and\n watchdog state machines.\n\n Defaults to `nodes`.\n\n - **`{sequence, {H,N} | `[`eval()`](`m:diameter#eval`)`}`** - A constant value\n `H` for the topmost `32-N` bits of of 32-bit End-to-End and Hop-by-Hop\n Identifiers generated by the service, either explicitly or as a return value\n of a function to be evaluated at `start_service/2`. In particular, an\n identifier `Id` is mapped to a new identifier as follows.\n\n ```text\n (H bsl N) bor (Id band ((1 bsl N) - 1))\n ```\n\n Note that RFC 6733 requires that End-to-End Identifiers remain unique for a\n period of at least 4 minutes and that this and the call rate places a lower\n bound on appropriate values of `N`: at a rate of `R` requests per second, an\n `N`\\-bit counter traverses all of its values in `(1 bsl N) div (R*60)`\n minutes, so the bound is `4*R*60 =< 1 bsl N`.\n\n `N` must lie in the range `0..32` and `H` must be a non-negative integer\n less than `1 bsl (32-N)`.\n\n Defaults to `{0,32}`.\n\n > #### Warning {: .warning }\n >\n > Multiple Erlang nodes implementing the same Diameter node should be\n > configured with different sequence masks to ensure that each node uses a\n > unique range of End-to-End and Hop-by-Hop Identifiers for outgoing\n > requests.\n\n - **`{share_peers, boolean() | [node()] | eval()}`** - Nodes to which peer\n connections established on the local Erlang node are communicated. Shared\n peers become available in the remote candidates list passed to\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callbacks on remote nodes whose\n services are configured to use them: see `use_shared_peers` below.\n\n If `false` then peers are not shared. If `[node()]` then peers are shared\n with the specified list of nodes. If `eval()` then peers are shared with the\n nodes returned by the specified function, evaluated whenever a peer\n connection becomes available or a remote service requests information about\n local connections. The value `true` is equivalent to `fun ``erlang:nodes/0`.\n The value `node/0` in a list is ignored, so a collection of services can all\n be configured to share with the same list of nodes.\n\n Defaults to `false`.\n\n > #### Note {: .info }\n >\n > Peers are only shared with services of the same name for the purpose of\n > sending outgoing requests. Since the value of the\n > [application_opt()](`m:diameter#application_opt`) `alias`, passed to\n > `call/4`, is the handle for identifying a peer as a suitable candidate,\n > services that share peers must use the same aliases to identify their\n > supported applications. They should typically also configure identical\n > [capabilities()](`m:diameter#capabilities`), since by sharing peer\n > connections they are distributing the implementation of a single Diameter\n > node across multiple Erlang nodes.\n\n - **`{strict_arities, boolean() | encode | decode}`{: #strict_arities }** -\n Whether or not to require that the number of AVPs in a message or grouped\n AVP agree with those specified in the dictionary in question when passing\n messages to `m:diameter_app` callbacks. If `true` then mismatches in an\n outgoing messages cause message encoding to fail, while mismatches in an\n incoming message are reported as 5005/5009 errors in the errors field of the\n diameter_packet record passed to\n [handle_request/3](`c:diameter_app:handle_request/3`) or\n [handle_answer/4](`c:diameter_app:handle_answer/4`) callbacks. If `false`\n then neither error is enforced/detected. If `encode` or `decode` then errors\n are only enforced/detected on outgoing or incoming messages respectively.\n\n Defaults to `true`.\n\n > #### Note {: .info }\n >\n > Disabling arity checks affects the form of messages at encode/decode. In\n > particular, decoded AVPs are represented as lists of values, regardless of\n > the AVP's arity (ie. expected number in the message/AVP grammar in\n > question), and values are expected to be supplied as lists at encode. This\n > differs from the historic decode behaviour of representing AVPs of arity 1\n > as bare values, not wrapped in a list.\n\n - **`{string_decode, boolean()}`{: #string_decode }** - Whether or not to\n decode AVPs of type [OctetString()](diameter_dict.md#DATA_TYPES) and its\n derived types [DiameterIdentity()](diameter_dict.md#DATA_TYPES),\n [DiameterURI()](diameter_dict.md#DATA_TYPES),\n [IPFilterRule()](diameter_dict.md#DATA_TYPES),\n [QoSFilterRule()](diameter_dict.md#DATA_TYPES), and\n [UTF8String()](diameter_dict.md#DATA_TYPES). If `true` then AVPs of these\n types are decoded to string(). If `false` then values are retained as\n binary().\n\n Defaults to `true`.\n\n > #### Warning {: .warning }\n >\n > This option should be set to `false` since a sufficiently malicious peer\n > can otherwise cause large amounts of memory to be consumed when decoded\n > Diameter messages are passed between processes. The default value is for\n > backwards compatibility.\n\n - **`{traffic_counters, boolean()}`{: #traffic_counters }** - Whether or not\n to count application-specific messages; those for which `m:diameter_app`\n callbacks take place. If false then only messages handled by diameter itself\n are counted: CER/CEA, DWR/DWA, DPR/DPA.\n\n Defaults to `true`.\n\n > #### Note {: .info }\n >\n > Disabling counters is a performance improvement, but means that the\n > omitted counters are not returned by `service_info/2`.\n\n - **`{use_shared_peers, boolean() | [node()] | eval()}`** - Nodes from which\n communicated peers are made available in the remote candidates list of\n [pick_peer/4](`c:diameter_app:pick_peer/4`) callbacks.\n\n If `false` then remote peers are not used. If `[node()]` then only peers\n from the specified list of nodes are used. If `eval()` then only peers\n returned by the specified function are used, evaluated whenever a remote\n service communicates information about an available peer connection. The\n value `true` is equivalent to `fun ``erlang:nodes/0`. The value `node/0` in\n a list is ignored.\n\n Defaults to `false`.\n\n > #### Note {: .info }\n >\n > A service that does not use shared peers will always pass the empty list\n > as the second argument of [pick_peer/4](`c:diameter_app:pick_peer/4`)\n > callbacks.\n\n > #### Warning {: .warning }\n >\n > Sending a request over a peer connection on a remote node is less\n > efficient than sending it over a local connection. It may be preferable to\n > make use of the [service_opt()](`m:diameter#service_opt`)\n > `restrict_connections` and maintain a dedicated connection on each node\n > from which requests are sent.\n\n - **[`transport_opt()`](`m:diameter#transport_opt`)** - Any transport option\n except `applications`, `capabilities`, `transport_config`, and\n `transport_module`. Used as defaults for transport configuration, values\n passed to `add_transport/2` overriding values configured on the service.\n\n [](){: #transport_opt }\n\n- **`transport_opt()`** - Option passed to `add_transport/2`. Has one of the\n following types.\n\n - **`{applications, [`[`application_alias()`](`m:diameter#application_alias`)`]}`{:\n #applications }** - Diameter applications to which the transport should be\n restricted. Defaults to all applications configured on the service in\n question. Applications not configured on the service in question are\n ignored.\n\n > #### Warning {: .warning }\n >\n > The capabilities advertised by a node must match its configured\n > applications. In particular, setting `applications` on a transport\n > typically implies having to set matching \\*-Application-Id AVPs in a\n > [capabilities()](`m:diameter#capabilities`) tuple.\n\n - **`{avp_dictionaries, [module()]}`{: #avp_dictionaries }** - A list of\n alternate dictionary modules with which to encode/decode AVPs that are not\n defined by the dictionary of the application in question. At decode, such\n AVPs are represented as diameter_avp records in the `'AVP'` field of a\n decoded message or Grouped AVP, the first alternate that succeeds in\n decoding the AVP setting the record's value field. At encode, values in an\n `'AVP'` list can be passed as AVP name/value 2-tuples, and it is an encode\n error for no alternate to define the AVP of such a tuple.\n\n Defaults to the empty list.\n\n > #### Note {: .info }\n >\n > The motivation for alternate dictionaries is RFC 7683, Diameter Overload\n > Indication Conveyance (DOIC), which defines AVPs to be piggybacked onto\n > existing application messages rather than defining an application of its\n > own. The DOIC dictionary is provided by the diameter application, as\n > module `diameter_gen_doic_rfc7683`, but alternate dictionaries can be used\n > to encode/decode any set of AVPs not known to an application dictionary.\n\n - **`{capabilities, [`[`capability()`](`m:diameter#capability`)`]}`{:\n #capabilities }** - AVPs used to construct outgoing CER/CEA messages. Values\n take precedence over any specified on the service in question.\n\n Specifying a capability as a transport option may be particularly\n appropriate for Inband-Security-Id, in case TLS is desired over TCP as\n implemented by `m:diameter_tcp`.\n\n - **`{capabilities_cb, `[`eval()`](`m:diameter#eval`)`}`{: #capabilities_cb\n }** - Callback invoked upon reception of CER/CEA during capabilities\n exchange in order to ask whether or not the connection should be accepted.\n Applied to the [`transport_ref()`](`m:diameter#transport_ref`) and\n `#diameter_caps{}` record of the connection.\n\n The return value can have one of the following types.\n\n - **`ok`** - Accept the connection.\n\n - **`t:integer/0`** - Causes an incoming CER to be answered with the\n specified Result-Code.\n\n - **`discard`** - Causes an incoming CER to be discarded without CEA being\n sent.\n\n - **`unknown`** - Equivalent to returning `3010`, DIAMETER_UNKNOWN_PEER.\n\n Returning anything but `ok` or a 2xxx series result code causes the\n transport connection to be broken. Multiple\n [capabilities_cb](`m:diameter#capabilities_cb`) options can be specified, in\n which case the corresponding callbacks are applied until either all return\n `ok` or one does not.\n\n - **`{capx_timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`{:\n #capx_timeout }** - Number of milliseconds after which a transport process\n having an established transport connection will be terminated if the\n expected capabilities exchange message (CER or CEA) is not received from the\n peer. For a connecting transport, the timing of connection attempts is\n governed by [connect_timer](`m:diameter#connect_timer`) or\n [watchdog_timer](`m:diameter#watchdog_timer`) expiry. For a listening\n transport, the peer determines the timing.\n\n Defaults to 10000.\n\n - **`{connect_timer, Tc}`{: #connect_timer }**\n\n ```text\n Tc = Unsigned32()\n ```\n\n For a connecting transport, the RFC 6733 Tc timer, in milliseconds. This\n timer determines the frequency with which a transport attempts to establish\n an initial connection with its peer following transport configuration. Once\n an initial connection has been established,\n [watchdog_timer](`m:diameter#watchdog_timer`) determines the frequency of\n reconnection attempts, as required by RFC 3539.\n\n For a listening transport, the timer specifies the time after which a\n previously connected peer will be forgotten: a connection after this time is\n regarded as an initial connection rather than reestablishment, causing the\n RFC 3539 state machine to pass to state OKAY rather than REOPEN. Note that\n these semantics are not governed by the RFC and that a listening transport's\n [connect_timer](`m:diameter#connect_timer`) should be greater than its\n peer's Tw plus jitter.\n\n Defaults to 30000 for a connecting transport and 60000 for a listening\n transport.\n\n - **`{disconnect_cb, `[`eval()`](`m:diameter#eval`)`}`{: #disconnect_cb }** -\n Callback invoked prior to terminating the transport process of a transport\n connection having watchdog state `OKAY`. Applied to\n `application|service|transport` and the\n [`transport_ref()`](`m:diameter#transport_ref`) and\n [`diameter_app:peer()`](`t:diameter_app:peer/0`) in question: `application`\n indicates that the diameter application is being stopped, `service` that the\n service in question is being stopped by `stop_service/1`, and `transport`\n that the transport in question is being removed by `remove_transport/2`.\n\n The return value can have one of the following types.\n\n - **`{dpr, [option()]}`** - Send Disconnect-Peer-Request to the peer, the\n transport process being terminated following reception of\n Disconnect-Peer-Answer or timeout. An `option()` can be one of the\n following.\n\n - **`{cause, 0|rebooting|1|busy|2|goaway}`** - Disconnect-Cause to send,\n `REBOOTING`, `BUSY` and `DO_NOT_WANT_TO_TALK_TO_YOU` respectively.\n Defaults to `rebooting` for `Reason=service|application` and `goaway`\n for `Reason=transport`.\n\n - **`{timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`** -\n Number of milliseconds after which the transport process is terminated\n if DPA has not been received. Defaults to the value of\n [dpa_timeout](`m:diameter#dpa_timeout`).\n\n - **`dpr`** - Equivalent to `{dpr, []}`.\n\n - **`close`** - Terminate the transport process without\n Disconnect-Peer-Request being sent to the peer.\n\n - **`ignore`** - Equivalent to not having configured the callback.\n\n Multiple [disconnect_cb](`m:diameter#disconnect_cb`) options can be\n specified, in which case the corresponding callbacks are applied until one\n of them returns a value other than `ignore`. All callbacks returning\n `ignore` is equivalent to not having configured them.\n\n Defaults to a single callback returning `dpr`.\n\n - **`{dpa_timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`{:\n #dpa_timeout }** - Number of milliseconds after which a transport connection\n is terminated following an outgoing DPR if DPA is not received.\n\n Defaults to 1000.\n\n - **`{dpr_timeout, `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)`}`{:\n #dpr_timeout }** - Number of milliseconds after which a transport connection\n is terminated following an incoming DPR if the peer does not close the\n connection.\n\n Defaults to 5000.\n\n - **`{incoming_maxlen, 0..16777215}`{: #incoming_maxlen }** - Bound on the\n expected size of incoming Diameter messages. Messages larger than the\n specified number of bytes are discarded.\n\n Defaults to `16777215`, the maximum value of the 24-bit Message Length field\n in a Diameter Header.\n\n - **`{length_errors, exit|handle|discard}`{: #length_errors }** - How to deal\n with errors in the Message Length field of the Diameter Header in an\n incoming message. An error in this context is that the length is not at\n least 20 bytes (the length of a Header), is not a multiple of 4 (a valid\n length) or is not the length of the message in question, as received over\n the transport interface documented in `m:diameter_transport`.\n\n If `exit` then the transport process in question exits. If `handle` then the\n message is processed as usual, a resulting\n [handle_request/3](`c:diameter_app:handle_request/3`) or\n [handle_answer/4](`c:diameter_app:handle_answer/4`) callback (if one takes\n place) indicating the `5015` error (DIAMETER_INVALID_MESSAGE_LENGTH). If\n `discard` then the message in question is silently discarded.\n\n Defaults to `exit`.\n\n > #### Note {: .info }\n >\n > The default value reflects the fact that a transport module for a\n > stream-oriented transport like TCP may not be able to recover from a\n > message length error since such a transport must use the Message Length\n > header to divide the incoming byte stream into individual Diameter\n > messages. An invalid length leaves it with no reliable way to rediscover\n > message boundaries, which may result in the failure of subsequent\n > messages. See `m:diameter_tcp` for the behaviour of that module.\n\n - **`{pool_size, pos_integer()}`** - Number of transport processes to start.\n For a listening transport, determines the size of the pool of accepting\n transport processes, a larger number being desirable for processing multiple\n concurrent peer connection attempts. For a connecting transport, determines\n the number of connections to the peer in question that will be attempted to\n be establshed: the [service_opt()](`m:diameter#service_opt`):\n `restrict_connections` should also be configured on the service in question\n to allow multiple connections to the same peer.\n\n - **`{spawn_opt, [term()] | {M,F,A}}`{: #spawn_opt }** - An options list\n passed to `erlang:spawn_opt/2` to spawn a handler process for an incoming\n Diameter request on the local node, or an MFA that returns the pid of a\n handler process.\n\n Options `monitor` and `link` are ignored in the list-valued case. An MFA is\n applied with an additional term prepended to its argument list, and should\n return either the pid of the handler process that invokes\n `diameter_traffic:request/1` on the argument in order to process the\n request, or the atom `discard`. The handler process need not be local, and\n diameter need not be started on the remote node, but diameter and relevant\n application callbacks must be on the code path.\n\n Defaults to the empty list.\n\n - **`{strict_capx, boolean()]}`{: #strict_capx }** - Whether or not to enforce\n the RFC 6733 requirement that any message before capabilities exchange\n should close the peer connection. If false then unexpected messages are\n discarded.\n\n Defaults to true. Changing this results in non-standard behaviour, but can\n be useful in case peers are known to be behave badly.\n\n - **`{strict_mbit, boolean()}`{: #strict_mbit }** - Whether or not to regard\n an AVP setting the M-bit as erroneous when the command grammar in question\n does not explicitly allow the AVP. If `true` then such AVPs are regarded as\n 5001 errors, DIAMETER_AVP_UNSUPPORTED. If `false` then the M-bit is ignored\n and policing it becomes the receiver's responsibility.\n\n Defaults to `true`.\n\n > #### Warning {: .warning }\n >\n > RFC 6733 is unclear about the semantics of the M-bit. One the one hand,\n > the CCF specification in section 3.2 documents AVP in a command grammar as\n > meaning _any_ arbitrary AVP; on the other hand, 1.3.4 states that AVPs\n > setting the M-bit cannot be added to an existing command: the modified\n > command must instead be placed in a new Diameter application.\n >\n > The reason for the latter is presumably interoperability: allowing\n > arbitrary AVPs setting the M-bit in a command makes its interpretation\n > implementation-dependent, since there's no guarantee that all\n > implementations will understand the same set of arbitrary AVPs in the\n > context of a given command. However, interpreting `AVP` in a command\n > grammar as any AVP, regardless of M-bit, renders 1.3.4 meaningless, since\n > the receiver can simply ignore any AVP it thinks isn't relevant,\n > regardless of the sender's intent.\n >\n > Beware of confusing mandatory in the sense of the M-bit with mandatory in\n > the sense of the command grammar. The former is a semantic requirement:\n > that the receiver understand the semantics of the AVP in the context in\n > question. The latter is a syntactic requirement: whether or not the AVP\n > must occur in the message in question.\n\n - **`{transport_config, term()}`{: #transport_config }**\n\n - **`{transport_config, term(), `[`Unsigned32()`](diameter_dict.md#DATA_TYPES)` | infinity}`** -\n Term passed as the third argument to the\n [start/3](`c:diameter_transport:start/3`) function of the relevant\n [transport module](`m:diameter_transport`) in order to start a transport\n process. Defaults to the empty list.\n\n The 3-tuple form additionally specifies an interval, in milliseconds, after\n which a started transport process should be terminated if it has not yet\n established a connection. For example, the following options on a connecting\n transport request a connection with one peer over SCTP or another (typically\n the same) over TCP.\n\n ```erlang\n {transport_module, diameter_sctp}\n {transport_config, SctpOpts, 5000}\n {transport_module, diameter_tcp}\n {transport_config, TcpOpts}\n ```\n\n To listen on both SCTP and TCP, define one transport for each.\n\n - **`{transport_module, atom()}`{: #transport_module }** - Module implementing\n a transport process as defined in `m:diameter_transport`. Defaults to\n `diameter_tcp`.\n\n Multiple `transport_module` and\n [transport_config](`m:diameter#transport_config`) options are allowed. The\n order of these is significant in this case (and only in this case), a\n `transport_module` being paired with the first\n [transport_config](`m:diameter#transport_config`) following it in the\n options list, or the default value for trailing modules. Transport starts\n will be attempted with each of the modules in order until one establishes a\n connection within the corresponding timeout (see below) or all fail.\n\n - **`{watchdog_config, [{okay|suspect, non_neg_integer()}]}`{:\n #watchdog_config }** - Configuration that alters the behaviour of the\n watchdog state machine. On key `okay`, the non-negative number of answered\n DWR messages before transitioning from REOPEN to OKAY. On key `suspect`, the\n number of watchdog timeouts before transitioning from OKAY to SUSPECT when\n DWR is unanswered, or 0 to not make the transition.\n\n Defaults to `[{okay, 3}, {suspect, 1}]`. Not specifying a key is equivalent\n to specifying the default value for that key.\n\n > #### Warning {: .warning }\n >\n > The default value is as required by RFC 3539: changing it results in\n > non-standard behaviour that should only be used to simulate misbehaving\n > nodes during test.\n\n - **`{watchdog_timer, TwInit}`{: #watchdog_timer }**\n\n ```text\n TwInit = Unsigned32()\n | {M,F,A}\n ```\n\n The RFC 3539 watchdog timer. An integer value is interpreted as the RFC's\n TwInit in milliseconds, a jitter of ± 2 seconds being added at each rearming\n of the timer to compute the RFC's Tw. An MFA is expected to return the RFC's\n Tw directly, with jitter applied, allowing the jitter calculation to be\n performed by the callback.\n\n An integer value must be at least 6000 as required by RFC 3539. Defaults\n to 30000.\n\n Unrecognized options are silently ignored but are returned unmodified by\n `service_info/2` and can be referred to in predicate functions passed to\n `remove_transport/2`.\n\n- **`transport_ref() = reference()`{: #transport_ref }** - Reference returned by\n `add_transport/2` that identifies the configuration.","title":"DATA TYPES - diameter","ref":"diameter.html#module-data-types"},{"type":"module","doc":"`m:diameter_app`, `m:diameter_transport`, [diameter_dict(4)](diameter_dict.md)","title":"SEE ALSO - diameter","ref":"diameter.html#module-see-also"},{"type":"function","doc":"Add transport capability to a service.\n\nThe service will start transport processes as required in order to establish a\nconnection with the peer, either by connecting to the peer (`connect`) or by\naccepting incoming connection requests (`listen`). A connecting transport\nestablishes transport connections with at most one peer, an listening transport\npotentially with many.\n\nThe diameter application takes responsibility for exchanging CER/CEA with the\npeer. Upon successful completion of capabilities exchange the service calls each\nrelevant application module's [peer_up/3](`c:diameter_app:peer_up/3`) callback\nafter which the caller can exchange Diameter messages with the peer over the\ntransport. In addition to CER/CEA, the service takes responsibility for the\nhandling of DWR/DWA and required by RFC 3539, as well as for DPR/DPA.\n\nThe returned reference uniquely identifies the transport within the scope of the\nservice. Note that the function returns before a transport connection has been\nestablished.\n\n> #### Note {: .info }\n>\n> It is not an error to add a transport to a service that has not yet been\n> configured: a service can be started after configuring its transports.","title":"diameter.add_transport/2","ref":"diameter.html#add_transport/2"},{"type":"function","doc":"Send a Diameter request message.\n\n`App` specifies the Diameter application in which the request is defined and\ncallbacks to the corresponding callback module will follow as described below\nand in `m:diameter_app`. Unless the `detach` option is specified, the call\nreturns either when an answer message is received from the peer or an error\noccurs. In the answer case, the return value is as returned by a\n[handle_answer/4](`c:diameter_app:handle_answer/4`) callback. In the error case,\nwhether or not the error is returned directly by diameter or from a\n[handle_error/4](`c:diameter_app:handle_error/4`) callback depends on whether or\nnot the outgoing request is successfully encoded for transmission to the peer,\nthe cases being documented below.\n\nIf there are no suitable peers, or if\n[pick_peer/4](`c:diameter_app:pick_peer/4`) rejects them by returning `false`,\nthen `{error,no_connection}` is returned. Otherwise\n[pick_peer/4](`c:diameter_app:pick_peer/4`) is followed by a\n[prepare_request/3](`c:diameter_app:prepare_request/3`) callback, the message is\nencoded and then sent.\n\nThere are several error cases which may prevent an answer from being received\nand passed to a [handle_answer/4](`c:diameter_app:handle_answer/4`) callback:\n\n- If the initial encode of the outgoing request fails, then the request process\n fails and `{error,encode}` is returned.\n- If the request is successfully encoded and sent but the answer times out then\n a [handle_error/4](`c:diameter_app:handle_error/4`) callback takes place with\n `Reason = timeout`.\n- If the request is successfully encoded and sent but the service in question is\n stopped before an answer is received then a\n [handle_error/4](`c:diameter_app:handle_error/4`) callback takes place with\n `Reason = cancel`.\n- If the transport connection with the peer goes down after the request has been\n sent but before an answer has been received then an attempt is made to resend\n the request to an alternate peer. If no such peer is available, or if the\n subsequent [pick_peer/4](`c:diameter_app:pick_peer/4`) callback rejects the\n candidates, then a [handle_error/4](`c:diameter_app:handle_error/4`) callback\n takes place with `Reason = failover`. If a peer is selected then a\n [prepare_retransmit/3](`c:diameter_app:prepare_retransmit/3`) callback takes\n place, after which the semantics are the same as following an initial\n [prepare_request/3](`c:diameter_app:prepare_request/3`) callback.\n- If an encode error takes place during retransmission then the request process\n fails and `{error,failure}` is returned.\n- If an application callback made in processing the request fails (pick_peer,\n prepare_request, prepare_retransmit, handle_answer or handle_error) then\n either `{error,encode}` or `{error,failure}` is returned depending on whether\n or not there has been an attempt to send the request over the transport.\n\nNote that `{error,encode}` is the only return value which guarantees that the\nrequest has _not_ been sent over the transport connection.","title":"diameter.call/4","ref":"diameter.html#call/4"},{"type":"function","doc":"Return a reasonable value for use as Origin-State-Id in outgoing messages.\n\nThe value returned is the number of seconds since 19680120T031408Z, the first\nvalue that can be encoded as a Diameter [`Time()`](diameter_dict.md#DATA_TYPES),\nat the time the diameter application was started.","title":"diameter.origin_state_id/0","ref":"diameter.html#origin_state_id/0"},{"type":"function","doc":"Remove previously added transports.\n\n`Pred` determines which transports to remove. An arity-3-valued `Pred` removes\nall transports for which `Pred(Ref, Type, Opts)` returns `true`, where `Type`\nand `Opts` are as passed to `add_transport/2` and `Ref` is as returned by it.\nThe remaining forms are equivalent to an arity-3 fun as follows.\n\n```erlang\nPred = fun(transport_ref(), list()): fun(Ref, _, Opts) -> Pred(Ref, Opts) end\nPred = fun(list()): fun(_, _, Opts) -> Pred(Opts) end\nPred = transport_ref(): fun(Ref, _, _) -> Pred == Ref end\nPred = list(): fun(_, _, Opts) -> [] == Pred -- Opts end\nPred = true: fun(_, _, _) -> true end\nPred = false: fun(_, _, _) -> false end\nPred = {M,F,A}: fun(Ref, Type, Opts) -> apply(M, F, [Ref, Type, Opts | A]) end\n```\n\nRemoving a transport causes the corresponding transport processes to be\nterminated. Whether or not a DPR message is sent to a peer is controlled by\nvalue of [disconnect_cb](`m:diameter#disconnect_cb`) configured on the\ntransport.","title":"diameter.remove_transport/2","ref":"diameter.html#remove_transport/2"},{"type":"function","doc":"Return information about a started service. Requesting info for an unknown\nservice causes `undefined` to be returned. Requesting a list of items causes a\ntagged list to be returned.\n\n`Item` can be one of the following.\n\n- **`'Origin-Host'`**\n\n- **`'Origin-Realm'`**\n\n- **`'Vendor-Id'`**\n\n- **`'Product-Name'`**\n\n- **`'Origin-State-Id'`**\n\n- **`'Host-IP-Address'`**\n\n- **`'Supported-Vendor'`**\n\n- **`'Auth-Application-Id'`**\n\n- **`'Inband-Security-Id'`**\n\n- **`'Acct-Application-Id'`**\n\n- **`'Vendor-Specific-Application-Id'`**\n\n- **`'Firmware-Revision'`** - Return a capability value as configured with\n `start_service/2`.\n\n- **`applications`** - Return the list of applications as configured with\n `start_service/2`.\n\n- **`capabilities`** - Return a tagged list of all capabilities values as\n configured with `start_service/2`.\n\n- **`transport`** - Return a list containing one entry for each of the service's\n transport as configured with `add_transport/2`. Each entry is a tagged list\n containing both configuration and information about established peer\n connections. An example return value with for a client service with\n Origin-Host \"client.example.com\" configured with a single transport connected\n to \"server.example.com\" might look as follows.\n\n ```erlang\n [[{ref,#Ref<0.0.0.93>},\n {type,connect},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{ip,{127,0,0,1}},\n {raddr,{127,0,0,1}},\n {rport,3868},\n {reuseaddr,true}]}]},\n {watchdog,{<0.66.0>,-576460736368485571,okay}},\n {peer,{<0.67.0>,-576460736357885808}},\n {apps,[{0,common}]},\n {caps,[{origin_host,{\"client.example.com\",\"server.example.com\"}},\n {origin_realm,{\"example.com\",\"example.com\"}},\n {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},\n {vendor_id,{0,193}},\n {product_name,{\"Client\",\"Server\"}},\n {origin_state_id,{[],[]}},\n {supported_vendor_id,{[],[]}},\n {auth_application_id,{[0],[0]}},\n {inband_security_id,{[],[0]}},\n {acct_application_id,{[],[]}},\n {vendor_specific_application_id,{[],[]}},\n {firmware_revision,{[],[]}},\n {avp,{[],[]}}]},\n {port,[{owner,<0.69.0>},\n {module,diameter_tcp},\n {socket,{{127,0,0,1},48758}},\n {peer,{{127,0,0,1},3868}},\n {statistics,[{recv_oct,656},\n {recv_cnt,6},\n {recv_max,148},\n {recv_avg,109},\n {recv_dvi,19},\n {send_oct,836},\n {send_cnt,6},\n {send_max,184},\n {send_avg,139},\n {send_pend,0}]}]},\n {statistics,[{{{0,258,0},recv},3},\n {{{0,258,1},send},3},\n {{{0,258,0},recv,{'Result-Code',2001}},3},\n {{{0,257,0},recv},1},\n {{{0,257,1},send},1},\n {{{0,257,0},recv,{'Result-Code',2001}},1},\n {{{0,280,1},recv},2},\n {{{0,280,0},send},2},\n {{{0,280,0},send,{'Result-Code',2001}},2}]}]]\n ```\n\n Here `ref` is a [`transport_ref()`](`m:diameter#transport_ref`) and `options`\n the corresponding [`transport_opt()`](`m:diameter#transport_opt`) list passed\n to `add_transport/2`. The `watchdog` entry shows the state of a connection's\n RFC 3539 watchdog state machine. The `peer` entry identifies the\n [`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`) for which there will\n have been [peer_up/3](`c:diameter_app:peer_up/3`) callbacks for the Diameter\n applications identified by the `apps` entry, `common` being the\n [`application_alias()`](`m:diameter#application_alias`). The `caps` entry\n identifies the capabilities sent by the local node and received from the peer\n during capabilities exchange. The `port` entry displays socket-level\n information about the transport connection. The `statistics` entry presents\n Diameter-level counters, an entry like `{{{0,280,1},recv},2}` saying that the\n client has received 2 DWR messages:\n `{0,280,1} = {Application_Id, Command_Code, R_Flag}`.\n\n Note that `watchdog`, `peer`, `apps`, `caps` and `port` entries depend on\n connectivity with the peer and may not be present. Note also that the\n `statistics` entry presents values accumulated during the lifetime of the\n transport configuration.\n\n A listening transport presents its information slightly differently since\n there may be multiple accepted connections for the same\n [`transport_ref()`](`m:diameter#transport_ref`). The `transport` info returned\n by a server with a single client connection might look as follows.\n\n ```erlang\n [[{ref,#Ref<0.0.0.61>},\n {type,listen},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{reuseaddr,true},\n {ip,{127,0,0,1}},\n {port,3868}]}]},\n {accept,[[{watchdog,{<0.56.0>,-576460739249514012,okay}},\n {peer,{<0.58.0>,-576460638229179167}},\n {apps,[{0,common}]},\n {caps,[{origin_host,{\"server.example.com\",\"client.example.com\"}},\n {origin_realm,{\"example.com\",\"example.com\"}},\n {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},\n {vendor_id,{193,0}},\n {product_name,{\"Server\",\"Client\"}},\n {origin_state_id,{[],[]}},\n {supported_vendor_id,{[],[]}},\n {auth_application_id,{[0],[0]}},\n {inband_security_id,{[],[]}},\n {acct_application_id,{[],[]}},\n {vendor_specific_application_id,{[],[]}},\n {firmware_revision,{[],[]}},\n {avp,{[],[]}}]},\n {port,[{owner,<0.62.0>},\n {module,diameter_tcp},\n {socket,{{127,0,0,1},3868}},\n {peer,{{127,0,0,1},48758}},\n {statistics,[{recv_oct,1576},\n {recv_cnt,16},\n {recv_max,184},\n {recv_avg,98},\n {recv_dvi,26},\n {send_oct,1396},\n {send_cnt,16},\n {send_max,148},\n {send_avg,87},\n {send_pend,0}]}]}],\n [{watchdog,{<0.72.0>,-576460638229717546,initial}}]]},\n {statistics,[{{{0,280,0},recv},7},\n {{{0,280,1},send},7},\n {{{0,280,0},recv,{'Result-Code',2001}},7},\n {{{0,258,1},recv},3},\n {{{0,258,0},send},3},\n {{{0,258,0},send,{'Result-Code',2001}},3},\n {{{0,280,1},recv},5},\n {{{0,280,0},send},5},\n {{{0,280,0},send,{'Result-Code',2001}},5},\n {{{0,257,1},recv},1},\n {{{0,257,0},send},1},\n {{{0,257,0},send,{'Result-Code',2001}},1}]}]]\n ```\n\n The information presented here is as in the `connect` case except that the\n client connections are grouped under an `accept` tuple.\n\n Whether or not the [transport_opt()](`m:diameter#transport_opt`) `pool_size`\n has been configured affects the format of the listing in the case of a\n connecting transport, since a value greater than 1 implies multiple transport\n processes for the same [`transport_ref()`](`m:diameter#transport_ref`), as in\n the listening case. The format in this case is similar to the listening case,\n with a `pool` tuple in place of an `accept` tuple.\n\n- **`connections`** - Return a list containing one entry for every established\n transport connection whose watchdog state machine is not in the `down` state.\n This is a flat view of `transport` info which lists only active connections\n and for which Diameter-level statistics are accumulated only for the lifetime\n of the transport connection. A return value for the server above might look as\n follows.\n\n ```erlang\n [[{ref,#Ref<0.0.0.61>},\n {type,accept},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{reuseaddr,true},\n {ip,{127,0,0,1}},\n {port,3868}]}]},\n {watchdog,{<0.56.0>,-576460739249514012,okay}},\n {peer,{<0.58.0>,-576460638229179167}},\n {apps,[{0,common}]},\n {caps,[{origin_host,{\"server.example.com\",\"client.example.com\"}},\n {origin_realm,{\"example.com\",\"example.com\"}},\n {host_ip_address,{[{127,0,0,1}],[{127,0,0,1}]}},\n {vendor_id,{193,0}},\n {product_name,{\"Server\",\"Client\"}},\n {origin_state_id,{[],[]}},\n {supported_vendor_id,{[],[]}},\n {auth_application_id,{[0],[0]}},\n {inband_security_id,{[],[]}},\n {acct_application_id,{[],[]}},\n {vendor_specific_application_id,{[],[]}},\n {firmware_revision,{[],[]}},\n {avp,{[],[]}}]},\n {port,[{owner,<0.62.0>},\n {module,diameter_tcp},\n {socket,{{127,0,0,1},3868}},\n {peer,{{127,0,0,1},48758}},\n {statistics,[{recv_oct,10124},\n {recv_cnt,132},\n {recv_max,184},\n {recv_avg,76},\n {recv_dvi,9},\n {send_oct,10016},\n {send_cnt,132},\n {send_max,148},\n {send_avg,75},\n {send_pend,0}]}]},\n {statistics,[{{{0,280,0},recv},62},\n {{{0,280,1},send},62},\n {{{0,280,0},recv,{'Result-Code',2001}},62},\n {{{0,258,1},recv},3},\n {{{0,258,0},send},3},\n {{{0,258,0},send,{'Result-Code',2001}},3},\n {{{0,280,1},recv},66},\n {{{0,280,0},send},66},\n {{{0,280,0},send,{'Result-Code',2001}},66},\n {{{0,257,1},recv},1},\n {{{0,257,0},send},1},\n {{{0,257,0},send,{'Result-Code',2001}},1}]}]]\n ```\n\n Note that there may be multiple entries with the same `ref`, in contrast to\n `transport` info.\n\n- **`statistics`** - Return a `{{Counter, Ref}, non_neg_integer()}` list of\n counter values. `Ref` can be either a\n [`transport_ref()`](`m:diameter#transport_ref`) or a\n [`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`). Entries for the latter\n are folded into corresponding entries for the former as peer connections go\n down. Entries for both are removed at `remove_transport/2`. The Diameter-level\n statistics returned by `transport` and `connections` info are based upon these\n entries.\n\n- **[`diameter_app:peer_ref()`](`t:diameter_app:peer_ref/0`)** - Return transport\n configuration associated with a single peer, as passed to `add_transport/2`.\n The returned list is empty if the peer is unknown. Otherwise it contains the\n `ref`, `type` and `options` tuples as in `transport` and `connections` info\n above. For example:\n\n ```erlang\n [{ref,#Ref<0.0.0.61>},\n {type,accept},\n {options,[{transport_module,diameter_tcp},\n {transport_config,[{reuseaddr,true},\n {ip,{127,0,0,1}},\n {port,3868}]}]}]\n ```","title":"diameter.service_info/2","ref":"diameter.html#service_info/2"},{"type":"function","doc":"Return the list of started services.","title":"diameter.services/0","ref":"diameter.html#services/0"},{"type":"function","doc":"Return a value for a Session-Id AVP.\n\nThe value has the form required by section 8.8 of RFC 6733. Ident should be the\nOrigin-Host of the peer from which the message containing the returned value\nwill be sent.","title":"diameter.session_id/1","ref":"diameter.html#session_id/1"},{"type":"function","doc":"Start the diameter application.\n\nThe diameter application must be started before starting a service. In a\nproduction system this is typically accomplished by a boot file, not by calling\n`start/0` explicitly.","title":"diameter.start/0","ref":"diameter.html#start/0"},{"type":"function","doc":"Start a diameter service.\n\nA service defines a locally-implemented Diameter node, specifying the\ncapabilities to be advertised during capabilities exchange. Transports are added\nto a service using `add_transport/2`.\n\n> #### Note {: .info }\n>\n> A transport can both override its service's capabilities and restrict its\n> supported Diameter applications so \"service = Diameter node as identified by\n> Origin-Host\" is not necessarily the case.","title":"diameter.start_service/2","ref":"diameter.html#start_service/2"},{"type":"function","doc":"Stop the diameter application.","title":"diameter.stop/0","ref":"diameter.html#stop/0"},{"type":"function","doc":"Stop a diameter service.\n\nStopping a service causes all associated transport connections to be broken. A\nDPR message will be sent as in the case of `remove_transport/2`.\n\n> #### Note {: .info }\n>\n> Stopping a service does not remove any associated transports:\n> `remove_transport/2` must be called to remove transport configuration.","title":"diameter.stop_service/1","ref":"diameter.html#stop_service/1"},{"type":"function","doc":"Subscribe to [`service_event()`](`m:diameter#service_event`) messages from a\nservice.\n\nIt is not an error to subscribe to events from a service that does not yet\nexist. Doing so before adding transports is required to guarantee the reception\nof all transport-related events.","title":"diameter.subscribe/1","ref":"diameter.html#subscribe/1"},{"type":"function","doc":"Unsubscribe to event messages from a service.","title":"diameter.unsubscribe/1","ref":"diameter.html#unsubscribe/1"},{"type":"function","doc":"Return a list of _all_ connections, grouped by the service they\nare associated with.","title":"diameter.which_connections/0","ref":"diameter.html#which_connections/0"},{"type":"function","doc":"Return a list of connections associated with the service 'SvcName'.","title":"diameter.which_connections/1","ref":"diameter.html#which_connections/1"},{"type":"function","doc":"Return a list of _all_ transports.","title":"diameter.which_transports/0","ref":"diameter.html#which_transports/0"},{"type":"function","doc":"Return a list of transports associated with the service 'SvcName'.","title":"diameter.which_transports/1","ref":"diameter.html#which_transports/1"},{"type":"function","doc":"Return a list of _all_ watchdogs.","title":"diameter.which_watchdogs/0","ref":"diameter.html#which_watchdogs/0"},{"type":"function","doc":"Return a list of watchdogs associated with the service 'SvcName'.","title":"diameter.which_watchdogs/1","ref":"diameter.html#which_watchdogs/1"},{"type":"type","doc":"","title":"diameter.Address/0","ref":"diameter.html#t:Address/0"},{"type":"type","doc":"","title":"diameter.app_alias/0","ref":"diameter.html#t:app_alias/0"},{"type":"type","doc":"","title":"diameter.app_module/0","ref":"diameter.html#t:app_module/0"},{"type":"type","doc":"","title":"diameter.application_opt/0","ref":"diameter.html#t:application_opt/0"},{"type":"type","doc":"","title":"diameter.call_opt/0","ref":"diameter.html#t:call_opt/0"},{"type":"type","doc":"","title":"diameter.capability/0","ref":"diameter.html#t:capability/0"},{"type":"type","doc":"","title":"diameter.common_opt/0","ref":"diameter.html#t:common_opt/0"},{"type":"type","doc":"","title":"diameter.DiameterIdentity/0","ref":"diameter.html#t:DiameterIdentity/0"},{"type":"type","doc":"","title":"diameter.DiameterURI/0","ref":"diameter.html#t:DiameterURI/0"},{"type":"type","doc":"","title":"diameter.decode_format/0","ref":"diameter.html#t:decode_format/0"},{"type":"type","doc":"","title":"diameter.Enumerated/0","ref":"diameter.html#t:Enumerated/0"},{"type":"type","doc":"","title":"diameter.elapsed_time/0","ref":"diameter.html#t:elapsed_time/0"},{"type":"type","doc":"","title":"diameter.eval/0","ref":"diameter.html#t:eval/0"},{"type":"type","doc":"","title":"diameter.evaluable/0","ref":"diameter.html#t:evaluable/0"},{"type":"type","doc":"","title":"diameter.Float32/0","ref":"diameter.html#t:Float32/0"},{"type":"type","doc":"","title":"diameter.Float64/0","ref":"diameter.html#t:Float64/0"},{"type":"type","doc":"","title":"diameter.Grouped/0","ref":"diameter.html#t:Grouped/0"},{"type":"type","doc":"","title":"diameter.Integer32/0","ref":"diameter.html#t:Integer32/0"},{"type":"type","doc":"","title":"diameter.Integer64/0","ref":"diameter.html#t:Integer64/0"},{"type":"type","doc":"","title":"diameter.IPFilterRule/0","ref":"diameter.html#t:IPFilterRule/0"},{"type":"type","doc":"","title":"diameter.message_length/0","ref":"diameter.html#t:message_length/0"},{"type":"type","doc":"","title":"diameter.OctetString/0","ref":"diameter.html#t:OctetString/0"},{"type":"type","doc":"","title":"diameter.peer_filter/0","ref":"diameter.html#t:peer_filter/0"},{"type":"opaque","doc":"","title":"diameter.peer_ref/0","ref":"diameter.html#t:peer_ref/0"},{"type":"type","doc":"","title":"diameter.QoSFilterRule/0","ref":"diameter.html#t:QoSFilterRule/0"},{"type":"type","doc":"","title":"diameter.remotes/0","ref":"diameter.html#t:remotes/0"},{"type":"type","doc":"","title":"diameter.restriction/0","ref":"diameter.html#t:restriction/0"},{"type":"type","doc":"","title":"diameter.sequence/0","ref":"diameter.html#t:sequence/0"},{"type":"type","doc":"","title":"diameter.service_name/0","ref":"diameter.html#t:service_name/0"},{"type":"type","doc":"","title":"diameter.service_opt/0","ref":"diameter.html#t:service_opt/0"},{"type":"type","doc":"","title":"diameter.strict_arities/0","ref":"diameter.html#t:strict_arities/0"},{"type":"type","doc":"","title":"diameter.Time/0","ref":"diameter.html#t:Time/0"},{"type":"type","doc":"","title":"diameter.transport_opt/0","ref":"diameter.html#t:transport_opt/0"},{"type":"type","doc":"","title":"diameter.transport_pred/0","ref":"diameter.html#t:transport_pred/0"},{"type":"type","doc":"","title":"diameter.transport_ref/0","ref":"diameter.html#t:transport_ref/0"},{"type":"type","doc":"","title":"diameter.Unsigned32/0","ref":"diameter.html#t:Unsigned32/0"},{"type":"type","doc":"","title":"diameter.Unsigned64/0","ref":"diameter.html#t:Unsigned64/0"},{"type":"type","doc":"","title":"diameter.UTF8String/0","ref":"diameter.html#t:UTF8String/0"},{"type":"behaviour","doc":"Callback module of a Diameter application.\n\nA diameter service as started by `diameter:start_service/2` configures one of\nmore Diameter applications, each of whose configuration specifies a callback\nthat handles messages specific to the application. The messages and AVPs of the\napplication are defined in a dictionary file whose format is documented in\n[diameter_dict(4)](diameter_dict.md) while the callback module is documented\nhere. The callback module implements the Diameter application-specific\nfunctionality of a service.\n\nA callback module must export all of the functions documented below. The\nfunctions themselves are of three distinct flavours:\n\n- `c:peer_up/3` and `c:peer_down/3` signal the attainment or loss of\n connectivity with a Diameter peer.\n- `c:pick_peer/4`, `c:prepare_request/3`, `c:prepare_retransmit/3`,\n `c:handle_answer/4` and `c:handle_error/4` are (or may be) called as a\n consequence of a call to `diameter:call/4` to send an outgoing Diameter\n request message.\n- `c:handle_request/3` is called in response to an incoming Diameter request\n message.\n\nThe arities for the the callback functions here assume no extra arguments. All\nfunctions will also be passed any extra arguments configured with the callback\nmodule itself when calling `diameter:start_service/2` and, for the call-specific\ncallbacks, any extra arguments passed to `diameter:call/4`.","title":"diameter_app","ref":"diameter_app.html"},{"type":"callback","doc":"Invoked when an answer message is received from a peer. The return value is\nreturned from `diameter:call/4` unless the `detach` option was specified.\n\nThe decoded answer record and undecoded binary are in the `msg` and `bin` fields\nof the argument [packet()](`t:packet/0`) respectively. `Request` is\nthe outgoing request message as was returned from `c:prepare_request/3` or\n`c:prepare_retransmit/3`.\n\nFor any given call to `diameter:call/4` there is at most one `c:handle_answer/4`\ncallback: any duplicate answer (due to retransmission or otherwise) is\ndiscarded. Similarly, only one of `c:handle_answer/4` or `c:handle_error/4` is\ncalled.\n\nBy default, an incoming answer message that cannot be successfully decoded\ncauses the request process to fail, causing `diameter:call/4` to return\n`{error, failure}` unless the `detach` option was specified. In particular,\nthere is no `c:handle_error/4` callback in this case. The\n[diameter:application_opt()](`m:diameter#application_opt`) `answer_errors` can\nbe set to change this behaviour.","title":"diameter_app.handle_answer/4","ref":"diameter_app.html#c:handle_answer/4"},{"type":"callback","doc":"Invoked when an error occurs before an answer message is received in response to\nan outgoing request. The return value is returned from `diameter:call/4` unless\nthe `detach` option was specified.\n\nReason `timeout` indicates that an answer message has not been received within\nthe time specified with the corresponding\n[diameter:call_opt()](`m:diameter#call_opt`). Reason `failover` indicates that\nthe transport connection to the peer to which the request has been sent has\nbecome unavailable and that not alternate peer was not selected.","title":"diameter_app.handle_error/4","ref":"diameter_app.html#c:handle_error/4"},{"type":"callback","doc":"Invoked when a request message is received from a peer. The application in which\nthe callback takes place (that is, the callback module as configured with\n`diameter:start_service/2`) is determined by the Application Identifier in the\nheader of the incoming request message, the selected module being the one whose\ncorresponding dictionary declares itself as defining either the application in\nquestion or the Relay application.\n\nThe argument [packet()](`t:packet/0`) has the following signature.\n\n```erlang\n#diameter_packet{header = #diameter_header{},\n avps = [#diameter_avp{}],\n msg = record() | undefined,\n errors = [Unsigned32() | {Unsigned32(), #diameter_avp{}}],\n bin = binary(),\n transport_data = term()}\n```\n\nThe `msg` field will be `undefined` in case the request has been received in the\nrelay application. Otherwise it contains the record representing the request as\noutlined in [diameter_dict(4)](diameter_dict.md#MESSAGE_RECORDS).\n\nThe `errors` field specifies any results codes identifying errors found while\ndecoding the request. This is used to set Result-Code and/or Failed-AVP in a\nreturned answer unless the callback returns a `#diameter_packet{}` whose\n`errors` field is set to either a non-empty list of its own, in which case this\nlist is used instead, or the atom `false` to disable any setting of Result-Code\nand Failed-AVP. Note that the errors detected by diameter are of the 3xxx and\n5xxx series, Protocol Errors and Permanent Failures respectively. The `errors`\nlist is empty if the request has been received in the relay application.\n\nThe `transport_data` field contains an arbitrary term passed into diameter from\nthe transport module in question, or the atom `undefined` if the transport\nspecified no data. The term is preserved if a\n[message()](`t:message/0`) is returned but must be set explicitly in\na returned [packet()](`t:packet/0`).\n\nThe semantics of each of the possible return values are as follows.\n\n- **`{reply, `[`packet()`](`t:packet/0`)`|`[`message()`](`t:message/0`)`}`** -\n Send the specified answer message to the peer. In the case of a\n [packet()](`t:packet/0`), the message to be sent must be set in the\n `msg` field and the `header` field can be set to a `#diameter_header{}` to\n specify values that should be preserved in the outgoing answer, appropriate\n values otherwise being set by diameter.\n\n- **`{answer_message, 3000..3999|5000..5999}`** - Send an answer message to the\n peer containing the specified Result-Code. Equivalent to\n\n ```text\n {reply, ['answer-message' | Avps]\n ```\n\n where `Avps` sets the Origin-Host, Origin-Realm, the specified Result-Code and\n (if the request contained one) Session-Id AVPs, and possibly Failed-AVP as\n described below.\n\n Returning a value other than 3xxx or 5xxx will cause the request process in\n question to fail, as will returning a 5xxx value if the peer connection in\n question has been configured with the RFC 3588 common dictionary\n `diameter_gen_base_rfc3588`. (Since RFC 3588 only allows 3xxx values in an\n answer-message.)\n\n When returning 5xxx, Failed-AVP will be populated with the AVP of the first\n matching Result-Code/AVP pair in the `errors` field of the argument\n [packet()](`t:packet/0`), if found. If this is not appropriate then\n an answer-message should be constructed explicitly and returned in a `reply`\n tuple instead.\n\n- **`{relay, Opts}`** - Relay a request to another peer in the role of a\n Diameter relay agent. If a routing loop is detected then the request is\n answered with 3005 (DIAMETER_LOOP_DETECTED). Otherwise a Route-Record AVP\n (containing the sending peer's Origin-Host) is added to the request and\n `c:pick_peer/4` and subsequent callbacks take place just as if\n `diameter:call/4` had been called explicitly. The End-to-End Identifier of the\n incoming request is preserved in the header of the relayed request.\n\n The returned `Opts` should not specify `detach`. A subsequent\n `c:handle_answer/4` callback for the relayed request must return its first\n argument, the [packet()](`t:packet/0`) containing the answer\n message. Note that the `extra` option can be specified to supply arguments\n that can distinguish the relay case from others if so desired. Any other\n return value (for example, from a `c:handle_error/4` callback) causes the\n request to be answered with 3002 (DIAMETER_UNABLE_TO_DELIVER).\n\n- **`discard`** - Discard the request. No answer message is sent to the peer.\n\n- **`{eval, Action, PostF}`** - Handle the request as if `Action` has been\n returned and then evaluate `PostF` in the request process. The return value is\n ignored.\n\n- **`{eval_packet, Action, PostF}`** - Like `eval` but evaluate `PostF` on any\n encoded `#diameter_packet{}` prior to transmission, the `bin` field containing\n the encoded binary. The return value is ignored.\n\n- **`{protocol_error, 3000..3999}`** - Equivalent to\n `{answer_message, 3000..3999}`.\n\n> #### Note {: .info }\n>\n> Requests containing errors may be answered by diameter, without a callback\n> taking place, depending on the value of the\n> [diameter:application_opt()](`m:diameter#application_opt`) `request_errors`.","title":"diameter_app.handle_request/3","ref":"diameter_app.html#c:handle_request/3"},{"type":"callback","doc":"Invoked to signal that a peer connection on the local Erlang node is no longer\navailable following a previous call to `c:peer_up/3`. In particular, that the\nRFC 3539 watchdog state machine for the connection has left state `OKAY` and the\npeer will no longer be a candidate in `c:pick_peer/4` callbacks.","title":"diameter_app.peer_down/3","ref":"diameter_app.html#c:peer_down/3"},{"type":"callback","doc":"Invoked to signal the availability of a peer connection on the local Erlang\nnode. In particular, capabilities exchange with the peer has indicated support\nfor the application in question, the RFC 3539 watchdog state machine for the\nconnection has reached state `OKAY` and Diameter messages can be both sent and\nreceived.\n\n> #### Note {: .info }\n>\n> A watchdog state machine can reach state `OKAY` from state `SUSPECT` without a\n> new capabilities exchange taking place. A new transport connection (and\n> capabilities exchange) results in a new peer_ref().\n\n> #### Note {: .info }\n>\n> There is no requirement that a callback return before incoming requests are\n> received: `c:handle_request/3` callbacks must be handled independently of\n> `c:peer_up/3` and `c:peer_down/3`.","title":"diameter_app.peer_up/3","ref":"diameter_app.html#c:peer_up/3"},{"type":"callback","doc":"Invoked as a consequence of a call to `diameter:call/4` to select a destination\npeer for an outgoing request. The return value indicates the selected peer.\n\nThe candidate lists contain only those peers that have advertised support for\nthe Diameter application in question during capabilities exchange, that have not\nbe excluded by a `filter` option in the call to `diameter:call/4` and whose\nwatchdog state machine is in the `OKAY` state. The order of the elements is\nunspecified except that any peers whose Origin-Host and Origin-Realm matches\nthat of the outgoing request (in the sense of a `{filter, {all, [host, realm]}}`\noption to `diameter:call/4`) will be placed at the head of the list.\n`LocalCandidates` contains peers whose transport process resides on the local\nErlang node while `RemoteCandidates` contains peers that have been communicated\nfrom other nodes by services of the same name.\n\nA callback that returns a peer() will be followed by a `c:prepare_request/3`\ncallback and, if the latter indicates that the request should be sent, by either\n`c:handle_answer/4` or `c:handle_error/4` depending on whether or not an answer\nmessage is received from the peer. If the transport becomes unavailable after\n`c:prepare_request/3` then a new `c:pick_peer/4` callback may take place to\nfailover to an alternate peer, after which `c:prepare_retransmit/3` takes the\nplace of `c:prepare_request/3` in resending the request. There is no guarantee\nthat a `c:pick_peer/4` callback to select an alternate peer will be followed by\nany additional callbacks since a retransmission to an alternate peer is\nabandoned if an answer is received from a previously selected peer.\n\nThe return values `false` and `{false, State}` (that is, `NewState = State`) are\nequivalent, as are `{ok, Peer}` and `{Peer, State}`.\n\n> #### Note {: .info }\n>\n> The [diameter:service_opt()](`m:diameter#service_opt`) `use_shared_peers`\n> determines whether or not a service uses peers shared from other nodes. If not\n> then `RemoteCandidates` is the empty list.\n\n> #### Warning {: .warning }\n>\n> The return value `{Peer, NewState}` is only allowed if the Diameter\n> application in question was configured with the\n> [diameter:application_opt()](`m:diameter#application_opt`)\n> `{call_mutates_state, true}`. Otherwise, the `State` argument is always the\n> initial value as configured on the application, not any subsequent value\n> returned by a `c:peer_up/3` or `c:peer_down/3` callback.","title":"diameter_app.pick_peer/4","ref":"diameter_app.html#c:pick_peer/4"},{"type":"callback","doc":"Invoked to return a request for encoding and transport. Allows the sender to use\nthe selected peer's capabilities to modify the outgoing request. Many\nimplementations may simply want to return `{send, Packet}`\n\nA returned [packet()](`t:packet/0`) should set the request to be\nencoded in its `msg` field and can set the `transport_data` field in order to\npass information to the transport process. Extra arguments passed to\n`diameter:call/4` can be used to communicate transport (or any other) data to\nthe callback.\n\nA returned [packet()](`t:packet/0`) can set the `header` field to a\n`#diameter_header{}` to specify values that should be preserved in the outgoing\nrequest, values otherwise being those in the header record contained in\n`Packet`. A returned `length`, `cmd_code` or `application_id` is ignored.\n\nA returned `PostF` will be evaluated on any encoded `#diameter_packet{}` prior\nto transmission, the `bin` field containing the encoded binary. The return value\nis ignored.\n\nReturning `{discard, Reason}` causes the request to be aborted and the\n`diameter:call/4` for which the callback has taken place to return\n`{error, Reason}`. Returning `discard` is equivalent to returning\n`{discard, discarded}`.","title":"diameter_app.prepare_request/3","ref":"diameter_app.html#c:prepare_request/3"},{"type":"callback","doc":"Invoked to return a request for encoding and retransmission. Has the same role\nas `c:prepare_request/3` in the case that a peer connection is lost an an\nalternate peer selected but the argument [packet()](`t:packet/0`) is\nas returned by the initial `c:prepare_request/3`.\n\nReturning `{discard, Reason}` causes the request to be aborted and a\n`c:handle_error/4` callback to take place with `Reason` as initial argument.\nReturning `discard` is equivalent to returning `{discard, discarded}`.","title":"diameter_app.prepare_retransmit/3","ref":"diameter_app.html#c:prepare_retransmit/3"},{"type":"type","doc":"A record containing the identities of the local Diameter node and the remote Diameter\npeer having an established transport connection, as well as the capabilities\nas determined by capabilities exchange. Each field of the record is a 2-tuple\nconsisting of values for the (local) host and (remote) peer. Optional or\npossibly multiple values are encoded as lists of values, mandatory values as\nthe bare value.","title":"diameter_app.capabilities/0","ref":"diameter_app.html#t:capabilities/0"},{"type":"type","doc":"The representation of a Diameter message as passed to `diameter:call/4` or\nreturned from a `c:handle_request/3` callback.","title":"diameter_app.message/0","ref":"diameter_app.html#t:message/0"},{"type":"type","doc":"A container for incoming and outgoing Diameter messages that's passed through\nencode/decode and transport. Fields should not be set in return values except\nas documented.","title":"diameter_app.packet/0","ref":"diameter_app.html#t:packet/0"},{"type":"type","doc":"A tuple representing a Diameter peer connection.","title":"diameter_app.peer/0","ref":"diameter_app.html#t:peer/0"},{"type":"type","doc":"A term identifying a transport connection with a Diameter peer.","title":"diameter_app.peer_ref/0","ref":"diameter_app.html#t:peer_ref/0"},{"type":"type","doc":"The state maintained by the application\ncallback functions `c:peer_up/3`, `c:peer_down/3` and (optionally)\n`c:pick_peer/4`. The initial state is configured in the call to\n`diameter:start_service/2` that configures the application on a service.\nCallback functions returning a state are evaluated in a common\nservice-specific process while those not returning state are evaluated in a\nrequest-specific process.","title":"diameter_app.state/0","ref":"diameter_app.html#t:state/0"},{"type":"module","doc":"Decode and encode of Diameter messages.\n\nIncoming Diameter messages are decoded from binary() before being communicated\nto `m:diameter_app` callbacks. Similarly, outgoing Diameter messages are encoded\ninto binary() before being passed to the appropriate `m:diameter_transport`\nmodule for transmission. The functions documented here implement the default\nencode/decode.\n\n> #### Warning {: .warning }\n>\n> The diameter user does not need to call functions here explicitly when sending\n> and receiving messages using `diameter:call/4` and the callback interface\n> documented in `m:diameter_app`: diameter itself provides encode/decode as a\n> consequence of configuration passed to `diameter:start_service/2`, and the\n> results may differ from those returned by the functions documented here,\n> depending on configuration.\n\nThe [header()](`m:diameter_codec#header`) and\n[packet()](`m:diameter_codec#packet`) records below are defined in diameter.hrl,\nwhich can be included as follows.\n\n```erlang\n-include_lib(\"diameter/include/diameter.hrl\").\n```\n\nApplication-specific records are defined in the hrl files resulting from\ndictionary file compilation.","title":"diameter_codec","ref":"diameter_codec.html"},{"type":"module","doc":"- **`uint8()  = 0..255`{: #integers }**\n\n- **`uint24() = 0..16777215`**\n\n- **`uint32() = 0..4294967295`** - 8-bit, 24-bit and 32-bit integers occurring\n in Diameter and AVP headers.\n\n- **`avp() = #diameter_avp{}`{: #avp }** - The application-neutral\n representation of an AVP. Primarily intended for use by relay applications\n that need to handle arbitrary Diameter applications. A service implementing a\n specific Diameter application (for which it configures a dictionary) can\n manipulate values of type [message()](`m:diameter_codec#message`) instead.\n\n Fields have the following types.\n\n - **`code = uint32()`**\n\n - **`is_mandatory = boolean()`**\n\n - **`need_encryption = boolean()`**\n\n - **`vendor_id = uint32() | undefined`** - Values in the AVP header,\n corresponding to AVP Code, the M flag, P flags and Vendor-ID respectively. A\n Vendor-ID other than `undefined` implies a set V flag.\n\n - **`data = iolist()`** - The data bytes of the AVP.\n\n - **`name = atom()`** - The name of the AVP as defined in the dictionary file\n in question, or `undefined` if the AVP is unknown to the dictionary file in\n question.\n\n - **`value = term()`** - The decoded value of an AVP. Will be `undefined` on\n decode if the data bytes could not be decoded, the AVP is unknown, or if the\n [decode format](`m:diameter#decode_format`) is `none`. The type of a decoded\n value is as document in [diameter_dict(4)](diameter_dict.md#DATA_TYPES).\n\n - **`type = atom()`** - The type of the AVP as specified in the dictionary\n file in question (or one it inherits). Possible types are `undefined` and\n the Diameter types: `OctetString`, `Integer32`, `Integer64`, `Unsigned32`,\n `Unsigned64`, `Float32`, `Float64`, `Grouped`, `Enumerated`, `Address`,\n `Time`, `UTF8String`, `DiameterIdentity`, `DiameterURI`, `IPFilterRule` and\n `QoSFilterRule`.\n\n- **`dictionary() = module()`{: #dictionary }** - The name of a generated\n dictionary module as generated by [diameterc(1)](diameterc_cmd.md) or\n `diameter_make:codec/2`. The interface provided by a dictionary module is an\n implementation detail that may change.\n\n- **`header() = #diameter_header{}`{: #header }** - The record representation of\n the Diameter header. Values in a [packet()](`m:diameter_codec#packet`)\n returned by `decode/2` are as extracted from the incoming message. Values set\n in an [packet()](`m:diameter_codec#packet`) passed to `encode/2` are preserved\n in the encoded binary(), with the exception of `length`, `cmd_code` and\n `application_id`, all of which are determined by the\n [dictionary()](`m:diameter_codec#dictionary`) in question.\n\n > #### Note {: .info }\n >\n > It is not necessary to set header fields explicitly in outgoing messages as\n > diameter itself will set appropriate values. Setting inappropriate values\n > can be useful for test purposes.\n\n Fields have the following types.\n\n - **`version = uint8()`**\n\n - **`length = uint24()`**\n\n - **`cmd_code = uint24()`**\n\n - **`application_id = uint32()`**\n\n - **`hop_by_hop_id = uint32()`**\n\n - **`end_to_end_id = uint32()`** - Values of the Version, Message Length,\n Command-Code, Application-ID, Hop-by-Hop Identifier and End-to-End\n Identifier fields of the Diameter header.\n\n - **`is_request = boolean()`**\n\n - **`is_proxiable = boolean()`**\n\n - **`is_error = boolean()`**\n\n - **`is_retransmitted = boolean()`** - Values corresponding to the R(equest),\n P(roxiable), E(rror) and T(Potentially re-transmitted message) flags of the\n Diameter header.\n\n- **`message() = record() | maybe_improper_list()`{: #message }** - The\n representation of a Diameter message as passed to `diameter:call/4` or\n returned from a [handle_request/3](`c:diameter_app:handle_request/3`)\n callback. The record representation is as outlined in\n [diameter_dict(4)](diameter_dict.md#MESSAGE_RECORDS): a message as defined in\n a dictionary file is encoded as a record with one field for each component\n AVP. Equivalently, a message can also be encoded as a list whose head is the\n atom-valued message name (as specified in the relevant dictionary file) and\n whose tail is either a list of AVP name/values pairs or a map with values\n keyed on AVP names. The format at decode is determined by\n [diameter:service_opt()](`m:diameter#service_opt`)\n [decode_format](`m:diameter#decode_format`). Any of the formats is accepted at\n encode.\n\n Another list-valued representation allows a message to be specified as a list\n whose head is a [header()](`m:diameter_codec#header`) and whose tail is an\n [avp()](`m:diameter_codec#avp`) list. This representation is used by diameter\n itself when relaying requests as directed by the return value of a\n [handle_request/3](`c:diameter_app:handle_request/3`) callback. It differs\n from the other two in that it bypasses the checks for messages that do not\n agree with their definitions in the dictionary in question: messages are sent\n exactly as specified.\n\n- **`packet() = #diameter_packet{}`{: #packet }** - A container for incoming and\n outgoing Diameter messages. Fields have the following types.\n\n - **`header = `[`header()`](`m:diameter_codec#header`)` | undefined`** - The\n Diameter header of the message. Can be (and typically should be) `undefined`\n for an outgoing message in a non-relay application, in which case diameter\n provides appropriate values.\n\n - **`avps = [`[`avp()`](`m:diameter_codec#avp`)`] | undefined`** - The AVPs of\n the message. Ignored for an outgoing message if the `msg` field is set to a\n value other than `undefined`.\n\n - **`msg = `[`message()`](`m:diameter_codec#message`)` | undefined`** - The\n incoming/outgoing message. For an incoming message, a term corresponding to\n the configured [decode format](`m:diameter#decode_format`) if the message\n can be decoded in a non-relay application, `undefined` otherwise. For an\n outgoing message, setting a\n `[`[`header()`](`m:diameter_codec#header`)`|`[`avp()`](`m:diameter_codec#avp`)`]`\n list is equivalent to setting the `header` and `avps` fields to the\n corresponding values.\n\n > #### Warning {: .warning }\n >\n > A value in the `msg` field does _not_ imply an absence of decode errors.\n > The `errors` field should also be examined.\n\n - **`bin = binary()`** - The incoming message prior to encode or the outgoing\n message after encode.\n\n - **`errors = [5000..5999 | {5000..5999, avp()}]`** - Errors detected at\n decode of an incoming message, as identified by a corresponding 5xxx series\n Result-Code (Permanent Failures). For an incoming request, these should be\n used to formulate an appropriate answer as documented for the\n [handle_request/3](`c:diameter_app:handle_request/3`) callback in\n `m:diameter_app`. For an incoming answer, the\n [diameter:application_opt()](`m:diameter#application_opt`) `answer_errors`\n determines the behaviour.\n\n - **`transport_data = term()`** - An arbitrary term of meaning only to the\n transport process in question, as documented in `m:diameter_transport`.","title":"DATA TYPES - diameter_codec","ref":"diameter_codec.html#module-data-types"},{"type":"module","doc":"[diameterc(1)](diameterc_cmd.md), `m:diameter_app`,\n[diameter_dict(4)](diameter_dict.md), `m:diameter_make`","title":"SEE ALSO - diameter_codec","ref":"diameter_codec.html#module-see-also"},{"type":"function","doc":"Decode a Diameter message.","title":"diameter_codec.decode/2","ref":"diameter_codec.html#decode/2"},{"type":"function","doc":"Encode a Diameter message.","title":"diameter_codec.encode/2","ref":"diameter_codec.html#encode/2"},{"type":"type","doc":"The name of a generated [dictionary module](`m:diameter_codec#dictionary`)\nas generated by [diameterc(1)](diameterc_cmd.md) or `diameter_make:codec/2`.\nThe interface provided by a dictionary module is an\nimplementation detail that may change.","title":"diameter_codec.dictionary/0","ref":"diameter_codec.html#t:dictionary/0"},{"type":"type","doc":"The representation of a Diameter [message](`m:diameter_codec#message`)\nas passed to `diameter:call/4` or returned from a\n[handle_request/3](`c:diameter_app:handle_request/3`) callback.","title":"diameter_codec.message/0","ref":"diameter_codec.html#t:message/0"},{"type":"type","doc":"A [container](`m:diameter_codec#packet`) for incoming and outgoing\nDiameter messages.","title":"diameter_codec.packet/0","ref":"diameter_codec.html#t:packet/0"},{"type":"type","doc":"","title":"diameter_codec.record/0","ref":"diameter_codec.html#t:record/0"},{"type":"module","doc":"Diameter dictionary compilation.\n\nThe function `codec/2` is used to compile a diameter\n[dictionary file](diameter_dict.md) into Erlang source. The resulting source\nimplements the interface diameter requires to encode and decode the dictionary's\nmessages and AVPs.\n\nThe utility [diameterc(1)](diameterc_cmd.md) provides an alternate compilation\ninterface.","title":"diameter_make","ref":"diameter_make.html"},{"type":"module","doc":"Unrecognized options are silently ignored.","title":"BUGS - diameter_make","ref":"diameter_make.html#module-bugs"},{"type":"module","doc":"[diameterc(1)](diameterc_cmd.md), [diameter_dict(4)](diameter_dict.md)","title":"SEE ALSO - diameter_make","ref":"diameter_make.html#module-see-also"},{"type":"function","doc":"Compile a single dictionary file.\n\nThe input `File` can be either a path or a literal dictionary, the occurrence\nof newline (ascii NL) or carriage return (ascii CR) identifying the latter.\n`Opt` determines the format of the results and whether they are written to\nfile or returned, and can have the following types.\n\n- **`parse | forms | erl | hrl`** - Specifies an output format. Whether the\n output is returned or written to file depends on whether or not option\n `return` is specified. When written to file, the resulting file(s) will have\n extensions `.D`, `.F`, `.erl`, and `.hrl` respectively, basenames defaulting\n to `dictionary` if the input dictionary is literal and does not specify\n [`@name`](diameter_dict.md#name). When returned, results are in the order of\n the corresponding format options. Format options default to `erl` and `hrl`\n (in this order) if unspecified.\n\n The `parse` format is an internal representation that can be passed to\n `flatten/1` and `format/1`, while the `forms` format can be passed to\n `compile:forms/2`. The `erl` and `hrl` formats are returned as iolists.\n\n- **`{include, string()}`** - Prepend the specified directory to the code path.\n Use to point at beam files compiled from inherited dictionaries,\n [`@inherits`](diameter_dict.md#inherits) in a dictionary file creating a beam\n dependency, not an erl/hrl dependency.\n\n Multiple `include` options can be specified.\n\n- **`{outdir, string()}`** - Write generated source to the specified directory.\n Defaults to the current working directory. Has no effect if option `return` is\n specified.\n\n- **`return`** - Return results in a `{ok, [Out]}` tuple instead of writing to\n file and returning `ok`.\n\n- **`{name|prefix, string()}`** - Transform the input dictionary before\n compilation, setting [`@name`](diameter_dict.md#name) or\n [`@prefix`](diameter_dict.md#prefix) to the specified string.\n\n- **`{inherits, string()}`** - Transform the input dictionary before\n compilation, appending [`@inherits`](diameter_dict.md#inherits) of the\n specified string.\n\n Two forms have special meaning:\n\n ```text\n {inherits, \"-\"}\n {inherits, \"Prev/Mod\"}\n ```\n\n The first has the effect of clearing any previous inherits, the second of\n replacing a previous inherits of `Prev` to one of `Mod`. This allows the\n semantics of the input dictionary to be changed without modifying the file\n itself.\n\n Multiple `inherits` options can be specified.\n\nNote that a dictionary's [`@name`](diameter_dict.md#name), together with the\n`outdir` option, determine the output paths when the `return` option is not\nspecified. The [`@name`](diameter_dict.md#name) of a literal input dictionary\ndefaults to `dictionary`.\n\nA returned error reason can be converted into a readable string using\n`format_error/1`.","title":"diameter_make.codec/2","ref":"diameter_make.html#codec/2"},{"type":"function","doc":"Reconstitute a parsed dictionary, as returned by `codec/2`, without using\n[`@inherits`](diameter_dict.md#inherits). That is, construct an equivalent\ndictionary in which all AVP's are definined in the dictionary itself. The return\nvalue is also a parsed dictionary.","title":"diameter_make.flatten/1","ref":"diameter_make.html#flatten/1"},{"type":"function","doc":"Turns a parsed dictionary, as returned by `codec/2`, back into the dictionary\nformat.","title":"diameter_make.format/1","ref":"diameter_make.html#format/1"},{"type":"function","doc":"Turn an error reason returned by `codec/2` into a readable string.","title":"diameter_make.format_error/1","ref":"diameter_make.html#format_error/1"},{"type":"type","doc":"","title":"diameter_make.dict/0","ref":"diameter_make.html#t:dict/0"},{"type":"type","doc":"","title":"diameter_make.opt/0","ref":"diameter_make.html#t:opt/0"},{"type":"type","doc":"","title":"diameter_make.parsed/0","ref":"diameter_make.html#t:parsed/0"},{"type":"module","doc":"Diameter transport over SCTP.\n\nThis module implements diameter transport over SCTP using `m:gen_sctp`. It can\nbe specified as the value of a transport_module option to\n`diameter:add_transport/2` and implements the behaviour documented in\n`m:diameter_transport`.\n\n[](){: #start }","title":"diameter_sctp","ref":"diameter_sctp.html"},{"type":"module","doc":"`m:diameter`, `m:diameter_transport`, `m:gen_sctp`, `m:inet`","title":"SEE ALSO - diameter_sctp","ref":"diameter_sctp.html#module-see-also"},{"type":"function","doc":"The start function required by `m:diameter_transport`.\n\nOptions `raddr` and `rport` specify the remote address and port for a connecting\ntransport and not valid for a listening transport: the former is required while\nlatter defaults to 3868 if unspecified. Multiple `raddr` options can be\nspecified, in which case the connecting transport in question attempts each in\nsequence until an association is established.\n\nOption `accept` specifies remote addresses for a listening transport and is not\nvalid for a connecting transport. If specified, a remote address that does not\nmatch one of the specified addresses causes the association to be aborted.\nMultiple `accept` options can be specified. A string-valued `Match` that does\nnot parse as an address is interpreted as a regular expression.\n\nOption `unordered` specifies whether or not to use unordered delivery, integer\n`N` being equivalent to `N = #### Warning {: .warning }\n>\n> An small receive buffer may result in a peer having to resend incoming\n> messages: set the `m:inet` option `recbuf` to increase the buffer size.\n>\n> An small send buffer may result in outgoing messages being discarded: set the\n> `m:inet` option `sndbuf` to increase the buffer size.","title":"diameter_sctp.start/3","ref":"diameter_sctp.html#start/3"},{"type":"type","doc":"","title":"diameter_sctp.connect_option/0","ref":"diameter_sctp.html#t:connect_option/0"},{"type":"type","doc":"","title":"diameter_sctp.listen_option/0","ref":"diameter_sctp.html#t:listen_option/0"},{"type":"type","doc":"","title":"diameter_sctp.match/0","ref":"diameter_sctp.html#t:match/0"},{"type":"type","doc":"","title":"diameter_sctp.option/0","ref":"diameter_sctp.html#t:option/0"},{"type":"module","doc":"","title":"diameter_service","ref":"diameter_service.html"},{"type":"type","doc":"State of the watchdog","title":"diameter_service.wd_state/0","ref":"diameter_service.html#t:wd_state/0"},{"type":"module","doc":"Diameter transport over TCP.\n\nThis module implements diameter transport over TCP using `m:gen_tcp`. It can be\nspecified as the value of a `transport_module` option to\n`diameter:add_transport/2` and implements the behaviour documented in\n`m:diameter_transport`. TLS security is supported, either as an upgrade\nfollowing capabilities exchange or at connection establishment.\n\nNote that the ssl application is required for TLS and must be started before\nconfiguring TLS capability on diameter transports.\n\n[](){: #start }","title":"diameter_tcp","ref":"diameter_tcp.html"},{"type":"module","doc":"`m:diameter`, `m:diameter_transport`, `m:gen_tcp`, `m:inet`, `m:ssl`","title":"SEE ALSO - diameter_tcp","ref":"diameter_tcp.html#module-see-also"},{"type":"function","doc":"start({Type, Ref}, Svc, [Opt]) -> {ok, Pid} | {ok, Pid, [LAddr]} | {error,\nReason}\n\nThe start function required by `m:diameter_transport`.\n\nOptions `raddr` and `rport` specify the remote address and port for a connecting\ntransport and are not valid for a listening transport.\n\nOption `accept` specifies remote addresses for a listening transport and is not\nvalid for a connecting transport. If specified, a remote address that does not\nmatch one of the specified addresses causes the connection to be aborted.\nMultiple `accept` options can be specified. A string-valued `Match` that does\nnot parse as an address is interpreted as a regular expression.\n\nOption `ssl_options` must be specified for a transport that should support TLS:\na value of `true` results in a TLS handshake immediately upon connection\nestablishment while `t:list/0` specifies options to be passed to `ssl:connect/2`\nor `ssl:handshake/2` after capabilities exchange if TLS is negotiated.\n\nOption `fragment_timer` specifies the timeout, in milliseconds, of a timer used\nto flush messages from the incoming byte stream even if the number of bytes\nindicated in the Message Length field of its Diameter Header have not yet been\naccumulated: such a message is received over the transport interface after two\nsuccessive timeouts without the reception of additional bytes. Defaults to 1000.\n\n[](){: #sender }\n\nOption `sender` specifies whether or not to use a dedicated process for sending\noutgoing messages, which avoids the possibility of send blocking reception.\nDefaults to `false`. If set to `true` then a `message_cb` that avoids the\npossibility of messages being queued in the sender process without bound should\nbe configured.\n\nOption `message_cb` specifies a callback that is invoked on incoming and\noutgoing messages, that can be used to implement flow control. It is applied to\ntwo arguments: an atom indicating the reason for the callback (`send`, `recv`,\nor `ack` after a completed send), and the message in question (binary() on\n`recv`, binary() or diameter*packet record on `send` or `ack`, or `false` on\n`ack` when an incoming request has been discarded). It should return a list of\nactions and a new callback as tail; eg. `[fun cb/3, State]`. Valid actions are\nthe atoms `send` or `recv`, to cause a following message-valued action to be\nsent/received, a message to send/receive (binary() or diameter_packet record),\nor a boolean() to enable/disable reading on the socket. More than one\n`send`/`recv`/message sequence can be returned from the same callback, and an\ninitial `send`/`recv` can be omitted if the same as the value passed as the\ncallback's first argument. Reading is initially enabled, and returning `false`\ndoes not imply there cannot be subsequent `recv` callbacks since messages may\nalready have been read. An empty tail is equivalent to the prevailing callback.\nDefaults to a callback equivalent to `fun(ack, *) -> []; (\\_, Msg) -> [Msg]\nend`.\n\nRemaining options are any accepted by `ssl:connect/3` or `gen_tcp:connect/3` for\na connecting transport, or `ssl:listen/2` or `gen_tcp:listen/2` for a listening\ntransport, depending on whether or not `{ssl_options, true}` has been specified.\nOptions `binary`, `packet` and `active` cannot be specified. Also, option `port`\ncan be specified for a listening transport to specify the local listening port,\nthe default being the standardized 3868. Note that the option `ip` specifies the\nlocal address.\n\nAn `ssl_options` list must be specified if and only if the transport in question\nhas set `Inband-Security-Id` to 1 (`TLS`), as specified to either\n`diameter:start_service/2` or `diameter:add_transport/2`, so that the transport\nprocess will receive notification of whether or not to commence with a TLS\nhandshake following capabilities exchange. Failing to specify an options list on\na TLS-capable transport for which TLS is negotiated will cause TLS handshake to\nfail. Failing to specify TLS capability when `ssl_options` has been specified\nwill cause the transport process to wait for a notification that will not be\nforthcoming, which will eventually cause the RFC 3539 watchdog to take down the\nconnection.\n\nThe first element of a non-empty `Host-IP-Address` list in `Svc` provides the\nlocal IP address if an `ip` option is not specified. The local address is either\nreturned from`start/3` or passed in a `connected` message over the transport\ninterface.","title":"diameter_tcp.start/3","ref":"diameter_tcp.html#start/3"},{"type":"type","doc":"","title":"diameter_tcp.connect_option/0","ref":"diameter_tcp.html#t:connect_option/0"},{"type":"type","doc":"","title":"diameter_tcp.listen_option/0","ref":"diameter_tcp.html#t:listen_option/0"},{"type":"type","doc":"","title":"diameter_tcp.match/0","ref":"diameter_tcp.html#t:match/0"},{"type":"type","doc":"","title":"diameter_tcp.option/0","ref":"diameter_tcp.html#t:option/0"},{"type":"behaviour","doc":"Diameter transport interface.\n\nA module specified as a `transport_module` to `diameter:add_transport/2` must\nimplement the interface documented here. The interface consists of a function\nwith which diameter starts a transport process and a message interface with\nwhich the transport process communicates with the process that starts it (aka\nits parent).","title":"diameter_transport","ref":"diameter_transport.html"},{"type":"behaviour","doc":"- **`message() = binary() | `[`diameter_codec:packet()`](`m:diameter_codec#packet`)**{: #message } -\n A Diameter message as passed over the transport interface.\n\n For an inbound message from a transport process, a\n [diameter_codec:packet()](`m:diameter_codec#packet`) must contain the received\n message in its `bin` field. In the case of an inbound request, any value set\n in the `transport_data` field will passed back to the transport module in the\n corresponding answer message, unless the sender supplies another value.\n\n For an outbound message to a transport process, a\n [diameter_codec:packet()](`m:diameter_codec#packet`) has a value other than\n `undefined` in its `transport_data` field and has the binary() to send in its\n `bin` field.\n\n[](){: #MESSAGES }","title":"DATA TYPES - diameter_transport","ref":"diameter_transport.html#module-data-types"},{"type":"behaviour","doc":"All messages sent over the transport interface are of the form\n`{diameter, term()}`.\n\nA transport process can expect messages of the following types from its parent.\n\n- **`{diameter, {send, `[`message()`](`m:diameter_transport#message`)` | false}}`** -\n An outbound Diameter message. The atom `false` can only be received when\n request acknowledgements have been requests: see the `ack` message below.\n\n- **`{diameter, {close, Pid}}`** - A request to terminate the transport process\n after having received DPA in response to DPR. The transport process should\n exit. `Pid` is the pid() of the parent process.\n\n- **`{diameter, {tls, Ref, Type, Bool}}`** - Indication of whether or not\n capabilities exchange has selected inband security using TLS. `Ref` is a\n reference() that must be included in the `{diameter, {tls, Ref}}` reply\n message to the transport's parent process (see below). `Type` is either\n `connect` or `accept` depending on whether the process has been started for a\n connecting or listening transport respectively. `Bool` is a boolean()\n indicating whether or not the transport connection should be upgraded to TLS.\n\n If TLS is requested (`Bool=true`) then a connecting process should initiate a\n TLS handshake with the peer and an accepting process should prepare to accept\n a handshake. A successful handshake should be followed by a\n `{diameter, {tls, Ref}}` message to the parent process. A failed handshake\n should cause the process to exit.\n\n This message is only sent to a transport process over whose\n `Inband-Security-Id` configuration has indicated support for TLS.\n\nA transport process should send messages of the following types to its parent.\n\n- **`{diameter, {self(), connected}}`** - Inform the parent that the transport\n process with `Type=accept` has established a connection with the peer. Not\n sent if the transport process has `Type=connect`.\n\n- **`{diameter, {self(), connected, Remote}}`**\n\n- **`{diameter, {self(), connected, Remote, [LocalAddr]}}`** - Inform the parent\n that the transport process with `Type=connect` has established a connection\n with a peer. Not sent if the transport process has `Type=accept`.  `Remote` is\n an arbitrary term that uniquely identifies the remote endpoint to which the\n transport has connected. A `LocalAddr` list has the same semantics as one\n returned from `c:start/3`.\n\n- **`{diameter, ack}`** - Request acknowledgements of unanswered requests. A\n transport process should send this once before passing incoming Diameter\n messages into diameter. As a result, every Diameter request passed into\n diameter with a `recv` message (below) will be answered with a `send` message\n (above), either a [message()](`m:diameter_transport#message`) for the\n transport process to send or the atom `false` if the request has been\n discarded or otherwise not answered.\n\n This is to allow a transport process to keep count of the number of incoming\n request messages that have not yet been answered or discarded, to allow it to\n regulate the amount of incoming traffic. Both diameter_tcp and diameter_sctp\n request acknowledgements when a `message_cb` is configured, turning send/recv\n message into callbacks that can be used to regulate traffic.\n\n- **`{diameter, {recv, `[`message()`](`m:diameter_transport#message`)`}}`** - An\n inbound Diameter message.\n\n- **`{diameter, {tls, Ref}}`** - Acknowledgment of a successful TLS handshake.\n `Ref` is the reference() received in the `{diameter, {tls, Ref, Type, Bool}}`\n message in response to which the reply is sent. A transport must exit if a\n handshake is not successful.","title":"MESSAGES - diameter_transport","ref":"diameter_transport.html#module-messages"},{"type":"behaviour","doc":"`m:diameter_tcp`, `m:diameter_sctp`","title":"SEE ALSO - diameter_transport","ref":"diameter_transport.html#module-see-also"},{"type":"callback","doc":"Start a transport process. Called by diameter as a consequence of a call to\n`diameter:add_transport/2` in order to establish or accept a transport\nconnection respectively. A transport process maintains a connection with a\nsingle remote peer.\n\n`Type` indicates whether the transport process in question is being started for\na connecting (`Type=connect`) or listening (`Type=accept`) transport. In the\nlatter case, transport processes are started as required to accept connections\nfrom multiple peers.\n\nRef is the value that was returned from the call to `diameter:add_transport/2`\nthat has lead to starting of a transport process.\n\n`Svc` contains capabilities passed to `diameter:start_service/2` and\n`diameter:add_transport/2`, values passed to the latter overriding those passed\nto the former.\n\n`Config` is as passed in `transport_config` tuple in the\n[diameter:transport_opt()](`m:diameter#transport_opt`) list passed to\n`diameter:add_transport/2`.\n\nThe start function should use the `Host-IP-Address` list in `Svc` and/or\n`Config` to select and return an appropriate list of local IP addresses. In the\nconnecting case, the local address list can instead be communicated in a\n`connected` message (see [MESSAGES](`m:diameter_transport#MESSAGES`) below)\nfollowing connection establishment. In either case, the local address list is\nused to populate `Host-IP-Address` AVPs in outgoing capabilities exchange\nmessages if `Host-IP-Address` is unspecified.\n\nA transport process must implement the message interface documented below. It\nshould retain the pid of its parent, monitor the parent and terminate if it\ndies. It should not link to the parent. It should exit if its transport\nconnection with its peer is lost.","title":"diameter_transport.start/3","ref":"diameter_transport.html#c:start/3"},{"type":"extras","doc":"\n# Release Notes\n\nReleases are listed in reverse chronological order, most recent first.","title":"Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"diameter 2.4.1 - Release Notes","ref":"notes.html#diameter-2-4-1"},{"type":"extras","doc":"- Function specs for the main API module has been updated.\n\n Own Id: OTP-19126 Aux Id: [#8399]\n\n- Man pages are now available for `erl`, `erlc`, `dialyzer`, and all other programs that are included in Erlang/OTP.\n\n Own Id: OTP-19201 Aux Id: [PR-8740]\n\n- `diameter:stop_service/1` has been made more synchronous.\n\n Own Id: OTP-19206 Aux Id: ERIERL-1102\n\n[#8399]: https://github.com/erlang/otp/issues/8399\n[PR-8740]: https://github.com/erlang/otp/pull/8740","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.4 - Release Notes","ref":"notes.html#diameter-2-4"},{"type":"extras","doc":"- `-callback` attributes have been added to `m:diameter_app` and `m:diameter_transport`.\n\n Own Id: OTP-18783 Aux Id: [PR-7699]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- Pick peer can now also handle request of type `#diameter_packet{}`.\n\n Own Id: OTP-19090 Aux Id: [PR-8399]\n\n[PR-7699]: https://github.com/erlang/otp/pull/7699\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8399]: https://github.com/erlang/otp/pull/8399","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 2.3.2.2 - Release Notes","ref":"notes.html#diameter-2-3-2-2"},{"type":"extras","doc":"* Stop service has been made more synchronous.\n\n Own Id: OTP-19206 Aux Id: ERIERL-1102","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.3.2.1 - Release Notes","ref":"notes.html#diameter-2-3-2-1"},{"type":"extras","doc":"* Pick peer can now also handle request of type #diameter_packet\\{\\}.\n\n Own Id: OTP-19090 Aux Id: PR-8399","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 2.3.2 - Release Notes","ref":"notes.html#diameter-2-3-2"},{"type":"extras","doc":"* Reduce the impact of calling service_info by not counting the binaries (on the heap) info, This is done by introducing an option, bins_info, which controls this.\n\n Own Id: OTP-19040 Aux Id: ERIERL-1060","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.3.1 - Release Notes","ref":"notes.html#diameter-2-3-1"},{"type":"extras","doc":"- Replaced unintentional Erlang Public License 1.1 headers in some files with\n the intended Apache License 2.0 header.\n\n Own Id: OTP-18815 Aux Id: PR-7780","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.3 - Release Notes","ref":"notes.html#diameter-2-3"},{"type":"extras","doc":"- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18405 Aux Id:\n GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814\n\n- Deprecates `dbg:stop_clear/0` because it is simply a function alias to\n `dbg:stop/0`\n\n Own Id: OTP-18478 Aux Id: GH-6903\n\n- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n appropriate, instead of `proc_lib:init_ack/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 2.2.7.2 - Release Notes","ref":"notes.html#diameter-2-2-7-2"},{"type":"extras","doc":"* \\`diameter:stop_service/1\\` has been made more synchronous.\n\n Own Id: OTP-19206 Aux Id: ERIERL-1102","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2.7.1 - Release Notes","ref":"notes.html#diameter-2-2-7-1"},{"type":"extras","doc":"* Reduce the impact of calling service_info by not counting the binaries (on the heap) info, This is done by introducing an option, bins_info, which controls this.\n\n Own Id: OTP-19040 Aux Id: ERIERL-1060","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2.7 - Release Notes","ref":"notes.html#diameter-2-2-7"},{"type":"extras","doc":"- There is a new configure option, `--enable-deterministic-build`, which will\n apply the `deterministic` compiler option when building Erlang/OTP. The\n `deterministic` option has been improved to eliminate more sources of\n non-determinism in several applications.\n\n Own Id: OTP-18165 Aux Id: PR-5965","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 2.2.6 - Release Notes","ref":"notes.html#diameter-2-2-6"},{"type":"extras","doc":"- Fix decode of non-IP address types; that is, of values of the derived AVP data\n format Address whose first two octets specify an address family other than 1\n (IP) or 2 (IP6). Such values have never been decoded, and were treated as\n decode errors. They're now decoded to a 2-tuple of the integer() address\n family and binary() remaining octets, with no family-specific decode. The\n 2-tuple distinguishes the decode from the 4-tuple and 8-tuple IP address\n decodes. 2-tuples are also now encoded.\n\n Note that even currently unassigned address families are decoded: only the\n reserved values, 0 and 65535, are treated as errors.\n\n Own Id: OTP-17976 Aux Id: GH-5463","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2.5 - Release Notes","ref":"notes.html#diameter-2-2-5"},{"type":"extras","doc":"- The compilation time is no longer recorded in BEAM files. There remained\n several undocumented functions that attempted to retrieve compilation times.\n Those have now been removed.\n\n Own Id: OTP-17962","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2.4 - Release Notes","ref":"notes.html#diameter-2-2-4"},{"type":"extras","doc":"- The unordered option was ignored on a client diameter_sctp transport, causing\n all delivery to be ordered.\n\n The association id was not specified to gen_sctp when requesting unordered\n delivery, causing the setting to be applied to the whole endpoint.\n\n Thanks to Bengt Kleberg and Andreas Schultz.\n\n Own Id: OTP-17366 Aux Id: GH-4775","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2.3 - Release Notes","ref":"notes.html#diameter-2-2-3"},{"type":"extras","doc":"- Add the 'first' tuple to type diameter:peer_filter/0. The filter was added in\n OTP-17.5.6.8 and OTP-18.3, but neither release updated the type specification.\n\n Own Id: OTP-16548 Aux Id: ERL-1191","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2.2 - Release Notes","ref":"notes.html#diameter-2-2-2"},{"type":"extras","doc":"- The possibility of choosing a handler process for an incoming Diameter request\n with a configured MFA was documented in OTP 20.0, but counters (with\n \\{traffic_counters, true\\}) were not incremented when this process was on a\n remote node. Counters are now incremented on the node that configures the\n transport in question.\n\n Introduced in OTP 21.3.\n\n Own Id: OTP-16457\n\n- Transport options differing from those passed to diameter:add_transport/2 were\n used in several situations: when starting a transport process after\n connect_timer expiry after an initial connection attempt has failed, when\n starting a transport process after a connection has been accepted, when\n sending events, when returning options in diameter:service_info/2, and\n possibly more. In particular, the following configuration options to\n diameter:add_transport/2 were dropped: avp_dictionaries, incoming_maxlen,\n spawn_opt, strict_mbit.\n\n Moreover, any service options mistakenly passed to diameter:add_transport/2\n were interpreted as such, instead of being ignored as the documentation\n states, with the consequence that outgoing and incoming requests saw different\n values of some options, some were always taken from transport options, and\n others from service options.\n\n diameter:add_transport/2 must be called in new code for the fix to have\n effect.\n\n Introduced in OTP 20.1.\n\n Own Id: OTP-16459","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2.1 - Release Notes","ref":"notes.html#diameter-2-2-1"},{"type":"extras","doc":"- Fix inadvertently broad monitor that resulted in gen_server cast messages to\n hidden nodes from module diameter_dist.\n\n Own Id: OTP-15768","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.2 - Release Notes","ref":"notes.html#diameter-2-2"},{"type":"extras","doc":"- Fix failure of incoming answer message with faulty Experimental-Result-Code.\n Failure to decode the AVP resulted in an uncaught exception, with no no\n handle_answer/error callback as a consequence.\n\n Own Id: OTP-15569 Aux Id: ERIERL-302","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add spawn_opt MFA configuration to allow a callback to spawn a handler process\n for an incoming Diameter request on an an arbitrary node. Module diameter_dist\n provides a route_session/2 that can be used to distribute requests based on\n Session-Id, although this module is currently only documented in the module\n itself and may change.\n\n Own Id: OTP-15398","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 2.1.6 - Release Notes","ref":"notes.html#diameter-2-1-6"},{"type":"extras","doc":"- Fix function_clause when sending an outgoing request after DPA has been sent\n in response to an incoming DPR. The caused the diameter_peer_fsm gen_server\n associated with the peer connection to fail, which could then result in the\n transport connection being reset before the peer closed it upon reception of\n DPA.\n\n Own Id: OTP-15198 Aux Id: ERIERL-213","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.1.5 - Release Notes","ref":"notes.html#diameter-2-1-5"},{"type":"extras","doc":"- Fix documentation typos.\n\n Own Id: OTP-15045","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.1.4.1 - Release Notes","ref":"notes.html#diameter-2-1-4-1"},{"type":"extras","doc":"- Fix failure of incoming answer message with faulty Experimental-Result-Code.\n Failure to decode the AVP resulted in an uncaught exception, with no no\n handle_answer/error callback as a consequence.\n\n Own Id: OTP-15569 Aux Id: ERIERL-302","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.1.4 - Release Notes","ref":"notes.html#diameter-2-1-4"},{"type":"extras","doc":"- Fix close of diameter_tcp/sctp listening socket at\n diameter:remove_transport/2, that was broken in diameter 2.1. A reconfigured\n transport could not listen on the same endpoint as a result.\n\n Own Id: OTP-14839\n\n- Fix handling of SUSPECT connections at service termination. A connection with\n this watchdog state caused diameter_service:terminate/2 to fail.\n\n Own Id: OTP-14947 Aux Id: ERIERL-124","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.1.3 - Release Notes","ref":"notes.html#diameter-2-1-3"},{"type":"extras","doc":"- Fix documentation typo: peer_up/3 was written where peer_down/3 was intended.\n\n Own Id: OTP-14805","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.1.2 - Release Notes","ref":"notes.html#diameter-2-1-2"},{"type":"extras","doc":"- A fault introduced in diameter 2.1 could cause decode errors to be ignored in\n AVPs following the header of a Grouped AVP.\n\n Own Id: OTP-14684 Aux Id: ERIERL-85","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.1.1 - Release Notes","ref":"notes.html#diameter-2-1-1"},{"type":"extras","doc":"- An inadvertently removed monitor in diameter 2.1 caused the ets table\n diameter_reg to leak entries, and caused service restart and more to fail.\n\n Own Id: OTP-14668 Aux Id: ERIERL-83","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 2.1 - Release Notes","ref":"notes.html#diameter-2-1"},{"type":"extras","doc":"- Fix handling of Proxy-Info in answer messages setting the E-bit.\n\n RFC 6733 requires that Proxy-Info AVPs in an incoming request be echoed in an\n outgoing answer. This was not done in answers formulated by diameter; for\n example, as a result of a handle_request callback having returned an\n 'answer-message' or protocol_error tuple.\n\n Own Id: OTP-9869\n\n- React to nodeup/nodedown when sharing peer connections.\n\n Service configuration share_peers and use_shared_peers did not respond to the\n coming and going of remote nodes.\n\n Own Id: OTP-14011\n\n- Fix inappropriate message callbacks.\n\n An incoming CER or DPR was regarded as discarded, resulting in a corresponding\n message callback (if configured) in diameter_tcp/sctp.\n\n Own Id: OTP-14486\n\n- Fix handling of 5009 errors (DIAMETER_AVP_OCCURS_TOO_MANY TIMES).\n\n RFC 6733 says that the first AVP that exceeds the bound should be reported,\n but the suggestions in the errors field of a diameter_packet record counted\n AVPs from the rear of the message, not the front. Additionally, diameter 2.0\n in OTP 20.0 broke the counting by accepting one more AVP than the message\n grammar in question allowed.\n\n Own Id: OTP-14512\n\n- Match case insensitively in diameter_tcp/sctp accept tuple.\n\n Matching of remote addresses when accepting connections in a listening\n transport was case-sensitive, causing the semantics to change as a consequence\n of (kernel) OTP-13006.\n\n Own Id: OTP-14535 Aux Id: OTP-13006\n\n- Fix backwards incompatibility of remote send when sharing transports.\n\n The sending of requests over a transport connection on a remote node running\n an older version of diameter was broken by diameter 2.0 in OTP 20.0.\n\n Own Id: OTP-14552\n\n- Fix diameter_packet.avps decode of Grouped AVP errors in Failed-AVP.\n\n Decode didn't produce a list of diameter_avp records, so information about\n faulty component AVPs was lost.\n\n Own Id: OTP-14607","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Let unordered delivery be configured in diameter_sctp.\n\n With option \\{unordered, boolean() | pos_integer()\\}, with false the default,\n and N equivalent to OS =< N, where OS is the number of outbound streams\n negotiated on the association in question. If configured, unordered sending\n commences upon reception of a second message, outgoing messages being sent on\n stream 0 before this.\n\n The default false is for backwards compatibility, but false or 1 should be set\n to follow RFC 6733's recommendation on the use of unordered sending to avoid\n head-of-line blocking. There is typically no meaningful order to preserve,\n since the order in which outgoing messages are received by a transport process\n isn't known to the sender.\n\n Own Id: OTP-10889\n\n- Complete/simplify Standards Compliance in User's Guide.\n\n Own Id: OTP-10927\n\n- Add service option decode_format.\n\n To allow incoming messages to be decoded into maps or lists instead of\n records. Messages can be presented in any of the formats for encode.\n\n Decode performance has also been improved.\n\n Own Id: OTP-14511 Aux Id: OTP-14343\n\n- Add service option traffic_counters.\n\n To let message-related counters be disabled, which can be a performance\n improvement in some usecases.\n\n Own Id: OTP-14521\n\n- Allow loopback/any as local addresses in diameter_tcp/sctp.\n\n The atoms were implied by documentation, but not handled in code.\n\n Own Id: OTP-14544\n\n- Add transport option strict_capx.\n\n To allow the RFC 6733 requirement that a transport connection be closed if a\n message is received before capabilities exchange to be relaxed.\n\n Own Id: OTP-14546\n\n- Be consistent with service/transport configuration.\n\n For options for which it's meaningful, defaults values for transport options\n can now be configured on a service. This was previously the case only for an\n arbitrary subset of options.\n\n Own Id: OTP-14555\n\n- Add service/transport option avp_dictionaries.\n\n To provide better support for AVPs that are not defined in the application\n dictionary: configuring additional dictionaries in an avp_dictionaries tuple\n allows their AVPs to be encoded/decoded in much the same fashion as\n application AVPs.\n\n The motivation is RFC 7683 Diameter Overload, Indicator Conveyance (DOIC),\n that defines AVPs intended to be piggybacked onto arbitrary messages. A DOIC\n dictionary has been included in the installation, in module\n diameter_gen_doic_rfc7683.\n\n Own Id: OTP-14588\n\n- Decode application AVPs in answers setting the E-bit.\n\n AVPs defined in the application of the message being sent were previously not\n decoded, only those in the common application that defines the answer-message\n grammar.\n\n Own Id: OTP-14596","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 2.0 - Release Notes","ref":"notes.html#diameter-2-0"},{"type":"extras","doc":"- Let candidate peers be passed to diameter:call/4\n\n With call option peer, to allow a request to be sent to a peer that hasn't\n advertised support for the application in question.\n\n RFC 6733 2.4 requires a node to send the application identifiers of all\n locally supported applications at capabilities exchange, but not all nodes\n respect this for the common application, and diameter itself will send\n D\\[WP]\\[RA] without the common application having been explicitly advertised.\n Regarding the common application as implicit renders Result-Code 5010\n (DIAMETER_NO_COMMON_APPLICATION) meaningless however, so allow any request to\n be sent as long as there is a configured dictionary to support it.\n\n Own Id: OTP-14338\n\n- Improve performance of message encode/decode and related handling.\n\n Dictionaries using @custom_types or @codecs will need to adapt the\n corresponding functions to accept an additional argument that is now passed\n through encode/decode, which was required to remove various process\n dictionary-based workarounds that have been used to solve problems in the\n past.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14343\n\n- Add transport options to avoid deadlock and allow for load regulation.\n\n Both diameter_tcp and diameter_sctp now accept two new configuration options:\n sender and message_cb. The former causes outgoing sends to take place in a\n dedicated process, to avoid the possibility of deadlock when both the\n transport process and its peer block in send. The latter allows a callback to\n control the reading of messages on the socket, to allow for backpressure\n towards peers when the rate of incoming traffic is greater than can otherwise\n be handled.\n\n Neither of these options are yet documented, but are unlikely to change unless\n problems are discovered. The sender option is not the default since it should\n probably always be used in combination with message_cb, to prevent incoming\n requests from being read at a higher rate than a peer allows outgoing answers\n to be sent.\n\n Own Id: OTP-14455 Aux Id: ERL-332","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.12.2 - Release Notes","ref":"notes.html#diameter-1-12-2"},{"type":"extras","doc":"- An improvement in the handling of peer failover in diameter 1.12.1 adversely\n affected performance when sending requests. Further, the inefficient use of a\n public table to route incoming answers has been removed.\n\n Own Id: OTP-14206\n\n- Fixed xml issues in old release notes\n\n Own Id: OTP-14269","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.12.1 - Release Notes","ref":"notes.html#diameter-1-12-1"},{"type":"extras","doc":"- Close diameter_tcp/sctp listening sockets at diameter:stop_service/1.\n\n Broken by OTP-13611.\n\n Own Id: OTP-13787 Aux Id: OTP-13611\n\n- Update build scripts to not make assumptions about where env, cp and perl are\n located.\n\n Own Id: OTP-13800","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.12 - Release Notes","ref":"notes.html#diameter-1-12"},{"type":"extras","doc":"- Ensure listening socket is closed at transport removal.\n\n Transport removal did not immediately close a `diameter_tcp/sctp` listening\n socket, and a subsequent peer connection caused it to remain open.\n\n Own Id: OTP-13611","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add `diameter:peer_info/1`.\n\n That retrieves information in the style of `diameter:service_info/2`, but for\n a single peer connection.\n\n Own Id: OTP-13508","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.11.2 - Release Notes","ref":"notes.html#diameter-1-11-2"},{"type":"extras","doc":"- Make peer handling more efficient.\n\n Inefficient lookup and manipulation of peer lists could result in poor\n performance when many outgoing requests were sent simultaneously, or when many\n peers connected simultaneously. Filtering peer lists on realm/host is now also\n more efficient in many cases.\n\n Own Id: OTP-13164\n\n- Fix handling of shared peer connections in watchdog state SUSPECT.\n\n A peer connection shared from a remote node was regarded as being up for the\n lifetime of the connection, ignoring watchdog transitions into state SUSPECT.\n\n Own Id: OTP-13342","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.11.1 - Release Notes","ref":"notes.html#diameter-1-11-1"},{"type":"extras","doc":"- Fix request table leaks\n\n The End-to-End and Hop-by-Hop identifiers of outgoing Diameter requests are\n stored in a table in order for the caller to be located when the corresponding\n answer message is received. Entries were orphaned if the handler was\n terminated by an exit signal as a consequence of actions taken by callback\n functions, or if callbacks modified identifiers in retransmission cases.\n\n Own Id: OTP-13137","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.11 - Release Notes","ref":"notes.html#diameter-1-11"},{"type":"extras","doc":"- Fix relay encode of nested, Grouped AVPs.\n\n A fault in OTP-12475 caused encode to fail if the first AVP in a Grouped AVP\n was itself Grouped.\n\n Own Id: OTP-12879 Aux Id: OTP-12475\n\n- Match acceptable peer addresses case insensitively.\n\n Regular expressions passed in an 'accept' tuple to diameter_tcp or\n diameter_sctp inappropriately matched case.\n\n Own Id: OTP-12902\n\n- Fix diameter_watchdog function clause.\n\n OTP-12912 introduced an error with accepting transports setting\n `{restrict_connections, false}`, causing processes to fail when peer\n connections were terminated.\n\n Own Id: OTP-12969","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Don't report 5005 (DIAMETER_AVP_MISSING) errors unnecessarily.\n\n An AVP whose decode failed was reported as missing, despite having been\n reported with another error as a consequence of the failure.\n\n Own Id: OTP-12871\n\n- Improve decode performance.\n\n The time required to decode a message increased quadratically with the number\n of AVPs in the worst case, leading to extremely long execution times.\n\n Own Id: OTP-12891\n\n- Improve watchdog and statistics performance.\n\n Inefficient use of timers contributed to poor performance at high load, as did\n ordering of the table statistics are written to.\n\n Own Id: OTP-12912\n\n- Add service_opt() strict_mbit.\n\n There are differing opinions on whether or not reception of an arbitrary AVP\n setting the M-bit is an error. The default interpretation is strict: if a\n command grammar doesn't explicitly allow an AVP setting the M-bit then\n reception of such an AVP is regarded as an error. Setting\n `{strict_mbit, false}` disables this check.\n\n Own Id: OTP-12947","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.10 - Release Notes","ref":"notes.html#diameter-1-10"},{"type":"extras","doc":"- Fix decode of Grouped AVPs containing errors.\n\n RFC 6733 says this of Failed-AVP in 7.5:\n\n - \\_\\_\\_\\_ -\n `In the case where the offending AVP is embedded within a Grouped AVP, the Failed-AVP MAY contain the grouped AVP, which in turn contains the single offending AVP. The same method MAY be employed if the grouped AVP itself is embedded in yet another grouped AVP and so on. In this case, the Failed-AVP MAY contain the grouped AVP hierarchy up to the single offending AVP. This enables the recipient to detect the location of the offending AVP when embedded in a group.`\n\n It says this of DIAMETER_INVALID_AVP_LENGTH in 7.1.5:\n\n - \\_\\_\\_\\_ -\n `The request contained an AVP with an invalid length. A Diameter message indicating this error MUST include the offending AVPs within a Failed-AVP AVP. In cases where the erroneous AVP length value exceeds the message length or is less than the minimum AVP header length, it is sufficient to include the offending AVP header and a zero filled payload of the minimum required length for the payloads data type. If the AVP is a Grouped AVP, the Grouped AVP header with an empty payload would be sufficient to indicate the offending AVP. In the case where the offending AVP header cannot be fully decoded when the AVP length is less than the minimum AVP header length, it is sufficient to include an offending AVP header that is formulated by padding the incomplete AVP header with zero up to the minimum AVP header length.`\n\n The AVPs placed in the errors field of a diameter_packet record are intended\n to be appropriate for inclusion in a Failed-AVP, but neither of the above\n paragraphs has been followed in the Grouped case: the entire faulty AVP\n (non-faulty components and all) has been included. This made it difficult to\n identify the actual faulty AVP in all but simple cases.\n\n The decode is now adapted to the RFC, and implements the suggested single\n faulty AVP, nested in as many Grouped containers as required.\n\n Own Id: OTP-12721\n\n- Fix SCTP problems on Solaris.\n\n The allocation of association ids in Solaris was in conflict with an\n assumption made in diameter_sctp, resulting in failures when accepting\n multiple peer connections.\n\n Own Id: OTP-12768\n\n- Fix start order of alternate transports.\n\n A transport configured with diameter:add_transport/2 can be passed multiple\n transport_module/transport_config tuples in order to specify alternate\n configuration, modules being attempted in order until one succeeds. This is\n primarily for the connecting case; for example, to allow a transport to be\n configured to first attempt connection over SCTP, and then TCP in case SCTP\n fails. Multiple module tuples can be paired with a single config tuple, but in\n this case the start order was reversed relative to the order in which the\n modules were specified.\n\n Own Id: OTP-12851","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Change license text from Erlang Public License to Apache Public License v2.\n\n Own Id: OTP-12845","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.9.2 - Release Notes","ref":"notes.html#diameter-1-9-2"},{"type":"extras","doc":"- Fix broken relay counters.\n\n OTP-12654 in OTP 17.5.3 broke counters in the case of answer messages received\n in the relay application. Counters were accumulated as unknown messages or\n no_result_code instead of as relayed messages on the intended Result-Code and\n 'Experimental-Result' tuples.\n\n Own Id: OTP-12741\n\n- Fix diameter_sctp listener race.\n\n An oversight in OTP-12428 made it possible to start a transport process that\n could not establish associations.\n\n Own Id: OTP-12744","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.9.1 - Release Notes","ref":"notes.html#diameter-1-9-1"},{"type":"extras","doc":"- Don't leave extra bit in decoded AVP data.\n\n OTP-12074 in OTP 17.3 missed one case: a length error on a trailing AVP\n unknown to the dictionary in question.\n\n Own Id: OTP-12642\n\n- Don't confuse Result-Code and Experimental-Result.\n\n The errors field of a decoded diameter_packet record was populated with a\n Result-Code AVP when an Experimental-Result containing a 3xxx Result-Code was\n received in an answer not setting the E-bit. The correct AVP is now extracted\n from the incoming message.\n\n Own Id: OTP-12654\n\n- Don't count on unknown Application Id.\n\n OTP-11721 in OTP 17.1 missed the case of an Application Id not agreeing with\n that of the dictionary in question, causing counters to be accumulated on keys\n containing the unknown id.\n\n Own Id: OTP-12701","title":"Known Bugs and Problems - Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"diameter 1.9 - Release Notes","ref":"notes.html#diameter-1-9"},{"type":"extras","doc":"- Don't discard outgoing answers unnecessarily.\n\n Answers missing a Result-Code AVP or setting an E-bit inappropriately were\n discarded even if encode was successful.\n\n Own Id: OTP-11492\n\n- Increase supervision timeouts.\n\n At diameter application shutdown, DPR could be omitted on open peer\n connections because of short supervision timeouts.\n\n Own Id: OTP-12412\n\n- Fix retransmission of messages sent as header/avps list.\n\n Extracting End-to-End and Hop-by-Hop Identifiers resulted in a function clause\n error, resulting in a handle_error callback.\n\n Own Id: OTP-12415\n\n- Fix diameter_avp decode of Grouped AVPs having decode errors.\n\n Components of such an AVP were not extracted, causing it to be represented by\n a single diameter_avp record instead of the intended list.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-12475\n\n- Fix ordering of AVPs in relayed messages.\n\n The order was reversed relative to the received order, with a Route-Record AVP\n prepended.\n\n Thanks to Andrzej Trawiński.\n\n Own Id: OTP-12551\n\n- Fix issues with DiameterURI encode/decode.\n\n RFC 6773 changed the default port and transport, but the RFC 3588 defaults\n were used even if the RFC 6733 common dictionary was in use. The RFC 3588\n defaults are now only used when the common dictionary is\n diameter_gen_base_rfc3588.\n\n Both RFC 3588 and 6733 disallow transport=udp;protocol=diameter. Encode of the\n combination now fails.\n\n Decode of ports numbers outside the range 0-65535 and fully qualified domain\n names longer than 255 octets now fails.\n\n Note that RFC 3588 is obsolete, and that there is a diameter_gen_base_rfc6733.\n The change in defaults is a potential interoperability problem when moving to\n RFC 6733 with peers that do not send all URI components. The fact that 6733\n allows 5xxx result codes in answer messages setting the E-bit, which RFC 3588\n doesn't, is another.\n\n Own Id: OTP-12589","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add service_opt() string_decode.\n\n To disable the decode of potentially large binaries to string. This prevents\n large strings from being copied when incoming Diameter messages are passed\n between processes, a vulnerability that can lead to memory being exhausted\n given sufficiently malicious peers.\n\n The value is a boolean(), true being the default for backwards compatibility.\n Setting false causes both diameter_caps records and decoded messages to\n contain binary() in relevant places that previously had string():\n diameter_app(3) callbacks need to be prepared for the change.\n\n The Diameter types affected are OctetString and the derived types UTF8String,\n DiameterIdentity, DiameterURI, IPFilterRule, and QoSFilterRule. Time and\n Address are unaffected.\n\n Own Id: OTP-11952\n\n- Add transport_opt() pool_size.\n\n To allow for pools of accepting transport processes, which can better service\n multiple simultaneous peer connections. The option can also be used with\n connecting transports, to establish multiple connections to the same peer\n without having to configure multiple transports.\n\n Own Id: OTP-12428\n\n- Allow DPR to be sent with diameter:call/4.\n\n It has been possible to send, but the answer was regarded as unsolicited and\n discarded. DPA now causes the transport process in question to be terminated,\n as for DPR that diameter itself sends.\n\n Own Id: OTP-12542\n\n- Discard requests after DPR.\n\n RFC 6733 is imprecise, but the tone is that messages received after DPR are an\n exception to be dealt with only because of the possibility of unordered\n delivery over SCTP. As a consequence, and because a request following DPR is\n unlikely to be answered due to the impending loss of the peer connection,\n discard outgoing requests following an outgoing or incoming DPR. Incoming\n requests are also discarded, with the exception of DPR itself. Answers are\n sent and received as usual.\n\n Own Id: OTP-12543\n\n- Add transport_opt() dpr_timeout.\n\n To cause a peer connection to be closed following an outgoing DPA when the\n peer fails to do so. It is the recipient of DPA that should close the\n connection according to RFC 6733.\n\n Own Id: OTP-12609\n\n- Add service_opt() incoming_maxlen.\n\n To bound the expected size of incoming Diameter messages. Messages larger than\n the specified number of bytes are discarded, to prevent a malicious peer from\n generating excessive load.\n\n Own Id: OTP-12628","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.8 - Release Notes","ref":"notes.html#diameter-1-8"},{"type":"extras","doc":"- Fix remote diameter_request table leak.\n\n An outgoing request whose pick_peer callback selected a transport on another\n node resulted in an orphaned table entry on that node.\n\n Own Id: OTP-12196\n\n- Fix handling of 3xxx Result-Code without E-bit.\n\n OTP-12233 broke the population of the errors field of the diameter_packet\n record when an incoming request with an E-bit/Result-Code mismatch was\n detected, causing a 4-tuple to be inserted as Result-Code in a diameter_avp\n record.\n\n Own Id: OTP-12233\n\n- Fix ignored connect timer.\n\n There are two timers governing the establishment of peer connections:\n connect_timer and watchdog_timer. The former is the RFC 6733 Tc timer, and is\n used at initial connection establishment. The latter is RFC 3539 TwInit, and\n is used for connection reestablishment. A connecting transport erroneously\n used watchdog_timer in both cases.\n\n Own Id: OTP-12281 Aux Id: seq12728","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Order candidate peers in pick_peer callbacks.\n\n The order of candidate peers presented to a diameter_app(3) pick_peer callback\n has previously not been documented, but there are use cases that are\n simplified by an ordering. The order is now determined by the filter.\n\n Own Id: OTP-12308","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.7.1 - Release Notes","ref":"notes.html#diameter-1-7-1"},{"type":"extras","doc":"- Don't leave extra bit in decoded AVP data.\n\n An extra bit could be communicated in the data field of a diameter_avp record\n in the case of length errors. Of no consequence for code using the record\n encoding of Diameter messages, but code examining diameter_avp records would\n see this bit.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-12074\n\n- Fix counting of outgoing requests and answers setting the E-bit.\n\n OTP-11721 broke these counters for all outgoing requests except DWR, and\n caused answers setting the E-bit to be counted as unknown messages.\n\n Own Id: OTP-12080\n\n- Fix Failed-AVP decode.\n\n The best-effort decode only worked for AVPs in the common dictionary, not for\n those in the dictionary of the application identified in the Diameter Header\n of the answer message in question.\n\n Failed-AVP in an answer decoded with the RFC 3588 common dictionary\n (diameter_gen_base_rfc3588) was regarded as an error. The RFC 6733 dictionary\n was unaffected.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-12094","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.7 - Release Notes","ref":"notes.html#diameter-1-7"},{"type":"extras","doc":"- Improve robustness.\n\n Counters returned by diameter:service_info/2 now only count messages known to\n the dictionary in question, so that an attacker cannot cause arbitrarily many\n counters to be created.\n\n Messages to the Erlang log have been minimized, and those related to traffic\n have been removed entirely since an attacker could cause a node to be logged\n to death. Consequently, the default answer_errors configuration has been\n changed from report to discard. A service needs to be restarted for the change\n in default to take effect.\n\n Own Id: OTP-11721\n\n- Fix request table leak.\n\n Outgoing Diameter requests are stored in a table until an answer is received\n or times out. Calling diameter:stop_service/1 before this took place would\n orphan the entries, resulting in a memory leak.\n\n Own Id: OTP-11893\n\n- Fix broken SCTP transport.\n\n OTP-11593 caused the sending of answer messages over SCTP to fail.\n\n Own Id: OTP-11901 Aux Id: OTP-11593\n\n- Fix watchdog process leak.\n\n A failed capabilities exchange on a listening transport would orphan a\n process, causing a memory leak.\n\n Own Id: OTP-11934\n\n- Fix incorrect handling of incoming DPR.\n\n In the case of a listening transport, a reconnection by a peer following DPR\n could transition the watchdog state to REOPEN instead of OKAY.\n\n Own Id: OTP-11938\n\n- Fix handling of AVP length errors on unknown AVPs.\n\n An AVP (Header) length that pointed past the end of the message was not\n flagged as a 5014 error in this case. Moreover, encoding such an AVP in the\n Failed-AVP of an answer message as a consequence of other errors (eg. M-bit,\n resulting in 5001) failed if the AVP contained a complete header.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-11946\n\n- Fix broken check in dictionary compilation.\n\n That an AVP specified in the content of a @codecs or @custom_types section was\n undefined went undetected, causing compilation to fail when attempting to\n lookup the AVP's type.\n\n Own Id: OTP-11958","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add result code counters for CEA, DWA, and DPA.\n\n In addition to the existing result code counters on other answer messages.\n\n Own Id: OTP-11891\n\n- Add best-effort decode of AVPs within Failed-AVP.\n\n OTP-11007 disabled the decode of AVPs in Failed-AVP since errors could cause\n the decode of Failed-AVP itself to fail. Component AVPs are now decoded if\n possible, otherwise not. AVPs of type Grouped are decoded as much as possible,\n as deeply as possible.\n\n Dictionary files must be recompiled for the fix to have effect.\n\n Own Id: OTP-11936 Aux Id: OTP-11007\n\n- Add counters for encode errors in outgoing Diameter messages.\n\n In addition to the existing counters on decode errors. The latter now count\n independently of result codes in answer messages since decode errors do not\n preclude the presence of a result code.\n\n Own Id: OTP-11937","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.6 - Release Notes","ref":"notes.html#diameter-1-6"},{"type":"extras","doc":"- Add missing check at dictionary compilation.\n\n In particular, that an AVP defined as having type Grouped in an @avp_types\n section has a corresponding definition in a @grouped section.\n\n Own Id: OTP-11561\n\n- Correct documentation on the setting of Origin-State-Id\n\n It was incorrectly stated that the AVP would be set in an outgoing DPR/DPA.\n\n Own Id: OTP-11583\n\n- Change interface for communicating outbound stream id to diameter_sctp\n\n The module uses the transport_data field of record diameter_packet to\n communicate the stream on which the an incoming message is received and on\n which an outgoing message should be sent, the previous interface being that\n both are communicated as a tuple of the form \\{stream, Id\\}. However, since\n diameter retains the value of an incoming request's transport_data unless the\n corresponding answer message specifies otherwise, the behaviour in this case\n is to send an answer on the outbound stream with the same identifier as the\n that of the inbound stream on which the request was received. If the inbound\n stream id is greater than or equal to the number of outbound streams then this\n is guaranteed to fail, causing the transport process in question to terminate.\n There is no relationship between inbound and outbound stream identifiers so\n diameter_sctp's imposition of one is simply wrong.\n\n Outbound stream ids are now communicated with a different tuple: \\{outstream,\n Id\\}, interpreted modulo the number of outbound streams. Thus, retention of an\n inbound request's transport_data has no effect on the selection of an outbound\n stream.\n\n The change in interface is not strictly backwards compatible because of the\n new atom for the outbound stream. However, as there is currently no documented\n way of obtaining the available number of outbound streams for a peer\n connection, there is no way for a client to have known the range of ids from\n which it could reliably have chosen with the previous interface, so any\n setting of the outbound stream has probably been unintentional. Not explicitly\n specifying an outbound stream now results in a round-robin selection.\n\n Thanks to Sharmila Pillai for reporting the problem.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-11593\n\n- Fix unicode path failure in diameter_make:codec/2.\n\n A dictionary path containing a unicode codepoint > 255 caused the function to\n fail.\n\n Own Id: OTP-11655\n\n- Fix 'accept' config to diameter_sctp.\n\n OTP-10893 added support for \\{accept, Match\\} tuples to specify addresses or\n regexps that should be matched against peer addresses to decide whether or not\n a newly established association should be retained, but this hasn't been\n functional in the SCTP case because of missing support in inet(3).\n\n The display of both local and peer addresses in diameter:service_info/2 output\n has also been corrected.\n\n Own Id: OTP-11661 Aux Id: OTP-10229\n\n- Be lenient with the M-bit in Grouped AVPs.\n\n RFC 6733 says this, in 4.4:\n\n - \\_\\_\\_\\_ -\n `Receivers of a Grouped AVP that does not have the 'M' (mandatory) bit set and one or more of the encapsulated AVPs within the group has the 'M' (mandatory) bit set MAY simply be ignored if the Grouped AVP itself is unrecognized. The rule applies even if the encapsulated AVP with its 'M' (mandatory) bit set is further encapsulated within other sub-groups, i.e., other Grouped AVPs embedded within the Grouped AVP.`\n\n The first sentence is mangled but take it to mean this:\n\n - \\_\\_\\_\\_ -\n `An unrecognized AVP of type Grouped that does not set the 'M' bit MAY be ignored even if one of its encapsulated AVPs sets the 'M' bit.`\n\n This is a bit of a non-statement since if the AVP is unrecognized then its\n type is unknown. We therefore don't know that its data bytes contain\n encapsulated AVPs, so can't but ignore any of those that set the M-bit. Doing\n anything else when the type _is_ known would be inconsistent.\n\n OTP-11087 (R16B03) caused the M-bit on any unrecognized AVP to be regarded as\n an error, unrecognized being taken to mean \"not explicitly defined as a member\n of its container\". (That is, an AVP that can't be packed into a dedicated\n record field, which is slightly stronger than \"not defined\".) This fixed the\n original intention for top-level AVPs but broke the required leniency for\n Grouped AVPs whose type is known. This leniency is now restored.\n\n Note that dictionary files need to be recompiled for the change to have\n effect.\n\n Thanks to Rory McKeown for reporting the problem.\n\n Own Id: OTP-11675 Aux Id: OTP-11087\n\n- Fix pick_peer case clause failure.\n\n In the case of \\{call_mutates_state, true\\} configuration on the service in\n question, any peer selection that failed to select a peer resulted in a case\n clause failure. This was noticed in the case of a peer failover in which an\n alternate peer wasn't available.\n\n Own Id: OTP-11789","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.5 - Release Notes","ref":"notes.html#diameter-1-5"},{"type":"extras","doc":"- Rename reconnect_timer to connect_timer.\n\n The former is still accepted for backwards compatibility, but the name is\n misleading given the semantics of the timer.\n\n Own Id: OTP-11168\n\n- Extend diameter_make(3).\n\n Dictionaries can now be compiled from strings, not just filesystem paths, and\n results can be returned instead of written to the filesystem.\n\n Own Id: OTP-11348\n\n- Remove hardcoding of diameter_base as @prefix on dictionaries for application\n id 0.\n\n Own Id: OTP-11361","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.4.4 - Release Notes","ref":"notes.html#diameter-1-4-4"},{"type":"extras","doc":"- Fix setting of End-to-End and Hop-by-Hop Identifiers in outgoing DWA.\n\n Broken by OTP-11184, which caused the identifiers to be set anew, discarding\n the values from the incoming DWR.\n\n Own Id: OTP-11367\n\n- Fix handling of 5014, DIAMETER_INVALID_AVP_LENGTH.\n\n The error was detected as 5004, DIAMETER_INVALID_AVP_VALUE, for some Diameter\n types, in which case an AVP length that pointed past the end of a message\n resulted in encode failure.\n\n Own Id: OTP-11395","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.4.3 - Release Notes","ref":"notes.html#diameter-1-4-3"},{"type":"extras","doc":"- Fix UTF8String encode.\n\n Encode now accepts any nested list of codepoints and binaries. A list\n containing a binary was previously misinterpreted and the documentation was\n incomplete.\n\n Own Id: OTP-11172\n\n- Ensure DWR isn't sent immediately after DWA.\n\n This was possible if the timing was unfortunate. An incoming DWR now properly\n resets the watchdog timer.\n\n Own Id: OTP-11184\n\n- Fix faulty encode of Failed-AVP\n\n Reception of a CER, DWR or DPR that has decode failures caused encode of the\n corresponding answer message to fail.\n\n Own Id: OTP-11293\n\n- Fix broken service_opt() spawn_opt.\n\n The option was ignored.\n\n Own Id: OTP-11299","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.4.2 - Release Notes","ref":"notes.html#diameter-1-4-2"},{"type":"extras","doc":"- Fix handling of 5014 (INVALID_AVP_LENGTH) errors.\n\n This was in some cases reported as 3009 (INVALID_AVP_BITS).\n\n Note that the correction is partially implemented in modules generated by\n diameterc(1): a dictionary file must be recompiled for the correction to apply\n to any messages it defines.\n\n Own Id: OTP-11007\n\n- Fix faulty capitalization in release notes.\n\n Diameter = the protocol. \n diameter = the Erlang application.\n\n Own Id: OTP-11014\n\n- Fix watchdog memory leak.\n\n Entries were not removed from a service-specific ets table, causing them to be\n orphaned at connection reestablishment for listening transports, and\n diameter:remove_transport/2 for both listening and connecting transports.\n\n The fault was introduced by OTP-10692 in diameter-1.4.1 (R16B).\n\n Own Id: OTP-11019 Aux Id: OTP-10692\n\n- Fix decode failure on AVP Length < 8.\n\n The failure caused the message in question to be discarded.\n\n Own Id: OTP-11026\n\n- Respect Host-IP-Address configuration.\n\n Addresses returned from a transport module were always used to populate\n Host-IP-Address AVP's in an outgoing CER/CEA, which precluded the sending of a\n VIP address. Transport addresses are now only used if Host-IP-Address is\n unspecified.\n\n Own Id: OTP-11045\n\n- Fix mkdir race.\n\n Install could fail if examples/code and examples/dict were created in\n parallel. Noticed on FreeBSD.\n\n Own Id: OTP-11051\n\n- Fix recognition of 5001 on mandatory AVP's.\n\n An AVP setting the M-bit was not regarded as erroneous if it was defined in\n the dictionary in question and its container (message or Grouped AVP) had an\n 'AVP' field. It's now regarded as a 5001 error (AVP_UNSUPPORTED), as in the\n case that the AVP is not defined.\n\n Note that the correction is partially implemented in modules generated by\n diameterc(1): a dictionary file must be recompiled for the correction to apply\n to any messages it defines.\n\n Own Id: OTP-11087\n\n- Fix setting of Failed-AVP on handle_request \\{answer_message, 5xxx\\} return.\n\n Failed-AVP was never in the outgoing answer-message. It is now set with the\n AVP from the first entry with the specified Result-Code in the errors field of\n the incoming diameter_packet, if found.\n\n Own Id: OTP-11092\n\n- Fix watchdog function_clause\n\n A listening transport on a service that allowed multiple connections to the\n same peer could result in a function_clause error in module diameter_watchdog.\n The resulting crash was harmless but unseemly.\n\n Thanks to Aleksander Nycz.\n\n Own Id: OTP-11115\n\n- Fix population of Failed-AVP.\n\n In cases in which diameter populated this AVP, many values were sent instead\n of one as suggested by RFC 6733. This was partially corrected by OTP-11007.\n\n Own Id: OTP-11127 Aux Id: OTP-11007\n\n- Fix list-valued Vendor-Specific-Application-Id config\n\n R16B (specifically, OTP-10760) broke the handling of such configuration,\n resulting in a function clause error if the list was not of length 3, and\n faulty interpretation of the list's contents otherwise. Only record-valued\n configuration was properly interpreted.\n\n Own Id: OTP-11165","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Allow peer connections to be shared between Erlang nodes for the purpose of\n sending outgoing requests.\n\n A diameter_app(3) pick_peer/4 callback gets a list of remote candidates as\n argument, allowing a callback on one node to select a transport connection\n established on another node. The service_opt() share_peers controls the extent\n to which local connections are shared with remote nodes. The service_opt()\n use_shared_peers controls the extent to which connections shared from remote\n nodes are utilized on the local node.\n\n Own Id: OTP-9610\n\n- Allow listening diameter\\_\\{tcp,sctp\\} transports to be configured with remote\n addresses.\n\n Option 'accept' allows remote addresses to be configured as tuples or regular\n expressions. Remote addresses are matched against the configured values at\n connection establishment, any non-matching address causing the connection to\n be aborted.\n\n Own Id: OTP-10893\n\n- Detect more transport_opt() configuration errors at diameter:add_transport/2.\n\n Many errors would previously not be detected until transport start,\n diameter:add_transport/2 returning 'ok' but transport connections failing to\n be established. An error tuple is now returned.\n\n Own Id: OTP-10972\n\n- Make explicit local address configuration optional in diameter_tcp:start/3.\n\n The default address (as determined by gen_tcp) is now used when a local\n address is not explicitly configured.\n\n Own Id: OTP-10986\n\n- Improve handling of unrecognized service options.\n\n Such options were silently ignored by diameter:start_service/2. An error tuple\n is now returned.\n\n Own Id: OTP-11017\n\n- Don't send default Inband-Security-Id in CER/CEA.\n\n RFC 6733 recommends against the use of Inband-Security-Id. Only send a value\n that differs from the default, NO_INBAND_SECURITY = 0.\n\n Own Id: OTP-11050\n\n- Make spawn options for request processes configurable.\n\n Own Id: OTP-11060","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.4.1.1 - Release Notes","ref":"notes.html#diameter-1-4-1-1"},{"type":"extras","doc":"- Fix broken Vendor-Specific-Application-Id configuration.\n\n RFC 6733 changed the definition of this Grouped AVP, changing the arity of\n Vendor-Id from 1\\* to 1. A component Vendor-Id can now be either list- or\n integer-valued in service and transport configuration, allowing it to be used\n with both RFC 3588 and RFC 6733 dictionaries.\n\n Own Id: OTP-10942","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add transport_opt() watchdog_config to allow non-standard behaviour of the\n watchdog state machine.\n\n This can be useful during test but should not be used on nodes that must\n conform to RFC 3539.\n\n Own Id: OTP-10898","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.4.1 - Release Notes","ref":"notes.html#diameter-1-4-1"},{"type":"extras","doc":"- Fix erroneous watchdog transition from DOWN to INITIAL.\n\n This transition took place when a peer connection was reestablished following\n a failed capabilities exchange. RFC 3539 requires DOWN to transition into\n REOPEN.\n\n Own Id: OTP-10692","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add application_opt() request_errors to make the handling of incoming requests\n containing decode errors configurable.\n\n The value 'callback' ensures that a handle_request callback takes place for\n all such requests, the default being for diameter to answer 3xxx series errors\n itself.\n\n Own Id: OTP-10686\n\n- Add transport_opt() length_errors.\n\n The value determines how messages received over the transport interface with\n an incorrect Message Length are dealt with.\n\n Own Id: OTP-10687\n\n- Add commentary on RFC 6733 to Standards Compliance chapter of the User's\n Guide.\n\n Own Id: OTP-10688\n\n- Allow a 5xxx result code in an answer-message on peer connections using the\n RFC 6733 common dictionary.\n\n RFC 6733 allows this while RFC 3588 does not. A handle_request callback can\n return \\{answer_message, 3000..3999|5000..5999\\} in the simplest case.\n\n Own Id: OTP-10759\n\n- Add dictionaries for RFC 6733.\n\n Both the common and accounting dictionaries differ from their RFC 3588\n counterparts, which is reflected in generated record definitions. Application\n configuration on a service or transport determines the dictionary that will be\n used on a given peer connection.\n\n Own Id: OTP-10760\n\n- Allow a handle_request callback to control diameter's setting of Result-Code\n and Failed-AVP.\n\n Setting errors = false in a returned #diameter_packet\\{\\} disables the\n setting.\n\n Own Id: OTP-10761","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.4 - Release Notes","ref":"notes.html#diameter-1-4"},{"type":"extras","doc":"- Add registered server names to the app file.\n\n Own Id: OTP-10442\n\n- Fix #diameter_header\\{\\} handling broken by OTP-10445.\n\n The fault caused the the header of a \\[Header | Avps] request to be ignored if\n both end_to_end_id and hop_by_hop_id were undefined.\n\n Own Id: OTP-10609\n\n- Fix error handling for handle_request callback.\n\n A callback that returned a #diameter_packet\\{\\} would fail if the incoming\n request had decode errors.\n\n Own Id: OTP-10614\n\n- Fix timing of service start event.\n\n The event did not necessarily precede other events as documented.\n\n Own Id: OTP-10618\n\n- Fix setting of header T flag at peer failover.\n\n The flag is now set in the diameter_header record passed to a\n prepare_retransmit callback.\n\n Own Id: OTP-10619\n\n- Fix sending of CER/CEA timeout event at capx_timeout.\n\n The event was not sent as documented.\n\n Own Id: OTP-10628\n\n- Fix improper setting of Application-ID in the Diameter header of an answer\n message whose E flag is set.\n\n The value should be that of the request in question. The fault caused it\n always to be 0.\n\n Own Id: OTP-10655\n\n- Fix faulty handling of AVP length errors.\n\n An incorrect AVP length but no other errors caused an incoming request to\n fail.\n\n Own Id: OTP-10693","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.3.1 - Release Notes","ref":"notes.html#diameter-1-3-1"},{"type":"extras","doc":"- Fix function clause resulting from use of an eval callback.\n\n Own Id: OTP-10685","title":"Known Bugs and Problems - Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"diameter 1.3 - Release Notes","ref":"notes.html#diameter-1-3"},{"type":"extras","doc":"- Fix faulty handling of Origin-State-Id and faulty config values.\n\n The former was expected in a list despite the documentation requiring\n (correctly) an integer. A bare value for a list-valued capability was not\n handled.\n\n Own Id: OTP-10440\n\n- Fix timing of up/down events.\n\n Previously, a call to diameter:call/4 following a peer_up callback might\n incorrectly return \\{error, no_connection\\}, depending on timing. Both events\n now follow the corresponding callbacks.\n\n Own Id: OTP-10459\n\n- Make diameter:service_info/2 usable in peer_up, peer_down and pick_peer\n callbacks.\n\n Except for in pick_peer when \\{call_mutates_state, false\\}, it would\n previously hang indefinitely.\n\n Own Id: OTP-10460\n\n- Verify that End-to-End and Hop-by-Hop Identifiers in an incoming CEA/DPA match\n those sent in the corresponding CER/DPR.\n\n The values were previously ignored. Answers whose identifiers do not match are\n handled as unexpected.\n\n Own Id: OTP-10565\n\n- Fix formatting problems in PDF documentation.\n\n In particular, text corresponding to links in HTML was omitted in preformatted\n blocks. There are still issues with indentation but this is not\n diameter-specific.\n\n Own Id: OTP-10583","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Let prepare_request, prepare_retransmit and handle_request callbacks return a\n function to be invoked on outgoing messages after encode.\n\n This allows encoded messages to be logged for example.\n\n Own Id: OTP-10441\n\n- Add service_opt() 'restrict_connections' to allow multiple transport\n connections with the same peer.\n\n Own Id: OTP-10443\n\n- Add service_opt() 'sequence' to allow the masking of a constant onto the\n topmost bits of End-to-End and Hop-by-Hop identifiers.\n\n This allows the same service on different nodes to use distinct values in\n outgoing request messages.\n\n Own Id: OTP-10445\n\n- Add diameter:service_info(PeerRef) to return the transport_ref() and\n transport_opt() list of the corresponding transport.\n\n This allows easy access to these from diameter_app callbacks that only get\n peer_ref() as an argument.\n\n Own Id: OTP-10470\n\n- Add reference pages diameter_codec(3) and diameter_make(3).\n\n Own Id: OTP-10471\n\n- Add events for service start and stop.\n\n Own Id: OTP-10492\n\n- Add transport_opt() 'disconnect_cb' to make the sending of DPR configurable.\n\n Whether or not DPR should be sent at application stop, service stop or\n transport removal is determined by the value returned by the callback, as is\n the Disconnect-Cause and timeout if DPA is not received.\n\n Own Id: OTP-10493\n\n- Add transport_opt() 'capx_timeout' for the timeout associated with\n non-reception of CER/CEA.\n\n Own Id: OTP-10554\n\n- Allow a handle_request callback to return a #diameter_packet\\{\\}.\n\n This allows an answer to set transport_data and header fields.\n\n Own Id: OTP-10566\n\n- Update documentation for RFC 6733.\n\n RFC 3588 is now obsolete.\n\n Own Id: OTP-10568","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.2 - Release Notes","ref":"notes.html#diameter-1-2"},{"type":"extras","doc":"- Fix broken Result-Code setting and Destination-Host/Realm extraction.\n\n Result-Code was assumed to have arity 1 when setting this value in an answer\n to a request containing AVP decode errors. Destination-Host/Realm were only\n correctly extracted from messages in the common application.\n\n Own Id: OTP-10202\n\n- Handle insufficient capabilities configuration more gracefully.\n\n A transport that does not have sufficient capabilities configuration in order\n to encode CER/CEA will now emit an error report noting the configuration error\n and exit instead of failing. The error is not detected at\n diameter:add_transport/2 since there is no requirement that a service be\n configured before its transports.\n\n Own Id: OTP-10203\n\n- Ensure a failing peer_up/down callback does not affect transport connections\n to other peers.\n\n Such a failure would previously have taken down all of a service's\n connections.\n\n Own Id: OTP-10215","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Statistics related to Diameter messages can be retrieved using\n diameter:service_info/2.\n\n Both Diameter and socket-level statistics are available, for both incoming and\n outgoing messages.\n\n Own Id: OTP-9608\n\n- Allow multiple transport_module/config to diameter:add_transport/2.\n\n Multiple values are attempted in sequence until one results in an established\n connection. This provides a way for a connecting transport to specify\n configuration in order of preference. (For example, SCTP before TCP.)\n\n Own Id: OTP-9885\n\n- Add events for state transitions in the RFC 3539 watchdog state machine.\n\n The watchdog state is also available through diameter:service_info/2.\n\n Own Id: OTP-10212\n\n- Add diameter:service_info(SvcName, connections).\n\n This provides an alternative to diameter:service_info(SvcName, transport) that\n presents information per established connection instead of per transport\n reference.\n\n Own Id: OTP-10213\n\n- Assorted documentation corrections/improvements.\n\n Own Id: OTP-10216","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 1.1 - Release Notes","ref":"notes.html#diameter-1-1"},{"type":"extras","doc":"- Fix fault in sending of 'closed' events.\n\n The fault made it possible for the 'closed' event not to be sent following a\n failed capabilities exchange.\n\n Own Id: OTP-9824\n\n- Fix faulty diameterc -name/-prefix.\n\n A minor blunder when introducing the new dictionary parser in diameter-1.0\n broke these options.\n\n Own Id: OTP-9826","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"diameter 1.0 - Release Notes","ref":"notes.html#diameter-1-0"},{"type":"extras","doc":"- Fix faulty cleanup after diameter:remove_transport/2.\n\n Removing a transport removed the configuration but did not prevent the\n transport process from being restarted.\n\n Own Id: OTP-9756","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for TLS over TCP.\n\n RFC 3588 requires that a Diameter server support TLS. In practice this seems\n to mean TLS over SCTP since there are limitations with running over SCTP: see\n RFC 6083 (DTLS over SCTP), which is a response to RFC 3436 (TLS over SCTP).\n The current RFC 3588 draft acknowledges this by equating TLS with TLS/TCP and\n DTLS/SCTP.\n\n TLS handshaking can take place either following a CER/CEA that negotiates TLS\n using the Inband-Security-Id AVP (the method documented in RFC 3588) or\n immediately following connection establishment (the method added to the\n current draft).\n\n Own Id: OTP-9605\n\n- Improvements to the dictionary parser.\n\n The dictionary parser now emits useful error messages in case of faults in the\n input file, also identifying the line number at which the fault was detected.\n There are semantic checks that were missing in the previous parser, a fault in\n the interpretation of vendor id's in combination with @inherits has been fixed\n and @end can be used to terminate parsing explicitly instead of always parsing\n to end of file.\n\n Own Id: OTP-9639\n\n- Improve dictionary reusability.\n\n Reusing a dictionary just to get a different generated module name or prefix\n previously required taking a copy of the source, which may consist of several\n files if inheritance is used, just to edit a couple of lines which don't\n affect the semantics of the Diameter application being defined. Options\n --name, --prefix and --inherits have been added to diameterc to allow\n corresponding values to be set at compile time.\n\n Own Id: OTP-9641\n\n- Add capabilities_cb transport option.\n\n Its value is a function that's applied to the transport reference and\n capabilities record after capabilities exchange. If a callback returns\n anything but 'ok' then the connection is closed. In the case of an incoming\n CER, the callback can return a result code with which to answer. Multiple\n callbacks can be specified and are applied until either all return 'ok' or one\n doesn't.\n\n This provides a way to reject a peer connection.\n\n Own Id: OTP-9654\n\n- Add @codecs to dictionary format.\n\n The semantics are similar to @custom_types but results in codec functions of\n the form TypeName(encode|decode, AvpName, Data) rather than\n AvpName(encode|decode, TypeName, Data). That is, the role of the AVP name and\n Diameter type name are reversed. This eliminates the need for exporting one\n function for each AVP sharing a common specialized encode/decode.\n\n Own Id: OTP-9708 Aux Id: OTP-9639\n\n- Add #diameter_callback\\{\\} for more flexible callback configuration.\n\n The record allows individual functions to be configured for each of the\n diameter_app(3) callbacks, as well as a default callback.\n\n Own Id: OTP-9777","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"diameter 0.10 - Release Notes","ref":"notes.html#diameter-0-10"},{"type":"extras","doc":"- Handle #sctp_paddr_change and #sctp_pdapi_event from gen_sctp.\n\n The events are enabled by default but diameter_sctp neither disabled nor dealt\n with them. Reception of such an event caused a transport process to crash.\n\n Own Id: OTP-9538\n\n- Fix header folding bug.\n\n A prepare_request callback from diameter can return a diameter_header record\n in order to set values in the header of an outgoing request. A fault in\n diameter_lib:fold_tuple/3 caused the subsequent encode of the outgoing request\n to fail.\n\n Own Id: OTP-9577\n\n- Fix bugs in sending of answer-message replies.\n\n 3001 (DIAMETER_COMMAND_UNSUPPORTED) was not sent since the decode placed the\n AVP list in the wrong field of the diameter_packet, causing the subsequent\n encode to fail. Session-Id was also set improperly, causing encode to fail\n even in this case.\n\n Own Id: OTP-9578\n\n- Fix improper use of error_logger:info_report/2.\n\n Function doesn't take a format string and arguments as it was called. Instead\n use error_logger:info_report/1 and use the same report format as used for\n warning and error reports.\n\n Own Id: OTP-9579\n\n- Fix and clarify semantics of peer filters.\n\n An eval filter returning a non-true value caused the call process to fail and\n the doc was vague on how an exception was treated. Clarify that the non-tuple\n host/realm filters assume messages of a certain form.\n\n Own Id: OTP-9580\n\n- Fix and clarify relay behaviour.\n\n Implicit filtering of the sending peer in relaying a request could cause loop\n detection to be preempted in a manner not specified by RFC3588. Reply with\n 3002 (DIAMETER_UNABLE_TO_DELIVER) on anything but an answer to a relayed\n request.\n\n Own Id: OTP-9583","title":"Fixed Bugs and Malfunctions - Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- @id required in dictionary files only when @messages is specified.\n\n @id defines an application identifier and this is used only when sending or\n receiving messages. A dictionary can define only AVP's however, to be included\n by other dictionaries using @inherits, in which case it makes no sense to\n require @id.\n\n Note that message definitions are not inherited with @inherits, only AVP's\n\n Own Id: OTP-9467\n\n- Allow @enum when AVP is defined in an inherited dictionary.\n\n 3GPP standards (for one) extend the values allowed for RFC 3588 AVP's of type\n Enumerated. Previously, extending an AVP was only possible by completely\n redefining the AVP.\n\n Own Id: OTP-9469\n\n- Migrate testsuites to pure common test and add both suites and testcases.\n\n Own Id: OTP-9553\n\n- Requests of arbitrary form.\n\n diameter:call/4 can be passed anything, as long as the subsequent\n prepare_request callback returns a term that can be encoded.\n\n Own Id: OTP-9581","title":"Improvements and New Features - Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"Initial release of the diameter application.\n\nKnown issues or limitations:\n\n- Some agent-related functionality is not entirely complete. In particular,\n support for proxy agents, that advertise specific Diameter applications but\n otherwise relay messages in much the same way as relay agents (for which a\n handle_request callback can return a `relay` tuple), will be completed in an\n upcoming release. There may also be more explicit support for redirect agents,\n although redirect behaviour can be implemented with the current functionality.\n- There is some asymmetry in the treatment of messages sent as\n `diameter_header/avp` records and those sent in the \"normal\" fashion, and not\n all of this is documented. This is related to the previous point since this\n form of sending a message was introduced specifically to handle relay agent\n behaviour using the same callback interface as for client/server behaviour.\n- The User's Guide is currently quite thin. The introductory chapter followed by\n the examples (in the application `examples` subdirectory) may be sufficient\n for those having some familiarity with the Diameter protocol but the intention\n is to provide more introductory text. The reference documentation is quite\n complete, although some points could likely be expanded upon.\n- The function diameter:service_info/2 can be used to retrieve information about\n a started service (statistics, information about connected peers, etc) but\n this is not yet documented and both the input and output may change in the\n next release.\n\nSee [Standards Compliance](diameter_soc.md) for standards-related issues.","title":"diameter 0.9 - Release Notes","ref":"notes.html#diameter-0-9"},{"type":"extras","doc":"\n# Introduction\n\nThe diameter application is an implementation of the Diameter protocol as\ndefined by RFC 6733. It supports arbitrary Diameter applications by way of a\n_dictionary_ interface that allows messages and AVPs to be defined and input\ninto diameter as configuration. It has support for all roles defined in the RFC:\nclient, server and agent. This chapter provides a short overview of the\napplication.\n\nA Diameter node is implemented by configuring a _service_ and one or more\n_transports_ using the interface module `m:diameter`. The service configuration\ndefines the Diameter applications to be supported by the node and, typically,\nthe capabilities that it should send to remote peers at capabilities exchange\nupon the establishment of transport connections. A transport is configured on a\nservice and provides protocol-specific send/receive functionality by way of a\ntransport interface defined by diameter and implemented by a transport module.\nThe diameter application provides two transport modules: `m:diameter_tcp` and\n`m:diameter_sctp` for transport over TCP (using `m:gen_tcp`) and SCTP (using\n`m:gen_sctp`) respectively. Other transports can be provided by any module that\nimplements diameter's [transport interface](`m:diameter_transport`).\n\nWhile a service typically implements a single Diameter node (as identified by an\nOrigin-Host AVP), transports can themselves be associated with capabilities AVPs\nso that a single service can be used to implement more than one Diameter node.\n\nEach Diameter application defined on a service is configured with a callback\nmodule that implements the [application interface](`m:diameter_app`) through\nwhich diameter communicates the connectivity of remote peers, requests peer\nselection for outgoing requests, and communicates the reception of incoming\nDiameter request and answer messages. An application using diameter implements\nthese application callback modules to provide the functionality of the Diameter\nnode(s) it implements.\n\nEach Diameter application is also configured with a dictionary module that\nprovide encode/decode functionality for outgoing/incoming Diameter messages\nbelonging to the application. A dictionary module is generated from a\n[dictionary file](diameter_dict.md) using the [diameterc](diameterc_cmd.md)\nutility. Dictionaries for the RFC 6733 Diameter Common Messages, Base Accounting\nand Relay applications are provided with the diameter application.","title":"Introduction","ref":"diameter_intro.html"},{"type":"extras","doc":"\n# Usage\n\nTo be written.","title":"Usage","ref":"diameter_using.html"},{"type":"extras","doc":"\n# Examples\n\nExample code can be found in the diameter application's `examples` subdirectory.","title":"Examples","ref":"diameter_examples.html"},{"type":"extras","doc":"\n# Standards Compliance\n\nThe table below summarizes the diameter application's compliance with RFC 6733.\nSince the diameter application isn't a Diameter node on its own, compliance is\nstrictly the responsibility of the user in many cases, diameter providing the\nmeans for the user to be compliant rather than being compliant on its own.\n\nThe Compliance column notes _C_ (Compliant) if the required functionality is\nimplemented, _PC_ (Partially Compliant) if there are limitations, _NC_ (Not\nCompliant) if functionality is not implemented, or a dash if text is\ninformational or only places requirements that must be met by the user's\nimplementation.\n\nCapitalized _Diameter_ refers to the protocol, lowercase _diameter_ to the\nErlang application.","title":"Standards Compliance","ref":"diameter_soc.html"},{"type":"extras","doc":"| _Section_ | _Title_ | _Compliance_ | _Notes_ |\n| --------- | ----------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 1 | Introduction | — | |\n| 1\\.1 | Diameter Protocol | — | |\n| 1\\.1.1 | Description of the Document Set | — | |\n| 1\\.1.2 | Conventions Used in This Document | — | |\n| 1\\.1.3 | Changes from RFC 3588 | — | It is possible to configure a 3588 dictionary in order to get 3588 semantics, where the differ from 6733. |\n| 1\\.2 | Terminology | — | |\n| 1\\.3 | Approach to Extensibility | — | The dictionary interface documented in [diameter_dict(4)](diameter_dict.md) provides extensibility, allowing the user to defined new AVPs, commands, and applications. Ready dictionaries are provided for the RFC 6733 common message, base accounting, and relay applications, as well as for RFC 7683, Diameter Overload Indicator Conveyance. |\n| 1\\.3.1 | Defining New AVP Values | — | |\n| 1\\.3.2 | Creating New AVPs | — | New AVPs can be defined using the dictionary interface. Both RFC data formats and extensions are supported. |\n| 1\\.3.3 | Creating New Commands | — | New commands can be defined using the dictionary interface. |\n| 1\\.3.4 | Creating New Diameter Applications | — | New applications can be defined using the dictionary interface. |\n| 2 | Protocol Overview | — | Session state is the responsibility of the user.   The role of a Diameter node is determined by the user's implementation. |\n| 2\\.1 | Transport | PC | Ports are configured by the user: diameter places no restrictions.   The transport interface documented in `m:diameter_transport` allows the user to implement their own methods. Ready support is provided for TCP, TCP/TLS, and SCTP, but not DTLS/SCTP.   Multiple connections to the same peer is possible. ICMP messages are not interpreted. |\n| 2\\.1.1 | SCTP Guidelines | C | Unordered sending is configurable in `m:diameter_sctp`. There is no special handling of DPR/DPA: since a user that cares about pending answers should wait for them before initiating DPR.   A PPID can be configured with a a gen_sctp sctp_default_send_param option. |\n| 2\\.2 | Securing Diameter Messages | PC | DTLS is not supported by `m:diameter_sctp`. See also 2.1. |\n| 2\\.3 | Diameter Application Compliance | — | |\n| 2\\.4 | Application Identifiers | C | The user configures diameter with the identifiers to send at capabilities exchange, along with corresponding dictionaries defining the messages of the applications. |\n| 2\\.5 | Connections vs. Sessions | C | Connections are realized by configuring transport. Sessions are the responsibility of the user. |\n| 2\\.6 | Peer Table | PC | Routing is implemented by the user in callbacks documented in `m:diameter_app`. A peer table of the documented form is not exposed to the user. |\n| 2\\.7 | Routing Table | PC | See 2.6. A routing table of the documented form is not exposed to the user. |\n| 2\\.8 | Role of Diameter Agents | C | Most role-specific behaviour is implemented by the user. How a node advertises itself at capabilities exchange is determined by user configuration. |\n| 2\\.8.1 | Relay Agents | C | |\n| 2\\.8.2 | Proxy Agents | C | |\n| 2\\.8.3 | Redirect Agents | C | |\n| 2\\.8.4 | Translation Agents | C | |\n| 2\\.9 | Diameter Path Authorization | — | Authorization is the responsibility of the user. |\n| 3 | Diameter Header | C | Hop-by-Hop and End-to-End Identifiers are set by diameter when sending outgoing requests. |\n| 3\\.1 | Command Codes | C | |\n| 3\\.2 | Command Code Format Specification | C | Commands are defined as CCF specifications in dictionary files. |\n| 3\\.3 | Diameter Command Naming Conventions | — | |\n| 4 | Diameter AVPs | C | Any required padding is added by diameter when encoding outgoing messages. |\n| 4\\.1 | AVP Header | C | |\n| 4\\.1.1 | Optional Header Elements | C | |\n| 4\\.2 | Basic AVP Data Formats | C | |\n| 4\\.3 | Derived AVP Data Formats | C | Arbitrary derived data formats are supported by the dictionary interface. |\n| 4\\.3.1 | Common Derived AVP Data Formats | C | Beware that RFC 6733 changed the DiameterURI transport/port defaults specified in RFC3588. Relying on the defaults can result in interoperability problems. |\n| 4\\.4 | Grouped AVP Values | C | The M-bit on a component AVP of a Grouped AVP that does not set M is ignored: such AVPs are not regarded as erroneous at decode.   Grouped AVPs are defined as CCF specifications in dictionary files. |\n| 4\\.4.1 | Example AVP with a Grouped Data Type | — | |\n| 4\\.5 | Diameter Base Protocol AVPs | C | The base AVPs are defined in the common dictionary provided by diameter. There are common dictionaries for both RFC 3588 and RFC 6733 since the latter made changes to both syntax and semantics. |\n| 5 | Diameter Peers | — | |\n| 5\\.1 | Peer Connections | PC | A peer's DiameterIdentity is not required when initiating a connection: the identify is received at capabilities exchange, at which time the connection can be rejected if the identity is objectionable.   The number of connections established depends on the user's configuration. Multiple connections per peer is possible. |\n| 5\\.2 | Diameter Peer Discovery | NC | No form of peer discovery is implemented. The user can implement this independently of diameter if required. |\n| 5\\.3 | Capabilities Exchange | C | All supported applications are sent in CEA. The user can reject an incoming CER or CEA in a configured callback.   Both transport security at connection establishment and negotiated via an Inband-Security AVP are supported. |\n| 5\\.3.1 | Capabilities-Exchange-Request | C | CER is sent and received by diameter. |\n| 5\\.3.2 | Capabilities-Exchange-Answer | C | CEA is sent and received by diameter. |\n| 5\\.3.3 | Vendor-Id AVP | C | |\n| 5\\.3.4 | Firmware-Revision AVP | C | |\n| 5\\.3.5 | Host-IP-Address AVP | C | |\n| 5\\.3.6 | Supported-Vendor-Id AVP | C | |\n| 5\\.3.7 | Product-Name AVP | C | |\n| 5\\.4 | Disconnecting Peer Connections | C | DPA will not be answered with error: a peer that wants to a avoid a race can wait for pending answers before sending DPR. |\n| 5\\.4.1 | Disconnect-Peer-Request | C | DPR is sent by diameter in response to configuration changes requiring a connection to be broken. The user can also send DPR. |\n| 5\\.4.2 | Disconnect-Peer-Answer | C | DPR is answered by diameter. |\n| 5\\.4.3 | Disconnect-Cause AVP | C | |\n| 5\\.5 | Transport Failure Detection | — | |\n| 5\\.5.1 | Device-Watchdog-Request | C | DWR is sent and received by diameter. Callbacks notify the user of transitions into and out of the OKAY state. |\n| 5\\.5.2 | Device-Watchdog-Answer | C | DWA is sent and received by diameter. |\n| 5\\.5.3 | Transport Failure Algorithm | C | |\n| 5\\.5.4 | Failover and Failback Procedures | C | |\n| 5\\.6 | Peer State Machine | PC | The election process is modified as described in 5.6.4. |\n| 5\\.6.1 | Incoming Connections | C | |\n| 5\\.6.2 | Events | — | |\n| 5\\.6.3 | Actions | — | |\n| 5\\.6.4 | The Election Process | PC | As documented, the election assumes knowledge of a peer's DiameterIdentity when initiating a connection, which diameter doesn't require. Connections will be accepted if configuration allows multiple connections per peer to be established or there is no existing connection. Note that the election process is only applicable when multiple connections per peer is disallowed. |\n| 6 | Diameter Message Processing | — | |\n| 6\\.1 | Diameter Request Routing Overview | — | Routing is performed by the user. A callback from diameter provides a list of available suitable peer connections. |\n| 6\\.1.1 | Originating a Request | C | Requests are constructed by the user; diameter sets header fields as defined in the relevant dictionary. |\n| 6\\.1.2 | Sending a Request | C | |\n| 6\\.1.3 | Receiving Requests | C | Loops are detected by diameter when the return value of a request callback asks that a request be forwarded. Loop detection in other cases is the responsibility of the user. |\n| 6\\.1.4 | Processing Local Requests | C | The user decides whether or not to process a request locally in the request callback from diameter. |\n| 6\\.1.5 | Request Forwarding | PC | See 2.6. |\n| 6\\.1.6 | Request Routing | PC | See 2.7. |\n| 6\\.1.7 | Predictive Loop Avoidance | C | See 6.1.3. |\n| 6\\.1.8 | Redirecting Requests | PC | See 2.6. |\n| 6\\.1.9 | Relaying and Proxying Requests | C | A Route-Record AVP is appended by diameter when the return value of a request callback asks that a request be forwarded. Appending the AVP in other cases is the responsibility of the user. |\n| 6\\.2 | Diameter Answer Processing | C | Answer message are constructed by the user, except in the case of some protocol errors, in which case the procedures are followed. |\n| 6\\.2.1 | Processing Received Answers | C | Answers with an unknown Hop-by-Hop Identifier are discarded. |\n| 6\\.2.2 | Relaying and Proxying Answers | — | Modifying answers is the responsibility of the user in callbacks from diameter. |\n| 6\\.3 | Origin-Host AVP | C | The order of AVPs in an encoded message is determined by the CCF of the message in question.   AVPs defined in the RFC are defined in dictionaries provided by diameter. Their proper use in application messages is the responsibility of the user. |\n| 6\\.4 | Origin-Realm AVP | C | |\n| 6\\.5 | Destination-Host AVP | C | |\n| 6\\.6 | Destination-Realm AVP | C | |\n| 6\\.7 | Routing AVPs | — | |\n| 6\\.7.1 | Route-Record AVP | C | |\n| 6\\.7.2 | Proxy-Info AVP | C | |\n| 6\\.7.3 | Proxy-Host AVP | C | |\n| 6\\.7.4 | Proxy-State AVP | C | |\n| 6\\.8 | Auth-Application-Id AVP | C | |\n| 6\\.9 | Acct-Application-Id AVP | C | |\n| 6\\.10 | Inband-Security-Id AVP | C | See 2.1. |\n| 6\\.11 | Vendor-Specific-Application-Id AVP | C | Note that the CCF of this AVP is not the same as in RFC 3588. |\n| 6\\.12 | Redirect-Host AVP | C | |\n| 6\\.13 | Redirect-Host-Usage AVP | C | |\n| 6\\.14 | Redirect-Max-Cache-Time AVP | C | |\n| 7 | Error Handling | C | Answers are formulated by the user in most cases. Answers setting the E-bit can be sent by diameter itself in response to a request that cannot be handled by the user. |\n| 7\\.1 | Result-Code AVP | C | |\n| 7\\.1.1 | Informational | C | |\n| 7\\.1.2 | Success | C | |\n| 7\\.1.3 | Protocol Errors | C | Result codes 3001, 3002, 3005, and 3007 can be sent in answers formulated by diameter, if configured to do so. |\n| 7\\.1.4 | Transient Failures | C | Result code 4003 is sent in CEA if there is an existing connection to the peer in question and configuration does not allow more than one. |\n| 7\\.1.5 | Permanent Failures | C | Message reception detects 5001, 5004, 5005, 5008, 5009, 5010, 5011, 5014, 5015, and 5017 errors. It ignores 5013 errors at the admonition of sections 3 and 4.1.   Note that RFC 3588 did not allow 5xxx result codes in answers setting the E-bit, while RFC 6733 does. This is a potential interoperability problem since the Diameter protocol version has not changed. |\n| 7\\.2 | Error Bit | C | |\n| 7\\.3 | Error-Message AVP | C | The user can include this AVP as required. |\n| 7\\.4 | Error-Reporting-Host AVP | C | The user can include this AVP as required. |\n| 7\\.5 | Failed-AVP AVP | C | The user constructs application-specific messages, but diameter provides failed AVPs in message callbacks. Failed component AVPs are grouped within the relevant Grouped AVPs. |\n| 7\\.6 | Experimental-Result AVP | C | |\n| 7\\.7 | Experimental-Result-Code AVP | C | |\n| 8 | Diameter User Sessions | — | Authorization and accounting AVPs are defined in provided dictionaries. Their proper use is the responsibility of the user. |\n| 8\\.1 | Authorization Session State Machine | — | Authorization is the responsibility of the user: diameter does not implement this state machine. |\n| 8\\.2 | Accounting Session State Machine | — | Accounting is the responsibility of the user: diameter does not implement this state machine. |\n| 8\\.3 | Server-Initiated Re-Auth | — | |\n| 8\\.3.1 | Re-Auth-Request | C | |\n| 8\\.3.2 | Re-Auth-Answer | C | |\n| 8\\.4 | Session Termination | — | Session-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 8\\.4.1 | Session-Termination-Request | C | |\n| 8\\.4.2 | Session-Termination-Answer | C | |\n| 8\\.5 | Aborting a Session | — | Session-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 8\\.5.1 | Abort-Session-Request | C | |\n| 8\\.5.2 | Abort-Session-Answer | C | |\n| 8\\.6 | Inferring Session Termination from Origin-State-Id | — | Session-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 8\\.7 | Auth-Request-Type AVP | C | |\n| 8\\.8 | Session-Id AVP | C | |\n| 8\\.9 | Authorization-Lifetime AVP | C | |\n| 8\\.10 | Auth-Grace-Period AVP | C | |\n| 8\\.11 | Auth-Session-State AVP | C | |\n| 8\\.12 | Re-Auth-Request-Type AVP | C | |\n| 8\\.13 | Session-Timeout AVP | C | |\n| 8\\.14 | User-Name AVP | C | |\n| 8\\.15 | Termination-Cause AVP | C | |\n| 8\\.16 | Origin-State-Id AVP | C | |\n| 8\\.17 | Session-Binding AVP | C | |\n| 8\\.18 | Session-Server-Failover AVP | C | |\n| 8\\.19 | Multi-Round-Time-Out AVP | C | |\n| 8\\.20 | Class AVP | C | |\n| 8\\.21 | Event-Timestamp AVP | C | |\n| 9 | Accounting | — | Accounting-related messages and AVPs are defined in provided dictionaries. Their proper use is the user's responsibility. |\n| 9\\.1 | Server Directed Model | — | |\n| 9\\.2 | Protocol Messages | — | |\n| 9\\.3 | Accounting Application Extension and Requirements | — | |\n| 9\\.4 | Fault Resilience | — | |\n| 9\\.5 | Accounting Records | — | |\n| 9\\.6 | Correlation of Accounting Records | — | |\n| 9\\.7 | Accounting Command Codes | — | |\n| 9\\.7.1 | Accounting-Request | C | |\n| 9\\.7.2 | Accounting-Answer | C | |\n| 9\\.8 | Accounting AVPs | — | |\n| 9\\.8.1 | Accounting-Record-Type AVP | C | |\n| 9\\.8.2 | Acct-Interim-Interval AVP | C | |\n| 9\\.8.3 | Accounting-Record-Number AVP | C | |\n| 9\\.8.4 | Acct-Session-Id AVP | C | |\n| 9\\.8.5 | Acct-Multi-Session-Id AVP | C | |\n| 9\\.8.6 | Accounting-Sub-Session-Id AVP | C | |\n| 9\\.8.7 | Accounting-Realtime-Required AVP | C | |\n| 10 | AVP Occurrence Tables | — | |\n| 10\\.1 | Base Protocol Command AVP Table | — | |\n| 10\\.2 | Accounting AVP Table | — | |\n| 11 | IANA Considerations | — | |\n| 11\\.1 | AVP Header | — | |\n| 11\\.1.1 | AVP Codes | — | |\n| 11\\.1.2 | AVP Flags | — | |\n| 11\\.2 | Diameter Header | — | |\n| 11\\.2.1 | Command Codes | — | |\n| 11\\.2.2 | Command Flags | | |\n| 11\\.3 | AVP Values | — | |\n| 11\\.3.1 | Experimental-Result-Code AVP | — | |\n| 11\\.3.2 | Result-Code AVP Values | — | |\n| 11\\.3.3 | Accounting-Record-Type AVP Values | — | |\n| 11\\.3.4 | Termination-Cause AVP Values | — | |\n| 11\\.3.5 | Redirect-Host-Usage AVP Values | — | |\n| 11\\.3.6 | Session-Server-Failover AVP Values | — | |\n| 11\\.3.7 | Session-Binding AVP Values | — | |\n| 11\\.3.8 | Disconnect-Cause AVP Values | — | |\n| 11\\.3.9 | Auth-Request-Type AVP Values | — | |\n| 11\\.3.10 | Auth-Session-State AVP Values | — | |\n| 11\\.3.11 | Re-Auth-Request-Type AVP Values | — | |\n| 11\\.3.12 | Accounting-Realtime-Required AVP Values | — | |\n| 11\\.3.13 | Inband-Security-Id AVP (code 299) | — | |\n| 11\\.4 | \\_diameters Service Name and Port Number Registration | — | |\n| 11\\.5 | SCTP Payload Protocol Identifiers | — | |\n| 11\\.6 | S-NAPTR Parameters | — | |\n| 12 | Diameter Protocol-Related Configurable Parameters | — | |\n| 13 | Security Considerations | PC | See 2.1.   IPsec is transparent to diameter. |\n| 13\\.1 | TLS/TCP and DTLS/SCTP Usage | PC | See 2.1. |\n| 13\\.2 | Peer-to-Peer Considerations | — | |\n| 13\\.3 | AVP Considerations | — | |\n| 14 | References | — | |\n| 14\\.1 | Normative References | — | |\n| 14\\.2 | Informative References | — | |\n\n_Table: RFC 6733 Compliance_","title":"RFC 6733 - Diameter Base Protocol - Standards Compliance","ref":"diameter_soc.html#rfc-6733-diameter-base-protocol"},{"type":"extras","doc":"\n# diameterc\n\nCompile a diameter dictionary to Erlang source.","title":"diameterc","ref":"diameterc_cmd.html"},{"type":"extras","doc":"```\ndiameterc [ ] \n```","title":"Synopsis - diameterc","ref":"diameterc_cmd.html#synopsis"},{"type":"extras","doc":"The diameterc utility is used to compile a diameter\n[dictionary file](diameter_dict.md) into Erlang source. The resulting source\nimplements the interface diameter required to encode and decode the dictionary's\nmessages and AVPs.\n\nThe module `m:diameter_make` provides an alternate compilation interface.\n\n# USAGE\n\nCompile a single dictionary file to Erlang\nsource. Valid options are as follows.\n\n- **\\-i ** - Prepend the specified directory to the code path. Use to\n point at beam files compiled from inherited dictionaries,\n `[@inherits](diameter_dict.md#inherits)` in a dictionary file creating a\n beam dependency, not an erl/hrl dependency.\n\n Multiple `-i` options can be specified.\n\n- **\\-o ** - Write generated source to the specified directory. Defaults\n to the current working directory.\n\n- **\\-E** - Suppress `.erl` file generation.\n\n- **\\-H** - Suppress `.hrl` file generation.\n\n- **\\--name ** - Name the output module.\n\n- **\\--prefix ** - Transform the input dictionary before compilation,\n setting `[@name](diameter_dict.md#name)` or\n `[@prefix](diameter_dict.md#prefix)` to the specified string.\n\n- **\\--inherits ** - Transform the input dictionary before compilation,\n appending `[@inherits](diameter_dict.md#inherits)` of the specified string.\n\n Two forms of `--inherits` have special meaning:\n\n ```text\n --inherits -\n --inherits Prev/Mod\n ```\n\n The first has the effect of clearing any previous inherits, the second of\n replacing a previous inherits of `Prev` to one of `Mod`. This allows the\n semantics of the input dictionary to be changed without modifying the file\n itself.\n\n Multiple `--inherits` options can be specified.\n\n# EXIT STATUS\n\nReturns 0 on success, non-zero on failure.\n\n# SEE ALSO\n\n`m:diameter_make`, [diameter_dict(4)](diameter_dict.md)","title":"Description - diameterc","ref":"diameterc_cmd.html#description"},{"type":"extras","doc":"\n# diameter_dict\n\nDictionary interface of the diameter application.","title":"diameter_dict","ref":"diameter_dict.html"},{"type":"extras","doc":"A diameter service, as configured with `diameter:start_service/2`, specifies one\nor more supported Diameter applications. Each Diameter application specifies a\ndictionary module that knows how to encode and decode its messages and AVPs. The\ndictionary module is in turn generated from a file that defines these messages\nand AVPs. The format of such a file is defined in\n[FILE FORMAT](diameter_dict.md#FILE_FORMAT) below. Users add support for their\nspecific applications by creating dictionary files, compiling them to Erlang\nmodules using either [diameterc(1)](diameterc_cmd.md) or `m:diameter_make` and\nconfiguring the resulting dictionaries modules on a service.\n\nDictionary module generation also results in a hrl file that defines records for\nthe messages and Grouped AVPs defined by the dictionary, these records being\nwhat a user of the diameter application sends and receives, modulo other\npossible formats as discussed in `m:diameter_app`. These records and the\nunderlying Erlang data types corresponding to Diameter data formats are\ndiscussed in [MESSAGE RECORDS](diameter_dict.md#MESSAGE_RECORDS) and\n[DATA TYPES](diameter_dict.md#DATA_TYPES) respectively. The generated hrl also\ncontains macro definitions for the possible values of AVPs of type Enumerated.\n\nThe diameter application includes five dictionary modules corresponding to\napplications defined in section 2.4 of RFC 6733: `diameter_gen_base_rfc3588` and\n`diameter_gen_base_rfc6733` for the Diameter Common Messages application with\napplication identifier 0, `diameter_gen_accounting` (for RFC 3588) and\n`diameter_gen_acct_rfc6733` for the Diameter Base Accounting application with\napplication identifier 3 and `diameter_gen_relay` the Relay application with\napplication identifier 0xFFFFFFFF.\n\nThe Common Message and Relay applications are the only applications that\ndiameter itself has any specific knowledge of. The Common Message application is\nused for messages that diameter itself handles: CER/CEA, DWR/DWA and DPR/DPA.\nThe Relay application is given special treatment with regard to encode/decode\nsince the messages and AVPs it handles are not specifically defined.\n\n[](){: #FILE_FORMAT }","title":"Description - diameter_dict","ref":"diameter_dict.html#description"},{"type":"extras","doc":"A dictionary file consists of distinct sections. Each section starts with a tag\nfollowed by zero or more arguments and ends at the the start of the next section\nor end of file. Tags consist of an ampersand character followed by a keyword and\nare separated from their arguments by whitespace. Whitespace separates\nindividual tokens but is otherwise insignificant.\n\nThe tags, their arguments and the contents of each corresponding section are as\nfollows. Each section can occur multiple times unless otherwise specified. The\norder in which sections are specified is unimportant.\n\n- **`@id Number`{: #id }** - Defines the integer Number as the Diameter\n Application Id of the application in question. Can occur at most once and is\n required if the dictionary defines `@messages`. The section has empty content.\n\n The Application Id is set in the Diameter Header of outgoing messages of the\n application, and the value in the header of an incoming message is used to\n identify the relevant dictionary module.\n\n Example:\n\n ```text\n @id 16777231\n ```\n\n- **`@name Mod`{: #name }** - Defines the name of the generated dictionary\n module. Can occur at most once and defaults to the name of the dictionary file\n minus any extension. The section has empty content.\n\n Note that a dictionary module should have a unique name so as not collide with\n existing modules in the system.\n\n Example:\n\n ```text\n @name etsi_e2\n ```\n\n- **`@prefix Name`{: #prefix }** - Defines Name as the prefix to be added to\n record and constant names (followed by a `'_'` character) in the generated\n dictionary module and hrl. Can occur at most once. The section has empty\n content.\n\n A prefix is optional but can be be used to disambiguate between record and\n constant names resulting from similarly named messages and AVPs in different\n Diameter applications.\n\n Example:\n\n ```text\n @prefix etsi_e2\n ```\n\n- **`@vendor Number Name`{: #vendor }** - Defines the integer Number as the the\n default Vendor-Id of AVPs for which the V flag is set. Name documents the\n owner of the application but is otherwise unused. Can occur at most once and\n is required if an AVP sets the V flag and is not otherwise assigned a\n Vendor-Id. The section has empty content.\n\n Example:\n\n ```text\n @vendor 13019 ETSI\n ```\n\n- **`@avp_vendor_id Number`{: #avp_vendor_id }** - Defines the integer Number as\n the Vendor-Id of the AVPs listed in the section content, overriding the\n `@vendor` default. The section content consists of AVP names.\n\n Example:\n\n ```text\n @avp_vendor_id 2937\n\n WWW-Auth\n Domain-Index\n Region-Set\n ```\n\n- **`@inherits Mod`{: #inherits }** - Defines the name of a dictionary module\n containing AVP definitions that should be imported into the current\n dictionary. The section content consists of the names of those AVPs whose\n definitions should be imported from the dictionary, an empty list causing all\n to be imported. Any listed AVPs must not be defined in the current dictionary\n and it is an error to inherit the same AVP from more than one dictionary.\n\n Note that an inherited AVP that sets the V flag takes its Vendor-Id from\n either `@avp_vendor_id` in the inheriting dictionary or `@vendor` in the\n inherited dictionary. In particular, `@avp_vendor_id` in the inherited\n dictionary is ignored. Inheriting from a dictionary that specifies the\n required `@vendor` is equivalent to using `@avp_vendor_id` with a copy of the\n dictionary's definitions but the former makes for easier reuse.\n\n All dictionaries should typically inherit RFC 6733 AVPs from\n `diameter_gen_base_rfc6733`.\n\n Example:\n\n ```text\n @inherits diameter_gen_base_rfc6733\n ```\n\n- **`@avp_types`{: #avp_types }** - Defines the name, code, type and flags of\n individual AVPs. The section consists of definitions of the form\n\n `Name Code Type Flags`\n\n where Code is the integer AVP code, Type identifies an AVP Data Format as\n defined in section [DATA TYPES](diameter_dict.md#DATA_TYPES) below, and Flags\n is a string of V, M and P characters indicating the flags to be set on an\n outgoing AVP or a single `'-'` (minus) character if none are to be set.\n\n Example:\n\n ```text\n @avp_types\n\n Location-Information 350 Grouped MV\n Requested-Information 353 Enumerated V\n ```\n\n > #### Warning {: .warning }\n >\n > The P flag has been deprecated by RFC 6733.\n\n- **`@custom_types Mod`{: #custom_types }** - Specifies AVPs for which module\n Mod provides encode/decode functions. The section contents consists of AVP\n names. For each such name, `Mod:Name(encode|decode, Type, Data, Opts)` is\n expected to provide encode/decode for values of the AVP, where Name is the\n name of the AVP, Type is it's type as declared in the `@avp_types` section of\n the dictionary, Data is the value to encode/decode, and Opts is a term that is\n passed through encode/decode.\n\n Example:\n\n ```text\n @custom_types rfc4005_avps\n\n Framed-IP-Address\n ```\n\n- **`@codecs Mod`{: #codecs }** - Like `@custom_types` but requires the\n specified module to export `Mod:Type(encode|decode, Name, Data, Opts)` rather\n than `Mod:Name(encode|decode, Type, Data, Opts)`.\n\n Example:\n\n ```text\n @codecs rfc4005_avps\n\n Framed-IP-Address\n ```\n\n- **`@messages`{: #messages }** - Defines the messages of the application. The\n section content consists of definitions of the form specified in section 3.2\n of RFC 6733, \"Command Code Format Specification\".\n\n ```text\n @messages\n\n RTR ::= \n \n { Auth-Application-Id }\n { Auth-Session-State }\n { Origin-Host }\n { Origin-Realm }\n { Destination-Host }\n { SIP-Deregistration-Reason }\n [ Destination-Realm ]\n [ User-Name ]\n * [ SIP-AOR ]\n * [ Proxy-Info ]\n * [ Route-Record ]\n * [ AVP ]\n\n RTA ::= \n \n { Auth-Application-Id }\n { Result-Code }\n { Auth-Session-State }\n { Origin-Host }\n { Origin-Realm }\n [ Authorization-Lifetime ]\n [ Auth-Grace-Period ]\n [ Redirect-Host ]\n [ Redirect-Host-Usage ]\n [ Redirect-Max-Cache-Time ]\n * [ Proxy-Info ]\n * [ Route-Record ]\n * [ AVP ]\n ```\n\n- **`@grouped`** - Defines the contents of the AVPs of the\n application having type Grouped. The section content consists of definitions\n of the form specified in section 4.4 of RFC 6733, \"Grouped AVP Values\".\n\n Example:\n\n ```text\n @grouped\n\n SIP-Deregistration-Reason ::= \n { SIP-Reason-Code }\n [ SIP-Reason-Info ]\n * [ AVP ]\n ```\n\n Specifying a Vendor-Id in the definition of a grouped AVP is equivalent to\n specifying it with `@avp_vendor_id`.\n\n- **`@enum Name`{: #enum }** - Defines values of AVP Name having type\n Enumerated. Section content consists of names and corresponding integer\n values. Integer values can be prefixed with 0x to be interpreted as\n hexadecimal.\n\n Note that the AVP in question can be defined in an inherited dictionary in\n order to introduce additional values to an enumeration otherwise defined in\n another dictionary.\n\n Example:\n\n ```text\n @enum SIP-Reason-Code\n\n PERMANENT_TERMINATION 0\n NEW_SIP_SERVER_ASSIGNED 1\n SIP_SERVER_CHANGE 2\n REMOVE_SIP_SERVER 3\n ```\n\n- **`@end`{: #end }** - Causes parsing of the dictionary to terminate: any\n remaining content is ignored.\n\nComments can be included in a dictionary file using semicolon: characters from a\nsemicolon to end of line are ignored.\n\n[](){: #MESSAGE_RECORDS }","title":"FILE FORMAT - diameter_dict","ref":"diameter_dict.html#file-format"},{"type":"extras","doc":"The hrl generated from a dictionary specification defines records for the\nmessages and grouped AVPs defined in `@messages` and `@grouped` sections. For\neach message or grouped AVP definition, a record is defined whose name is the\nmessage or AVP name, prefixed with any dictionary prefix defined with `@prefix`,\nand whose fields are the names of the AVPs contained in the message or grouped\nAVP in the order specified in the definition in question. For example, the\ngrouped AVP\n\n```text\nSIP-Deregistration-Reason ::= \n { SIP-Reason-Code }\n [ SIP-Reason-Info ]\n * [ AVP ]\n```\n\nwill result in the following record definition given an empty prefix.\n\n```text\n-record('SIP-Deregistration-Reason', {'SIP-Reason-Code',\n 'SIP-Reason-Info',\n 'AVP'}).\n```\n\nThe values encoded in the fields of generated records depends on the type and\nnumber of times the AVP can occur. In particular, an AVP which is specified as\noccurring exactly once is encoded as a value of the AVP's type while an AVP with\nany other specification is encoded as a list of values of the AVP's type. The\nAVP's type is as specified in the AVP definition, the RFC 6733 types being\ndescribed below.\n\n[](){: #DATA_TYPES }","title":"MESSAGE RECORDS - diameter_dict","ref":"diameter_dict.html#message-records"},{"type":"extras","doc":"The data formats defined in sections 4.2 (\"Basic AVP Data Formats\") and 4.3\n(\"Derived AVP Data Formats\") of RFC 6733 are encoded as values of the types\ndefined here. Values are passed to `diameter:call/4` in a request record when\nsending a request, returned in a resulting answer record and passed to a\n[handle_request/3](`c:diameter_app:handle_request/3`) callback upon reception of\nan incoming request.\n\nIn cases in which there is a choice between string() and binary() types for\nOctetString() and derived types, the representation is determined by the value\nof [diameter:service_opt()](`m:diameter#service_opt`)\n[string_decode](`m:diameter#string_decode`).\n\n_Basic AVP Data Formats_\n\n```erlang\nOctetString() = string() | binary()\nInteger32() = -2147483647..2147483647\nInteger64() = -9223372036854775807..9223372036854775807\nUnsigned32() = 0..4294967295\nUnsigned64() = 0..18446744073709551615\nFloat32() = '-infinity' | float() | infinity\nFloat64() = '-infinity' | float() | infinity\nGrouped() = record()\n```\n\nOn encode, an OctetString() can be specified as an iolist(), excessively large\nfloats (in absolute value) are equivalent to `infinity` or `'-infinity'` and\nexcessively large integers result in encode failure. The records for grouped\nAVPs are as discussed in the previous section.\n\n_Derived AVP Data Formats_\n\n[](){: #Address }\n\n```text\nAddress() = OctetString()\n | tuple()\n```\n\nOn encode, an OctetString() IPv4 address is parsed in the usual x.x.x.x format\nwhile an IPv6 address is parsed in any of the formats specified by section 2.2\nof RFC 2373, \"Text Representation of Addresses\". An IPv4 tuple() has length 4\nand contains values of type 0..255. An IPv6 tuple() has length 8 and contains\nvalues of type 0..65535. The tuple representation is used on decode.\n\n[](){: #Time }\n\n```erlang\nTime() = {date(), time()}\n\nwhere\n\n date() = {Year, Month, Day}\n time() = {Hour, Minute, Second}\n\n Year = integer()\n Month = 1..12\n Day = 1..31\n Hour = 0..23\n Minute = 0..59\n Second = 0..59\n```\n\nAdditionally, values that can be encoded are limited by way of their encoding as\nfour octets as required by RFC 6733 with the required extension from RFC 2030.\nIn particular, only values between `{{1968,1,20},{3,14,8}}` and\n`{{2104,2,26},{9,42,23}}` (both inclusive) can be encoded.\n\n[](){: #UTF8String }\n\n```text\nUTF8String() = [integer()] | binary()\n```\n\nList elements are the UTF-8 encodings of the individual characters in the\nstring. Invalid codepoints will result in encode/decode failure. On encode, a\nUTF8String() can be specified as a binary, or as a nested list of binaries and\ncodepoints.\n\n[](){: #DiameterIdentity }\n\n```text\nDiameterIdentity() = OctetString()\n```\n\nA value must have length at least 1.\n\n[](){: #DiameterURI }\n\n```text\nDiameterURI() = OctetString()\n | #diameter_URI{type = Type,\n fqdn = FQDN,\n port = Port,\n transport = Transport,\n protocol = Protocol}\n\nwhere\n\n Type = aaa | aaas\n FQDN = OctetString()\n Port = integer()\n Transport = sctp | tcp\n Protocol = diameter | radius | 'tacacs+'\n```\n\nOn encode, fields port, transport and protocol default to 3868, sctp and\ndiameter respectively. The grammar of an OctetString-valued DiameterURI() is as\nspecified in section 4.3 of RFC 6733. The record representation is used on\ndecode.\n\n[](){: #Enumerated }\n\n```text\nEnumerated() = Integer32()\n```\n\nOn encode, values can be specified using the macros defined in a dictionary's\nhrl file.\n\n[](){: #IPFilterRule } [](){: #QoSFilterRule }\n\n```erlang\nIPFilterRule() = OctetString()\nQoSFilterRule() = OctetString()\n```\n\nValues of these types are not currently parsed by diameter.","title":"DATA TYPES - diameter_dict","ref":"diameter_dict.html#data-types"},{"type":"extras","doc":"[diameterc(1)](diameterc_cmd.md), `m:diameter`, `m:diameter_app`,\n`m:diameter_codec`, `m:diameter_make`","title":"SEE ALSO - diameter_dict","ref":"diameter_dict.html#see-also"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/diameter-2.4.1/doc/html/search.html b/prs/9277/lib/diameter-2.4.1/doc/html/search.html index ecadec796f772..146e79a2e6029 100644 --- a/prs/9277/lib/diameter-2.4.1/doc/html/search.html +++ b/prs/9277/lib/diameter-2.4.1/doc/html/search.html @@ -122,7 +122,7 @@

    - +

    diff --git a/prs/9277/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html b/prs/9277/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html index 64c7e7734af35..3a2bdf6f10045 100644 --- a/prs/9277/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html +++ b/prs/9277/lib/edoc-1.3.2/doc/html/edoc_doclet_markdown.html @@ -128,8 +128,8 @@

    -

    Doclet converting an edoc application to use EEP-59 and Markdown.

    This doclet has to be used together with edoc_layout_chunks.

    Example:

     1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
    -       {layout, edoc_layout_chunks}]).

    It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

    It does not delete the old edoc documentation.

    See also: edoc_layout_chunks.

    +

    Doclet converting an edoc application to use EEP-59 and Markdown.

    This doclet has to be used together with edoc_layout_chunks.

    Example:

     1> edoc:application(example, [{preprocess, true}, {doclet, edoc_doclet_markdown},
    +       {layout, edoc_layout_chunks}]).

    It will convert the overview to Markdown and any module documentation to use -doc attributes and Markdown. Any XHTML tags in the edoc documentation that are not part of the tags supported by Erlang Documentation Format will be added as HTML tags in the Markdown.

    It does not delete the old edoc documentation.

    See also: edoc_layout_chunks.

    diff --git a/prs/9277/lib/eldap-1.2.14/doc/html/eldap.epub b/prs/9277/lib/eldap-1.2.14/doc/html/eldap.epub index 7e99be45c4e31..2dc8dede190e4 100644 Binary files a/prs/9277/lib/eldap-1.2.14/doc/html/eldap.epub and b/prs/9277/lib/eldap-1.2.14/doc/html/eldap.epub differ diff --git a/prs/9277/lib/eldap-1.2.14/doc/html/eldap.html b/prs/9277/lib/eldap-1.2.14/doc/html/eldap.html index af3ee689da747..912ea3384e379 100644 --- a/prs/9277/lib/eldap-1.2.14/doc/html/eldap.html +++ b/prs/9277/lib/eldap-1.2.14/doc/html/eldap.html @@ -975,13 +975,13 @@

    add(Handle, Dn, Attributes)

    -

    Add an entry. The entry must not exist.

      add(Handle,
    +

    Add an entry. The entry must not exist.

      add(Handle,
           "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -       [{"objectclass", ["person"]},
    -        {"cn", ["Bill Valentine"]},
    -        {"sn", ["Valentine"]},
    -        {"telephoneNumber", ["545 555 00"]}]
    -     )
    +
    [{"objectclass", ["person"]}, + {"cn", ["Bill Valentine"]}, + {"sn", ["Valentine"]}, + {"telephoneNumber", ["545 555 00"]}] + )
    @@ -1293,7 +1293,7 @@

    extensibleMatch(MatchValue, OptionalAttrs)< -

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and +

    Creates an extensible match filter. For example,

      eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}]))

    creates a filter which performs a caseExactMatch on the attribute sn and matches with the value "Bar". The default value of dnAttributes is false.

    @@ -1511,9 +1511,9 @@

    modify(Handle, Dn, ModifyOps)

    -

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    -         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    -	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    +

    Modify an entry.

      modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com",
    +         [eldap:mod_replace("telephoneNumber", ["555 555 00"]),
    +	  eldap:mod_add("description", ["LDAP Hacker"]) ])
    @@ -1833,8 +1833,8 @@

    paged_result_control(PageSize)

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size for use in -search/3, for example:

    Control = eldap:paged_result_control(50),
    -{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    +search/3, for example:

    Control = eldap:paged_result_control(50),
    +{ok, SearchResults} = search(Handle, [{base, "dc=example, dc=com"}], [Control]),
    @@ -1867,12 +1867,12 @@

    paged_result_control(PageSize, Cookie)

    Paged results is an extension to the LDAP protocol specified by RFC2696

    This function creates a control with the specified page size and cookie for use in search/3 to retrieve the next results page.

    For example:

    PageSize = 50,
    -Control1 = eldap:paged_result_control(PageSize),
    -{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
    +Control1 = eldap:paged_result_control(PageSize),
    +{ok, SearchResults1} = search(Handle, [{base, "dc=example, dc=com"}], [Control1]),
     %% retrieve the returned cookie from the search results
    -{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    -Control2 = eldap:paged_result_control(PageSize, Cookie1),
    -{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
    +{ok, Cookie1} = eldap:paged_result_cookie(SearchResults1),
    +Control2 = eldap:paged_result_control(PageSize, Cookie1),
    +{ok, SearchResults2} = eldap:search(Handle, [{base, "dc=example,dc=com"}], [Control2]),
     %% etc
    @@ -1992,8 +1992,8 @@

    search(Handle, SearchOptions)

    Search the directory with the supplied the SearchOptions.

    The base and filter options must be supplied. Default values: scope is wholeSubtree/0, deref is -derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    -  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the +derefAlways/0, types_only is false and timeout is 0 (meaning infinity).

      Filter = eldap:substrings("cn", [{any,"V"}]),
    +  search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]),

    The timeout option in the SearchOptions is for the ldap server, while the timeout in eldap:open/2 is used for each individual request in the search operation.

    diff --git a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei.html b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei.html index 11a493ec40252..578ae7135019b 100644 --- a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei.html +++ b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei.html @@ -151,30 +151,30 @@

    Data Types

    -
    • ei_term

      typedef struct {
      +
      • ei_term

        typedef struct {
             char ei_type;
             int arity;
             int size;
        -    union {
        +    union {
           long i_val;
           double d_val;
        -  char atom_name[MAXATOMLEN_UTF8];
        +  char atom_name[MAXATOMLEN_UTF8];
           erlang_pid pid;
           erlang_port port;
           erlang_ref ref;
        -    } value;
        -} ei_term;

        Structure written by ei_decode_ei_term(). The + } value; +} ei_term;

      Structure written by ei_decode_ei_term(). The ei_type field is the type of the term which equals to what ei_get_type() sets *type to.

    • ei_x_buff - A dynamically resized buffer. It is a struct with two fields of interest for the user:

      • char *buff - Pointer to the dynamically allocated buffer.

      • int index - Offset to the next byte to write which also equals the amount of bytes currently written.

      An ei_x_buff is initialized by calling either ei_x_new() or ei_x_new_with_version(). The memory used by an initialized ei_x_buff is released by calling -ei_x_free().

    • erlang_char_encoding

      typedef enum {
      +ei_x_free().

    • erlang_char_encoding

      typedef enum {
           ERLANG_ASCII = 1,
           ERLANG_LATIN1 = 2,
           ERLANG_UTF8 = 4
      -} erlang_char_encoding;

      The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. +} erlang_char_encoding;

    The character encodings used for atoms. ERLANG_ASCII represents 7-bit ASCII. Latin-1 and UTF-8 are different extensions of 7-bit ASCII. All 7-bit ASCII characters are valid Latin-1 and UTF-8 characters. ASCII and Latin-1 both represent each character by one byte. An UTF-8 character can consist of 1-4 @@ -190,7 +190,7 @@

    ei_cmp_pids()

    -
    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_pids(erlang_pid *a, erlang_pid *b);

    Compare two process identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -199,7 +199,7 @@

    ei_cmp_ports()

    -
    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang +

    int ei_cmp_ports(erlang_port *a, erlang_port *b);

    Compare two port identifiers. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -208,7 +208,7 @@

    ei_cmp_refs()

    -
    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a +

    int ei_cmp_refs(erlang_ref *a, erlang_ref *b);

    Compare two references. The comparison is done the same way as Erlang does.

    Returns 0 if a and b are equal. Returns a value less than 0 if a compares as less than b. Returns a value larger than 0 if a compares as larger than b.

    Available since OTP 23.0

    @@ -216,15 +216,15 @@

    ei_decode_atom()

    -
    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom(const char *buf, int *index, char *p);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed at p. At most MAXATOMLEN bytes can be placed in the buffer.

    ei_decode_atom_as()

    -
    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    -  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom +

    int ei_decode_atom_as(const char *buf, int *index, char *p, int plen,
    +  erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result);

    Decodes an atom from the binary format. The NULL-terminated name of the atom is placed in buffer at p of length plen bytes.

    The wanted string encoding is specified by want. The original encoding used in the binary format (Latin-1 or UTF-8) can be obtained from *was. The encoding of the resulting string (7-bit ASCII, @@ -239,7 +239,7 @@

    ei_decode_bignum()

    -
    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this +

    int ei_decode_bignum(const char *buf, int *index, mpz_t obj);

    Decodes an integer in the binary format to a GMP mpz_t integer. To use this function, the ei library must be configured and compiled to use the GMP library.

    @@ -247,7 +247,7 @@

    ei_decode_binary()

    -
    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual +

    int ei_decode_binary(const char *buf, int *index, void *p, long *len);

    Decodes a binary from the binary format. Parameter len is set to the actual size of the binary. Notice that ei_decode_binary() assumes that there is enough room for the binary. The size required can be fetched by ei_get_type().

    @@ -256,8 +256,8 @@

    ei_decode_bitstring()

    -
    int ei_decode_bitstring(const char *buf, int *index, const char **pp,
    -  unsigned int *bitoffsp, size_t *nbitsp);

    Decodes a bit string from the binary format.

    • pp - Either NULL or *pp returns a pointer to the first byte of the +

      int ei_decode_bitstring(const char *buf, int *index, const char **pp,
      +  unsigned int *bitoffsp, size_t *nbitsp);

      Decodes a bit string from the binary format.

      • pp - Either NULL or *pp returns a pointer to the first byte of the bit string. The returned bit string is readable as long as the buffer pointed to by buf is readable and not written to.

      • bitoffsp - Either NULL or *bitoffsp returns the number of unused bits in the first byte pointed to by *pp. The value of *bitoffsp is @@ -273,14 +273,14 @@

        ei_decode_boolean()

        -
        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, +

        int ei_decode_boolean(const char *buf, int *index, int *p);

        Decodes a boolean value from the binary format. A boolean is actually an atom, true decodes 1 and false decodes 0.

        ei_decode_char()

        -
        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For +

        int ei_decode_char(const char *buf, int *index, char *p);

        Decodes a char (8-bit) integer between 0-255 from the binary format. For historical reasons the returned integer is of type char. Your C code is to consider the returned value to be of type unsigned char even if the C compilers and system can define char to be signed.

        @@ -289,14 +289,14 @@

        ei_decode_double()

        -
        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary +

        int ei_decode_double(const char *buf, int *index, double *p);

        Decodes a double-precision (64-bit) floating point number from the binary format.

        ei_decode_ei_term()

        -
        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in +

        int ei_decode_ei_term(const char* buf, int* index, ei_term* term);

        Decodes any term, or at least tries to. If the term pointed at by *index in buf fits in the term union, it is decoded, and the appropriate field in term->value is set, and *index is incremented by the term size.

        The function returns 1 on successful decoding, -1 on error, and 0 if the term seems alright, but does not fit in the term structure. If 1 is @@ -314,7 +314,7 @@

        free_fun()

        -
        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to +

        int ei_decode_fun(const char *buf, int *index, erlang_fun *p);
        void free_fun(erlang_fun* f);

        Decodes a fun from the binary format. Parameter p is to be NULL or point to an erlang_fun structure. This is the only decode function that allocates memory. When the erlang_fun is no longer needed, it is to be freed with free_fun. (This has to do with the arbitrary size of the environment for a @@ -324,7 +324,7 @@

        ei_decode_iodata()

        -
        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). +

        int ei_decode_iodata(const char *buf, int *index, int *size, char *outbuf);

        Decodes a term of the type iodata(). The iodata/0 term will be flattened an written into the buffer pointed to by the outbuf argument. The byte size of the iodata is written into the integer variable pointed to by the size argument. Both size and outbuf can be set @@ -345,7 +345,7 @@

        ei_decode_list_header()

        -
        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned +

        int ei_decode_list_header(const char *buf, int *index, int *arity);

        Decodes a list header from the binary format. The number of elements is returned in arity. The arity+1 elements follow (the last one is the tail of the list, normally an empty list). If arity is 0, it is an empty list.

        Notice that lists are encoded as strings if they consist entirely of integers in the range 0..255. This function do not decode such strings, use @@ -355,21 +355,21 @@

        ei_decode_long()

        -
        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the +

        int ei_decode_long(const char *buf, int *index, long *p);

        Decodes a long integer from the binary format. If the code is 64 bits, the function ei_decode_long() is the same as ei_decode_longlong().

        ei_decode_longlong()

        -
        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the +

        int ei_decode_longlong(const char *buf, int *index, long long *p);

        Decodes a GCC long long or Visual C++ __int64 (64-bit) integer from the binary format.

        ei_decode_map_header()

        -
        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is +

        int ei_decode_map_header(const char *buf, int *index, int *arity);

        Decodes a map header from the binary format. The number of key-value pairs is returned in *arity. Keys and values follow in this order: K1, V1, K2, V2, ..., Kn, Vn. This makes a total of arity*2 terms. If arity is zero, it is an empty map. A correctly encoded map does not have duplicate @@ -379,25 +379,25 @@

        ei_decode_pid()

        -
        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        +
        int ei_decode_pid(const char *buf, int *index, erlang_pid *p);

        Decodes a process identifier (pid) from the binary format.

        ei_decode_port()

        -
        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        +
        int ei_decode_port(const char *buf, int *index, erlang_port *p);

        Decodes a port identifier from the binary format.

        ei_decode_ref()

        -
        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        +
        int ei_decode_ref(const char *buf, int *index, erlang_ref *p);

        Decodes a reference from the binary format.

        ei_decode_string()

        -
        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of +

        int ei_decode_string(const char *buf, int *index, char *p);

        Decodes a string from the binary format. A string in Erlang is a list of integers between 0 and 255. Notice that as the string is just a list, sometimes lists are encoded as strings by term_to_binary/1, even if it was not intended.

        The string is copied to p, and enough space must be allocated. The returned @@ -408,34 +408,34 @@

        ei_decode_trace()

        -
        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        +
        int ei_decode_trace(const char *buf, int *index, erlang_trace *p);

        Decodes an Erlang trace token from the binary format.

        ei_decode_tuple_header()

        -
        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple +

        int ei_decode_tuple_header(const char *buf, int *index, int *arity);

        Decodes a tuple header, the number of elements is returned in arity. The tuple elements follow in order in the buffer.

        ei_decode_ulong()

        -
        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, +

        int ei_decode_ulong(const char *buf, int *index, unsigned long *p);

        Decodes an unsigned long integer from the binary format. If the code is 64 bits, the function ei_decode_ulong() is the same as ei_decode_ulonglong().

        ei_decode_ulonglong()

        -
        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) +

        int ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p);

        Decodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) integer from the binary format.

        ei_decode_version()

        -
        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be +

        int ei_decode_version(const char *buf, int *index, int *version);

        Decodes the version magic number for the Erlang binary term format. It must be the first token in a binary term.

        @@ -460,7 +460,7 @@

        ei_x_encode_atom_len()

        -
        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in +

        int ei_encode_atom(char *buf, int *index, const char *p);
        int ei_encode_atom_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_atom(ei_x_buff* x, const char *p);
        int ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len);

        Encodes an atom in the binary format. Parameter p is the name of the atom in Latin-1 encoding. Only up to MAXATOMLEN-1 bytes are encoded. The name is to be NULL-terminated, except for the ei_x_encode_atom_len() function.

        @@ -486,11 +486,11 @@

        ei_x_encode_atom_len_as()

        -
        int ei_encode_atom_as(char *buf, int *index, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        -  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with +

        int ei_encode_atom_as(char *buf, int *index, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_as(ei_x_buff* x, const char *p,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);
        int ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len,
        +  erlang_char_encoding from_enc, erlang_char_encoding to_enc);

        Encodes an atom in the binary format. Parameter p is the name of the atom with character encoding from_enc (ASCII, Latin-1, or UTF-8). The name must either be NULL-terminated or a function variant with a len parameter must be used.

        The encoding fails if p is not a valid string in encoding from_enc.

        Argument to_enc is ignored. As from Erlang/OTP 20 the encoding is always done @@ -506,7 +506,7 @@

        ei_x_encode_bignum()

        -
        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei +

        int ei_encode_bignum(char *buf, int *index, mpz_t obj);
        int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

        Encodes a GMP mpz_t integer to binary format. To use this function, the ei library must be configured and compiled to use the GMP library.

        @@ -519,7 +519,7 @@

        ei_x_encode_binary()

        -
        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes +

        int ei_encode_binary(char *buf, int *index, const void *p, long len);
        int ei_x_encode_binary(ei_x_buff* x, const void *p, long len);

        Encodes a binary in the binary format. The data is at p, of len bytes length.

        @@ -532,7 +532,7 @@

        ei_x_encode_bitstring()

        -
        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first +

        int ei_encode_bitstring(char *buf, int *index, const char *p, size_t bitoffs, size_t nbits);
        int ei_x_encode_bitstring(ei_x_buff* x, const char *p, size_t bitoffs, size_t nbits);

        Encodes a bit string in the binary format.

        The data is at p. The length of the bit string is nbits bits. The first bitoffs bits of the data at p are unused. The first byte which is part of the bit string is p[bitoffs/8]. The bitoffs%8 most significant bits of the first byte p[bitoffs/8] are unused.

        The number of bytes which is part of the bit string is @@ -550,7 +550,7 @@

        ei_x_encode_boolean()

        -
        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p +

        int ei_encode_boolean(char *buf, int *index, int p);
        int ei_x_encode_boolean(ei_x_buff* x, int p);

        Encodes a boolean value as the atom true if p is not zero, or false if p is zero.

        @@ -563,7 +563,7 @@

        ei_x_encode_char()

        -
        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For +

        int ei_encode_char(char *buf, int *index, char p);
        int ei_x_encode_char(ei_x_buff* x, char p);

        Encodes a char (8-bit) as an integer between 0-255 in the binary format. For historical reasons the integer argument is of type char. Your C code is to consider the specified argument to be of type unsigned char even if the C compilers and system may define char to be signed.

        @@ -578,7 +578,7 @@

        ei_x_encode_double()

        -
        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        +
        int ei_encode_double(char *buf, int *index, double p);
        int ei_x_encode_double(ei_x_buff* x, double p);

        Encodes a double-precision (64-bit) floating point number in the binary format.

        Returns -1 if the floating point number is not finite.

        @@ -590,7 +590,7 @@

        ei_x_encode_empty_list()

        -
        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        +
        int ei_encode_empty_list(char* buf, int* index);
        int ei_x_encode_empty_list(ei_x_buff* x);

        Encodes an empty list. It is often used at the tail of a list.

        @@ -602,7 +602,7 @@

        ei_x_encode_fun()

        -
        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun +

        int ei_encode_fun(char *buf, int *index, const erlang_fun *p);
        int ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun);

        Encodes a fun in the binary format. Parameter p points to an erlang_fun structure. The erlang_fun is not freed automatically, the free_fun is to be called if the fun is not needed after encoding.

        @@ -616,23 +616,23 @@

        ei_x_encode_list_header()

        -
        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the +

        int ei_encode_list_header(char *buf, int *index, int arity);
        int ei_x_encode_list_header(ei_x_buff* x, int arity);

        Encodes a list header, with a specified arity. The next arity+1 terms are the elements (actually its arity cons cells) and the tail of the list. Lists and tuples are encoded recursively, so that a list can contain another list or -tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        -ei_encode_atom(buf, &i, "c");
        -ei_encode_atom(buf, &i, "d");
        -ei_encode_list_header(buf, &i, 1);
        -ei_encode_atom(buf, &i, "e");
        -ei_encode_atom(buf, &i, "f");
        -ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number +tuple.

        For example, to encode the list [c, d, [e | f]]:

        ei_encode_list_header(buf, &i, 3);
        +ei_encode_atom(buf, &i, "c");
        +ei_encode_atom(buf, &i, "d");
        +ei_encode_list_header(buf, &i, 1);
        +ei_encode_atom(buf, &i, "e");
        +ei_encode_atom(buf, &i, "f");
        +ei_encode_empty_list(buf, &i);

        Note

        It may seem that there is no way to create a list without knowing the number of elements in advance. But indeed there is a way. Notice that the list [a, b, c] can be written as [a | [b | [c]]]. Using this, a list can be -written as conses.

        To encode a list, without knowing the arity in advance:

        while (something()) {
        -    ei_x_encode_list_header(&x, 1);
        -    ei_x_encode_ulong(&x, i); /* just an example */
        -}
        -ei_x_encode_empty_list(&x);

        +written as conses.

        To encode a list, without knowing the arity in advance:

        while (something()) {
        +    ei_x_encode_list_header(&x, 1);
        +    ei_x_encode_ulong(&x, i); /* just an example */
        +}
        +ei_x_encode_empty_list(&x);

        @@ -644,7 +644,7 @@

        ei_x_encode_long()

        -
        int ei_encode_long(char *buf, int *index, long p);
        int ei_x_encode_long(ei_x_buff* x, long p);

        Encodes a long integer in the binary format. If the code is 64 bits, the +

        int ei_encode_long(char *buf, int *index, long p);
        int ei_x_encode_long(ei_x_buff* x, long p);

        Encodes a long integer in the binary format. If the code is 64 bits, the function ei_encode_long() is the same as ei_encode_longlong().

        @@ -657,7 +657,7 @@

        ei_x_encode_longlong()

        -
        int ei_encode_longlong(char *buf, int *index, long long p);
        int ei_x_encode_longlong(ei_x_buff* x, long long p);

        Encodes a GCC long long or Visual C++ __int64 (64-bit) integer in the binary +

        int ei_encode_longlong(char *buf, int *index, long long p);
        int ei_x_encode_longlong(ei_x_buff* x, long long p);

        Encodes a GCC long long or Visual C++ __int64 (64-bit) integer in the binary format.

        @@ -670,13 +670,13 @@

        ei_x_encode_map_header()

        -
        int ei_encode_map_header(char *buf, int *index, int arity);
        int ei_x_encode_map_header(ei_x_buff* x, int arity);

        Encodes a map header, with a specified arity. The next arity*2 terms encoded +

        int ei_encode_map_header(char *buf, int *index, int arity);
        int ei_x_encode_map_header(ei_x_buff* x, int arity);

        Encodes a map header, with a specified arity. The next arity*2 terms encoded will be the keys and values of the map encoded in the following order: -K1, V1, K2, V2, ..., Kn, Vn.

        For example, to encode the map #{a => "Apple", b => "Banana"}:

        ei_x_encode_map_header(&x, 2);
        -ei_x_encode_atom(&x, "a");
        -ei_x_encode_string(&x, "Apple");
        -ei_x_encode_atom(&x, "b");
        -ei_x_encode_string(&x, "Banana");

        A correctly encoded map cannot have duplicate keys.

        Available since OTP 17.0

        +K1, V1, K2, V2, ..., Kn, Vn.

        For example, to encode the map #{a => "Apple", b => "Banana"}:

        ei_x_encode_map_header(&x, 2);
        +ei_x_encode_atom(&x, "a");
        +ei_x_encode_string(&x, "Apple");
        +ei_x_encode_atom(&x, "b");
        +ei_x_encode_string(&x, "Banana");

        A correctly encoded map cannot have duplicate keys.

        Available since OTP 17.0

        @@ -688,7 +688,7 @@

        ei_x_encode_pid()

        -
        int ei_encode_pid(char *buf, int *index, const erlang_pid *p);
        int ei_x_encode_pid(ei_x_buff* x, const erlang_pid *p);

        Encodes an Erlang process identifier (pid) in the binary format. Parameter p +

        int ei_encode_pid(char *buf, int *index, const erlang_pid *p);
        int ei_x_encode_pid(ei_x_buff* x, const erlang_pid *p);

        Encodes an Erlang process identifier (pid) in the binary format. Parameter p points to an erlang_pid structure which should either have been obtained earlier with ei_decode_pid(), ei_self() or created by @@ -704,7 +704,7 @@

        ei_x_encode_port()

        -
        int ei_encode_port(char *buf, int *index, const erlang_port *p);
        int ei_x_encode_port(ei_x_buff* x, const erlang_port *p);

        Encodes an Erlang port in the binary format. Parameter p points to an +

        int ei_encode_port(char *buf, int *index, const erlang_port *p);
        int ei_x_encode_port(ei_x_buff* x, const erlang_port *p);

        Encodes an Erlang port in the binary format. Parameter p points to an erlang_port structure which should have been obtained earlier with ei_decode_port(),

        @@ -718,7 +718,7 @@

        ei_x_encode_ref()

        -
        int ei_encode_ref(char *buf, int *index, const erlang_ref *p);
        int ei_x_encode_ref(ei_x_buff* x, const erlang_ref *p);

        Encodes an Erlang reference in the binary format. Parameter p points to an +

        int ei_encode_ref(char *buf, int *index, const erlang_ref *p);
        int ei_x_encode_ref(ei_x_buff* x, const erlang_ref *p);

        Encodes an Erlang reference in the binary format. Parameter p points to an erlang_ref structure which either should have been obtained earlier with ei_decode_ref(), or created by ei_make_ref().

        @@ -745,7 +745,7 @@

        ei_x_encode_string_len()

        -
        int ei_encode_string(char *buf, int *index, const char *p);
        int ei_encode_string_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_string(ei_x_buff* x, const char *p);
        int ei_x_encode_string_len(ei_x_buff* x, const char* s, int len);

        Encodes a string in the binary format. (A string in Erlang is a list, but is +

        int ei_encode_string(char *buf, int *index, const char *p);
        int ei_encode_string_len(char *buf, int *index, const char *p, int len);
        int ei_x_encode_string(ei_x_buff* x, const char *p);
        int ei_x_encode_string_len(ei_x_buff* x, const char* s, int len);

        Encodes a string in the binary format. (A string in Erlang is a list, but is encoded as a character array in the binary format.) The string is to be NULL-terminated, except for the ei_x_encode_string_len() function.

        @@ -759,7 +759,7 @@

        ei_x_encode_trace()

        -
        int ei_encode_trace(char *buf, int *index, const erlang_trace *p);
        int ei_x_encode_trace(ei_x_buff* x, const erlang_trace *p);

        Encodes an Erlang trace token in the binary format. Parameter p points to a +

        int ei_encode_trace(char *buf, int *index, const erlang_trace *p);
        int ei_x_encode_trace(ei_x_buff* x, const erlang_trace *p);

        Encodes an Erlang trace token in the binary format. Parameter p points to a erlang_trace structure which should have been obtained earlier with ei_decode_trace().

        @@ -773,13 +773,13 @@

        ei_x_encode_tuple_header()

        -
        int ei_encode_tuple_header(char *buf, int *index, int arity);
        int ei_x_encode_tuple_header(ei_x_buff* x, int arity);

        Encodes a tuple header, with a specified arity. The next arity terms encoded +

        int ei_encode_tuple_header(char *buf, int *index, int arity);
        int ei_x_encode_tuple_header(ei_x_buff* x, int arity);

        Encodes a tuple header, with a specified arity. The next arity terms encoded will be the elements of the tuple. Tuples and lists are encoded recursively, so -that a tuple can contain another tuple or list.

        For example, to encode the tuple {a, {b, {}}}:

        ei_encode_tuple_header(buf, &i, 2);
        -ei_encode_atom(buf, &i, "a");
        -ei_encode_tuple_header(buf, &i, 2);
        -ei_encode_atom(buf, &i, "b");
        -ei_encode_tuple_header(buf, &i, 0);

        +that a tuple can contain another tuple or list.

        For example, to encode the tuple {a, {b, {}}}:

        ei_encode_tuple_header(buf, &i, 2);
        +ei_encode_atom(buf, &i, "a");
        +ei_encode_tuple_header(buf, &i, 2);
        +ei_encode_atom(buf, &i, "b");
        +ei_encode_tuple_header(buf, &i, 0);

        @@ -791,7 +791,7 @@

        ei_x_encode_ulong()

        -
        int ei_encode_ulong(char *buf, int *index, unsigned long p);
        int ei_x_encode_ulong(ei_x_buff* x, unsigned long p);

        Encodes an unsigned long integer in the binary format. If the code is 64 bits, +

        int ei_encode_ulong(char *buf, int *index, unsigned long p);
        int ei_x_encode_ulong(ei_x_buff* x, unsigned long p);

        Encodes an unsigned long integer in the binary format. If the code is 64 bits, the function ei_encode_ulong() is the same as ei_encode_ulonglong().

        @@ -804,7 +804,7 @@

        ei_x_encode_ulonglong()

        -
        int ei_encode_ulonglong(char *buf, int *index, unsigned long long p);
        int ei_x_encode_ulonglong(ei_x_buff* x, unsigned long long p);

        Encodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) +

        int ei_encode_ulonglong(char *buf, int *index, unsigned long long p);
        int ei_x_encode_ulonglong(ei_x_buff* x, unsigned long long p);

        Encodes a GCC unsigned long long or Visual C++ unsigned __int64 (64-bit) integer in the binary format.

        @@ -817,14 +817,14 @@

        ei_x_encode_version()

        -
        int ei_encode_version(char *buf, int *index);
        int ei_x_encode_version(ei_x_buff* x);

        Encodes a version magic number for the binary format. Must be the first token in +

        int ei_encode_version(char *buf, int *index);
        int ei_x_encode_version(ei_x_buff* x);

        Encodes a version magic number for the binary format. Must be the first token in a binary term.

        ei_get_type()

        -
        int ei_get_type(const char *buf, const int *index, int *type, int *size);

        Returns the type in *type and size in *size of the encoded term. For strings +

        int ei_get_type(const char *buf, const int *index, int *type, int *size);

        Returns the type in *type and size in *size of the encoded term. For strings and atoms, size is the number of characters not including the terminating NULL. For binaries and bitstrings, *size is the number of bytes. For lists, tuples and maps, *size is the arity of the object. For bignum integers, @@ -857,7 +857,7 @@

        ei_init()

        -
        int ei_init(void);

        Initialize the ei library. This function should be called once (and only once) +

        int ei_init(void);

        Initialize the ei library. This function should be called once (and only once) before calling any other functionality in the ei library.

        On success zero is returned. On failure a posix error code is returned.

        Available since OTP 21.3

        @@ -870,7 +870,7 @@

        ei_s_print_term()

        -
        int ei_print_term(FILE* fp, const char* buf, int* index);
        int ei_s_print_term(char** s, const char* buf, int* index);

        Prints a term, in clear text, to the file specified by fp, or the buffer +

        int ei_print_term(FILE* fp, const char* buf, int* index);
        int ei_s_print_term(char** s, const char* buf, int* index);

        Prints a term, in clear text, to the file specified by fp, or the buffer pointed to by s. It tries to resemble the term printing in the Erlang shell.

        In ei_s_print_term(), parameter s is to point to a dynamically (malloc) allocated string of BUFSIZ bytes or a NULL pointer. The string can be reallocated (and *s can be updated) by this function if the result is more @@ -883,7 +883,7 @@

        ei_set_compat_rel()

        -
        void ei_set_compat_rel(unsigned release_number);

        In general, the ei library is guaranteed to be compatible with other +

        void ei_set_compat_rel(unsigned release_number);

        In general, the ei library is guaranteed to be compatible with other Erlang/OTP components that are 2 major releases older or newer than the ei library itself.

        Sometimes an exception to the above rule has to be made to make new features (or even bug fixes) possible. A call to ei_set_compat_rel(release_number) sets the @@ -908,7 +908,7 @@

        ei_skip_term()

        -
        int ei_skip_term(const char* buf, int* index);

        Skips a term in the specified buffer; recursively skips elements of lists and +

        int ei_skip_term(const char* buf, int* index);

        Skips a term in the specified buffer; recursively skips elements of lists and tuples, so that a full term is skipped. This is a way to get the size of an Erlang term.

        buf is the buffer.

        index is updated to point right after the term in the buffer.

        Note

        This can be useful when you want to hold arbitrary terms: skip them and copy the binary term data to some buffer.

        Returns 0 on success, otherwise -1.

        @@ -923,7 +923,7 @@

        ei_x_append_buf()

        -
        int ei_x_append(ei_x_buff* x, const ei_x_buff* x2);
        int ei_x_append_buf(ei_x_buff* x, const char* buf, int len);

        Appends data at the end of buffer x.

        +
        int ei_x_append(ei_x_buff* x, const ei_x_buff* x2);
        int ei_x_append_buf(ei_x_buff* x, const char* buf, int len);

        Appends data at the end of buffer x.

        @@ -935,7 +935,7 @@

        ei_x_format_wo_ver()

        -
        int ei_x_format(ei_x_buff* x, const char* fmt, ...);
        int ei_x_format_wo_ver(ei_x_buff* x, const char *fmt, ... );

        Formats a term, given as a string, to a buffer. Works like a sprintf for Erlang +

        int ei_x_format(ei_x_buff* x, const char* fmt, ...);
        int ei_x_format_wo_ver(ei_x_buff* x, const char *fmt, ... );

        Formats a term, given as a string, to a buffer. Works like a sprintf for Erlang terms. fmt contains a format string, with arguments like ~d, to insert terms from variables. The following formats are supported (with the C types given):

        ~a  An atom, char*
         ~c  A character, char
        @@ -945,14 +945,14 @@ 

        ~u A unsigned long integer, unsigned long int ~f A float, float ~d A double float, double float -~p An Erlang pid, erlang_pid*

        For example, to encode a tuple with some stuff:

        ei_x_format("{~a,~i,~d}", "numbers", 12, 3.14159)
        -encodes the tuple {numbers,12,3.14159}

        ei_x_format_wo_ver() formats into a buffer, without the initial version byte.

        Change

        Since OTP 26.2 maps can be encoded with syntax like "#{k1 => v1, k2 => v2}".

        +~p An Erlang pid, erlang_pid*

    For example, to encode a tuple with some stuff:

    ei_x_format("{~a,~i,~d}", "numbers", 12, 3.14159)
    +encodes the tuple {numbers,12,3.14159}

    ei_x_format_wo_ver() formats into a buffer, without the initial version byte.

    Change

    Since OTP 26.2 maps can be encoded with syntax like "#{k1 => v1, k2 => v2}".

    ei_x_free()

    -
    int ei_x_free(ei_x_buff* x);

    Deallocates the dynamically allocated content of the buffer referred by x. +

    int ei_x_free(ei_x_buff* x);

    Deallocates the dynamically allocated content of the buffer referred by x. After deallocation, the buff field is set to NULL.

    @@ -965,7 +965,7 @@

    ei_x_new_with_version()

    -
    int ei_x_new(ei_x_buff* x);
    int ei_x_new_with_version(ei_x_buff* x);

    Initialize the dynamically realizable buffer referred to by x. The fields of +

    int ei_x_new(ei_x_buff* x);
    int ei_x_new_with_version(ei_x_buff* x);

    Initialize the dynamically realizable buffer referred to by x. The fields of the structure pointed to by parameter x is filled in, and a default buffer is allocated. ei_x_new_with_version() also puts an initial version byte, which is used in the binary format (so that ei_x_encode_version() will not be needed.)

    diff --git a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_connect.html b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_connect.html index d9273922ad2e6..7a3357ee57f15 100644 --- a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_connect.html +++ b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_connect.html @@ -241,36 +241,36 @@

    • ei_cnode - Opaque data type representing a C-node. A ei_cnode structure is initialized by calling -ei_connect_init() or friends.

    • ei_socket_callbacks

      typedef struct {
      +ei_connect_init() or friends.

    • ei_socket_callbacks

      typedef struct {
           int flags;
      -    int (*socket)(void **ctx, void *setup_ctx);
      -    int   (*close)(void *ctx);
      -    int (*listen)(void *ctx, void *addr, int *len, int backlog);
      -    int (*accept)(void **ctx, void *addr, int *len, unsigned tmo);
      -    int (*connect)(void *ctx, void *addr, int len, unsigned tmo);
      -    int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo);
      -    int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo);
      -    int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo);
      -    int (*handshake_packet_header_size)(void *ctx, int *sz);
      -    int (*connect_handshake_complete)(void *ctx);
      -    int (*accept_handshake_complete)(void *ctx);
      -    int (*get_fd)(void *ctx, int *fd);
      -} ei_socket_callbacks;

      Callbacks functions for a + int (*socket)(void **ctx, void *setup_ctx); + int (*close)(void *ctx); + int (*listen)(void *ctx, void *addr, int *len, int backlog); + int (*accept)(void **ctx, void *addr, int *len, unsigned tmo); + int (*connect)(void *ctx, void *addr, int len, unsigned tmo); + int (*writev)(void *ctx, const void *iov, int iovcnt, ssize_t *len, unsigned tmo); + int (*write)(void *ctx, const char *buf, ssize_t *len, unsigned tmo); + int (*read)(void *ctx, char *buf, ssize_t *len, unsigned tmo); + int (*handshake_packet_header_size)(void *ctx, int *sz); + int (*connect_handshake_complete)(void *ctx); + int (*accept_handshake_complete)(void *ctx); + int (*get_fd)(void *ctx, int *fd); +} ei_socket_callbacks;

    Callbacks functions for a User Supplied Socket Implementation. Documentation of each field can be -found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    -    char ipadr[4]; /* Ip v4 address in network byte order */
    -    char nodename[MAXNODELEN];
    -} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
    +found in the User Supplied Socket Implementation section above.

  • ErlConnect

    typedef struct {
    +    char ipadr[4]; /* Ip v4 address in network byte order */
    +    char nodename[MAXNODELEN];
    +} ErlConnect;

    IP v4 address and nodename.

  • Erl_IpAddr

    typedef struct {
         unsigned s_addr; /* Ip v4 address in network byte order */
    -} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
    +} Erl_IpAddr;

    IP v4 address.

  • erlang_msg

    typedef struct {
         long msgtype;
         erlang_pid from;
         erlang_pid to;
    -    char toname[MAXATOMLEN+1];
    -    char cookie[MAXATOMLEN+1];
    +    char toname[MAXATOMLEN+1];
    +    char cookie[MAXATOMLEN+1];
         erlang_trace token;
    -} erlang_msg;

    Information about a message received via +} erlang_msg;

  • Information about a message received via ei_receive_msg() or friends.

    @@ -295,15 +295,15 @@

    ei_gethostbyname_r()

    -
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    -  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    -  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    +
    struct hostent * ei_gethostbyaddr(const char *addr, int len, int type);
    struct hostent * ei_gethostbyaddr_r(const char *addr, int length,  int type,
    +  struct hostent *hostp, char *buffer,   int buflen,  int *h_errnop);
    struct hostent * ei_gethostbyname(const char *name);
    struct hostent * ei_gethostbyname_r(const char *name,  struct hostent *hostp,
    +  char *buffer,  int buflen,  int *h_errnop);

    Convenience functions for some common name lookup functions.

    ei_accept()

    -
    int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp);

    Used by a server process to accept a connection from a client process.

    • ec is the C-node structure.
    • listensock is an open socket descriptor on which listen() has previously +
      int ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp);

      Used by a server process to accept a connection from a client process.

      • ec is the C-node structure.
      • listensock is an open socket descriptor on which listen() has previously been called.
      • conp is a pointer to an ErlConnect struct.

      On success, conp is filled in with the address and node name of the connecting client and a file descriptor is returned. On failure, ERL_ERROR is returned and erl_errno is set to EIO.

      @@ -312,14 +312,14 @@

      ei_accept_tmo()

      -
      int ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms);

      Equivalent to ei_accept with an optional time-out argument, see the +

      int ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms);

      Equivalent to ei_accept with an optional time-out argument, see the description at the beginning of this manual page.

      ei_close_connection()

      -
      int ei_close_connection(int fd);

      Closes a previously opened connection or listen socket.

      Available since OTP 21.3

      +
      int ei_close_connection(int fd);

      Closes a previously opened connection or listen socket.

      Available since OTP 21.3

      @@ -343,7 +343,7 @@

      ei_xconnect_host_port()

      -
      int ei_connect(ei_cnode* ec, char *nodename);
      int ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename);
      int ei_connect_host_port(ei_cnode* ec, char *hostname, int port);
      int ei_xconnect_host_port(ei_cnode* ec, Erl_IpAddr adr, int port);

      Sets up a connection to an Erlang node.

      ei_xconnect() requires the IP address of the remote host and the alive name of +

      int ei_connect(ei_cnode* ec, char *nodename);
      int ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename);
      int ei_connect_host_port(ei_cnode* ec, char *hostname, int port);
      int ei_xconnect_host_port(ei_cnode* ec, Erl_IpAddr adr, int port);

      Sets up a connection to an Erlang node.

      ei_xconnect() requires the IP address of the remote host and the alive name of the remote node to be specified. ei_connect() provides an alternative interface and determines the information from the node name provided. The ei_xconnect_host_port() function provides yet another alternative that will @@ -359,12 +359,12 @@

      #define IP_ADDR "150.236.14.75" /*** Variant 1 ***/ -int fd = ei_connect(&ec, NODE); +int fd = ei_connect(&ec, NODE); /*** Variant 2 ***/ struct in_addr addr; -addr.s_addr = inet_addr(IP_ADDR); -fd = ei_xconnect(&ec, &addr, ALIVE);

    Available since OTP 23.0

    +addr.s_addr = inet_addr(IP_ADDR); +fd = ei_xconnect(&ec, &addr, ALIVE);

    Available since OTP 23.0

    @@ -388,11 +388,11 @@

    ei_connect_xinit_ussi()

    -
    int ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation);
    int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie,
    -  unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);
    int ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    -  const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation);
    int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    +
    int ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation);
    int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie,
    +  unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);
    int ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename,
    +  const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation);
    int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename,
       const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation,
    -  ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);

    Initializes the ec structure, to identify the node name and cookie of the + ei_socket_callbacks *cbs, int cbs_sz, void *setup_context);

    Initializes the ec structure, to identify the node name and cookie of the server. One of them must be called before other functions that works on the ei_cnode type or a file descriptor associated with a connection to another node is used.

    • ec is a structure containing information about the C-node. It is used in @@ -415,20 +415,20 @@

      see the relevant system documentation.

      These functions return a negative value indicating that an error occurred.

      Example 1:

      unsigned n = 0;
       struct in_addr addr;
       ei_cnode ec;
      -addr.s_addr = inet_addr("150.236.14.75");
      -if (ei_connect_xinit(&ec,
      +addr.s_addr = inet_addr("150.236.14.75");
      +if (ei_connect_xinit(&ec,
                            "chivas",
                            "madonna",
                            "madonna@chivas.du.etx.ericsson.se",
                            &addr;
                            "cookie...",
      -                     n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Example 2:

      if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
      -    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
      -    exit(-1);
      -}

      Available since OTP 21.3

      + n++) < 0) { + fprintf(stderr,"ERROR when initializing: %d",erl_errno); + exit(-1); +}

    Example 2:

    if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) {
    +    fprintf(stderr,"ERROR when initializing: %d",erl_errno);
    +    exit(-1);
    +}

    Available since OTP 21.3

    @@ -452,7 +452,7 @@

    ei_xconnect_host_port_tmo()

    -
    int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
    int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
    int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
    int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

    Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and +

    int ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms);
    int ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms);
    int ei_connect_host_port_tmo(ei_cnode* ec, char *hostname, int port, unsigned ms);
    int ei_xconnect_host_port_tmo(ei_cnode* ec, Erl_IpAddr adr, int port, unsigned ms);

    Equivalent to ei_connect, ei_xconnect, ei_connect_host_port and ei_xconnect_host_port with an optional time-out argument, see the description at the beginning of this manual page.

    Available since OTP 23.0

    @@ -466,7 +466,7 @@

    ei_set_tracelevel()

    -
    int ei_get_tracelevel(void);
    void ei_set_tracelevel(int level);

    Used to set tracing on the distribution. The levels are different verbosity +

    int ei_get_tracelevel(void);
    void ei_set_tracelevel(int level);

    Used to set tracing on the distribution. The levels are different verbosity levels. A higher level means more information. See also section Debug Information.

    These functions are not thread safe.

    Available since OTP R13B04

    @@ -480,7 +480,7 @@

    ei_xlisten()

    -
    int ei_listen(ei_cnode *ec, int *port, int backlog);
    int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

    Used by a server process to setup a listen socket which later can be used for +

    int ei_listen(ei_cnode *ec, int *port, int backlog);
    int ei_xlisten(ei_cnode *ec, Erl_IpAddr adr, int *port, int backlog);

    Used by a server process to setup a listen socket which later can be used for accepting connections from client processes.

    • ec is the C-node structure.
    • adr is local interface to bind to.
    • port is a pointer to an integer containing the port number to bind to. If *port equals 0 when calling ei_listen(), the socket will be bound to an ephemeral port. On success, ei_listen() will update the value of *port to @@ -495,7 +495,7 @@

      ei_make_pid()

      -
      int ei_make_pid(ei_cnode *ec, erlang_pid *pid);

      Creates a new process identifier in the argument pid. This process identifier +

      int ei_make_pid(ei_cnode *ec, erlang_pid *pid);

      Creates a new process identifier in the argument pid. This process identifier refers to a conseptual process residing on the C-node identified by the argument ec. On success 0 is returned. On failure ERL_ERROR is returned and erl_errno is set.

      The C-node identified by ec must have been initialized and must have received @@ -508,7 +508,7 @@

      ei_make_ref()

      -
      int ei_make_ref(ei_cnode *ec, erlang_ref *ref);

      Creates a new reference in the argument ref. This reference originates from +

      int ei_make_ref(ei_cnode *ec, erlang_ref *ref);

      Creates a new reference in the argument ref. This reference originates from the C-node identified by the argument ec. On success 0 is returned. On failure ERL_ERROR is returned and erl_errno is set.

      The C-node identified by ec must have been initialized and must have received a name prior to the call to ei_make_ref(). Initialization of the C-node is @@ -520,7 +520,7 @@

      ei_publish()

      -
      int ei_publish(ei_cnode *ec, int port);

      Used by a server process to register with the local name server EPMD, thereby +

      int ei_publish(ei_cnode *ec, int port);

      Used by a server process to register with the local name server EPMD, thereby allowing other processes to send messages by using the registered name. Before calling either of these functions, the process should have called bind() and listen() on an open socket.

      • ec is the C-node structure.
      • port is the local name to register, and is to be the same as the port number @@ -533,14 +533,14 @@

        ei_publish_tmo()

        -
        int ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms);

        Equivalent to ei_publish with an optional time-out argument, see the +

        int ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms);

        Equivalent to ei_publish with an optional time-out argument, see the description at the beginning of this manual page.

        ei_receive()

        -
        int ei_receive(int fd, unsigned char* bufp, int bufsize);

        Receives a message consisting of a sequence of bytes in the Erlang external +

        int ei_receive(int fd, unsigned char* bufp, int bufsize);

        Receives a message consisting of a sequence of bytes in the Erlang external format.

        • fd is an open descriptor to an Erlang connection. It is obtained from a previous ei_connect or ei_accept.
        • bufp is a buffer large enough to hold the expected message.
        • bufsize indicates the size of bufp.

        If a tick occurs, that is, the Erlang node on the other end of the connection has polled this node to see if it is still alive, the function returns @@ -553,7 +553,7 @@

        ei_receive_encoded()

        -
        int ei_receive_encoded(int fd, char **mbufp, int *bufsz,  erlang_msg *msg, int *msglen);

        This function is retained for compatibility with code generated by the interface +

        int ei_receive_encoded(int fd, char **mbufp, int *bufsz,  erlang_msg *msg, int *msglen);

        This function is retained for compatibility with code generated by the interface compiler and with code following examples in the same application.

        In essence, the function performs the same operation as ei_xreceive_msg, but instead of using an ei_x_buff, the function expects a pointer to a character pointer (mbufp), where the character pointer is to point to a memory area @@ -569,8 +569,8 @@

        ei_receive_encoded_tmo()

        -
        int ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz,  erlang_msg *msg,
        -  int *msglen, unsigned timeout_ms);

        Equivalent to ei_receive_encoded with an optional time-out argument, see the +

        int ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz,  erlang_msg *msg,
        +  int *msglen, unsigned timeout_ms);

        Equivalent to ei_receive_encoded with an optional time-out argument, see the description at the beginning of this manual page.

        @@ -583,7 +583,7 @@

        ei_xreceive_msg()

        -
        int ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x);
        int ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x);

        Receives a message to the buffer in x. ei_xreceive_msg allows the buffer in +

        int ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x);
        int ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x);

        Receives a message to the buffer in x. ei_xreceive_msg allows the buffer in x to grow, but ei_receive_msg fails if the message is larger than the pre-allocated buffer in x.

        • fd is an open descriptor to an Erlang connection.
        • msg is a pointer to an erlang_msg structure and contains information on the message received.
        • x is buffer obtained from ei_x_new.

        On success, the functions return ERL_MSG and the @@ -603,33 +603,33 @@

        ei_xreceive_msg_tmo()

        -
        int ei_receive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned imeout_ms);
        int ei_xreceive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned timeout_ms);

        Equivalent to ei_receive_msg and ei_xreceive_msg with an optional time-out +

        int ei_receive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned imeout_ms);
        int ei_xreceive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned timeout_ms);

        Equivalent to ei_receive_msg and ei_xreceive_msg with an optional time-out argument, see the description at the beginning of this manual page.

        ei_receive_tmo()

        -
        int ei_receive_tmo(int fd, unsigned char* bufp, int bufsize, unsigned timeout_ms);

        Equivalent to ei_receive with an optional time-out argument, see the +

        int ei_receive_tmo(int fd, unsigned char* bufp, int bufsize, unsigned timeout_ms);

        Equivalent to ei_receive with an optional time-out argument, see the description at the beginning of this manual page.

        ei_reg_send()

        -
        int ei_reg_send(ei_cnode* ec, int fd, char* server_name, char* buf, int len);

        Sends an Erlang term to a registered process.

        • fd is an open descriptor to an Erlang connection.
        • server_name is the registered name of the intended recipient.
        • buf is the buffer containing the term in binary format.
        • len is the length of the message in bytes.

        Returns 0 if successful, otherwise -1. In the latter case it sets +

        int ei_reg_send(ei_cnode* ec, int fd, char* server_name, char* buf, int len);

        Sends an Erlang term to a registered process.

        • fd is an open descriptor to an Erlang connection.
        • server_name is the registered name of the intended recipient.
        • buf is the buffer containing the term in binary format.
        • len is the length of the message in bytes.

        Returns 0 if successful, otherwise -1. In the latter case it sets erl_errno to EIO.

        Example:

        Send the atom "ok" to the process "worker":

        ei_x_buff x;
        -ei_x_new_with_version(&x);
        -ei_x_encode_atom(&x, "ok");
        -if (ei_reg_send(&ec, fd, x.buff, x.index) < 0)
        -    handle_error();

        +ei_x_new_with_version(&x); +ei_x_encode_atom(&x, "ok"); +if (ei_reg_send(&ec, fd, x.buff, x.index) < 0) + handle_error();

    ei_reg_send_tmo()

    -
    int ei_reg_send_tmo(ei_cnode* ec, int fd, char* server_name, char* buf, int len,
    -  unsigned timeout_ms);

    Equivalent to ei_reg_send with an optional time-out argument, see the +

    int ei_reg_send_tmo(ei_cnode* ec, int fd, char* server_name, char* buf, int len,
    +  unsigned timeout_ms);

    Equivalent to ei_reg_send with an optional time-out argument, see the description at the beginning of this manual page.

    @@ -654,10 +654,10 @@

    ei_rpc_from()

    -
    int ei_rpc(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    -  int argbuflen, ei_x_buff *x);
    int ei_rpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    -  int argbuflen);
    int ei_xrpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    -  int argbuflen, int flags);
    int ei_rpc_from(ei_cnode *ec, int fd, int timeout, erlang_msg *msg, ei_x_buff *x);

    Supports calling Erlang functions on remote nodes. ei_rpc_to() sends an RPC +

    int ei_rpc(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    +  int argbuflen, ei_x_buff *x);
    int ei_rpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    +  int argbuflen);
    int ei_xrpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf,
    +  int argbuflen, int flags);
    int ei_rpc_from(ei_cnode *ec, int fd, int timeout, erlang_msg *msg, ei_x_buff *x);

    Supports calling Erlang functions on remote nodes. ei_rpc_to() sends an RPC request to a remote node and ei_rpc_from() receives the results of such a call. ei_rpc() combines the functionality of these two functions by sending an RPC request and waiting for the results.

    The ei_xrpc_to() function is equivalent to ei_rpc_to() when its flags @@ -705,25 +705,25 @@

    functions set erl_errno to one of the following:

    • EIO - I/O error.

    • ETIMEDOUT - Time-out expired.

    • EAGAIN - Temporary error: Try again.

    Example:

    Check to see if an Erlang process is alive:

    int index = 0, is_alive;
     ei_x_buff args, result;
     
    -ei_x_new(&result);
    -ei_x_new(&args);
    -ei_x_encode_list_header(&args, 1);
    -ei_x_encode_pid(&args, &check_pid);
    -ei_x_encode_empty_list(&args);
    +ei_x_new(&result);
    +ei_x_new(&args);
    +ei_x_encode_list_header(&args, 1);
    +ei_x_encode_pid(&args, &check_pid);
    +ei_x_encode_empty_list(&args);
     
    -if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
    -           args.buff, args.index, &result) < 0)
    -    handle_error();
    +if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
    +           args.buff, args.index, &result) < 0)
    +    handle_error();
     
    -if (ei_decode_version(result.buff, &index) < 0
    -    || ei_decode_bool(result.buff, &index, &is_alive) < 0)
    -    handle_error();

    +if (ei_decode_version(result.buff, &index) < 0 + || ei_decode_bool(result.buff, &index, &is_alive) < 0) + handle_error();

    ei_self()

    -
    erlang_pid * ei_self(ei_cnode *ec);

    Retrieves a generic pid of the C-node. Every C-node has a (pseudo) pid used in +

    erlang_pid * ei_self(ei_cnode *ec);

    Retrieves a generic pid of the C-node. Every C-node has a (pseudo) pid used in ei_send_reg, ei_rpc(), and others. This is contained in a field in the ec structure. Do not modify this structure.

    On success a pointer to the process identifier is returned. On failure NULL is returned and erl_errno is set.

    The C-node identified by ec must have been initialized and must have received @@ -736,28 +736,28 @@

    ei_send()

    -
    int ei_send(int fd, erlang_pid* to, char* buf, int len);

    Sends an Erlang term to a process.

    • fd is an open descriptor to an Erlang connection.
    • to is the pid of the intended recipient of the message.
    • buf is the buffer containing the term in binary format.
    • len is the length of the message in bytes.

    Returns 0 if successful, otherwise -1. In the latter case it sets +

    int ei_send(int fd, erlang_pid* to, char* buf, int len);

    Sends an Erlang term to a process.

    • fd is an open descriptor to an Erlang connection.
    • to is the pid of the intended recipient of the message.
    • buf is the buffer containing the term in binary format.
    • len is the length of the message in bytes.

    Returns 0 if successful, otherwise -1. In the latter case it sets erl_errno to EIO.

    ei_send_encoded()

    -
    int ei_send_encoded(int fd, erlang_pid* to, char* buf, int len);

    Works exactly as ei_send, the alternative name is retained for backward +

    int ei_send_encoded(int fd, erlang_pid* to, char* buf, int len);

    Works exactly as ei_send, the alternative name is retained for backward compatibility. The function will not be removed without prior notice.

    ei_send_encoded_tmo()

    -
    int ei_send_encoded_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send_encoded with an optional time-out argument, see the +

    int ei_send_encoded_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send_encoded with an optional time-out argument, see the description at the beginning of this manual page.

    ei_send_reg_encoded()

    -
    int ei_send_reg_encoded(int fd, const erlang_pid *from, const char *to, const char *buf, int len);

    This function is retained for compatibility with code generated by the interface +

    int ei_send_reg_encoded(int fd, const erlang_pid *from, const char *to, const char *buf, int len);

    This function is retained for compatibility with code generated by the interface compiler and with code following examples in the same application.

    The function works as ei_reg_send with one exception. Instead of taking ei_cnode as first argument, it takes a second argument, an erlang_pid, which is to be the process identifier of the sending process (in the Erlang @@ -768,15 +768,15 @@

    ei_send_reg_encoded_tmo()

    -
    int ei_send_reg_encoded_tmo(int fd, const erlang_pid *from, const char *to, const char *buf,
    -  int len, unsigned timeout_ms);

    Equivalent to ei_send_reg_encoded with an optional time-out argument, see the +

    int ei_send_reg_encoded_tmo(int fd, const erlang_pid *from, const char *to, const char *buf,
    +  int len, unsigned timeout_ms);

    Equivalent to ei_send_reg_encoded with an optional time-out argument, see the description at the beginning of this manual page.

    ei_send_tmo()

    -
    int ei_send_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send with an optional time-out argument, see the description +

    int ei_send_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms);

    Equivalent to ei_send with an optional time-out argument, see the description at the beginning of this manual page.

    @@ -795,7 +795,7 @@

    ei_thisalivename()

    -
    const char * ei_thisnodename(ei_cnode *ec);
    const char * ei_thishostname(ei_cnode *ec);
    const char * ei_thisalivename(ei_cnode *ec);

    Can be used to retrieve information about the C-node. These values are initially +

    const char * ei_thisnodename(ei_cnode *ec);
    const char * ei_thishostname(ei_cnode *ec);
    const char * ei_thisalivename(ei_cnode *ec);

    Can be used to retrieve information about the C-node. These values are initially set with ei_connect_init() or ei_connect_xinit().

    These function simply fetch the appropriate field from the ec structure. Read the field directly will probably be safe for a long time, so these functions are not really needed.

    @@ -804,7 +804,7 @@

    ei_unpublish()

    -
    int ei_unpublish(ei_cnode *ec);

    Can be called by a process to unregister a specified node from EPMD on the local +

    int ei_unpublish(ei_cnode *ec);

    Can be called by a process to unregister a specified node from EPMD on the local host. This is, however, usually not allowed, unless EPMD was started with flag -relaxed_command_check, which it normally is not.

    To unregister a node you have published, you should close the descriptor that was returned by ei_publish().

    Warning

    This function is deprecated and will be removed in a future release.

    ec is the node structure of the node to unregister.

    If the node was successfully unregistered from EPMD, the function returns 0. @@ -814,7 +814,7 @@

    ei_unpublish_tmo()

    -
    int ei_unpublish_tmo(ei_cnode *ec, unsigned timeout_ms);

    Equivalent to ei_unpublish with an optional time-out argument, see the +

    int ei_unpublish_tmo(ei_cnode *ec, unsigned timeout_ms);

    Equivalent to ei_unpublish with an optional time-out argument, see the description at the beginning of this manual page.

    diff --git a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_global.html b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_global.html index 40fbdc3c1a452..ddd8880442ab0 100644 --- a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_global.html +++ b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_global.html @@ -132,7 +132,7 @@

    ei_global_names()

    -
    char **ei_global_names(ei_cnode *ec, int fd, int *count);

    Retrieves a list of all known global names.

    • ec is the ei_cnode representing the current cnode.
    • fd is an open descriptor to an Erlang connection.
    • count is the address of an integer, or NULL. If count is not NULL, it +
      char **ei_global_names(ei_cnode *ec, int fd, int *count);

      Retrieves a list of all known global names.

      • ec is the ei_cnode representing the current cnode.
      • fd is an open descriptor to an Erlang connection.
      • count is the address of an integer, or NULL. If count is not NULL, it is set by the function to the number of names found.

      On success, the function returns an array of strings, each containing a single registered name, and sets count to the number of names found. The array is terminated by a single NULL pointer. On failure, the function returns NULL @@ -144,20 +144,20 @@

      ei_global_register()

      -
      int ei_global_register(int fd, const char *name, erlang_pid *self);

      Registers a name in global.

      • fd is an open descriptor to an Erlang connection.
      • name is the name to register in global.
      • pid is the pid that is to be associated with name. This value is returned +
        int ei_global_register(int fd, const char *name, erlang_pid *self);

        Registers a name in global.

        • fd is an open descriptor to an Erlang connection.
        • name is the name to register in global.
        • pid is the pid that is to be associated with name. This value is returned by global when processes request the location of name.

        Returns 0 on success, otherwise -1.

        Available since OTP 23.0

        ei_global_unregister()

        -
        int ei_global_unregister(ei_cnode *ec, int fd, const char *name);

        Unregisters a name from global.

        • ec is the ei_cnode representing the current cnode.
        • fd is an open descriptor to an Erlang connection.
        • name is the name to unregister from global.

        Returns 0 on success, otherwise -1.

        Available since OTP 23.0

        +
        int ei_global_unregister(ei_cnode *ec, int fd, const char *name);

        Unregisters a name from global.

        • ec is the ei_cnode representing the current cnode.
        • fd is an open descriptor to an Erlang connection.
        • name is the name to unregister from global.

        Returns 0 on success, otherwise -1.

        Available since OTP 23.0

        ei_global_whereis()

        -
        int ei_global_whereis(ei_cnode *ec, int fd, const char *name, erlang_pid* pid, char *node);

        Looks up a name in global.

        • ec is the ei_cnode representing the current cnode.
        • fd is an open descriptor to an Erlang connection.
        • name is the name that is to be looked up in global.

        The pid parameter is a pointer to a erlang_pid that the function will update +

        int ei_global_whereis(ei_cnode *ec, int fd, const char *name, erlang_pid* pid, char *node);

        Looks up a name in global.

        • ec is the ei_cnode representing the current cnode.
        • fd is an open descriptor to an Erlang connection.
        • name is the name that is to be looked up in global.

        The pid parameter is a pointer to a erlang_pid that the function will update with the pid associated with the global name, if successful.

        If node is not NULL, it is a pointer to a buffer where the function can fill in the name of the node where name is found. node can be passed directly to ei_connect() if necessary.

        On success, the function returns 0, updates the erlang_pid pointed to by the diff --git a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html index e0f6ba45c95f1..f7acbba017902 100644 --- a/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html +++ b/prs/9277/lib/erl_interface-5.5.2/doc/html/ei_users_guide.html @@ -180,11 +180,11 @@

        Erlang.

        The Erl_Interface library supports this activity. It has several C functions that create and manipulate Erlang data structures. The following example shows how to create and encode an Erlang tuple {tobbe,3928}:

        ei_x_buff buf;
        -ei_x_new(&buf);
        +ei_x_new(&buf);
         int i = 0;
        -ei_x_encode_tuple_header(&buf, 2);
        -ei_x_encode_atom(&buf, "tobbe");
        -ei_x_encode_long(&buf, 3928);

        For a complete description, see the ei module.

        +ei_x_encode_tuple_header(&buf, 2); +ei_x_encode_atom(&buf, "tobbe"); +ei_x_encode_long(&buf, 3928);

    For a complete description, see the ei module.

    @@ -193,18 +193,18 @@

    The previous example can be simplified by using the ei_x_format_wo_ver function to create an Erlang term:

    ei_x_buff buf;
    -ei_x_new(&buf);
    -ei_x_format_wo_ver(&buf, "{~a,~i}", "tobbe", 3928);

    For a complete description of the different format directives, see the the +ei_x_new(&buf); +ei_x_format_wo_ver(&buf, "{~a,~i}", "tobbe", 3928);

    For a complete description of the different format directives, see the the ei_x_format_wo_ver function.

    The following example is more complex:

    ei_x_buff buf;
     int i = 0;
    -ei_x_new(&buf);
    -ei_x_format_wo_ver(&buf,
    +ei_x_new(&buf);
    +ei_x_format_wo_ver(&buf,
                        "[{name,~a},{age,~i},{data,[{adr,~s,~i}]}]",
                        "madonna",
                        21,
    -                  "E-street", 42);
    -ei_print_term(stdout, buf.buff, &i);
    -ei_x_free(&buf);

    As in the previous examples, it is your responsibility to free the memory + "E-street", 42); +ei_print_term(stdout, buf.buff, &i); +ei_x_free(&buf);

    As in the previous examples, it is your responsibility to free the memory allocated for Erlang terms. In this example, ei_x_free() ensures that the data pointed to by buf is released.

    @@ -220,18 +220,18 @@

    char *cookie="a secret cookie string"; /* An example */ const char* node_name = "einode@durin"; const char *cookie = NULL; -short creation = time(NULL) + 1; +short creation = time(NULL) + 1; ei_cnode ec; -ei_connect_init(&ec, +ei_connect_init(&ec, node_name, cookie, - creation);

    For more information, see the ei_connect module.

    After initialization, you set up the connection to the Erlang node. To specify + creation);

    For more information, see the ei_connect module.

    After initialization, you set up the connection to the Erlang node. To specify the Erlang node you want to connect to, use the ei_connect_*() family of functions. The following example sets up the connection and is to result in a valid socket file descriptor:

    int sockfd;
     const char* node_name = "einode@durin"; /* An example */
    -if ((sockfd = ei_connect(&ec, nodename)) < 0)
    -  fprintf(stderr, "ERROR: ei_connect failed");

    +if ((sockfd = ei_connect(&ec, nodename)) < 0) + fprintf(stderr, "ERROR: ei_connect failed");

    @@ -246,7 +246,7 @@

    connection is first made to epmd and, if the node is known, a connection is then made to the Erlang node.

    C nodes can also register themselves with epmd if they want other nodes in the system to be able to find and connect to them.

    Before registering with epmd, you must first create a listen socket and bind -it to a port. Then:

    int pub = ei_publish(&ec, port);

    pub is a file descriptor now connected to epmd. epmd monitors the other +it to a port. Then:

    int pub = ei_publish(&ec, port);

    pub is a file descriptor now connected to epmd. epmd monitors the other end of the connection. If it detects that the connection has been closed, the node becomes unregistered. So, if you explicitly close the descriptor or if your node fails, it becomes unregistered from epmd.

    Notice that on some systems a failed node is not detected by this mechanism, as @@ -269,13 +269,13 @@

    In the following example, {Pid, hello_world} is sent to a registered process my_server:

    ei_x_buff buf;
    -ei_x_new_with_version(&buf);
    +ei_x_new_with_version(&buf);
     
    -ei_x_encode_tuple_header(&buf, 2);
    -ei_x_encode_pid(&buf, ei_self(ec));
    -ei_x_encode_atom(&buf, "Hello world");
    +ei_x_encode_tuple_header(&buf, 2);
    +ei_x_encode_pid(&buf, ei_self(ec));
    +ei_x_encode_atom(&buf, "Hello world");
     
    -ei_reg_send(&ec, fd, "my_server", buf.buff, buf.index);

    The first element of the tuple that is sent is your own pid. This enables +ei_reg_send(&ec, fd, "my_server", buf.buff, buf.index);

    The first element of the tuple that is sent is your own pid. This enables my_server to reply. For more information about the primitives, see the ei_connect module.

    @@ -289,24 +289,24 @@

    int arity = 0; erlang_pid pid; ei_x_buff buf; -ei_x_new(&buf); -for (;;) { - int got = ei_xreceive_msg(fd, &msg, &x); - if (got == ERL_TICK) +ei_x_new(&buf); +for (;;) { + int got = ei_xreceive_msg(fd, &msg, &x); + if (got == ERL_TICK) continue; - if (got == ERL_ERROR) { - fprintf(stderr, "ei_xreceive_msg, got==%d", got); - exit(1); - } + if (got == ERL_ERROR) { + fprintf(stderr, "ei_xreceive_msg, got==%d", got); + exit(1); + } break; -} -ei_decode_version(buf.buff, &index, &version); -ei_decode_tuple_header(buf.buff, &index, &arity); -if (arity != 2) { - fprintf(stderr, "got wrong message"); - exit(1); -} -ei_decode_pid(buf.buff, &index, &pid);

    To provide robustness, a distributed Erlang node occasionally polls all its +} +ei_decode_version(buf.buff, &index, &version); +ei_decode_tuple_header(buf.buff, &index, &arity); +if (arity != 2) { + fprintf(stderr, "got wrong message"); + exit(1); +} +ei_decode_pid(buf.buff, &index, &pid);

    To provide robustness, a distributed Erlang node occasionally polls all its connected neighbors in an attempt to detect failed nodes or communication links. A node that receives such a message is expected to respond immediately with an ERL_TICK message. This is done automatically by ei_xreceive_msg(). However, @@ -324,19 +324,19 @@

    a remote node and is called a remote procedure call.

    The following example checks if a specific Erlang process is alive:

    int index = 0, is_alive;
     ei_x_buff args, result;
     
    -ei_x_new(&result);
    -ei_x_new(&args);
    -ei_x_encode_list_header(&args, 1);
    -ei_x_encode_pid(&args, &check_pid);
    -ei_x_encode_empty_list(&args);
    +ei_x_new(&result);
    +ei_x_new(&args);
    +ei_x_encode_list_header(&args, 1);
    +ei_x_encode_pid(&args, &check_pid);
    +ei_x_encode_empty_list(&args);
     
    -if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
    -           args.buff, args.index, &result) < 0)
    -    handle_error();
    +if (ei_rpc(&ec, fd, "erlang", "is_process_alive",
    +           args.buff, args.index, &result) < 0)
    +    handle_error();
     
    -if (ei_decode_version(result.buff, &index) < 0
    -    || ei_decode_bool(result.buff, &index, &is_alive) < 0)
    -    handle_error();

    For more information about ei_rpc() and its companions ei_rpc_to() and +if (ei_decode_version(result.buff, &index) < 0 + || ei_decode_bool(result.buff, &index, &is_alive) < 0) + handle_error();

    For more information about ei_rpc() and its companions ei_rpc_to() and ei_rpc_from(), see the ei_connect module.

    @@ -353,32 +353,32 @@

    int count; int i; -names = ei_global_names(&ec,fd,&count); +names = ei_global_names(&ec,fd,&count); -if (names) - for (i=0; i<count; i++) - printf("%s\n",names[i]); +if (names) + for (i=0; i<count; i++) + printf("%s\n",names[i]); -free(names);

    ei_global_names allocates and returns a buffer +free(names);

    ei_global_names allocates and returns a buffer containing all the names known to the global module in Kernel. count is initialized to indicate the number of names in the array. The array of strings in names is terminated by a NULL pointer, so it is not necessary to use count to determine when the last name is reached.

    It is the caller's responsibility to free the array. ei_global_names allocates the array and all the strings using a single call to malloc(), so free(names) is all that is necessary.

    To look up one of the names:

    ETERM *pid;
    -char node[256];
    +char node[256];
     erlang_pid the_pid;
     
    -if (ei_global_whereis(&ec,fd,"schedule",&the_pid,node) < 0)
    -   fprintf(stderr, "ei_global_whereis error\n");

    If "schedule" is known to the global module in Kernel, an Erlang pid is +if (ei_global_whereis(&ec,fd,"schedule",&the_pid,node) < 0) + fprintf(stderr, "ei_global_whereis error\n");

    If "schedule" is known to the global module in Kernel, an Erlang pid is written to the_pid. This pid that can be used to send messages to the schedule service. Also, node is initialized to contain the name of the node where the service is registered, so that you can make a connection to it by simply passing the variable to ei_connect.

    Before registering a name, you should already have registered your port number with epmd. This is not strictly necessary, but if you neglect to do so, then other nodes wishing to communicate with your service cannot find or connect to -your process.

    Create a name that Erlang processes can use to communicate with your service:

    ei_global_register(fd,servicename,ei_self(ec));

    After registering the name, use ei_accept to wait -for incoming connections.

    Note

    Remember to free pid later with ei_x_free.

    To unregister a name:

    ei_global_unregister(&ec,fd,servicename);
    +your process.

    Create a name that Erlang processes can use to communicate with your service:

    ei_global_register(fd,servicename,ei_self(ec));

    After registering the name, use ei_accept to wait +for incoming connections.

    Note

    Remember to free pid later with ei_x_free.

    To unregister a name:

    ei_global_unregister(&ec,fd,servicename);
    diff --git a/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html b/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html index 8f8aa6e31a0d7..59894ee6934b9 100644 --- a/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html +++ b/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_call_cmd.html @@ -251,8 +251,8 @@

    {<madonna@chivas.du.etx.ericsson.se,38,0>, []}]

    To forward standard output without printing the result term (again, the input ends with EOF (Control-D)):

    erl_call -s -e -sname madonna -fetch_stdout -no_result_term
    -io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
    -io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
    +io:format("Number of schedulers: ~p~n", [erlang:system_info(schedulers)]),
    +io:format("Number of logical cores: ~p~n", [erlang:system_info(logical_processors_available)]).
     ^D
     Number of schedulers: 8
     Number of logical cores: 8
    diff --git a/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_interface.epub b/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_interface.epub index 0284ebd302293..fcf2706e993c7 100644 Binary files a/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_interface.epub and b/prs/9277/lib/erl_interface-5.5.2/doc/html/erl_interface.epub differ diff --git a/prs/9277/lib/et-1.7.1/doc/html/et.epub b/prs/9277/lib/et-1.7.1/doc/html/et.epub index edacef5cd9035..5f45afbf6d426 100644 Binary files a/prs/9277/lib/et-1.7.1/doc/html/et.epub and b/prs/9277/lib/et-1.7.1/doc/html/et.epub differ diff --git a/prs/9277/lib/et-1.7.1/doc/html/et_desc.html b/prs/9277/lib/et-1.7.1/doc/html/et_desc.html index 5f840de7a6ff0..cf89d880d17b3 100644 --- a/prs/9277/lib/et-1.7.1/doc/html/et_desc.html +++ b/prs/9277/lib/et-1.7.1/doc/html/et_desc.html @@ -138,33 +138,33 @@

    enable other types of Viewers. However in the following text we will focus on usage of the et_viewer.

    The main start function is et_viewer:start/1. By default it will start both an et_collector and an et_viewer:

    % erl -pa et/examples
    -Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
     
    -Eshell V5.7.4  (abort with ^G)
    -1> {ok, Viewer} = et_viewer:start([]).
    -{ok,<0.40.0>}

    A Viewer gets trace Events from its Collector by polling it regularly for +Eshell V5.7.4 (abort with ^G) +1> {ok, Viewer} = et_viewer:start([]). +{ok,<0.40.0>}

    A Viewer gets trace Events from its Collector by polling it regularly for more Events to display. Events are for example reported to the Collector -with et_collector:report_event/6:

    2> Collector = et_viewer:get_collector_pid(Viewer).
    +with et_collector:report_event/6:

    2> Collector = et_viewer:get_collector_pid(Viewer).
     <0.39.0>
    -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
    -3>                           "Start outer transaction"),
    -3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
    -3>                           "New transaction id is 4711"),
    -3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
    -3>                           "Acquire write lock for {my_tab, key}"),
    -3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
    -3>                           "You got the write lock for {my_tab, key}"),
    -3> et_collector:report_event(Collector, 60, my_shell, do_commit,
    -3>                           "Perform  transaction commit"),
    -3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
    -3>                           "Release all locks for transaction 4711"),
    -3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
    -3>                           "End of outer transaction"),
    -3> et_collector:report_event(Collector, 20, my_shell, end_outer,
    -3>                           "Transaction returned {atomic, ok}").
    -{ok,{table_handle,<0.39.0>,16402,trace_ts,
    -     #Fun<et_collector.0.62831470>}}

    This actually is a simulation of the process Events caused by a Mnesia -transaction that writes a record in a local table:

    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

    At this stage when we have a couple of Events, it is time to show how it looks +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer, +3> "Start outer transaction"), +3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid, +3> "New transaction id is 4711"), +3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock, +3> "Acquire write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted, +3> "You got the write lock for {my_tab, key}"), +3> et_collector:report_event(Collector, 60, my_shell, do_commit, +3> "Perform transaction commit"), +3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid, +3> "Release all locks for transaction 4711"), +3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction, +3> "End of outer transaction"), +3> et_collector:report_event(Collector, 20, my_shell, end_outer, +3> "Transaction returned {atomic, ok}"). +{ok,{table_handle,<0.39.0>,16402,trace_ts, + #Fun<et_collector.0.62831470>}}

    This actually is a simulation of the process Events caused by a Mnesia +transaction that writes a record in a local table:

    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

    At this stage when we have a couple of Events, it is time to show how it looks like in the graphical interface of et_viewer:

    A simulated Mnesia transaction which writes one record

    In the sequence chart, the actors (which symbolically has performed the Event) are shown as named vertical bars. The order of the actors may be altered by dragging (hold mouse button 1 pressed during the operation) the name tag of an @@ -181,11 +181,11 @@

    The Event Tracer (ET) uses named filters in various contexts. An Event Trace filter is an Erlang fun that takes some trace data as input and returns a -possibly modified version of it:

    filter(TraceData) -> false | true | {true, NewEvent}
    +possibly modified version of it:

    filter(TraceData) -> false | true | {true, NewEvent}
     
    -TraceData = Event | erlang_trace_data()
    -Event = #event{}
    -NewEvent = #event{}

    The interface of the filter function is the same as the the filter functions for +TraceData = Event | erlang_trace_data() +Event = #event{} +NewEvent = #event{}

    The interface of the filter function is the same as the the filter functions for the good old lists:filtermap/2. If the filter returns false it means that the trace data should silently be dropped. true means that the trace data data already is an Event Record and that it should be kept as it is. true means @@ -212,21 +212,21 @@

    in the viewer. The following filter in et/examples/et_demo.erl replaces the actor names mnesia_tm and mnesia_locker and leaves everything else in the record as it was:

    
    -mgr_actors(E) when is_record(E, event) ->
    -    Actor = fun(A) ->
    +mgr_actors(E) when is_record(E, event) ->
    +    Actor = fun(A) ->
                    case A of
                        mnesia_tm     -> trans_mgr;
                        mnesia_locker -> lock_mgr;
                        _             -> A
                    end
                 end,
    -    {true, E#event{from = Actor(E#event.from),
    -                   to = Actor(E#event.to),
    -                   contents = [{orig_from, E#event.from},
    -                               {orig_to,   E#event.to},
    -                               {orig_contents, E#event.contents}]}}.

    If we now add the filter to the running Collector:

    4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
    +    {true, E#event{from = Actor(E#event.from),
    +                   to = Actor(E#event.to),
    +                   contents = [{orig_from, E#event.from},
    +                               {orig_to,   E#event.to},
    +                               {orig_contents, E#event.contents}]}}.

    If we now add the filter to the running Collector:

    4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
     #Fun<erl_eval.6.13229925>
    -5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
    +5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
     ok

    you will see that the Filter menu in all viewers have got a new entry called mgr_actors. Select it, and a new Viewer window will pop up:

    The same trace data in a different view

    In order to see the nitty gritty details of an Event you may click on the Event in order to start a Contents Viewer for that Event. In the diff --git a/prs/9277/lib/et-1.7.1/doc/html/et_examples.html b/prs/9277/lib/et-1.7.1/doc/html/et_examples.html index f56a66483c209..fafe814a1a4fd 100644 --- a/prs/9277/lib/et-1.7.1/doc/html/et_examples.html +++ b/prs/9277/lib/et-1.7.1/doc/html/et_examples.html @@ -133,52 +133,52 @@

    The Erlang code for running the simulated Mnesia transaction example in the previous chapter is included in the et/examples/et_demo.erl file:

    
    -sim_trans() ->
    -    sim_trans([]).
    -
    -sim_trans(ExtraOptions) ->
    -    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
    -    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
    -    Collector = et_viewer:get_collector_pid(Viewer),
    -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
    -                              "Start outer transaction"),
    -    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
    -                              "New transaction id is 4711"),
    -    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
    -                              "Acquire write lock for {my_tab, key}"),
    -    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
    -                              "You got the write lock for {my_tab, key}"),
    -    et_collector:report_event(Collector, 60, my_shell, do_commit,
    -                              "Perform  transaction commit"),
    -    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
    -                              "Release all locks for transaction 4711"),
    -    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
    -                              "End of outer transaction"),
    -    et_collector:report_event(Collector, 20, my_shell, end_outer,
    -                              "Transaction returned {atomic, ok}"),
    -    {collector, Collector}.
    
    -mgr_actors(E) when is_record(E, event) ->
    -    Actor = fun(A) ->
    +sim_trans() ->
    +    sim_trans([]).
    +
    +sim_trans(ExtraOptions) ->
    +    Options = [{dict_insert, {filter, mgr_actors}, fun mgr_actors/1}],
    +    {ok, Viewer} = et_viewer:start_link(Options ++ ExtraOptions),
    +    Collector = et_viewer:get_collector_pid(Viewer),
    +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
    +                              "Start outer transaction"),
    +    et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
    +                              "New transaction id is 4711"),
    +    et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
    +                              "Acquire write lock for {my_tab, key}"),
    +    et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
    +                              "You got the write lock for {my_tab, key}"),
    +    et_collector:report_event(Collector, 60, my_shell, do_commit,
    +                              "Perform  transaction commit"),
    +    et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
    +                              "Release all locks for transaction 4711"),
    +    et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
    +                              "End of outer transaction"),
    +    et_collector:report_event(Collector, 20, my_shell, end_outer,
    +                              "Transaction returned {atomic, ok}"),
    +    {collector, Collector}.
    
    +mgr_actors(E) when is_record(E, event) ->
    +    Actor = fun(A) ->
                    case A of
                        mnesia_tm     -> trans_mgr;
                        mnesia_locker -> lock_mgr;
                        _             -> A
                    end
                 end,
    -    {true, E#event{from = Actor(E#event.from),
    -                   to = Actor(E#event.to),
    -                   contents = [{orig_from, E#event.from},
    -                               {orig_to,   E#event.to},
    -                               {orig_contents, E#event.contents}]}}.

    If you invoke the et_demo:sim_trans() function, a Viewer window will pop up + {true, E#event{from = Actor(E#event.from), + to = Actor(E#event.to), + contents = [{orig_from, E#event.from}, + {orig_to, E#event.to}, + {orig_contents, E#event.contents}]}}.

    If you invoke the et_demo:sim_trans() function, a Viewer window will pop up and the sequence trace will be almost the same as if the following Mnesia -transaction would have been run:

    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

    And the viewer window will look like:

    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    -
    -Eshell V5.7.4  (abort with ^G)
    -1> {ok, Viewer} = et_viewer:start([]).
    -{ok,<0.40.0>;}
    -2> et_demo:sim_trans().
    -{ok,{table_handle,<0.45.0>,24596,trace_ts,
    -     #Fun<et_collector.0.62831470>}}

    A simulated Mnesia transaction which writes one record

    +transaction would have been run:

    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

    And the viewer window will look like:

    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +
    +Eshell V5.7.4  (abort with ^G)
    +1> {ok, Viewer} = et_viewer:start([]).
    +{ok,<0.40.0>;}
    +2> et_demo:sim_trans().
    +{ok,{table_handle,<0.45.0>,24596,trace_ts,
    +     #Fun<et_collector.0.62831470>}}

    A simulated Mnesia transaction which writes one record

    @@ -190,20 +190,20 @@

    caller to the callee. The [{message, {caller}}, {return_trace}] options to dbg:tpl/2 function will imply the necessary information in the Erlang traces. Here follows the module_as_actor filter:

    
    -module_as_actor(E) when is_record(E, event) ->
    -    case lists:keysearch(mfa, 1, E#event.contents) of
    -        {value, {mfa, {M, F, _A}}} ->
    -            case lists:keysearch(pam_result, 1, E#event.contents) of
    -                {value, {pam_result, {M2, _F2, _A2}}} ->
    -                    {true, E#event{label = F, from = M2, to = M}};
    +module_as_actor(E) when is_record(E, event) ->
    +    case lists:keysearch(mfa, 1, E#event.contents) of
    +        {value, {mfa, {M, F, _A}}} ->
    +            case lists:keysearch(pam_result, 1, E#event.contents) of
    +                {value, {pam_result, {M2, _F2, _A2}}} ->
    +                    {true, E#event{label = F, from = M2, to = M}};
                     _ ->
    -                    {true, E#event{label = F, from = M, to = M}}
    +                    {true, E#event{label = F, from = M, to = M}}
                 end;
             _ ->
                 false
         end.

    The plain_process_info filter does not alter the Event Records. It merely ensures that the event not related to processes are skipped:

    
    -plain_process_info(E) when is_record(E, event) ->
    +plain_process_info(E) when is_record(E, event) ->
         case E#event.label of
             send                          -> true;
             send_to_non_existing_process  -> true;
    @@ -213,50 +213,50 @@ 

    link -> true; unlink -> true; getting_linked -> true; - {seq_send, _Label} -> true; - {seq_receive, _Label} -> true; - {seq_print, _Label} -> true; - {drop, _N} -> true; + {seq_send, _Label} -> true; + {seq_receive, _Label} -> true; + {seq_print, _Label} -> true; + {drop, _N} -> true; _ -> false end.

    The plain_process_info_nolink filter does not alter the Event Records. It do makes use of the plain_process_info , but do also ensure that the process info related to linking and unlinking is skipped:

    
    -plain_process_info_nolink(E) when is_record(E, event) ->
    -    (E#event.label /= link) and
    -    (E#event.label /= unlink) and
    -    (E#event.label /= getting_linked) and
    -    plain_process_info(E).

    In order to simplify the startup of an et_viewer process with the filters +plain_process_info_nolink(E) when is_record(E, event) -> + (E#event.label /= link) and + (E#event.label /= unlink) and + (E#event.label /= getting_linked) and + plain_process_info(E).

    In order to simplify the startup of an et_viewer process with the filters mentioned above, plus some others (that also are found in et/examples/et_demo.erl src/et_collector.erl the et_demo:start/0,1 functions can be used:

    
    -start() ->
    -    start([]).
    -
    -start(ExtraOptions) ->
    -    Options = [{trace_global, true},
    -               {parent_pid, undefined},
    -               {max_actors, infinity},
    -               {max_events, 1000},
    -               {active_filter, module_as_actor}],
    -    et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

    A simple one-liner starts the tool:

              erl -pa ../examples -s et_demo

    The filters are included by the following parameters:

    
    -filters() ->
    -    [{dict_insert, {filter, module_as_actor},
    -                   fun module_as_actor/1},
    -     {dict_insert, {filter, plain_process_info},
    -                   fun plain_process_info/1},
    -     {dict_insert, {filter, plain_process_info_nolink},
    -                   fun plain_process_info_nolink/1},
    -     {dict_insert, {filter, named_process_info},
    -                   fun named_process_info/1},
    -     {dict_insert, {filter, named_process_info_nolink},
    -                   fun named_process_info_nolink/1},
    -     {dict_insert, {filter, node_process_info},
    -                   fun node_process_info/1},
    -     {dict_insert, {filter, node_process_info_nolink},
    -                   fun node_process_info_nolink/1},
    -     {dict_insert, {filter, application_as_actor},
    -                   fun application_as_actor/1}
    -    ].

    +start() -> + start([]). + +start(ExtraOptions) -> + Options = [{trace_global, true}, + {parent_pid, undefined}, + {max_actors, infinity}, + {max_events, 1000}, + {active_filter, module_as_actor}], + et_viewer:start_link(filters() ++ Options ++ ExtraOptions).

    A simple one-liner starts the tool:

              erl -pa ../examples -s et_demo

    The filters are included by the following parameters:

    
    +filters() ->
    +    [{dict_insert, {filter, module_as_actor},
    +                   fun module_as_actor/1},
    +     {dict_insert, {filter, plain_process_info},
    +                   fun plain_process_info/1},
    +     {dict_insert, {filter, plain_process_info_nolink},
    +                   fun plain_process_info_nolink/1},
    +     {dict_insert, {filter, named_process_info},
    +                   fun named_process_info/1},
    +     {dict_insert, {filter, named_process_info_nolink},
    +                   fun named_process_info_nolink/1},
    +     {dict_insert, {filter, node_process_info},
    +                   fun node_process_info/1},
    +     {dict_insert, {filter, node_process_info_nolink},
    +                   fun node_process_info_nolink/1},
    +     {dict_insert, {filter, application_as_actor},
    +                   fun application_as_actor/1}
    +    ].

    @@ -270,33 +270,33 @@

    processes plus the calling process (that is your shell). Please, observe that the whereis/1 call in the following code requires that both the traced Mnesia application and the et_viewer is running on the same node:

    
    -trace_mnesia() ->
    -    Modules = mnesia:ms(),
    -    Spec = [{message, {caller}}, {return_trace}],
    -    Flags = [send, 'receive', procs, timestamp],
    -    dbg:p(all, [call, timestamp]),
    -    [dbg:tpl(M, [{'_', [], Spec}]) || M <- Modules],
    -    LocallyRunningServers = [M || M <- Modules, whereis(M) /= undefined],
    -    [dbg:p(whereis(RS), Flags) || RS <- LocallyRunningServers],
    -    dbg:p(self(), Flags),
    +trace_mnesia() ->
    +    Modules = mnesia:ms(),
    +    Spec = [{message, {caller}}, {return_trace}],
    +    Flags = [send, 'receive', procs, timestamp],
    +    dbg:p(all, [call, timestamp]),
    +    [dbg:tpl(M, [{'_', [], Spec}]) || M <- Modules],
    +    LocallyRunningServers = [M || M <- Modules, whereis(M) /= undefined],
    +    [dbg:p(whereis(RS), Flags) || RS <- LocallyRunningServers],
    +    dbg:p(self(), Flags),
         LocallyRunningServers.

    The et_demo:live_trans/0 function starts the global Collector, starts a Viewer, starts Mnesia, creates a local table, activates tracing (as described above) and registers the shell process is as 'my_shell' for clarity. Finally a simple Mnesia transaction that writes a single record is run:

    
    -live_trans() ->
    -    live_trans([]).
    -
    -live_trans(ExtraOptions) ->
    -    Options = [{title, "Mnesia tracer"},
    -	       {hide_actions, true},
    -	       {active_filter, named_process_info_nolink}],
    -    et_demo:start(Options ++ ExtraOptions),
    -    mnesia:start(),
    -    mnesia:create_table(my_tab, [{ram_copies, [node()]}]),
    -    et_demo:trace_mnesia(),
    -    register(my_shell, self()),
    -
    -    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

    Now we run the et_demo:live_trans/0 function:

    erl -pa ../examples
    +live_trans() ->
    +    live_trans([]).
    +
    +live_trans(ExtraOptions) ->
    +    Options = [{title, "Mnesia tracer"},
    +	       {hide_actions, true},
    +	       {active_filter, named_process_info_nolink}],
    +    et_demo:start(Options ++ ExtraOptions),
    +    mnesia:start(),
    +    mnesia:create_table(my_tab, [{ram_copies, [node()]}]),
    +    et_demo:trace_mnesia(),
    +    register(my_shell, self()),
    +
    +    mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).

    Now we run the et_demo:live_trans/0 function:

    erl -pa ../examples
     Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4]
                                [async-threads:0] [kernel-poll:false]
     
    @@ -316,113 +316,113 @@ 

    with calls to et:trace_me/5. For each call a detail level is given in order to enable dynamic control of the trace level in a simple manner.

    The megaco_filter module implements a customized filter for Megaco messages. It does also make use of trace_global combined with usage of the -trace_pattern:

    -module(megaco_filter).
    --export([start/0]).
    +trace_pattern:

    -module(megaco_filter).
    +-export([start/0]).
     
    -start() ->
    +start() ->
         Options =
    -        [{event_order, event_ts},
    -         {scale, 3},
    -         {max_actors, infinity},
    -         {trace_pattern, {megaco, max}},
    -         {trace_global, true},
    -         {dict_insert, {filter, megaco_filter}, fun filter/1},
    -         {active_filter, megaco_filter},
    -         {title, "Megaco tracer - Erlang/OTP"}],
    -    et_viewer:start(Options).

    First we start an Erlang node with a global Collector and its Viewer.

    erl -sname observer
    -Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    -
    -Eshell V5.7.4  (abort with ^G)
    -(observer@falco)1> megaco_filter:start().
    -{ok,<0.48.0>}

    Secondly we start another Erlang node which we connect the observer node, before + [{event_order, event_ts}, + {scale, 3}, + {max_actors, infinity}, + {trace_pattern, {megaco, max}}, + {trace_global, true}, + {dict_insert, {filter, megaco_filter}, fun filter/1}, + {active_filter, megaco_filter}, + {title, "Megaco tracer - Erlang/OTP"}], + et_viewer:start(Options).

    First we start an Erlang node with a global Collector and its Viewer.

    erl -sname observer
    +Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +
    +Eshell V5.7.4  (abort with ^G)
    +(observer@falco)1> megaco_filter:start().
    +{ok,<0.48.0>}

    Secondly we start another Erlang node which we connect the observer node, before we start the application that we want to trace. In this case we start a Media Gateway Controller that listens for both TCP and UDP on the text and binary ports for Megaco:

    erl -sname mgc -pa ../../megaco/examples/simple
    -Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
     
    -Eshell V5.7.4  (abort with ^G)
    -(mgc@falco)1> net:ping(observer@falco).
    +Eshell V5.7.4  (abort with ^G)
    +(mgc@falco)1> net:ping(observer@falco).
     pong
    -(mgc@falco)2> megaco:start().
    +(mgc@falco)2> megaco:start().
     ok
    -(mgc@falco)3> megaco_simple_mgc:start().
    -{ok,[{ok,2944,
    -         {megaco_receive_handle,{deviceName,"controller"},
    -                                megaco_pretty_text_encoder,[],megaco_tcp,dynamic}},
    -     {ok,2944,
    -         {megaco_receive_handle,{deviceName,"controller"},
    -                                megaco_pretty_text_encoder,[],megaco_udp,dynamic}},
    -     {ok,2945,
    -         {megaco_receive_handle,{deviceName,"controller"},
    -                                megaco_binary_encoder,[],megaco_tcp,dynamic}},
    -     {ok,2945,
    -         {megaco_receive_handle,{deviceName,"controller"},
    -                                megaco_binary_encoder,[],megaco_udp,dynamic}}]}

    And finally we start an Erlang node for the Media Gateways and connect to the +(mgc@falco)3> megaco_simple_mgc:start(). +{ok,[{ok,2944, + {megaco_receive_handle,{deviceName,"controller"}, + megaco_pretty_text_encoder,[],megaco_tcp,dynamic}}, + {ok,2944, + {megaco_receive_handle,{deviceName,"controller"}, + megaco_pretty_text_encoder,[],megaco_udp,dynamic}}, + {ok,2945, + {megaco_receive_handle,{deviceName,"controller"}, + megaco_binary_encoder,[],megaco_tcp,dynamic}}, + {ok,2945, + {megaco_receive_handle,{deviceName,"controller"}, + megaco_binary_encoder,[],megaco_udp,dynamic}}]}

    And finally we start an Erlang node for the Media Gateways and connect to the observer node. Each Media Gateway connects to the controller and sends an initial Service Change message. The controller accepts the gateways and sends a reply to each one using the same transport mechanism and message encoding according to the preference of each gateway. That is all combinations of TCP/IP -transport, UDP/IP transport, text encoding and ASN.1 BER encoding:

    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
    +transport, UDP/IP transport, text encoding and ASN.1 BER encoding:

    Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
     
    -Eshell V5.7.4  (abort with ^G)
    -(mg@falco)1> net:ping(observer@falco).
    +Eshell V5.7.4  (abort with ^G)
    +(mg@falco)1> net:ping(observer@falco).
     pong
    -(mg@falco)2> megaco_simple_mg:start().
    -[{{deviceName,"gateway_tt"},
    -  {error,{start_user,megaco_not_started}}},
    - {{deviceName,"gateway_tb"},
    -  {error,{start_user,megaco_not_started}}},
    - {{deviceName,"gateway_ut"},
    -  {error,{start_user,megaco_not_started}}},
    - {{deviceName,"gateway_ub"},
    -  {error,{start_user,megaco_not_started}}}]
    -(mg@falco)3> megaco:start().
    +(mg@falco)2> megaco_simple_mg:start().
    +[{{deviceName,"gateway_tt"},
    +  {error,{start_user,megaco_not_started}}},
    + {{deviceName,"gateway_tb"},
    +  {error,{start_user,megaco_not_started}}},
    + {{deviceName,"gateway_ut"},
    +  {error,{start_user,megaco_not_started}}},
    + {{deviceName,"gateway_ub"},
    +  {error,{start_user,megaco_not_started}}}]
    +(mg@falco)3> megaco:start().
     ok
    -(mg@falco)4> megaco_simple_mg:start().
    -[{{deviceName,"gateway_tt"},
    -  {1,
    -   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    -            [{serviceChangeReply,
    -                 {'ServiceChangeReply',
    -                     [{megaco_term_id,false,["root"]}],
    -                     {serviceChangeResParms,
    -                         {'ServiceChangeResParm',
    -                             {deviceName,"controller"},
    +(mg@falco)4> megaco_simple_mg:start().
    +[{{deviceName,"gateway_tt"},
    +  {1,
    +   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    +            [{serviceChangeReply,
    +                 {'ServiceChangeReply',
    +                     [{megaco_term_id,false,["root"]}],
    +                     {serviceChangeResParms,
    +                         {'ServiceChangeResParm',
    +                             {deviceName,"controller"},
                                  asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,
    -                             asn1_NOVALUE}}}}]}]}}},
    - {{deviceName,"gateway_tb"},
    -  {1,
    -   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    -            [{serviceChangeReply,
    -                 {'ServiceChangeReply',
    -                     [{megaco_term_id,false,["root"]}],
    -                     {serviceChangeResParms,
    -                         {'ServiceChangeResParm',
    -                             {deviceName,"controller"},
    +                             asn1_NOVALUE}}}}]}]}}},
    + {{deviceName,"gateway_tb"},
    +  {1,
    +   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    +            [{serviceChangeReply,
    +                 {'ServiceChangeReply',
    +                     [{megaco_term_id,false,["root"]}],
    +                     {serviceChangeResParms,
    +                         {'ServiceChangeResParm',
    +                             {deviceName,"controller"},
                                  asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,
    -                             asn1_NOVALUE}}}}]}]}}},
    - {{deviceName,"gateway_ut"},
    -  {1,
    -   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    -            [{serviceChangeReply,
    -                 {'ServiceChangeReply',
    -                     [{megaco_term_id,false,["root"]}],
    -                     {serviceChangeResParms,
    -                         {'ServiceChangeResParm',
    -                             {deviceName,"controller"},
    +                             asn1_NOVALUE}}}}]}]}}},
    + {{deviceName,"gateway_ut"},
    +  {1,
    +   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    +            [{serviceChangeReply,
    +                 {'ServiceChangeReply',
    +                     [{megaco_term_id,false,["root"]}],
    +                     {serviceChangeResParms,
    +                         {'ServiceChangeResParm',
    +                             {deviceName,"controller"},
                                  asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,
    -                             asn1_NOVALUE}}}}]}]}}},
    - {{deviceName,"gateway_ub"},
    -  {1,
    -   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    -            [{serviceChangeReply,
    -                 {'ServiceChangeReply',
    -                     [{megaco_term_id,false,["root"]}],
    -                     {serviceChangeResParms,
    -                         {'ServiceChangeResParm',
    -                             {deviceName,"controller"},
    +                             asn1_NOVALUE}}}}]}]}}},
    + {{deviceName,"gateway_ub"},
    +  {1,
    +   {ok,[{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
    +            [{serviceChangeReply,
    +                 {'ServiceChangeReply',
    +                     [{megaco_term_id,false,["root"]}],
    +                     {serviceChangeResParms,
    +                         {'ServiceChangeResParm',
    +                             {deviceName,"controller"},
                                  asn1_NOVALUE,asn1_NOVALUE,
    -                             asn1_NOVALUE,...}}}}]}]}}}]

    The Megaco adopted viewer looks like this, when we have clicked on the + asn1_NOVALUE,...}}}}]}]}}}]

    The Megaco adopted viewer looks like this, when we have clicked on the [gateway_tt] actor name in order to only display the events regarding that actor:

    The viewer adopted for Megaco

    A pretty printed Megaco message looks like this:

    A textual Megaco message

    And the corresponding internal form for the same Megaco message looks like this:

    The internal form of a Megaco message

    diff --git a/prs/9277/lib/et-1.7.1/doc/html/et_tutorial.html b/prs/9277/lib/et-1.7.1/doc/html/et_tutorial.html index acaaf3f3ebc30..25ff377210c1c 100644 --- a/prs/9277/lib/et-1.7.1/doc/html/et_tutorial.html +++ b/prs/9277/lib/et-1.7.1/doc/html/et_tutorial.html @@ -133,8 +133,8 @@

    The easiest way of using ET, is to just use it as a graphical tool for displaying message sequence charts. In order to do that you need to first start -a Viewer (which by default starts a Collector):

          {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
    -      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

    Then you send events to the Collector with the function +a Viewer (which by default starts a Collector):

          {ok, ViewerPid} = et_viewer:start([{title,"Coffee Order"}]),
    +      CollectorPid = et_viewer:get_collector_pid(ViewerPid).

    Then you send events to the Collector with the function et_collector:report_event/6 like this:

          et_collector:report_event(CollectorPid,85,from,to,message,extra_stuff).

    The Viewer will automatically pull events from the Collector and display them on the screen.

    The number (in this case 85) is an integer from 1 to 100 that specifies the "detail level" of the message. The higher the number, the more important it is. @@ -144,30 +144,30 @@

    displayed next to the lifeline as an "action". The extra_stuffvalue is simply data that you can attach that will be displayed when someone actually clicks on the action or message in the Viewer window.

    The module et/examples/et_display_demo.erl illustrates how it can be used:

    
    --module(et_display_demo).
    +-module(et_display_demo).
     
    --export([test/0]).
    -
    -test() ->
    -    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
    -    Drink = {drink,iced_chai_latte},
    -    Size = {size,grande},
    -    Milk = {milk,whole},
    -    Flavor = {flavor,vanilla},
    -    C = et_viewer:get_collector_pid(Viewer),
    -    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
    -    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
    -    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
    -    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
    -    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
    -    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
    -    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
    -    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
    -    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
    -    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
    -    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
    -    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
    -    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
    +-export([test/0]).
    +
    +test() ->
    +    {ok, Viewer} = et_viewer:start([{title,"Coffee Order"}, {max_actors,10}]),
    +    Drink = {drink,iced_chai_latte},
    +    Size = {size,grande},
    +    Milk = {milk,whole},
    +    Flavor = {flavor,vanilla},
    +    C = et_viewer:get_collector_pid(Viewer),
    +    et_collector:report_event(C,99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
    +    et_collector:report_event(C,80,barrista1,register,enter_order,[Drink,Size,Flavor]),
    +    et_collector:report_event(C,80,register,barrista1,give_total,"$5"),
    +    et_collector:report_event(C,80,barrista1,barrista1,get_cup,[Drink,Size]),
    +    et_collector:report_event(C,80,barrista1,barrista2,give_cup,[]),
    +    et_collector:report_event(C,90,barrista1,customer,request_money,"$5"),
    +    et_collector:report_event(C,90,customer,barrista1,pay_money,"$5"),
    +    et_collector:report_event(C,80,barrista2,barrista2,get_chai_mix,[]),
    +    et_collector:report_event(C,80,barrista2,barrista2,add_flavor,[Flavor]),
    +    et_collector:report_event(C,80,barrista2,barrista2,add_milk,[Milk]),
    +    et_collector:report_event(C,80,barrista2,barrista2,add_ice,[]),
    +    et_collector:report_event(C,80,barrista2,barrista2,swirl,[]),
    +    et_collector:report_event(C,80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
         ok.

    When you run the et_display_demo:test(). function in the example above, the Viewer window will look like this:

    Screenshot of the Viewer window

    @@ -199,7 +199,7 @@

    calls. The idea is that you should instrument your code with calls to et:trace_me/5 in strategic places where you have interesting information available in your program. Then you just start the Collector with global -tracing enabled:

          et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

    This will start a Collector, a Viewer and also start the tracing of +tracing enabled:

          et_viewer:start([{trace_global, true}, {trace_pattern, {et,max}}]).

    This will start a Collector, a Viewer and also start the tracing of et:trace_me/5 function calls. The Raw Trace Data is collected by the Collector and a view of it is displayed on the screen by the Viewer. You can define your own "views" of the data by implementing your own Filter functions @@ -255,36 +255,36 @@

    all you have to do is enable them.

    For those people who want to do general tracing, consult the dbg module on how to trace whatever you're interested in and let it work its magic. If you just want et:trace_me/5 to work, do the following:

    1. Create a Collector
    2. Create a Viewer (this can do step #1 for you)
    3. Turn on and pare down debugging

    The module et/examples/et_trace_demo.erl achieves this.

    
    --module(et_trace_demo).
    +-module(et_trace_demo).
     
    --export([test/0]).
    -
    -test() ->
    -    et_viewer:start([
    -        {title,"Coffee Order"},
    -        {trace_global,true},
    -        {trace_pattern,{et,max}},
    -        {max_actors,10}
    -      ]),
    +-export([test/0]).
    +
    +test() ->
    +    et_viewer:start([
    +        {title,"Coffee Order"},
    +        {trace_global,true},
    +        {trace_pattern,{et,max}},
    +        {max_actors,10}
    +      ]),
           %% dbg:p(all,call),
           %% dbg:tpl(et, trace_me, 5, []),
    -      Drink = {drink,iced_chai_latte},
    -      Size = {size,grande},
    -      Milk = {milk,whole},
    -      Flavor = {flavor,vanilla},
    -      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
    -      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
    -      et:trace_me(80,register,barrista1,give_total,"$5"),
    -      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
    -      et:trace_me(80,barrista1,barrista2,give_cup,[]),
    -      et:trace_me(90,barrista1,customer,request_money,"$5"),
    -      et:trace_me(90,customer,barrista1,pay_money,"$5"),
    -      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
    -      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
    -      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
    -      et:trace_me(80,barrista2,barrista2,add_ice,[]),
    -      et:trace_me(80,barrista2,barrista2,swirl,[]),
    -      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
    +      Drink = {drink,iced_chai_latte},
    +      Size = {size,grande},
    +      Milk = {milk,whole},
    +      Flavor = {flavor,vanilla},
    +      et:trace_me(99,customer,barrista1,place_order,[Drink,Size,Milk,Flavor]),
    +      et:trace_me(80,barrista1,register,enter_order,[Drink,Size,Flavor]),
    +      et:trace_me(80,register,barrista1,give_total,"$5"),
    +      et:trace_me(80,barrista1,barrista1,get_cup,[Drink,Size]),
    +      et:trace_me(80,barrista1,barrista2,give_cup,[]),
    +      et:trace_me(90,barrista1,customer,request_money,"$5"),
    +      et:trace_me(90,customer,barrista1,pay_money,"$5"),
    +      et:trace_me(80,barrista2,barrista2,get_chai_mix,[]),
    +      et:trace_me(80,barrista2,barrista2,add_flavor,[Flavor]),
    +      et:trace_me(80,barrista2,barrista2,add_milk,[Milk]),
    +      et:trace_me(80,barrista2,barrista2,add_ice,[]),
    +      et:trace_me(80,barrista2,barrista2,swirl,[]),
    +      et:trace_me(80,barrista2,customer,give_tasty_beverage,[Drink,Size]),
           ok.

    Running through the above, the most important points are:

    • Turn on global tracing
    • Set a Trace Pattern
    • Tell dbg to trace function Calls
    • Tell it specifically to trace the et:trace_me/5 function

    When you run the et_trace_demo:test() function above, the Viewer window will look like this screenshot:

    Screenshot of the Viewer window

    diff --git a/prs/9277/lib/eunit-2.9.1/doc/html/eunit.epub b/prs/9277/lib/eunit-2.9.1/doc/html/eunit.epub index fa4217808a37e..616224e387218 100644 Binary files a/prs/9277/lib/eunit-2.9.1/doc/html/eunit.epub and b/prs/9277/lib/eunit-2.9.1/doc/html/eunit.epub differ diff --git a/prs/9277/lib/ftp-1.2.3/doc/html/ftp.epub b/prs/9277/lib/ftp-1.2.3/doc/html/ftp.epub index dec9a7f748fdf..36554d1e1501c 100644 Binary files a/prs/9277/lib/ftp-1.2.3/doc/html/ftp.epub and b/prs/9277/lib/ftp-1.2.3/doc/html/ftp.epub differ diff --git a/prs/9277/lib/ftp-1.2.3/doc/html/ftp_client.html b/prs/9277/lib/ftp-1.2.3/doc/html/ftp_client.html index ef56fccc571d4..a204bf6487280 100644 --- a/prs/9277/lib/ftp-1.2.3/doc/html/ftp_client.html +++ b/prs/9277/lib/ftp-1.2.3/doc/html/ftp_client.html @@ -126,25 +126,25 @@

    The following is a simple example of an FTP session, where the user guest with -password password logs on to the remote host erlang.org:

          1> ftp:start().
    +password password logs on to the remote host erlang.org:

          1> ftp:start().
           ok
    -      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
    -      {ok,<0.22.0>}
    -      3> ftp:user(Pid, "guest", "password").
    +      2> {ok, Pid} = ftp:open([{host, "erlang.org"}]).
    +      {ok,<0.22.0>}
    +      3> ftp:user(Pid, "guest", "password").
           ok
    -      4> ftp:pwd(Pid).
    -      {ok, "/home/guest"}
    -      5> ftp:cd(Pid, "appl/examples").
    +      4> ftp:pwd(Pid).
    +      {ok, "/home/guest"}
    +      5> ftp:cd(Pid, "appl/examples").
           ok
    -      6> ftp:lpwd(Pid).
    -      {ok, "/home/fred"}.
    -      7> ftp:lcd(Pid, "/home/eproj/examples").
    +      6> ftp:lpwd(Pid).
    +      {ok, "/home/fred"}.
    +      7> ftp:lcd(Pid, "/home/eproj/examples").
           ok
    -      8> ftp:recv(Pid, "appl.erl").
    +      8> ftp:recv(Pid, "appl.erl").
           ok
    -      9> ftp:close(Pid).
    +      9> ftp:close(Pid).
           ok
    -      10> ftp:stop().
    +      10> ftp:stop().
           ok

    The file appl.erl is transferred from the remote to the local host. When the session is opened, the current directory at the remote host is /home/guest, and /home/fred at the local host. Before transferring the file, the current diff --git a/prs/9277/lib/inets-9.3.1/doc/html/http_client.html b/prs/9277/lib/inets-9.3.1/doc/html/http_client.html index c0190b4e1d2b7..a11ff8637f8fc 100644 --- a/prs/9277/lib/inets-9.3.1/doc/html/http_client.html +++ b/prs/9277/lib/inets-9.3.1/doc/html/http_client.html @@ -138,32 +138,32 @@

    handle each request, unless a persistent connection can be used with or without pipelining. The client adds a host header and an empty te header if there are no such headers present in the request.

    The client supports IPv6 as long as the underlying mechanisms also do so.

    The following is to be put in the Erlang node application configuration file to -start a profile at application startup:

    [{inets, [{services, [{httpc, PropertyList}]}]}]

    For valid properties, see httpc.

    +start a profile at application startup:

    [{inets, [{services, [{httpc, PropertyList}]}]}]

    For valid properties, see httpc.

    Getting Started

    -

    Start Inets:

    1> inets:start().
    +

    Start Inets:

    1> inets:start().
     ok

    The following calls use the default client profile. Use the proxy "www-proxy.mycompany.com:8000", except from requests to localhost. This -applies to all the following requests.

    Example:

    2> httpc:set_options([{proxy, {{"www-proxy.mycompany.com", 8000},
    -["localhost"]}}]).
    -ok

    The following is an ordinary synchronous request:

    3> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
    -.. httpc:request(get, {"http://www.erlang.org", []}, [], []).

    With all the default values presented, a get request can also be written as -follows:

    4> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
    -.. httpc:request("http://www.erlang.org").

    The following is a https request and with verification of the host:

    5> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
    -.. httpc:request(get, {"https://www.erlang.org", []}, [{ssl, httpc:ssl_verify_host_options(true)}], []).

    The following is an ordinary asynchronous request:

    6> {ok, RequestId} =
    -.. httpc:request(get, {"http://www.erlang.org", []}, [], [{sync, false}]).

    The result is sent to the calling process as {http, {ReqestId, Result}}.

    In this case, the calling process is the shell, so the following result is -received:

    7> receive {http, {RequestId, Result}} -> ok after 500 -> error end.
    -ok

    This sends a request with a specified connection header:

    8> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
    -.. httpc:request(get, {"http://www.erlang.org", [{"connection", "close"}]},
    -.. [], []).

    This sends an HTTP request over a unix domain socket (experimental):

    9> httpc:set_options([{ipfamily, local}, {unix_socket,"/tmp/unix_socket/consul_http.sock"}]).
    -10> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
    - .. httpc:request(put, {"http:///v1/kv/foo", [], [], "hello"}, [], []).

    Start an HTTP client profile:

    10> {ok, Pid} = inets:start(httpc, [{profile, foo}]).
    -{ok, <0.45.0>}

    The new profile has no proxy settings, so the connection is refused:

    11> httpc:request("http://www.erlang.org", foo).
    -{error, econnrefused}

    Stop the HTTP client profile:

    12> inets:stop(httpc, foo).
    -ok

    Alternative way to stop the HTTP client profile:

    13> inets:stop(httpc, Pid).
    +applies to all the following requests.

    Example:

    2> httpc:set_options([{proxy, {{"www-proxy.mycompany.com", 8000},
    +["localhost"]}}]).
    +ok

    The following is an ordinary synchronous request:

    3> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
    +.. httpc:request(get, {"http://www.erlang.org", []}, [], []).

    With all the default values presented, a get request can also be written as +follows:

    4> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
    +.. httpc:request("http://www.erlang.org").

    The following is a https request and with verification of the host:

    5> {ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
    +.. httpc:request(get, {"https://www.erlang.org", []}, [{ssl, httpc:ssl_verify_host_options(true)}], []).

    The following is an ordinary asynchronous request:

    6> {ok, RequestId} =
    +.. httpc:request(get, {"http://www.erlang.org", []}, [], [{sync, false}]).

    The result is sent to the calling process as {http, {ReqestId, Result}}.

    In this case, the calling process is the shell, so the following result is +received:

    7> receive {http, {RequestId, Result}} -> ok after 500 -> error end.
    +ok

    This sends a request with a specified connection header:

    8> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
    +.. httpc:request(get, {"http://www.erlang.org", [{"connection", "close"}]},
    +.. [], []).

    This sends an HTTP request over a unix domain socket (experimental):

    9> httpc:set_options([{ipfamily, local}, {unix_socket,"/tmp/unix_socket/consul_http.sock"}]).
    +10> {ok, {{NewVersion, 200, NewReasonPhrase}, NewHeaders, NewBody}} =
    + .. httpc:request(put, {"http:///v1/kv/foo", [], [], "hello"}, [], []).

    Start an HTTP client profile:

    10> {ok, Pid} = inets:start(httpc, [{profile, foo}]).
    +{ok, <0.45.0>}

    The new profile has no proxy settings, so the connection is refused:

    11> httpc:request("http://www.erlang.org", foo).
    +{error, econnrefused}

    Stop the HTTP client profile:

    12> inets:stop(httpc, foo).
    +ok

    Alternative way to stop the HTTP client profile:

    13> inets:stop(httpc, Pid).
     ok
    diff --git a/prs/9277/lib/inets-9.3.1/doc/html/http_server.html b/prs/9277/lib/inets-9.3.1/doc/html/http_server.html index ac4c02e330728..4e67e750b30ce 100644 --- a/prs/9277/lib/inets-9.3.1/doc/html/http_server.html +++ b/prs/9277/lib/inets-9.3.1/doc/html/http_server.html @@ -141,20 +141,20 @@

    server API, which is described in the Erlang Web Server API. This API can be used to enhance the core server functionality, for example with custom logging and authentication.

    The following is to be put in the Erlang node application configuration file to -start an HTTP server at application startup:

    [{inets, [{services, [{httpd, [{proplist_file,
    -           "/var/tmp/server_root/conf/8888_props.conf"}]},
    -          {httpd, [{proplist_file,
    -           "/var/tmp/server_root/conf/8080_props.conf"}]}]}]}].

    The server is configured using an Erlang property list. For the available -properties, see httpd.

    The available configuration properties are as follows:

    httpd_service() -> {httpd, httpd()}
    -httpd()         -> [httpd_config()]
    -httpd_config()  -> {proplist_file, file()}
    -                   {debug, debug()} |
    -                   {accept_timeout, integer()}
    -debug()         -> disable | [debug_options()]
    -debug_options() -> {all_functions, modules()} |
    -                   {exported_functions, modules()} |
    -                   {disable, modules()}
    -modules()       -> [atom()]

    Here:

    In all of these cases, ReplyInfo has the following structure:

     {RequestId, saved_to_file}
    - {RequestId, {error, Reason}}
    - {RequestId, Result}
    - {RequestId, stream_start, Headers}
    - {RequestId, stream_start, Headers, HandlerPid}
    - {RequestId, stream, BinBodyPart}
    - {RequestId, stream_end, Headers}

    Default is the pid of the process calling the request function (self/0).

  • ipv6_host_with_brackets - Defines when parsing the Host-Port part of an +apply(Module, Function, [ReplyInfo | Args]).

  • In all of these cases, ReplyInfo has the following structure:

     {RequestId, saved_to_file}
    + {RequestId, {error, Reason}}
    + {RequestId, Result}
    + {RequestId, stream_start, Headers}
    + {RequestId, stream_start, Headers, HandlerPid}
    + {RequestId, stream, BinBodyPart}
    + {RequestId, stream_end, Headers}

    Default is the pid of the process calling the request function (self/0).

  • ipv6_host_with_brackets - Defines when parsing the Host-Port part of an URI with an IPv6 address with brackets, if those brackets are to be retained (true) or stripped (false).

    Default is false.

  • diff --git a/prs/9277/lib/inets-9.3.1/doc/html/httpd.html b/prs/9277/lib/inets-9.3.1/doc/html/httpd.html index 223bd9bd74663..4e6f5d2e5bd0c 100644 --- a/prs/9277/lib/inets-9.3.1/doc/html/httpd.html +++ b/prs/9277/lib/inets-9.3.1/doc/html/httpd.html @@ -236,36 +236,36 @@

    level error under the hierarchical logger domain: [otp, inets, httpd, ServerID, error] The built in logger formatting function produces log entries from the error -reports:

    #{server_name => string()
    +reports:

    #{server_name => string()
       protocol => internal | 'TCP' | 'TLS' | 'HTTP',
       transport => "TCP" | "TLS", %% Present when protocol = 'HTTP'
    -  uri => string(), %% Present when protocol = 'HTTP' and URI is valid
    -  peer => inet:peername(),
    -  host => inet:hostname(),
    -  reason => term()
    -}

    An example of a log entry with only default settings of logger

    =ERROR REPORT==== 9-Oct-2019::09:33:27.350235 ===
    +  uri => string(), %% Present when protocol = 'HTTP' and URI is valid
    +  peer => inet:peername(),
    +  host => inet:hostname(),
    +  reason => term()
    +}

    An example of a log entry with only default settings of logger

    =ERROR REPORT==== 9-Oct-2019::09:33:27.350235 ===
        Server: My Server
      Protocol: HTTP
     Transport: TLS
           URI: /not_there
          Host: 127.0.1.1:80
          Peer: 127.0.0.1:45253
    -   Reason: [{statuscode,404},{description,"Object Not Found"}]

    Using this option makes mod_log and mod_disk_log error logs redundant.

    Add the filter

    {fun logger_filters:domain/2,
    -    {log,equal,[otp,inets, httpd, ServerID, error]}

    to appropriate logger handler to handle the events. For example to write the + Reason: [{statuscode,404},{description,"Object Not Found"}]

    Using this option makes mod_log and mod_disk_log error logs redundant.

    Add the filter

    {fun logger_filters:domain/2,
    +    {log,equal,[otp,inets, httpd, ServerID, error]}

    to appropriate logger handler to handle the events. For example to write the error log from an httpd server with a ServerID of my_server to a file -you can use the following sys.config:

    [{kernel,
    - [{logger,
    -  [{handler, http_error_test, logger_std_h,
    -    #{config => #{ file => "log/http_error.log" },
    -      filters => [{inets_httpd, {fun logger_filters:domain/2,
    -                                 {log, equal,
    -                                  [otp, inets, httpd, my_server, error]
    -                                 }}}],
    -      filter_default => stop }}]}]}].

    or if you want to add it to the default logger via an API:

    logger:add_handler_filter(default,
    +you can use the following sys.config:

    [{kernel,
    + [{logger,
    +  [{handler, http_error_test, logger_std_h,
    +    #{config => #{ file => "log/http_error.log" },
    +      filters => [{inets_httpd, {fun logger_filters:domain/2,
    +                                 {log, equal,
    +                                  [otp, inets, httpd, my_server, error]
    +                                 }}}],
    +      filter_default => stop }}]}]}].

    or if you want to add it to the default logger via an API:

    logger:add_handler_filter(default,
                               inets_httpd,
    -                          {fun logger_filters:domain/2,
    -                           {log, equal,
    -                            [otp, inets, httpd, my_server, error]}}).
  • {log_format, common | combined}
    Defines if access logs are to be written according to the common log format + {fun logger_filters:domain/2, + {log, equal, + [otp, inets, httpd, my_server, error]}}).

  • {log_format, common | combined}
    Defines if access logs are to be written according to the common log format or the extended common log format. The common format is one line looking like this: remotehost rfc931 authuser [date] "request" status bytes.

    Here:

    • remotehost - Remote.

    • rfc931 - The remote username of the client (RFC 931).

    • authuser - The username used for authentication.

    • [date] - Date and time of the request @@ -275,7 +275,7 @@

      remotehost rfc931 authuser [date] "request" status bytes "referer" "user_agent"

      In addition to the earlier:

      • "referer" - The URL the client was on before requesting the URL (if it could not be determined, a minus sign is placed in this field).

      • "user_agent" - The software the client claims to be using (if it could not be determined, a minus sign is placed in this field).

      This affects the access logs written by mod_log and mod_disk_log.

    • {error_log_format, pretty | compact}
      Default is pretty. If the error log is meant to be read directly by a human, -pretty is the best option.

      pretty has a format corresponding to:

      io:format("[~s] ~s, reason: ~n ~p ~n~n", [Date, Msg, Reason]).

      compact has a format corresponding to:

      io:format("[~s] ~s, reason: ~w ~n", [Date, Msg, Reason]).

      This affects the error logs written by mod_log and mod_disk_log.

    +pretty is the best option.

    pretty has a format corresponding to:

    io:format("[~s] ~s, reason: ~n ~p ~n~n", [Date, Msg, Reason]).

    compact has a format corresponding to:

    io:format("[~s] ~s, reason: ~w ~n", [Date, Msg, Reason]).

    This affects the error logs written by mod_log and mod_disk_log.

  • @@ -284,15 +284,15 @@

    • {alias, {Alias, RealName}}
      Alias = string() and RealName = string(). alias allows documents to be stored in the local file system instead of the document_root location. URLs with a path beginning with url-path is mapped to local files beginning with -directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file +directory-filename, for example:

      {alias, {"/image", "/ftp/pub/image"}}

      Access to http://your.server.org/image/foo.gif would refer to the file /ftp/pub/image/foo.gif.

    • {re_write, {Re, Replacement}}
      Re = string() and Replacement = string(). re_write allows documents to be stored in the local file system instead of the document_root location. URLs are rewritten by re:replace/3 to produce a path in the local -file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file +file-system, for example:

      {re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}

      Access to http://your.server.org/~bob/foo.gif would refer to the file /home/bob/public/foo.gif.

    • {directory_index, [string()]}
      directory_index specifies a list of resources to look for if a client requests a directory using a / at the end of the directory name. file depicts the name of a file in the directory. Several files can be given, in -which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return +which case the server returns the first it finds, for example:

      {directory_index, ["index.html", "welcome.html"]}

      Access to http://your.server.org/docs/ would return http://your.server.org/docs/index.html or http://your.server.org/docs/welcome.html if index.html does not exist.

    @@ -320,7 +320,7 @@

    method. The method is either GET or POST, as defined in RFC 1945. It propagates the URL and file path of the requested document using the standard CGI PATH_INFO and -PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    +PATH_TRANSLATED environment variables.

    Example:

    {script, {"PUT", "/cgi-bin/put"}}

    @@ -328,7 +328,7 @@

    • {erl_script_alias, {URLPath, [AllowedModule]}}
      URLPath = string() and AllowedModule = atom(). erl_script_alias marks all URLs matching url-path as erl scheme scripts. A matching URL is mapped -into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would +into a specific module and function, for example:

      {erl_script_alias, {"/cgi-bin/example", [httpd_example]}}

      A request to http://your.server.org/cgi-bin/example/httpd_example:yahoo would refer to httpd_example:yahoo/3 or, if that does not exist, httpd_example:yahoo/2 and http://your.server.org/cgi-bin/example/other:yahoo would not be allowed to execute.

    • {erl_script_nocache, boolean()}
      If erl_script_nocache is set to true, the server adds HTTP header fields @@ -378,7 +378,7 @@

      Authentication Properties - Requires mod_auth

      -

      {directory, {path(), [{property(), term()}]}}

      The properties for directories are as follows:

      • {allow_from, all | [RegxpHostString]}
        Defines a set of hosts to be granted access to a given directory, for example:

        {allow_from, ["123.34.56.11", "150.100.23"]}

        The host 123.34.56.11 and all machines on the 150.100.23 subnet are +

        {directory, {path(), [{property(), term()}]}}

        The properties for directories are as follows:

        • {allow_from, all | [RegxpHostString]}
          Defines a set of hosts to be granted access to a given directory, for example:

          {allow_from, ["123.34.56.11", "150.100.23"]}

          The host 123.34.56.11 and all machines on the 150.100.23 subnet are allowed access.

        • {deny_from, all | [RegxpHostString]}
          Defines a set of hosts to be denied access to a given directory, for example:

          {deny_from, ["123.34.56.11", "150.100.23"]}

          The host 123.34.56.11 and all machines on the 150.100.23 subnet are not allowed access.

        • {auth_type, plain | dets | mnesia}
          Sets the type of authentication database that is used for the directory. The key difference between the different methods is that dynamic data can be saved @@ -413,7 +413,7 @@

          Security Properties - Requires mod_security

          -

          {security_directory, {path(), [{property(), term()}]}}

          The properties for the security directories are as follows:

          • {data_file, path()}
            Name of the security data file. The filename can either be absolute or +

            {security_directory, {path(), [{property(), term()}]}}

            The properties for the security directories are as follows:

            • {data_file, path()}
              Name of the security data file. The filename can either be absolute or relative to the server_root. This file is used to store persistent data for module mod_security.

            • {max_retries, integer()}
              Specifies the maximum number of attempts to authenticate a user before the user is blocked out. If a user successfully authenticates while blocked, the @@ -430,10 +430,10 @@

              Web server API data types

              -

              The Erlang web server API data types are as follows:

              ModData = #mod{}
              +

              The Erlang web server API data types are as follows:

              ModData = #mod{}
               
              --record(mod, {
              -    data = [],
              +-record(mod, {
              +    data = [],
                   socket_type = ip_comm,
                   socket,
                   config_db,
              @@ -442,10 +442,10 @@ 

              request_uri, http_version, request_line, - parsed_header = [], + parsed_header = [], entity_body, connection -}).

              To access the record in your callback-module use:

              -include_lib("inets/include/httpd.hrl").

              The fields of record mod have the following meaning:

              • data - Type [{InteractionKey,InteractionValue}] is used to propagate +}).

              To access the record in your callback-module use:

              -include_lib("inets/include/httpd.hrl").

              The fields of record mod have the following meaning:

              • data - Type [{InteractionKey,InteractionValue}] is used to propagate data between modules. Depicted interaction_data() in function type declarations.

              • socket_type - socket_type() indicates whether it is an IP socket or an ssl socket.

              • socket - The socket, in format ip_comm or ssl, depending on diff --git a/prs/9277/lib/inets-9.3.1/doc/html/inets.epub b/prs/9277/lib/inets-9.3.1/doc/html/inets.epub index ec811c3defca5..e80415f19c4c9 100644 Binary files a/prs/9277/lib/inets-9.3.1/doc/html/inets.epub and b/prs/9277/lib/inets-9.3.1/doc/html/inets.epub differ diff --git a/prs/9277/lib/inets-9.3.1/doc/html/inets_services.html b/prs/9277/lib/inets-9.3.1/doc/html/inets_services.html index 9954271cf73e3..03ddf6a825027 100644 --- a/prs/9277/lib/inets-9.3.1/doc/html/inets_services.html +++ b/prs/9277/lib/inets-9.3.1/doc/html/inets_services.html @@ -141,7 +141,7 @@

                unless the service is started with the standalone option. In this case the service is linked to the calling process and all OTP application features, such as soft upgrade, are lost.

                Services to be configured for startup at application startup are to be put into -the Erlang node configuration file on the following form:

                [{inets, [{services, ListofConfiguredServices}]}].

                For details of what to put in the list of configured services, see the +the Erlang node configuration file on the following form:

                [{inets, [{services, ListofConfiguredServices}]}].

                For details of what to put in the list of configured services, see the documentation for the services to be configured.

                diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/.build b/prs/9277/lib/jinterface-1.14.1/doc/html/.build index edfce6104bb6c..478d232157fee 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/.build +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/.build @@ -129,7 +129,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-E41D9DD2.js +dist/search_data-1B526AE3.js dist/sidebar_items-C4FB09FB.js index.html jinterface_users_guide.html diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html index 92aec00dea0d5..b40356f97bf2b 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses-index.html @@ -2,10 +2,10 @@ - + All Classes (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html index 49f213ab63b24..1832cf4701142 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allclasses.html @@ -2,10 +2,10 @@ - + All Classes (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html index 729faed782c41..9bc194f7cfa42 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/allpackages-index.html @@ -2,10 +2,10 @@ - + All Packages (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html index f3d8665377539..5a34f09d8f5d5 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractConnection.html @@ -2,10 +2,10 @@ - + AbstractConnection (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html index 8aaf622ec4675..632aae95f62e3 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/AbstractNode.html @@ -2,10 +2,10 @@ - + AbstractNode (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html index 2f449904f48cb..5916bcd24f6b6 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/GenericQueue.html @@ -2,10 +2,10 @@ - + GenericQueue (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html index de8e9f64f08b4..64f2c385c3083 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpAuthException.html @@ -2,10 +2,10 @@ - + OtpAuthException (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html index e9f4b584aa67f..9b6cc88c7a953 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpConnection.html @@ -2,10 +2,10 @@ - + OtpConnection (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html index 77cf5d5ff6a7b..6f1ed31b69b2f 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpCookedConnection.html @@ -2,10 +2,10 @@ - + OtpCookedConnection (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html index ba3ac30748452..6941e778a25e7 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpEpmd.html @@ -2,10 +2,10 @@ - + OtpEpmd (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html index fd49875d9153a..020782d753a4f 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html @@ -2,10 +2,10 @@ - + OtpErlangAtom (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html index e328cb3456719..128a48adedb01 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html @@ -2,10 +2,10 @@ - + OtpErlangBinary (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html index ac5dc94c534c7..d7028dea3ab5b 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBitstr.html @@ -2,10 +2,10 @@ - + OtpErlangBitstr (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html index f02dbbe83b24f..1727cf099fba3 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html @@ -2,10 +2,10 @@ - + OtpErlangBoolean (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html index 53dd360ceb786..c365f3a5504fc 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangByte.html @@ -2,10 +2,10 @@ - + OtpErlangByte (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html index f5329932f46a6..c1dc911114c9f 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangChar.html @@ -2,10 +2,10 @@ - + OtpErlangChar (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html index 736628a634c82..0d9cba1c80728 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDecodeException.html @@ -2,10 +2,10 @@ - + OtpErlangDecodeException (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html index 5f0bd6c81b306..9d6bf2712e18a 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html @@ -2,10 +2,10 @@ - + OtpErlangDouble (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html index f6bfc5ae85fb3..7eb8fd0cc1145 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangException.html @@ -2,10 +2,10 @@ - + OtpErlangException (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html index f61266a2801a2..7134245b06fb0 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExit.html @@ -2,10 +2,10 @@ - + OtpErlangExit (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html index 2e0a2d4492133..2f3076bb135c0 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangExternalFun.html @@ -2,10 +2,10 @@ - + OtpErlangExternalFun (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html index c7e2be61ef60d..a8360d5063075 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html @@ -2,10 +2,10 @@ - + OtpErlangFloat (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html index a89a579a6d18e..17c84e4d5c092 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangFun.html @@ -2,10 +2,10 @@ - + OtpErlangFun (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html index bd7455e587738..6ac2641d87e8a 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangInt.html @@ -2,10 +2,10 @@ - + OtpErlangInt (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html index 3c666551c324f..7476d4c4dbad7 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.SubList.html @@ -2,10 +2,10 @@ - + OtpErlangList.SubList (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html index 4676fd3949c51..47659165f59a4 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangList.html @@ -2,10 +2,10 @@ - + OtpErlangList (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html index 8ae3df16a7657..68943530a37bb 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangLong.html @@ -2,10 +2,10 @@ - + OtpErlangLong (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html index a785b27ccb580..eb4fe92875ace 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangMap.html @@ -2,10 +2,10 @@ - + OtpErlangMap (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html index 1bd1597468b3c..c21449fb9b9e4 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.Hash.html @@ -2,10 +2,10 @@ - + OtpErlangObject.Hash (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html index b89e44cd69b12..0732fa33b4011 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangObject.html @@ -2,10 +2,10 @@ - + OtpErlangObject (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html index 152f07928a7d8..4fec938ed698d 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPid.html @@ -2,10 +2,10 @@ - + OtpErlangPid (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html index e57985e4db0f6..4727cd8480fb6 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangPort.html @@ -2,10 +2,10 @@ - + OtpErlangPort (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html index 13242e8bf9e1c..a76b61aa31f5c 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRangeException.html @@ -2,10 +2,10 @@ - + OtpErlangRangeException (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html index 41342828b6c61..26403b51764a6 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangRef.html @@ -2,10 +2,10 @@ - + OtpErlangRef (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html index aee57ebe34035..6e6aeb49ef8a9 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangShort.html @@ -2,10 +2,10 @@ - + OtpErlangShort (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html index 19291cddf8342..25b625a606704 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangString.html @@ -2,10 +2,10 @@ - + OtpErlangString (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html index ae5af70461e8b..a1b8155f22502 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html @@ -2,10 +2,10 @@ - + OtpErlangTuple (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html index 62bb2c6c8f75e..7c063c40a6e7e 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html @@ -2,10 +2,10 @@ - + OtpErlangUInt (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html index 9fc2f1600ad25..cb18eee5712fe 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html @@ -2,10 +2,10 @@ - + OtpErlangUShort (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html index 255a15cdc9b06..829f3a5d3bda2 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpException.html @@ -2,10 +2,10 @@ - + OtpException (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html index 465b7e484875d..a539b25fb8065 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpExternal.html @@ -2,10 +2,10 @@ - + OtpExternal (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html index 22d762fae8aef..86cd7d92cc40e 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html @@ -2,10 +2,10 @@ - + OtpGenericTransportFactory (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html index 411e5737375bc..e09c03c4a925c 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpInputStream.html @@ -2,10 +2,10 @@ - + OtpInputStream (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html index b6c2630954834..744a9d1d9efa7 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpLocalNode.html @@ -2,10 +2,10 @@ - + OtpLocalNode (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html index 2e02baee71d28..4cf220a7ed61e 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMbox.html @@ -2,10 +2,10 @@ - + OtpMbox (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html index 473cb1a81f6fb..ddd2bbde85cea 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpMsg.html @@ -2,10 +2,10 @@ - + OtpMsg (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html index b2781c2ecac22..b7fb9e8dfccf2 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Acceptor.html @@ -2,10 +2,10 @@ - + OtpNode.Acceptor (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html index 9ded5be644353..52b8146a87b95 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.Mailboxes.html @@ -2,10 +2,10 @@ - + OtpNode.Mailboxes (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html index d114a7bc232f6..85499ec5b65a7 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNode.html @@ -2,10 +2,10 @@ - + OtpNode (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html index c7e50c64bb408..5bf473648b6ec 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpNodeStatus.html @@ -2,10 +2,10 @@ - + OtpNodeStatus (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html index b559017715b48..a13ff153d516e 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpOutputStream.html @@ -2,10 +2,10 @@ - + OtpOutputStream (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html index 5de05453e1c7f..aaac412a4de3a 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpPeer.html @@ -2,10 +2,10 @@ - + OtpPeer (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html index 26f44f7eecef8..976e31718fb34 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSelf.html @@ -2,10 +2,10 @@ - + OtpSelf (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html index bdf226824dd80..b3a09d69487d6 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServer.html @@ -2,10 +2,10 @@ - + OtpServer (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html index 7a6ddd804397b..c6b977277d573 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerSocketTransport.html @@ -2,10 +2,10 @@ - + OtpServerSocketTransport (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html index 1db34924907ff..d1f91e775f9ce 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpServerTransport.html @@ -2,10 +2,10 @@ - + OtpServerTransport (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html index aa0780eb57ec9..b5df91ff160dc 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransport.html @@ -2,10 +2,10 @@ - + OtpSocketTransport (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html index 2b9a35ec03726..dd0db7db771c7 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpSocketTransportFactory.html @@ -2,10 +2,10 @@ - + OtpSocketTransportFactory (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html index 5bac9d3dd75d9..9994facc668dd 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransport.html @@ -2,10 +2,10 @@ - + OtpTransport (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html index ab2ee32cc541b..40cdb188f1136 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html @@ -2,10 +2,10 @@ - + OtpTransportFactory (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html index 5e5262d62f9d4..8862e539f1ef8 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-summary.html @@ -2,10 +2,10 @@ - + com.ericsson.otp.erlang (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html index 3a4445fd04c6f..6f30929aee58b 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/com/ericsson/otp/erlang/package-tree.html @@ -2,10 +2,10 @@ - + com.ericsson.otp.erlang Class Hierarchy (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html index c739db2e61fb3..4f40530499601 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/constant-values.html @@ -2,10 +2,10 @@ - + Constant Field Values (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html index ed1f4f85ed18e..04efdde799718 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/deprecated-list.html @@ -2,10 +2,10 @@ - + Deprecated List (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html index 6771f618574f4..dfc6595d06056 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/help-doc.html @@ -2,10 +2,10 @@ - + API Help (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html index c114a018c1a90..776d760743bad 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index-all.html @@ -2,10 +2,10 @@ - + Index (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index.html index e75fbe335b947..27b93ecd7d056 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/index.html @@ -2,7 +2,7 @@ - + Java-Erlang Interface Library diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/member-search-index.zip b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/member-search-index.zip index 5199046a218bd..37bf37c915cee 100644 Binary files a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/member-search-index.zip and b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/member-search-index.zip differ diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/overview-tree.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/overview-tree.html index bebb40e7deba3..da7718d4c7374 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/overview-tree.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/overview-tree.html @@ -2,10 +2,10 @@ - + Class Hierarchy (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/package-search-index.zip b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/package-search-index.zip index 4748202512819..e62da6ae4ac19 100644 Binary files a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/package-search-index.zip and b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/package-search-index.zip differ diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html index 49bdd6cf30029..ca1980622e819 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/serialized-form.html @@ -2,10 +2,10 @@ - + Serialized Form (Java-Erlang Interface Library) - + diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/type-search-index.zip b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/type-search-index.zip index 4ea3e2fbd4d49..15a6d4a31d4f6 100644 Binary files a/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/type-search-index.zip and b/prs/9277/lib/jinterface-1.14.1/doc/html/assets/java/type-search-index.zip differ diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/dist/search_data-1B526AE3.js b/prs/9277/lib/jinterface-1.14.1/doc/html/dist/search_data-1B526AE3.js new file mode 100644 index 0000000000000..fb5539d55d0a5 --- /dev/null +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/dist/search_data-1B526AE3.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"extras","title":"Jinterface Release Notes","doc":"\n# Jinterface Release Notes\n\nThis document describes the changes made to the Jinterface application.","ref":"notes.html"},{"type":"extras","title":"Jinterface 1.14.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-14-1"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-8026]: https://github.com/erlang/otp/pull/8026","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.14 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-14"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- As announced since the release of OTP 24, support for:\n\n - version 4 node container types in the external term format are now\n mandatory. That is, references supporting up to 5 32-bit integer\n identifiers, and process and port identifiers with support for 64-bit data\n storage. The distribution flag\n [`DFLAG_V4_NC`](`e:erts:erl_dist_protocol.md#DFLAG_V4_NC`) is therefor now\n also mandatory. OTP has since OTP 24 supported this. Also note that the\n external format produced by `term_to_binary()` and `term_to_iovec()` will\n unconditionally produce pids, ports, and references supporting this larger\n format.\n - the [new link protocol](`e:erts:erl_dist_protocol.md#new_link_protocol`)\n introduced in OTP 23.3 is now mandatory. The distribution flag\n [`DFLAG_UNLINK_ID`](`e:erts:erl_dist_protocol.md#DFLAG_UNLINK_ID`) is\n therefor now also mandatory.\n\n Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from\n releases prior to OTP 24.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18140 Aux Id: PR-6072","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.13.2 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-13-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Accept connection setup from OTP 23 and 24 nodes that are not using epmd.\n\n Own Id: OTP-18404 Aux Id: GH-6595, PR-6625","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.13.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-13-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Fix javadoc build error by adding option `-encoding UTF-8`.\n\n Own Id: OTP-18215 Aux Id: PR-6154","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.13 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-13"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- The following distribution flags are now mandatory: `DFLAG_BIT_BINARIES`,\n `DFLAG_EXPORT_PTR_TAG`, `DFLAG_MAP_TAGS`, `DFLAG_NEW_FLOATS`, and\n `DFLAG_FUN_TAGS`. This mainly concerns libraries or application that implement\n the distribution protocol themselves.\n\n Own Id: OTP-17318 Aux Id: PR-4972\n\n- Removed use of node creation value zero as a wildcard. Also prevent zero from\n being used as creation by `erl_interface` and `jinterface` nodes.\n\n Own Id: OTP-17682 Aux Id: PR-5347\n\n- Add new abstract class `OtpGenericTransportFactory` to allow implementation of\n any transport protocol without dependency on epmd.\n\n Own Id: OTP-17961 Aux Id: PR-4839","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.12.2 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-12-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Fix bug in `OtpOutputStream.write_pid/4` and `write_ref/3` causing faulty\n encodig. Bug exists since OTP 23.0.\n\n Own Id: OTP-17887 Aux Id: ERIERL-750, PR-5640","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.12.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-12-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Fixed rare race bug that could cause NullPointerException on local close of\n connection.\n\n Own Id: OTP-17478 Aux Id: PR-4837","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.12 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-12"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Accept 64-bit process identifiers from external nodes. This is the first step\n in an upgrade path toward using 64-bit pids in a future OTP release.\n\n Own Id: OTP-16720 Aux Id: PR-2680\n\n- Accept references up to a size of 160-bits from remote nodes. This is the\n first step in an upgrade path toward using references up to 160-bits in a\n future OTP release.\n\n Own Id: OTP-17005 Aux Id: OTP-16718\n\n- Accept 64-bit port identifiers from external nodes. This is the first step in\n an upgrade path toward using 64-bit port identifiers in a future OTP release.\n\n Own Id: OTP-17007\n\n- Make `OtpErlangExternalFun`'s fields `module`, `function` and `arity` public.\n\n Own Id: OTP-17170 Aux Id: PR-3005","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.11.1.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-11-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Fix bug in `OtpOutputStream.write_pid/4` and `write_ref/3` causing faulty\n encodig. Bug exists since OTP 23.0.\n\n Own Id: OTP-17887 Aux Id: ERIERL-750, PR-5640","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.11.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-11-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- A [new link protocol](`e:erts:erl_dist_protocol.md#new_link_protocol`) has\n been introduced which prevents links from ending up in an inconsistent state\n where one participant considers itself linked while the other doesn't. This\n bug has always existed in the distributed case, but has since OTP 21 also\n existed in the node local case since the distributed link protocol then was\n adopted also for node local links. The bug could, however, only trigger if\n both participants operated on the link simultaneously.\n\n Own Id: OTP-17127","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.11 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-11"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Increased size of node incarnation numbers (aka \"creation\"), from 2 bits to 32\n bits. This will reduce the risk of pids/ports/refs, from different node\n incarnation with the same name, being mixed up.\n\n Own Id: OTP-15603\n\n- Improved node connection setup handshake protocol. Made possible to agree on\n protocol version without dependence on `epmd` or other prior knowledge of peer\n node version. Also added exchange of node incarnation (\"creation\") values and\n expanded the distribution capability flag field from 32 to 64 bits.\n\n Own Id: OTP-16229","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.10.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-10-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Replaced deprecated with in documentation.\n\n Own Id: OTP-16050","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.10 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- All incorrect (that is, all) uses of \"can not\" has been corrected to \"cannot\"\n in source code comments, documentation, examples, and so on.\n\n Own Id: OTP-14282 Aux Id: PR-1891","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Added support to receive export funs (`fun M:F/A`).\n\n Before this change, export funs sent to a jinterface node were encoded using\n an undocumented fallback tuple format `{M,F}`. Existing jinterface\n implementations expecting these tuples must be changed to instead use the\n existing `OtpErlangExternalFun` class.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15774 Aux Id: OTP-15712","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.9.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-9-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Improved documentation.\n\n Own Id: OTP-15190","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.9 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-9"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Add module package name for Java 9\n\n Own Id: OTP-14844","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.8.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-8-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Removed all old unused files in the documentation.\n\n Own Id: OTP-14475 Aux Id: ERL-409, PR-1493","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.8 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-8"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Remove generation of atoms in old latin1 external format in the distribution\n between erlang nodes, `erl_interface`, and `jinterface`. The new utf8 format\n for atoms was introduced in OTP R16. An OTP 20 node can therefore not connect\n to nodes older than R16.\n\n Atoms that can be encoded using latin1 are still encoded by `term_to_binary()`\n using latin1 encoding. Note that all atoms will by default be encoded using\n utf8 in a future Erlang/OTP release. For more information see the\n documentation of `erlang:term_to_binary/2`.\n\n Own Id: OTP-14337","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.7.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-7-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Update build scripts to not make assumptions about where env, cp and perl are\n located.\n\n Own Id: OTP-13800","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.7 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Fix Jinterface build on Maven\n\n Own Id: OTP-13482","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Handle terms (pids,ports and refs) from nodes with a 'creation' value larger\n than 3. This is a preparation of the distribution protocol to allow OTP 19\n nodes to correctly communicate with future nodes (20 or higher). The\n 'creation' value differentiates different incarnations of the same node\n (name).\n\n Own Id: OTP-13488","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.6.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-6-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Add missing Term tag matching switch statement that was missing an external\n fun tag.\n\n Own Id: OTP-13106\n\n- fixed writing small compressed values.\n\n Own Id: OTP-13165","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.6 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Reformat the sources for JInterface uniformly and according to the standard\n Java style guidelines. Provide description of the rules applied in Eclipse\n format (for other editors one can check the settings against these).\n\n In short, the formatting style is: _ indentation uses only spaces; each level\n is 4 positions _ no trailing whitespace _ mostly default Java style formatting\n (any difference is minor) _ always use \\{\\} blocks \\* use 'final' as much as\n possible\n\n Own Id: OTP-12333\n\n- Remove extra @param in javadoc as this gives an error when building the docs\n in java 1.8\n\n Own Id: OTP-12746","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Add basic transport factory implementation. This makes possible creating\n connections between nodes using ssh channels for example.\n\n Own Id: OTP-12686\n\n- Add Jinterface generic match and bind methods to provide low level interface\n base methods sufficient for variety of higher level pattern matching/variable\n binding implementations.\n\n Own Id: OTP-12691\n\n- Minimal Java version is now 1.6\n\n Own Id: OTP-12715","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.12 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-12"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- handle empty .erlang.cookie without crashing and OtpErlangList.clone must not\n return null\n\n Own Id: OTP-12210\n\n- This fixes all the compilation warnings in the Java code\n\n Own Id: OTP-12211","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Added an .appup file for the application.\n\n Own Id: OTP-12358 Aux Id: OTP-12178","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.11 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-11"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Added a `.app` file for the application.\n\n Own Id: OTP-12178","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.5.10 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Array now show meaningful values in exceptions.\n\n Own Id: OTP-12049\n\n- Documentation improvements.\n\n Own Id: OTP-12050\n\n- Include the cause when raising a new IOException, which should make the reason\n for the exception clearer.\n\n Own Id: OTP-12075\n\n- Arrays (here: md5 and freeVars) must not be compared with equals, which is\n broken (compares identity).\n\n Own Id: OTP-12121","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.5.9 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-9"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Implement support for Maps\n\n The API and implementation are simplistic, like for lists and tuples, using\n arrays and without any connection to java.util.Map. (Thanks to Vlad\n Dumitrescu)\n\n Own Id: OTP-11703","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.8 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Fixed a bug in OtpErlangTuple constructor. Thanks to Vlad Dumitrescu.\n\n Own Id: OTP-10819\n\n- Fixed finding cookie file on windows. Thanks to Vlad Dumitrescu\n\n Own Id: OTP-10821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Don't compress external binary format if this increases the size. Thanks to\n Nico Kruber.\n\n Own Id: OTP-10822","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.7 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- fix reading compressed binary terms from Java (Thanks to Nico Kruber)\n\n Own Id: OTP-10505\n\n- OtpEpmd.lokupNames() no longer hangs when badly configured (Thanks to Vlad\n Dumitrescu)\n\n Own Id: OTP-10579","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Where necessary a comment stating encoding has been added to Erlang files. The\n comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630\n\n- Limited support for unicode atoms in the external format and in the internal\n representation of the vm. This is a preparative feature in order to support\n communication with future releases of Erlang/OTP that may create unicode\n atoms.\n\n Own Id: OTP-10753","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.6 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Correct spelling of registered (Thanks to Richard Carlsson)\n\n Own Id: OTP-9925\n\n- Java 1.5 has a bug where detecting codepoint offsets in strings that are\n created by String.substring() gives wrong results. The new implementation uses\n a different method, avoiding the issue. (Thanks to Vlad Dumitrescu)\n\n Own Id: OTP-9927\n\n- Improve error message when creating a too long OtpErlangAtom. Also print the\n value that we tried to use for the atom. (Thanks to Vlad Dumitrescu)\n\n Own Id: OTP-9928","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.5.5 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- JInterface: improve OtpOutputStream buffer allocation\n\n Previously, the buffer was increased linearly by 2048 bytes. I now propose to\n use an exponential increase function (similar to Javas ArrayList, e.g. always\n at least +50%). This significantly increases performance of e.g. doRPC for\n large parameters. (Thanks to Nico Kruber)\n\n Own Id: OTP-9806","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.5.4 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Some malformed distribution messages could cause VM to crash, this is now\n corrected.\n\n Own Id: OTP-8993","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.5.3.2 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-3-2"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- The OtpMbox class did not have a hash() method, which it should have because\n it overrides equals().\n\n Own Id: OTP-8854","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.3.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-3-1"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- An pom.xml file is now generated. (Thanks to Gabor Liptak.)\n\n Own Id: OTP-8841","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.3 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-3"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- The documentation is now possible to build in an open source environment after\n a number of bugs are fixed and some features are added in the documentation\n build process.\n\n \\- The arity calculation is updated.\n\n \\- The module prefix used in the function names for bif's are removed in the\n generated links so the links will look like\n \"http://www.erlang.org/doc/man/erlang.html#append_element-2\" instead of\n \"http://www.erlang.org/doc/man/erlang.html#erlang:append_element-2\".\n\n \\- Enhanced the menu positioning in the html documentation when a new page is\n loaded.\n\n \\- A number of corrections in the generation of man pages (thanks to Sergei\n Golovan)\n\n \\- The legal notice is taken from the xml book file so OTP's build process can\n be used for non OTP applications.\n\n Own Id: OTP-8343","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.2 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-2"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8201","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Many Erlang classes, e.g. OtpErlangRef, was missing an implementation of the\n hashCode() method, making it futile to put them in hash structures such as\n HashMap. Bug and patch provided by Paul Guyot. We extended the patch to all\n classes and improved (?) on the hash algorithm.\n\n Own Id: OTP-7899","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- jinterface uses the new environment variable ERL_EPMD_PORT the same way that\n erl, epmd and erl_interface do since R13A.\n\n Own Id: OTP-7885","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.5 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-5"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- A number of fixes and improvements from the ErlIDE group; Vlad Dumitrescu and\n Jakob Cederlund: JDK 1.5 is now a minimal requirement for building Jinterface.\n New method: OtpEpmd.lookupNames. OtpErlangList is now iterable. Non-proper\n lists are now allowed - you have to test if a list is proper or not.\n Non-proper lists can also be created. New methods: isProper, getHead, getTail\n and getNthTail. The get tail methods creates a sublist object that re-uses the\n original list. OtpErlangPid is now Comparable. Empty atoms can now be\n constructed, a missing feature pointed out by Sebastien Boisgerault on\n erlang-questions.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7832","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.4.2 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- A bug when Jinterface did not detect remote node disconnects has been\n corrected.\n\n Own Id: OTP-7624","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.4.1 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Jinterface has been fixed to use the loopback interface when connecting to the\n Erlang Port Mapper Daemon - epmd. This facilitates firewall configuration and\n saves resources.\n\n Own Id: OTP-7103\n\n- Jinterface now refuses to connect to another node that does not agree on the\n other node's name. This has been a problem in that a connection was set up,\n but not used on a following send, which caused a second erroneous connection\n attempt to fail since the other (Erlang) node rejects a connection due to name\n disagreement.\n\n Problem reported and dissected by Alexander Lamb\n\n Own Id: OTP-7330","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Jinterface 1.4 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-4"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Jinterface has been updated to handle compressed terms, bitstring, new (IEEE)\n floats and bignums. This has caused a few incompatibilities.\n\n com.ericsson.otp.erlang.OtpOutputStream now extends\n java.io.ByteArrayOutputStream, previously java.lang.Object, and hence the\n method size() now return the number of bytes in the stream as dictated by the\n new parent class and not the buffer length as before. The new method length()\n returns what the old size() did return. The method count() is deprecated as it\n returns the same as the new size().\n\n com.ericsson.otp.erlang.OtpErlangLong now can handle larger values than\n 64-bit. Previously when larger than 64-bit integers were sent to a Jinterface\n node, it caused an com.ericsson.otp.erlang.OtpDecodeException. Now the integer\n is accepted, but the return value of longValue() is silently truncated, as\n opposed to the return value of intValue() that now and previously raises an\n com.ericsson.otp.erlang.OtpRangeException for unrepresentable values. The new\n methods isLong() and isULong() can be used to determine if the value fits in a\n long.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6809","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.3 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- `OtpMbox.receive()` and `OtpMbox.receive(long timeout)` can now throw\n `OtpErlangDecodeException` if the received message cannot be decoded. `null`\n is now only returned from `OtpMbox.receive(long timeout)` if a timeout occurs.\n `OtpMbox.receive()` will never return `null`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-3932 Aux Id: seq5196\n\n- Strings longer than 65535 bytes were encoded wrong by jinterface.\n\n Own Id: OTP-4883 Aux Id: OTP-4865\n\n- Misc bugfixes:\n\n - A node pinging itself does no longer cause the java program to hang.\n - `OtpMbox.close()` uses exit reason `'normal'` (atom) instead of `\"normal\"`\n (string).\n - Added `OtpNode.closeMbox(OtpMbox mbox, OtpErlangObject reason)`.\n - Added `OtpMbox.exit(OtpErlangObject reason)` and\n `OtpMbox.exit(String reason)`.\n - Added `OtpMbox.exit(OtpErlangPid to, OtpErlangObject reason)`.\n - `OtpMbox.exit(OtpErlangPid to, String reason)` is now equivalent to\n `OtpMbox.exit(to, new OtpErlangAtom(reason))`.\n - Exit signals from an Erlang node can now contain any erlang term as reason,\n not only atoms.\n\n Own Id: OTP-5088\n\n- For java versions 1.3.1 or later, `localStatus` was not sent to registered\n status handler when `OtpNode.close()` was called. This is now corrected.\n\n Own Id: OTP-5169","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Jinterface Release Notes","doc":"- Process identifiers and port identifiers have been made more unique.\n Previously 18 bits were used as id in the internal representation of process\n and port identifiers. Now 28 bits are used.\n\n The maximum limit on the number of concurrently existing processes due to the\n representation of pids has been increased to 268435456 processes. The same is\n true for ports. This limit will at least on a 32-bit architecture be\n impossible to reach due to memory shortage.\n\n _NOTE:_ By default, the `ERTS`, and the `erl_interface`, `ei`, and\n `jinterface` libraries are now only guaranteed to be compatible with other\n Erlang/OTP components from the same release. It is possible to set each\n component in compatibility mode of an earlier release, though. See the\n documentation for respective component on how to set it in compatibility mode.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-4968 Aux Id: OTP-4196","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Jinterface 1.2.1.2 - Jinterface Release Notes","doc":"","ref":"notes.html#jinterface-1-2-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","doc":"- Output of Java long was truncated to 32 bits. IDL long long and unsigned long\n long could not be used in a struct for the Java backend. All unsigned integer\n types for the Java backend had broken marshalling for large values. These bugs\n has now been fixed.\n\n Own Id: OTP-4763 Aux Id: seq8024","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"The Jinterface Package","doc":"\n# The Jinterface Package\n\nThe [Jinterface] package provides a set of tools for communication with Erlang processes.\nIt can also be used for communication with other Java processes using the same package,\nas well as C processes using the Erl_Interface library.\n\nThe set of classes in the package can be divided into two categories: those that\nprovide the actual communication, and those that provide a Java representation\nof the Erlang data types. The latter are all subclasses of [`OtpErlangObject`], and\nthey are identified by the `OtpErlang` prefix.\n\nSince this package provides a mechanism for communicating with Erlang, message\nrecipients can be Erlang processes or instances of\n`com.ericsson.otp.erlang.OtpMbox`, both of which are identified with pids and\npossibly registered names. When pids or mailboxes are mentioned as message\nsenders or recipients in this section, it should assumed that even Erlang\nprocesses are included, unless specified otherwise. The classes in\n[Jinterface] support the following:\n\n- manipulation of data represented as Erlang data types\n- conversion of data between Java and Erlang formats\n- encoding and decoding of Erlang data types for transmission or storage\n- communication between Java nodes and Erlang processes\n\nIn the following sections, these topics are described:\n\n- mapping of Erlang types to Java\n- encoding, decoding, and sending Erlang terms\n- connecting to a distributed Erlang node\n- using nodes, mailboxes and EPMD\n- sending and receiving Erlang messages and data\n- remote procedure calls\n- linking to remote processes\n- compiling your code for use with Jinterface\n- tracing message flow","ref":"jinterface_users_guide.html"},{"type":"extras","title":"Mapping of Basic Erlang Types to Java - The Jinterface Package","doc":"This section describes the mapping of Erlang basic types to Java.\n\n| Erlang type | Java type |\n| -------------------- | ------------------ |\n| atom | [`OtpErlangAtom`] |\n| binary | [`OtpErlangBinary`] |\n| floating point types | [`OtpErlangFloat`] or [`OtpErlangDouble`], depending on the floating point value size |\n| integral types | One of [`OtpErlangByte`], [`OtpErlangChar`], [`OtpErlangShort`], [`OtpErlangUShort`], [`OtpErlangInt`], [`OtpErlangUInt`] or [`OtpErlangLong`], depending on the integral value size and sign |\n| list | [`OtpErlangList`] |\n| pid | [`OtpErlangPid`] |\n| port | [`OtpErlangPort`] |\n| ref | [`OtpErlangRef`] |\n| tuple | [`OtpErlangTuple`] |\n| map | [`OtpErlangMap`] |\n| term | [`OtpErlangObject`] |\n\n_Table: Mapping of Erlang basic types to Java_","ref":"jinterface_users_guide.html#mapping-of-basic-erlang-types-to-java"},{"type":"extras","title":"Special Mapping Issues - The Jinterface Package","doc":"The atoms `true` and `false` are special atoms, used as boolean values. The\nclass [`OtpErlangBoolean`] can be used to represent these.\n\nLists in Erlang are also used to describe sequences of printable characters\n(strings). A convenience class [`OtpErlangString`] is provided to represent\nErlang strings.","ref":"jinterface_users_guide.html#special-mapping-issues"},{"type":"extras","title":"Nodes - The Jinterface Package","doc":"A node as defined by Erlang/OTP is an instance of the Erlang Runtime System, a\nvirtual machine roughly equivalent to a JVM. Each node has a unique name in the\nform of an identifier composed partly of the hostname on which the node is\nrunning, e.g \"gurka@sallad.com\". Several such nodes can run on the same host as\nlong as their names are unique. The class [`OtpNode`] represents an Erlang\nnode.\n\nIt is created with a name and optionally a TCP/IP socket port number on which it\nlistens for incoming connections. By default before creating an instance of\n[`OtpNode`], ensure that Epmd is running on the host machine. See the Erlang\ndocumentation for more information about [Epmd](`e:erts:epmd_cmd.md`).\n\nIn this example, the host name is appended automatically to the identifier, and\nthe port number is chosen by the underlying system:\n\n```java\nOtpNode node = new OtpNode(\"gurka\");\n```\n\nIt is also possible to use alternative communication (or distribution) protocols\nwithout Epmd by switching to a custom transport factory extending the\nOtpGenericTransportFactory abstract class, for example based on Unix Domain\nSockets instead of the default TCP/IP sockets.\n\nIn this example, the host name is appended automatically to the identifier and a\ncustom transport factory is used:\n\n```java\nOtpGenericTransportFactory customFactory = new MyCustomFactory();\nOtpNode node = new OtpNode(\"gurka\", customFactory);\n```","ref":"jinterface_users_guide.html#nodes"},{"type":"extras","title":"Mailboxes - The Jinterface Package","doc":"Erlang processes running on an Erlang node are identified by process identifiers\n(pids) and, optionally, by registered names unique within the node. Each Erlang\nprocess has an implicit mailbox that is used to receive messages; the mailbox is\nidentified with the pid of the process.\n\nJinterface provides a similar mechanism with the class [`OtpMbox`], a mailbox that can\nbe used to send and receive messages asynchronously. Each OtpMbox is identified\nwith a unique pid and , optionally, a registered name unique within the\n[`OtpNode`].\n\nApplications are free to create mailboxes as necessary. This is done as follows:\n\n```java\nOtpMbox mbox = node.createMbox();\n```\n\nThe mailbox created in the above example has no registered name, although it\ndoes have a pid. The pid can be obtained from the mailbox and included in\nmessages sent from the mailbox, so that remote processes are able to respond.\n\nAn application can register a name for a mailbox, either when the mailbox is\ninitially created:\n\n```java\nOtpMbox mbox = node.createMbox(\"server\");\n```\n\nor later on, as necessary:\n\n```java\nOtpMbox mbox = node.createMbox();\nmbox.registerName(\"server\");\n```\n\nRegistered names are usually necessary in order to start communication, since it\nis impossible to know in advance the pid of a remote process. If a well-known\nname for one of the processes is chosen in advance and known by all\ncommunicating parties within an application, each mailbox can send an initial\nmessage to the named mailbox, which then can identify the sender pid.","ref":"jinterface_users_guide.html#mailboxes"},{"type":"extras","title":"Connections - The Jinterface Package","doc":"It is not necessary to explicitly set up communication with a remote node.\nSimply sending a message to a mailbox on that node will cause the OtpNode to\ncreate a connection if one does not already exist. Once the connection is\nestablished, subsequent messages to the same node will reuse the same\nconnection.\n\nIt is possible to check for the existence of a remote node before attempting to\ncommunicate with it. Here we send a ping message to the remote node to see if it\nis alive and accepting connections:\n\n```java\nif (node.ping(\"remote\",2000)) {\n System.out.println(\"remote is up\");\n}\nelse {\n System.out.println(\"remote is not up\");\n}\n```\n\nIf the call to ping() succeeds, a connection to the remote node has been\nestablished. Note that it is not necessary to ping remote nodes before\ncommunicating with them, but by using ping you can determine if the remote\nexists before attempting to communicate with it.\n\nConnections are only permitted by nodes using the same security cookie. The\ncookie is a short string provided either as an argument when creating OtpNode\nobjects, or found in the user's home directory in the file `.erlang.cookie`.\nWhen a connection attempt is made, the string is used as part of the\nauthentication process. If you are having trouble getting communication to work,\nuse the trace facility (described later in this document) to show the connection\nestablishment. A likely problem is that the cookies are different.\n\nConnections are never broken explicitly. If a node fails or is closed, a\nconnection may be broken however.","ref":"jinterface_users_guide.html#connections"},{"type":"extras","title":"Transport Factory - The Jinterface Package","doc":"All necessary connections are made using methods of\n[OtpTransportFactory](assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html)\ninterface. The default OtpTransportFactory implementation is based on standard\nTCP/IP Socket class and relies on epmd. User may provide custom transport\nfactory as needed. See java doc for details.\n\nFor alternative distribution protocols working without epmd, using a transport\nfactory extending the\n[OtpGenericTransportFactory](assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html)\nabstract class will disable the automatic epmd registration and lookup in\nJinterface.","ref":"jinterface_users_guide.html#transport-factory"},{"type":"extras","title":"Sending and Receiving Messages - The Jinterface Package","doc":"Messages sent with this package must be instances of\n[`OtpErlangObject`] or one of its subclasses. Message can be sent to processes or pids,\neither by specifying the pid of the remote, or its registered name and node.\n\nIn this example, we create a message containing our own pid so the echo process\ncan reply:\n\n```java\nOtpErlangObject[] msg = new OtpErlangObject[2];\nmsg[0] = mbox.self();\nmsg[1] = new OtpErlangAtom(\"hello, world\");\nOtpErlangTuple tuple = new OtpErlangTuple(msg);\n```\n\nWhen we send the message, a connection will be created:\n\n```java\nmbox.send(\"echo\", \"gurka@sallad.com\", tuple);\n```\n\nAnd here we receive the reply:\n\n```java\nOtpErlangObject reply = mbox.receive();\n```\n\nMessages are sent asynchronously, so the call to `send()` returns as soon as the\nmessage has been dispatched to the underlying communication layer. This means\nthat you receive no indication whether the operation completed successfully or\nthe remote even existed. If you need this kind of confirmation, you should wait\nfor a response from the remote process.\n\nThe echo server itself might look like this:\n\n```java\nOtpNode self = new OtpNode(\"gurka\");\nOtpMbox mbox = self.createMbox(\"echo\");\nOtpErlangObject o;\nOtpErlangTuple msg;\nOtpErlangPid from;\n\nwhile (true) {\n try {\n o = mbox.receive();\n if (o instanceof OtpErlangTuple) {\n msg = (OtpErlangTuple)o;\n from = (OtpErlangPid)(msg.elementAt(0));\n mbox.send(from,msg.elementAt(1));\n }\n catch (Exception e) {\n System.out.println(\"\" + e);\n }\n}\n```\n\nIn the examples above, only one mailbox was created on each node. however you\nare free to create as many mailboxes on each node as you like. You are also free\nto create as many nodes as you like on each JVM, however because each node uses\nsome limited system resources such as file descriptors, it is recommended that\nyou create only a small number of nodes (such as one) on each JVM.","ref":"jinterface_users_guide.html#sending-and-receiving-messages"},{"type":"extras","title":"Sending Arbitrary Data - The Jinterface Package","doc":"This package was originally intended to be used for communicating between Java\nand Erlang, and for that reason the send and receive methods all use Java\nrepresentations of Erlang data types.\n\nHowever it is possible to use the package to communicate with remote processes\nwritten in Java as well, and in these cases it may be desirable to send other\ndata types.\n\nThe simplest way to do this is to encapsulate arbitrary data in messages of type\n[`OtpErlangBinary`](assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html). The\nOtpErlangBinary class can be created from arbitrary Java objects that implement\nthe Serializable or Externalizable interface:\n\n```java\no = new MyClass(foo);\nmbox.send(remote,new OtpErlangBinary(o));\n```\n\nThe example above will cause the object to be serialized and encapsulated in an\nOtpErlangBinary before being sent. The recipient will receive an OtpErlangBinary\nbut can extract the original object from it:\n\n```java\nmsg = mbox.receive();\nif (msg instanceof OtpErlangBinary) {\n OtpErlangBinary b = (OtpErlangBinary)msg;\n MyClass o = (MyClass)(b.getObject());\n}\n```","ref":"jinterface_users_guide.html#sending-arbitrary-data"},{"type":"extras","title":"Linking to Remote Processes - The Jinterface Package","doc":"Erlang defines a concept known as linked processes. A link is an implicit\nconnection between two processes that causes an exception to be raised in one of\nthe processes if the other process terminates for any reason. Links are\nbidirectional: it does not matter which of the two processes created the link or\nwhich of the linked processes eventually terminates; an exception will be raised\nin the remaining process. Links are also idempotent: at most one link can exist\nbetween two given processes, only one operation is necessary to remove the link.\n\nJinterface provides a similar mechanism. Also here, no distinction is made\nbetween mailboxes and Erlang processes. A link can be created to a remote\nmailbox or process when its pid is known:\n\n```java\nmbox.link(remote);\n```\n\nThe link can be removed by either of the processes in a similar manner:\n\n```java\nmbox.unlink(remote);\n```\n\nIf the remote process terminates while the link is still in place, an exception\nwill be raised on a subsequent call to receive():\n\n```java\ntry {\n msg = mbox.receive();\n}\ncatch (OtpErlangExit e) {\n System.out.println(\"Remote pid \" + e.pid() + \" has terminated\");\n}\ncatch (OtpErlangDecodeException f) {\n System.out.println(\"Received message could not be decoded: \" + f);\n}\n```\n\nWhen a mailbox is explicitly closed, exit messages will be sent in order to\nbreak any outstanding links. If a mailbox is never closed but instead goes out\nof scope, the objects `finalize()` method will call `close()`. However since\nJava provides no guarantees about when or even if finalize() will be called, it\nis important that your application explicitly closes mailboxes when they are no\nlonger needed if you want links to work in a timely manner.","ref":"jinterface_users_guide.html#linking-to-remote-processes"},{"type":"extras","title":"Using EPMD - The Jinterface Package","doc":"Epmd is the Erlang Port Mapper Daemon. By default distributed Erlang nodes\nregister with epmd on the localhost to indicate to other nodes that they exist\nand can accept connections. Epmd maintains a register of node and socket port\nnumber information, and when a node wishes to connect to another node, it first\ncontacts epmd in order to find out the correct socket port number to connect to.\nIt is also possible to use alternative distribution protocols which don't need\nepmd at all.\n\nThe basic interaction with EPMD is done through instances of\n[OtpEpmd](assets/java/com/ericsson/otp/erlang/OtpEpmd.html) class. Nodes wishing\nto contact other nodes must first request information from Epmd before a\nconnection can be set up, however this is done automatically by\n[OtpSelf.connect()](assets/java/com/ericsson/otp/erlang/OtpSelf.html#connect%28com.ericsson.otp.erlang.OtpPeer%29)\nwhen necessary.\n\nWhen you use\n[OtpSelf.connect()](assets/java/com/ericsson/otp/erlang/OtpSelf.html#connect%28com.ericsson.otp.erlang.OtpPeer%29)\nto connect to an Erlang node, a connection is first made to epmd and, if the\nnode is known, a connection is then made to the Erlang node.\n\nJava nodes can also register themselves with epmd if they want other nodes in\nthe system to be able to find and connect to them. This is done by call to\nmethod\n[OtpEpmd.publishPort()](assets/java/com/ericsson/otp/erlang/OtpEpmd.html#publishPort%28com.ericsson.otp.erlang.OtpLocalNode%29).\n\nBe aware that on some systems a failed node will not be detected by this\nmechanism since the operating system does not automatically close descriptors\nthat were left open when the node failed. If a node has failed in this way, epmd\nwill prevent you from registering a new node with the old name, since it thinks\nthat the old name is still in use. In this case, you must unregister the name\nexplicitly, by using\n[OtpEpmd.unPublishPort()](assets/java/com/ericsson/otp/erlang/OtpEpmd.html#unPublishPort%28com.ericsson.otp.erlang.OtpLocalNode%29)\n\nThis will cause epmd to close the connection from the far end. Note that if the\nname was in fact still in use by a node, the results of this operation are\nunpredictable. Also, doing this does not cause the local end of the connection\nto close, so resources may be consumed.","ref":"jinterface_users_guide.html#using-epmd"},{"type":"extras","title":"Remote Procedure Calls - The Jinterface Package","doc":"An Erlang node acting as a client to another Erlang node typically sends a\nrequest and waits for a reply. Such a request is included in a function call at\na remote node and is called a remote procedure call. Remote procedure calls are\nsupported through the class [`OtpConnection`]. The following example shows how the\n[`OtpConnection`] class is used for remote procedure calls:\n\n```java\nOtpSelf self = new OtpSelf(\"client\", \"hejsan\" );\nOtpPeer other = new OtpPeer(\"server@balin\");\nOtpConnection connection = self.connect(other);\n\nconnection.sendRPC(\"erlang\",\"date\",new OtpErlangList());\nOtpErlangObject received = connection.receiveRPC();\n```\n\n`erlang:date/0` is just called to get the date tuple from a remote host.","ref":"jinterface_users_guide.html#remote-procedure-calls"},{"type":"extras","title":"Compiling and Loading Your Code - The Jinterface Package","doc":"In order to use any of the\n[Jinterface] classes,\ninclude the following line in your code:\n\n```java\nimport com.ericsson.otp.erlang.*;\n```\n\nDetermine where the top directory of your OTP installation is. You can find this\nout by starting Erlang and entering the following command at the Eshell prompt:\n\n```text\nEshell V4.9.1.2 (abort with ^G)\n1> code:root_dir().\n/usr/local/otp\n```\n\nTo compile your code, make sure that your Java compiler knows where to find the\nfile `OtpErlang.jar` which contains the package. This is done by specifying an\nappropriate `-classpath` argument on the command line, or by adding it to the\n`CLASSPATH` definition in your `Makefile`. The correct value for this path is\n`$OTPROOT/lib/jinterface`_Vsn_`/priv/OtpErlang.jar`, where `$OTPROOT` is the\npath reported by `code:root_dir/0` in the above example and _Vsn_ is the version\nof Jinterface, for example `jinterface-1.2`\n\n```text\n$ javac -classpath \".:/usr/local/otp/lib/jinterface-1.2/priv/OtpErlang.jar\"\n myclass.java\n```\n\nWhen running your program, you will also need to specify the path to\n`OtpErlang.jar` in a similar way.\n\n```text\n$ java \".:/usr/local/otp/lib/jinterface-1.2/priv/OtpErlang.jar\" myclass\n```","ref":"jinterface_users_guide.html#compiling-and-loading-your-code"},{"type":"extras","title":"Tracing - The Jinterface Package","doc":"Communication between nodes can be traced by setting a system property before\nthe communication classes in this package are initialized. The value system\nproperty \"OtpConnection.trace\" is the default trace level for all connections.\nNormally the default trace level is zero, i.e. no tracing is performed. By\nsetting OtpConnection.trace to some non-zero value, the communication protocol\ncan be shown in more or less detail. The valid values are:\n\n- 0: no tracing is performed\n- 1: only ordinary send and reg-send messages are shown\n- 2: control messages such as link, unlink and exit are shown\n- 3: connection setup (handshake) is shown\n- 4: epmd requests are shown\n\nEach level also includes the information shown by all lower levels.\n\n[`OtpErlangAtom`]: assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html\n[`OtpErlangBinary`]: assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html\n[`OtpErlangBoolean`]: assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html\n[`OtpErlangFloat`]: assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html\n[`OtpErlangDouble`]: assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html\n[`OtpErlangByte`]: assets/java/com/ericsson/otp/erlang/OtpErlangByte.html\n[`OtpErlangChar`]: assets/java/com/ericsson/otp/erlang/OtpErlangChar.html\n[`OtpErlangShort`]: assets/java/com/ericsson/otp/erlang/OtpErlangShort.html\n[`OtpErlangString`]: assets/java/com/ericsson/otp/erlang/OtpErlangString.html\n[`OtpErlangUShort`]: assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html\n[`OtpErlangInt`]: assets/java/com/ericsson/otp/erlang/OtpErlangInt.html\n[`OtpErlangUInt`]: assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html\n[`OtpErlangLong`]: assets/java/com/ericsson/otp/erlang/OtpErlangLong.html\n[`OtpErlangList`]: assets/java/com/ericsson/otp/erlang/OtpErlangList.html\n[`OtpErlangPid`]: assets/java/com/ericsson/otp/erlang/OtpErlangPid.html\n[`OtpErlangPort`]: assets/java/com/ericsson/otp/erlang/OtpErlangPort.html\n[`OtpErlangRef`]: assets/java/com/ericsson/otp/erlang/OtpErlangRef.html\n[`OtpErlangTuple`]: assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html\n[`OtpErlangMap`]: assets/java/com/ericsson/otp/erlang/OtpErlangMap.html\n[`OtpErlangObject`]: assets/java/com/ericsson/otp/erlang/OtpErlangObject.html\n[`OtpMbox`]: assets/java/com/ericsson/otp/erlang/OtpMbox.html\n[`OtpNode`]: assets/java/com/ericsson/otp/erlang/OtpNode.html\n[`OtpConnection`]: assets/java/com/ericsson/otp/erlang/OtpConnection.html\n[Jinterface]: assets/java/com/ericsson/otp/erlang/package-summary.html","ref":"jinterface_users_guide.html#tracing"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/dist/search_data-E41D9DD2.js b/prs/9277/lib/jinterface-1.14.1/doc/html/dist/search_data-E41D9DD2.js deleted file mode 100644 index 8ca6babec2bfc..0000000000000 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/dist/search_data-E41D9DD2.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"extras","doc":"\n# Jinterface Release Notes\n\nThis document describes the changes made to the Jinterface application.","title":"Jinterface Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Jinterface 1.14.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-14-1"},{"type":"extras","doc":"- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-8026]: https://github.com/erlang/otp/pull/8026","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.14 - Jinterface Release Notes","ref":"notes.html#jinterface-1-14"},{"type":"extras","doc":"- As announced since the release of OTP 24, support for:\n\n - version 4 node container types in the external term format are now\n mandatory. That is, references supporting up to 5 32-bit integer\n identifiers, and process and port identifiers with support for 64-bit data\n storage. The distribution flag\n [`DFLAG_V4_NC`](`e:erts:erl_dist_protocol.md#DFLAG_V4_NC`) is therefor now\n also mandatory. OTP has since OTP 24 supported this. Also note that the\n external format produced by `term_to_binary()` and `term_to_iovec()` will\n unconditionally produce pids, ports, and references supporting this larger\n format.\n - the [new link protocol](`e:erts:erl_dist_protocol.md#new_link_protocol`)\n introduced in OTP 23.3 is now mandatory. The distribution flag\n [`DFLAG_UNLINK_ID`](`e:erts:erl_dist_protocol.md#DFLAG_UNLINK_ID`) is\n therefor now also mandatory.\n\n Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from\n releases prior to OTP 24.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18140 Aux Id: PR-6072","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.13.2 - Jinterface Release Notes","ref":"notes.html#jinterface-1-13-2"},{"type":"extras","doc":"- Accept connection setup from OTP 23 and 24 nodes that are not using epmd.\n\n Own Id: OTP-18404 Aux Id: GH-6595, PR-6625","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.13.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-13-1"},{"type":"extras","doc":"- Fix javadoc build error by adding option `-encoding UTF-8`.\n\n Own Id: OTP-18215 Aux Id: PR-6154","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.13 - Jinterface Release Notes","ref":"notes.html#jinterface-1-13"},{"type":"extras","doc":"- The following distribution flags are now mandatory: `DFLAG_BIT_BINARIES`,\n `DFLAG_EXPORT_PTR_TAG`, `DFLAG_MAP_TAGS`, `DFLAG_NEW_FLOATS`, and\n `DFLAG_FUN_TAGS`. This mainly concerns libraries or application that implement\n the distribution protocol themselves.\n\n Own Id: OTP-17318 Aux Id: PR-4972\n\n- Removed use of node creation value zero as a wildcard. Also prevent zero from\n being used as creation by `erl_interface` and `jinterface` nodes.\n\n Own Id: OTP-17682 Aux Id: PR-5347\n\n- Add new abstract class `OtpGenericTransportFactory` to allow implementation of\n any transport protocol without dependency on epmd.\n\n Own Id: OTP-17961 Aux Id: PR-4839","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.12.2 - Jinterface Release Notes","ref":"notes.html#jinterface-1-12-2"},{"type":"extras","doc":"- Fix bug in `OtpOutputStream.write_pid/4` and `write_ref/3` causing faulty\n encodig. Bug exists since OTP 23.0.\n\n Own Id: OTP-17887 Aux Id: ERIERL-750, PR-5640","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.12.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-12-1"},{"type":"extras","doc":"- Fixed rare race bug that could cause NullPointerException on local close of\n connection.\n\n Own Id: OTP-17478 Aux Id: PR-4837","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.12 - Jinterface Release Notes","ref":"notes.html#jinterface-1-12"},{"type":"extras","doc":"- Accept 64-bit process identifiers from external nodes. This is the first step\n in an upgrade path toward using 64-bit pids in a future OTP release.\n\n Own Id: OTP-16720 Aux Id: PR-2680\n\n- Accept references up to a size of 160-bits from remote nodes. This is the\n first step in an upgrade path toward using references up to 160-bits in a\n future OTP release.\n\n Own Id: OTP-17005 Aux Id: OTP-16718\n\n- Accept 64-bit port identifiers from external nodes. This is the first step in\n an upgrade path toward using 64-bit port identifiers in a future OTP release.\n\n Own Id: OTP-17007\n\n- Make `OtpErlangExternalFun`'s fields `module`, `function` and `arity` public.\n\n Own Id: OTP-17170 Aux Id: PR-3005","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.11.1.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-11-1-1"},{"type":"extras","doc":"- Fix bug in `OtpOutputStream.write_pid/4` and `write_ref/3` causing faulty\n encodig. Bug exists since OTP 23.0.\n\n Own Id: OTP-17887 Aux Id: ERIERL-750, PR-5640","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.11.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-11-1"},{"type":"extras","doc":"- A [new link protocol](`e:erts:erl_dist_protocol.md#new_link_protocol`) has\n been introduced which prevents links from ending up in an inconsistent state\n where one participant considers itself linked while the other doesn't. This\n bug has always existed in the distributed case, but has since OTP 21 also\n existed in the node local case since the distributed link protocol then was\n adopted also for node local links. The bug could, however, only trigger if\n both participants operated on the link simultaneously.\n\n Own Id: OTP-17127","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.11 - Jinterface Release Notes","ref":"notes.html#jinterface-1-11"},{"type":"extras","doc":"- Increased size of node incarnation numbers (aka \"creation\"), from 2 bits to 32\n bits. This will reduce the risk of pids/ports/refs, from different node\n incarnation with the same name, being mixed up.\n\n Own Id: OTP-15603\n\n- Improved node connection setup handshake protocol. Made possible to agree on\n protocol version without dependence on `epmd` or other prior knowledge of peer\n node version. Also added exchange of node incarnation (\"creation\") values and\n expanded the distribution capability flag field from 32 to 64 bits.\n\n Own Id: OTP-16229","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.10.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-10-1"},{"type":"extras","doc":"- Replaced deprecated with in documentation.\n\n Own Id: OTP-16050","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.10 - Jinterface Release Notes","ref":"notes.html#jinterface-1-10"},{"type":"extras","doc":"- All incorrect (that is, all) uses of \"can not\" has been corrected to \"cannot\"\n in source code comments, documentation, examples, and so on.\n\n Own Id: OTP-14282 Aux Id: PR-1891","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added support to receive export funs (`fun M:F/A`).\n\n Before this change, export funs sent to a jinterface node were encoded using\n an undocumented fallback tuple format `{M,F}`. Existing jinterface\n implementations expecting these tuples must be changed to instead use the\n existing `OtpErlangExternalFun` class.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15774 Aux Id: OTP-15712","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.9.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-9-1"},{"type":"extras","doc":"- Improved documentation.\n\n Own Id: OTP-15190","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.9 - Jinterface Release Notes","ref":"notes.html#jinterface-1-9"},{"type":"extras","doc":"- Add module package name for Java 9\n\n Own Id: OTP-14844","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.8.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-8-1"},{"type":"extras","doc":"- Removed all old unused files in the documentation.\n\n Own Id: OTP-14475 Aux Id: ERL-409, PR-1493","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.8 - Jinterface Release Notes","ref":"notes.html#jinterface-1-8"},{"type":"extras","doc":"- Remove generation of atoms in old latin1 external format in the distribution\n between erlang nodes, `erl_interface`, and `jinterface`. The new utf8 format\n for atoms was introduced in OTP R16. An OTP 20 node can therefore not connect\n to nodes older than R16.\n\n Atoms that can be encoded using latin1 are still encoded by `term_to_binary()`\n using latin1 encoding. Note that all atoms will by default be encoded using\n utf8 in a future Erlang/OTP release. For more information see the\n documentation of `erlang:term_to_binary/2`.\n\n Own Id: OTP-14337","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.7.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-7-1"},{"type":"extras","doc":"- Update build scripts to not make assumptions about where env, cp and perl are\n located.\n\n Own Id: OTP-13800","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.7 - Jinterface Release Notes","ref":"notes.html#jinterface-1-7"},{"type":"extras","doc":"- Fix Jinterface build on Maven\n\n Own Id: OTP-13482","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Handle terms (pids,ports and refs) from nodes with a 'creation' value larger\n than 3. This is a preparation of the distribution protocol to allow OTP 19\n nodes to correctly communicate with future nodes (20 or higher). The\n 'creation' value differentiates different incarnations of the same node\n (name).\n\n Own Id: OTP-13488","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.6.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-6-1"},{"type":"extras","doc":"- Add missing Term tag matching switch statement that was missing an external\n fun tag.\n\n Own Id: OTP-13106\n\n- fixed writing small compressed values.\n\n Own Id: OTP-13165","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.6 - Jinterface Release Notes","ref":"notes.html#jinterface-1-6"},{"type":"extras","doc":"- Reformat the sources for JInterface uniformly and according to the standard\n Java style guidelines. Provide description of the rules applied in Eclipse\n format (for other editors one can check the settings against these).\n\n In short, the formatting style is: _ indentation uses only spaces; each level\n is 4 positions _ no trailing whitespace _ mostly default Java style formatting\n (any difference is minor) _ always use \\{\\} blocks \\* use 'final' as much as\n possible\n\n Own Id: OTP-12333\n\n- Remove extra @param in javadoc as this gives an error when building the docs\n in java 1.8\n\n Own Id: OTP-12746","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add basic transport factory implementation. This makes possible creating\n connections between nodes using ssh channels for example.\n\n Own Id: OTP-12686\n\n- Add Jinterface generic match and bind methods to provide low level interface\n base methods sufficient for variety of higher level pattern matching/variable\n binding implementations.\n\n Own Id: OTP-12691\n\n- Minimal Java version is now 1.6\n\n Own Id: OTP-12715","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.12 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-12"},{"type":"extras","doc":"- handle empty .erlang.cookie without crashing and OtpErlangList.clone must not\n return null\n\n Own Id: OTP-12210\n\n- This fixes all the compilation warnings in the Java code\n\n Own Id: OTP-12211","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added an .appup file for the application.\n\n Own Id: OTP-12358 Aux Id: OTP-12178","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.11 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-11"},{"type":"extras","doc":"- Added a `.app` file for the application.\n\n Own Id: OTP-12178","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.5.10 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-10"},{"type":"extras","doc":"- Array now show meaningful values in exceptions.\n\n Own Id: OTP-12049\n\n- Documentation improvements.\n\n Own Id: OTP-12050\n\n- Include the cause when raising a new IOException, which should make the reason\n for the exception clearer.\n\n Own Id: OTP-12075\n\n- Arrays (here: md5 and freeVars) must not be compared with equals, which is\n broken (compares identity).\n\n Own Id: OTP-12121","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.5.9 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-9"},{"type":"extras","doc":"- Implement support for Maps\n\n The API and implementation are simplistic, like for lists and tuples, using\n arrays and without any connection to java.util.Map. (Thanks to Vlad\n Dumitrescu)\n\n Own Id: OTP-11703","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.8 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-8"},{"type":"extras","doc":"- Fixed a bug in OtpErlangTuple constructor. Thanks to Vlad Dumitrescu.\n\n Own Id: OTP-10819\n\n- Fixed finding cookie file on windows. Thanks to Vlad Dumitrescu\n\n Own Id: OTP-10821","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Don't compress external binary format if this increases the size. Thanks to\n Nico Kruber.\n\n Own Id: OTP-10822","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.7 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-7"},{"type":"extras","doc":"- fix reading compressed binary terms from Java (Thanks to Nico Kruber)\n\n Own Id: OTP-10505\n\n- OtpEpmd.lokupNames() no longer hangs when badly configured (Thanks to Vlad\n Dumitrescu)\n\n Own Id: OTP-10579","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Where necessary a comment stating encoding has been added to Erlang files. The\n comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630\n\n- Limited support for unicode atoms in the external format and in the internal\n representation of the vm. This is a preparative feature in order to support\n communication with future releases of Erlang/OTP that may create unicode\n atoms.\n\n Own Id: OTP-10753","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.6 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-6"},{"type":"extras","doc":"- Correct spelling of registered (Thanks to Richard Carlsson)\n\n Own Id: OTP-9925\n\n- Java 1.5 has a bug where detecting codepoint offsets in strings that are\n created by String.substring() gives wrong results. The new implementation uses\n a different method, avoiding the issue. (Thanks to Vlad Dumitrescu)\n\n Own Id: OTP-9927\n\n- Improve error message when creating a too long OtpErlangAtom. Also print the\n value that we tried to use for the atom. (Thanks to Vlad Dumitrescu)\n\n Own Id: OTP-9928","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.5.5 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-5"},{"type":"extras","doc":"- JInterface: improve OtpOutputStream buffer allocation\n\n Previously, the buffer was increased linearly by 2048 bytes. I now propose to\n use an exponential increase function (similar to Javas ArrayList, e.g. always\n at least +50%). This significantly increases performance of e.g. doRPC for\n large parameters. (Thanks to Nico Kruber)\n\n Own Id: OTP-9806","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.5.4 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-4"},{"type":"extras","doc":"- Some malformed distribution messages could cause VM to crash, this is now\n corrected.\n\n Own Id: OTP-8993","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.5.3.2 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-3-2"},{"type":"extras","doc":"- The OtpMbox class did not have a hash() method, which it should have because\n it overrides equals().\n\n Own Id: OTP-8854","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.3.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-3-1"},{"type":"extras","doc":"- An pom.xml file is now generated. (Thanks to Gabor Liptak.)\n\n Own Id: OTP-8841","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.3 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-3"},{"type":"extras","doc":"- The documentation is now possible to build in an open source environment after\n a number of bugs are fixed and some features are added in the documentation\n build process.\n\n \\- The arity calculation is updated.\n\n \\- The module prefix used in the function names for bif's are removed in the\n generated links so the links will look like\n \"http://www.erlang.org/doc/man/erlang.html#append_element-2\" instead of\n \"http://www.erlang.org/doc/man/erlang.html#erlang:append_element-2\".\n\n \\- Enhanced the menu positioning in the html documentation when a new page is\n loaded.\n\n \\- A number of corrections in the generation of man pages (thanks to Sergei\n Golovan)\n\n \\- The legal notice is taken from the xml book file so OTP's build process can\n be used for non OTP applications.\n\n Own Id: OTP-8343","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.2 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-2"},{"type":"extras","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8201","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5-1"},{"type":"extras","doc":"- Many Erlang classes, e.g. OtpErlangRef, was missing an implementation of the\n hashCode() method, making it futile to put them in hash structures such as\n HashMap. Bug and patch provided by Paul Guyot. We extended the patch to all\n classes and improved (?) on the hash algorithm.\n\n Own Id: OTP-7899","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- jinterface uses the new environment variable ERL_EPMD_PORT the same way that\n erl, epmd and erl_interface do since R13A.\n\n Own Id: OTP-7885","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.5 - Jinterface Release Notes","ref":"notes.html#jinterface-1-5"},{"type":"extras","doc":"- A number of fixes and improvements from the ErlIDE group; Vlad Dumitrescu and\n Jakob Cederlund: JDK 1.5 is now a minimal requirement for building Jinterface.\n New method: OtpEpmd.lookupNames. OtpErlangList is now iterable. Non-proper\n lists are now allowed - you have to test if a list is proper or not.\n Non-proper lists can also be created. New methods: isProper, getHead, getTail\n and getNthTail. The get tail methods creates a sublist object that re-uses the\n original list. OtpErlangPid is now Comparable. Empty atoms can now be\n constructed, a missing feature pointed out by Sebastien Boisgerault on\n erlang-questions.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7832","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.4.2 - Jinterface Release Notes","ref":"notes.html#jinterface-1-4-2"},{"type":"extras","doc":"- A bug when Jinterface did not detect remote node disconnects has been\n corrected.\n\n Own Id: OTP-7624","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.4.1 - Jinterface Release Notes","ref":"notes.html#jinterface-1-4-1"},{"type":"extras","doc":"- Jinterface has been fixed to use the loopback interface when connecting to the\n Erlang Port Mapper Daemon - epmd. This facilitates firewall configuration and\n saves resources.\n\n Own Id: OTP-7103\n\n- Jinterface now refuses to connect to another node that does not agree on the\n other node's name. This has been a problem in that a connection was set up,\n but not used on a following send, which caused a second erroneous connection\n attempt to fail since the other (Erlang) node rejects a connection due to name\n disagreement.\n\n Problem reported and dissected by Alexander Lamb\n\n Own Id: OTP-7330","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Jinterface 1.4 - Jinterface Release Notes","ref":"notes.html#jinterface-1-4"},{"type":"extras","doc":"- Jinterface has been updated to handle compressed terms, bitstring, new (IEEE)\n floats and bignums. This has caused a few incompatibilities.\n\n com.ericsson.otp.erlang.OtpOutputStream now extends\n java.io.ByteArrayOutputStream, previously java.lang.Object, and hence the\n method size() now return the number of bytes in the stream as dictated by the\n new parent class and not the buffer length as before. The new method length()\n returns what the old size() did return. The method count() is deprecated as it\n returns the same as the new size().\n\n com.ericsson.otp.erlang.OtpErlangLong now can handle larger values than\n 64-bit. Previously when larger than 64-bit integers were sent to a Jinterface\n node, it caused an com.ericsson.otp.erlang.OtpDecodeException. Now the integer\n is accepted, but the return value of longValue() is silently truncated, as\n opposed to the return value of intValue() that now and previously raises an\n com.ericsson.otp.erlang.OtpRangeException for unrepresentable values. The new\n methods isLong() and isULong() can be used to determine if the value fits in a\n long.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6809","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.3 - Jinterface Release Notes","ref":"notes.html#jinterface-1-3"},{"type":"extras","doc":"- `OtpMbox.receive()` and `OtpMbox.receive(long timeout)` can now throw\n `OtpErlangDecodeException` if the received message cannot be decoded. `null`\n is now only returned from `OtpMbox.receive(long timeout)` if a timeout occurs.\n `OtpMbox.receive()` will never return `null`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-3932 Aux Id: seq5196\n\n- Strings longer than 65535 bytes were encoded wrong by jinterface.\n\n Own Id: OTP-4883 Aux Id: OTP-4865\n\n- Misc bugfixes:\n\n - A node pinging itself does no longer cause the java program to hang.\n - `OtpMbox.close()` uses exit reason `'normal'` (atom) instead of `\"normal\"`\n (string).\n - Added `OtpNode.closeMbox(OtpMbox mbox, OtpErlangObject reason)`.\n - Added `OtpMbox.exit(OtpErlangObject reason)` and\n `OtpMbox.exit(String reason)`.\n - Added `OtpMbox.exit(OtpErlangPid to, OtpErlangObject reason)`.\n - `OtpMbox.exit(OtpErlangPid to, String reason)` is now equivalent to\n `OtpMbox.exit(to, new OtpErlangAtom(reason))`.\n - Exit signals from an Erlang node can now contain any erlang term as reason,\n not only atoms.\n\n Own Id: OTP-5088\n\n- For java versions 1.3.1 or later, `localStatus` was not sent to registered\n status handler when `OtpNode.close()` was called. This is now corrected.\n\n Own Id: OTP-5169","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Process identifiers and port identifiers have been made more unique.\n Previously 18 bits were used as id in the internal representation of process\n and port identifiers. Now 28 bits are used.\n\n The maximum limit on the number of concurrently existing processes due to the\n representation of pids has been increased to 268435456 processes. The same is\n true for ports. This limit will at least on a 32-bit architecture be\n impossible to reach due to memory shortage.\n\n _NOTE:_ By default, the `ERTS`, and the `erl_interface`, `ei`, and\n `jinterface` libraries are now only guaranteed to be compatible with other\n Erlang/OTP components from the same release. It is possible to set each\n component in compatibility mode of an earlier release, though. See the\n documentation for respective component on how to set it in compatibility mode.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-4968 Aux Id: OTP-4196","title":"Improvements and New Features - Jinterface Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Jinterface 1.2.1.2 - Jinterface Release Notes","ref":"notes.html#jinterface-1-2-1-2"},{"type":"extras","doc":"- Output of Java long was truncated to 32 bits. IDL long long and unsigned long\n long could not be used in a struct for the Java backend. All unsigned integer\n types for the Java backend had broken marshalling for large values. These bugs\n has now been fixed.\n\n Own Id: OTP-4763 Aux Id: seq8024","title":"Fixed Bugs and Malfunctions - Jinterface Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"\n# The Jinterface Package\n\nThe [Jinterface] package provides a set of tools for communication with Erlang processes.\nIt can also be used for communication with other Java processes using the same package,\nas well as C processes using the Erl_Interface library.\n\nThe set of classes in the package can be divided into two categories: those that\nprovide the actual communication, and those that provide a Java representation\nof the Erlang data types. The latter are all subclasses of [`OtpErlangObject`], and\nthey are identified by the `OtpErlang` prefix.\n\nSince this package provides a mechanism for communicating with Erlang, message\nrecipients can be Erlang processes or instances of\n`com.ericsson.otp.erlang.OtpMbox`, both of which are identified with pids and\npossibly registered names. When pids or mailboxes are mentioned as message\nsenders or recipients in this section, it should assumed that even Erlang\nprocesses are included, unless specified otherwise. The classes in\n[Jinterface] support the following:\n\n- manipulation of data represented as Erlang data types\n- conversion of data between Java and Erlang formats\n- encoding and decoding of Erlang data types for transmission or storage\n- communication between Java nodes and Erlang processes\n\nIn the following sections, these topics are described:\n\n- mapping of Erlang types to Java\n- encoding, decoding, and sending Erlang terms\n- connecting to a distributed Erlang node\n- using nodes, mailboxes and EPMD\n- sending and receiving Erlang messages and data\n- remote procedure calls\n- linking to remote processes\n- compiling your code for use with Jinterface\n- tracing message flow","title":"The Jinterface Package","ref":"jinterface_users_guide.html"},{"type":"extras","doc":"This section describes the mapping of Erlang basic types to Java.\n\n| Erlang type | Java type |\n| -------------------- | ------------------ |\n| atom | [`OtpErlangAtom`] |\n| binary | [`OtpErlangBinary`] |\n| floating point types | [`OtpErlangFloat`] or [`OtpErlangDouble`], depending on the floating point value size |\n| integral types | One of [`OtpErlangByte`], [`OtpErlangChar`], [`OtpErlangShort`], [`OtpErlangUShort`], [`OtpErlangInt`], [`OtpErlangUInt`] or [`OtpErlangLong`], depending on the integral value size and sign |\n| list | [`OtpErlangList`] |\n| pid | [`OtpErlangPid`] |\n| port | [`OtpErlangPort`] |\n| ref | [`OtpErlangRef`] |\n| tuple | [`OtpErlangTuple`] |\n| map | [`OtpErlangMap`] |\n| term | [`OtpErlangObject`] |\n\n_Table: Mapping of Erlang basic types to Java_","title":"Mapping of Basic Erlang Types to Java - The Jinterface Package","ref":"jinterface_users_guide.html#mapping-of-basic-erlang-types-to-java"},{"type":"extras","doc":"The atoms `true` and `false` are special atoms, used as boolean values. The\nclass [`OtpErlangBoolean`] can be used to represent these.\n\nLists in Erlang are also used to describe sequences of printable characters\n(strings). A convenience class [`OtpErlangString`] is provided to represent\nErlang strings.","title":"Special Mapping Issues - The Jinterface Package","ref":"jinterface_users_guide.html#special-mapping-issues"},{"type":"extras","doc":"A node as defined by Erlang/OTP is an instance of the Erlang Runtime System, a\nvirtual machine roughly equivalent to a JVM. Each node has a unique name in the\nform of an identifier composed partly of the hostname on which the node is\nrunning, e.g \"gurka@sallad.com\". Several such nodes can run on the same host as\nlong as their names are unique. The class [`OtpNode`] represents an Erlang\nnode.\n\nIt is created with a name and optionally a TCP/IP socket port number on which it\nlistens for incoming connections. By default before creating an instance of\n[`OtpNode`], ensure that Epmd is running on the host machine. See the Erlang\ndocumentation for more information about [Epmd](`e:erts:epmd_cmd.md`).\n\nIn this example, the host name is appended automatically to the identifier, and\nthe port number is chosen by the underlying system:\n\n```java\nOtpNode node = new OtpNode(\"gurka\");\n```\n\nIt is also possible to use alternative communication (or distribution) protocols\nwithout Epmd by switching to a custom transport factory extending the\nOtpGenericTransportFactory abstract class, for example based on Unix Domain\nSockets instead of the default TCP/IP sockets.\n\nIn this example, the host name is appended automatically to the identifier and a\ncustom transport factory is used:\n\n```java\nOtpGenericTransportFactory customFactory = new MyCustomFactory();\nOtpNode node = new OtpNode(\"gurka\", customFactory);\n```","title":"Nodes - The Jinterface Package","ref":"jinterface_users_guide.html#nodes"},{"type":"extras","doc":"Erlang processes running on an Erlang node are identified by process identifiers\n(pids) and, optionally, by registered names unique within the node. Each Erlang\nprocess has an implicit mailbox that is used to receive messages; the mailbox is\nidentified with the pid of the process.\n\nJinterface provides a similar mechanism with the class [`OtpMbox`], a mailbox that can\nbe used to send and receive messages asynchronously. Each OtpMbox is identified\nwith a unique pid and , optionally, a registered name unique within the\n[`OtpNode`].\n\nApplications are free to create mailboxes as necessary. This is done as follows:\n\n```java\nOtpMbox mbox = node.createMbox();\n```\n\nThe mailbox created in the above example has no registered name, although it\ndoes have a pid. The pid can be obtained from the mailbox and included in\nmessages sent from the mailbox, so that remote processes are able to respond.\n\nAn application can register a name for a mailbox, either when the mailbox is\ninitially created:\n\n```java\nOtpMbox mbox = node.createMbox(\"server\");\n```\n\nor later on, as necessary:\n\n```java\nOtpMbox mbox = node.createMbox();\nmbox.registerName(\"server\");\n```\n\nRegistered names are usually necessary in order to start communication, since it\nis impossible to know in advance the pid of a remote process. If a well-known\nname for one of the processes is chosen in advance and known by all\ncommunicating parties within an application, each mailbox can send an initial\nmessage to the named mailbox, which then can identify the sender pid.","title":"Mailboxes - The Jinterface Package","ref":"jinterface_users_guide.html#mailboxes"},{"type":"extras","doc":"It is not necessary to explicitly set up communication with a remote node.\nSimply sending a message to a mailbox on that node will cause the OtpNode to\ncreate a connection if one does not already exist. Once the connection is\nestablished, subsequent messages to the same node will reuse the same\nconnection.\n\nIt is possible to check for the existence of a remote node before attempting to\ncommunicate with it. Here we send a ping message to the remote node to see if it\nis alive and accepting connections:\n\n```java\nif (node.ping(\"remote\",2000)) {\n System.out.println(\"remote is up\");\n}\nelse {\n System.out.println(\"remote is not up\");\n}\n```\n\nIf the call to ping() succeeds, a connection to the remote node has been\nestablished. Note that it is not necessary to ping remote nodes before\ncommunicating with them, but by using ping you can determine if the remote\nexists before attempting to communicate with it.\n\nConnections are only permitted by nodes using the same security cookie. The\ncookie is a short string provided either as an argument when creating OtpNode\nobjects, or found in the user's home directory in the file `.erlang.cookie`.\nWhen a connection attempt is made, the string is used as part of the\nauthentication process. If you are having trouble getting communication to work,\nuse the trace facility (described later in this document) to show the connection\nestablishment. A likely problem is that the cookies are different.\n\nConnections are never broken explicitly. If a node fails or is closed, a\nconnection may be broken however.","title":"Connections - The Jinterface Package","ref":"jinterface_users_guide.html#connections"},{"type":"extras","doc":"All necessary connections are made using methods of\n[OtpTransportFactory](assets/java/com/ericsson/otp/erlang/OtpTransportFactory.html)\ninterface. The default OtpTransportFactory implementation is based on standard\nTCP/IP Socket class and relies on epmd. User may provide custom transport\nfactory as needed. See java doc for details.\n\nFor alternative distribution protocols working without epmd, using a transport\nfactory extending the\n[OtpGenericTransportFactory](assets/java/com/ericsson/otp/erlang/OtpGenericTransportFactory.html)\nabstract class will disable the automatic epmd registration and lookup in\nJinterface.","title":"Transport Factory - The Jinterface Package","ref":"jinterface_users_guide.html#transport-factory"},{"type":"extras","doc":"Messages sent with this package must be instances of\n[`OtpErlangObject`] or one of its subclasses. Message can be sent to processes or pids,\neither by specifying the pid of the remote, or its registered name and node.\n\nIn this example, we create a message containing our own pid so the echo process\ncan reply:\n\n```java\nOtpErlangObject[] msg = new OtpErlangObject[2];\nmsg[0] = mbox.self();\nmsg[1] = new OtpErlangAtom(\"hello, world\");\nOtpErlangTuple tuple = new OtpErlangTuple(msg);\n```\n\nWhen we send the message, a connection will be created:\n\n```java\nmbox.send(\"echo\", \"gurka@sallad.com\", tuple);\n```\n\nAnd here we receive the reply:\n\n```java\nOtpErlangObject reply = mbox.receive();\n```\n\nMessages are sent asynchronously, so the call to `send()` returns as soon as the\nmessage has been dispatched to the underlying communication layer. This means\nthat you receive no indication whether the operation completed successfully or\nthe remote even existed. If you need this kind of confirmation, you should wait\nfor a response from the remote process.\n\nThe echo server itself might look like this:\n\n```java\nOtpNode self = new OtpNode(\"gurka\");\nOtpMbox mbox = self.createMbox(\"echo\");\nOtpErlangObject o;\nOtpErlangTuple msg;\nOtpErlangPid from;\n\nwhile (true) {\n try {\n o = mbox.receive();\n if (o instanceof OtpErlangTuple) {\n msg = (OtpErlangTuple)o;\n from = (OtpErlangPid)(msg.elementAt(0));\n mbox.send(from,msg.elementAt(1));\n }\n catch (Exception e) {\n System.out.println(\"\" + e);\n }\n}\n```\n\nIn the examples above, only one mailbox was created on each node. however you\nare free to create as many mailboxes on each node as you like. You are also free\nto create as many nodes as you like on each JVM, however because each node uses\nsome limited system resources such as file descriptors, it is recommended that\nyou create only a small number of nodes (such as one) on each JVM.","title":"Sending and Receiving Messages - The Jinterface Package","ref":"jinterface_users_guide.html#sending-and-receiving-messages"},{"type":"extras","doc":"This package was originally intended to be used for communicating between Java\nand Erlang, and for that reason the send and receive methods all use Java\nrepresentations of Erlang data types.\n\nHowever it is possible to use the package to communicate with remote processes\nwritten in Java as well, and in these cases it may be desirable to send other\ndata types.\n\nThe simplest way to do this is to encapsulate arbitrary data in messages of type\n[`OtpErlangBinary`](assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html). The\nOtpErlangBinary class can be created from arbitrary Java objects that implement\nthe Serializable or Externalizable interface:\n\n```java\no = new MyClass(foo);\nmbox.send(remote,new OtpErlangBinary(o));\n```\n\nThe example above will cause the object to be serialized and encapsulated in an\nOtpErlangBinary before being sent. The recipient will receive an OtpErlangBinary\nbut can extract the original object from it:\n\n```java\nmsg = mbox.receive();\nif (msg instanceof OtpErlangBinary) {\n OtpErlangBinary b = (OtpErlangBinary)msg;\n MyClass o = (MyClass)(b.getObject());\n}\n```","title":"Sending Arbitrary Data - The Jinterface Package","ref":"jinterface_users_guide.html#sending-arbitrary-data"},{"type":"extras","doc":"Erlang defines a concept known as linked processes. A link is an implicit\nconnection between two processes that causes an exception to be raised in one of\nthe processes if the other process terminates for any reason. Links are\nbidirectional: it does not matter which of the two processes created the link or\nwhich of the linked processes eventually terminates; an exception will be raised\nin the remaining process. Links are also idempotent: at most one link can exist\nbetween two given processes, only one operation is necessary to remove the link.\n\nJinterface provides a similar mechanism. Also here, no distinction is made\nbetween mailboxes and Erlang processes. A link can be created to a remote\nmailbox or process when its pid is known:\n\n```java\nmbox.link(remote);\n```\n\nThe link can be removed by either of the processes in a similar manner:\n\n```java\nmbox.unlink(remote);\n```\n\nIf the remote process terminates while the link is still in place, an exception\nwill be raised on a subsequent call to receive():\n\n```java\ntry {\n msg = mbox.receive();\n}\ncatch (OtpErlangExit e) {\n System.out.println(\"Remote pid \" + e.pid() + \" has terminated\");\n}\ncatch (OtpErlangDecodeException f) {\n System.out.println(\"Received message could not be decoded: \" + f);\n}\n```\n\nWhen a mailbox is explicitly closed, exit messages will be sent in order to\nbreak any outstanding links. If a mailbox is never closed but instead goes out\nof scope, the objects `finalize()` method will call `close()`. However since\nJava provides no guarantees about when or even if finalize() will be called, it\nis important that your application explicitly closes mailboxes when they are no\nlonger needed if you want links to work in a timely manner.","title":"Linking to Remote Processes - The Jinterface Package","ref":"jinterface_users_guide.html#linking-to-remote-processes"},{"type":"extras","doc":"Epmd is the Erlang Port Mapper Daemon. By default distributed Erlang nodes\nregister with epmd on the localhost to indicate to other nodes that they exist\nand can accept connections. Epmd maintains a register of node and socket port\nnumber information, and when a node wishes to connect to another node, it first\ncontacts epmd in order to find out the correct socket port number to connect to.\nIt is also possible to use alternative distribution protocols which don't need\nepmd at all.\n\nThe basic interaction with EPMD is done through instances of\n[OtpEpmd](assets/java/com/ericsson/otp/erlang/OtpEpmd.html) class. Nodes wishing\nto contact other nodes must first request information from Epmd before a\nconnection can be set up, however this is done automatically by\n[OtpSelf.connect()](assets/java/com/ericsson/otp/erlang/OtpSelf.html#connect%28com.ericsson.otp.erlang.OtpPeer%29)\nwhen necessary.\n\nWhen you use\n[OtpSelf.connect()](assets/java/com/ericsson/otp/erlang/OtpSelf.html#connect%28com.ericsson.otp.erlang.OtpPeer%29)\nto connect to an Erlang node, a connection is first made to epmd and, if the\nnode is known, a connection is then made to the Erlang node.\n\nJava nodes can also register themselves with epmd if they want other nodes in\nthe system to be able to find and connect to them. This is done by call to\nmethod\n[OtpEpmd.publishPort()](assets/java/com/ericsson/otp/erlang/OtpEpmd.html#publishPort%28com.ericsson.otp.erlang.OtpLocalNode%29).\n\nBe aware that on some systems a failed node will not be detected by this\nmechanism since the operating system does not automatically close descriptors\nthat were left open when the node failed. If a node has failed in this way, epmd\nwill prevent you from registering a new node with the old name, since it thinks\nthat the old name is still in use. In this case, you must unregister the name\nexplicitly, by using\n[OtpEpmd.unPublishPort()](assets/java/com/ericsson/otp/erlang/OtpEpmd.html#unPublishPort%28com.ericsson.otp.erlang.OtpLocalNode%29)\n\nThis will cause epmd to close the connection from the far end. Note that if the\nname was in fact still in use by a node, the results of this operation are\nunpredictable. Also, doing this does not cause the local end of the connection\nto close, so resources may be consumed.","title":"Using EPMD - The Jinterface Package","ref":"jinterface_users_guide.html#using-epmd"},{"type":"extras","doc":"An Erlang node acting as a client to another Erlang node typically sends a\nrequest and waits for a reply. Such a request is included in a function call at\na remote node and is called a remote procedure call. Remote procedure calls are\nsupported through the class [`OtpConnection`]. The following example shows how the\n[`OtpConnection`] class is used for remote procedure calls:\n\n```java\nOtpSelf self = new OtpSelf(\"client\", \"hejsan\" );\nOtpPeer other = new OtpPeer(\"server@balin\");\nOtpConnection connection = self.connect(other);\n\nconnection.sendRPC(\"erlang\",\"date\",new OtpErlangList());\nOtpErlangObject received = connection.receiveRPC();\n```\n\n`erlang:date/0` is just called to get the date tuple from a remote host.","title":"Remote Procedure Calls - The Jinterface Package","ref":"jinterface_users_guide.html#remote-procedure-calls"},{"type":"extras","doc":"In order to use any of the\n[Jinterface] classes,\ninclude the following line in your code:\n\n```java\nimport com.ericsson.otp.erlang.*;\n```\n\nDetermine where the top directory of your OTP installation is. You can find this\nout by starting Erlang and entering the following command at the Eshell prompt:\n\n```text\nEshell V4.9.1.2 (abort with ^G)\n1> code:root_dir().\n/usr/local/otp\n```\n\nTo compile your code, make sure that your Java compiler knows where to find the\nfile `OtpErlang.jar` which contains the package. This is done by specifying an\nappropriate `-classpath` argument on the command line, or by adding it to the\n`CLASSPATH` definition in your `Makefile`. The correct value for this path is\n`$OTPROOT/lib/jinterface`_Vsn_`/priv/OtpErlang.jar`, where `$OTPROOT` is the\npath reported by `code:root_dir/0` in the above example and _Vsn_ is the version\nof Jinterface, for example `jinterface-1.2`\n\n```text\n$ javac -classpath \".:/usr/local/otp/lib/jinterface-1.2/priv/OtpErlang.jar\"\n myclass.java\n```\n\nWhen running your program, you will also need to specify the path to\n`OtpErlang.jar` in a similar way.\n\n```text\n$ java \".:/usr/local/otp/lib/jinterface-1.2/priv/OtpErlang.jar\" myclass\n```","title":"Compiling and Loading Your Code - The Jinterface Package","ref":"jinterface_users_guide.html#compiling-and-loading-your-code"},{"type":"extras","doc":"Communication between nodes can be traced by setting a system property before\nthe communication classes in this package are initialized. The value system\nproperty \"OtpConnection.trace\" is the default trace level for all connections.\nNormally the default trace level is zero, i.e. no tracing is performed. By\nsetting OtpConnection.trace to some non-zero value, the communication protocol\ncan be shown in more or less detail. The valid values are:\n\n- 0: no tracing is performed\n- 1: only ordinary send and reg-send messages are shown\n- 2: control messages such as link, unlink and exit are shown\n- 3: connection setup (handshake) is shown\n- 4: epmd requests are shown\n\nEach level also includes the information shown by all lower levels.\n\n[`OtpErlangAtom`]: assets/java/com/ericsson/otp/erlang/OtpErlangAtom.html\n[`OtpErlangBinary`]: assets/java/com/ericsson/otp/erlang/OtpErlangBinary.html\n[`OtpErlangBoolean`]: assets/java/com/ericsson/otp/erlang/OtpErlangBoolean.html\n[`OtpErlangFloat`]: assets/java/com/ericsson/otp/erlang/OtpErlangFloat.html\n[`OtpErlangDouble`]: assets/java/com/ericsson/otp/erlang/OtpErlangDouble.html\n[`OtpErlangByte`]: assets/java/com/ericsson/otp/erlang/OtpErlangByte.html\n[`OtpErlangChar`]: assets/java/com/ericsson/otp/erlang/OtpErlangChar.html\n[`OtpErlangShort`]: assets/java/com/ericsson/otp/erlang/OtpErlangShort.html\n[`OtpErlangString`]: assets/java/com/ericsson/otp/erlang/OtpErlangString.html\n[`OtpErlangUShort`]: assets/java/com/ericsson/otp/erlang/OtpErlangUShort.html\n[`OtpErlangInt`]: assets/java/com/ericsson/otp/erlang/OtpErlangInt.html\n[`OtpErlangUInt`]: assets/java/com/ericsson/otp/erlang/OtpErlangUInt.html\n[`OtpErlangLong`]: assets/java/com/ericsson/otp/erlang/OtpErlangLong.html\n[`OtpErlangList`]: assets/java/com/ericsson/otp/erlang/OtpErlangList.html\n[`OtpErlangPid`]: assets/java/com/ericsson/otp/erlang/OtpErlangPid.html\n[`OtpErlangPort`]: assets/java/com/ericsson/otp/erlang/OtpErlangPort.html\n[`OtpErlangRef`]: assets/java/com/ericsson/otp/erlang/OtpErlangRef.html\n[`OtpErlangTuple`]: assets/java/com/ericsson/otp/erlang/OtpErlangTuple.html\n[`OtpErlangMap`]: assets/java/com/ericsson/otp/erlang/OtpErlangMap.html\n[`OtpErlangObject`]: assets/java/com/ericsson/otp/erlang/OtpErlangObject.html\n[`OtpMbox`]: assets/java/com/ericsson/otp/erlang/OtpMbox.html\n[`OtpNode`]: assets/java/com/ericsson/otp/erlang/OtpNode.html\n[`OtpConnection`]: assets/java/com/ericsson/otp/erlang/OtpConnection.html\n[Jinterface]: assets/java/com/ericsson/otp/erlang/package-summary.html","title":"Tracing - The Jinterface Package","ref":"jinterface_users_guide.html#tracing"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/jinterface-1.14.1/doc/html/search.html b/prs/9277/lib/jinterface-1.14.1/doc/html/search.html index d4c52035f64bd..70c329cd4786c 100644 --- a/prs/9277/lib/jinterface-1.14.1/doc/html/search.html +++ b/prs/9277/lib/jinterface-1.14.1/doc/html/search.html @@ -112,7 +112,7 @@

                - +

                diff --git a/prs/9277/lib/kernel-10.2/doc/html/.build b/prs/9277/lib/kernel-10.2/doc/html/.build index 41a26116b1fba..278a75e8b8285 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/.build +++ b/prs/9277/lib/kernel-10.2/doc/html/.build @@ -24,7 +24,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-FEC33C9C.js +dist/search_data-A693B63B.js dist/sidebar_items-AAD27074.js eep48_chapter.html erl_boot_server.html diff --git a/prs/9277/lib/kernel-10.2/doc/html/app.html b/prs/9277/lib/kernel-10.2/doc/html/app.html index fd8b07510a837..10268350b610a 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/app.html +++ b/prs/9277/lib/kernel-10.2/doc/html/app.html @@ -144,41 +144,41 @@

                The application resource file is to be called Application.app, where Application is the application name. The file is to be located in directory ebin for the application.

                The file must contain a single Erlang term, which is called an application -specification:

                {application, Application,
                -  [{description,  Description},
                -   {id,           Id},
                -   {vsn,          Vsn},
                -   {modules,      Modules},
                -   {maxP,         MaxP},
                -   {maxT,         MaxT},
                -   {registered,   Names},
                -   {included_applications, Apps},
                -   {optional_applications, Apps},
                -   {applications, Apps},
                -   {env,          Env},
                -   {mod,          Start},
                -   {start_phases, Phases},
                -   {runtime_dependencies, RTDeps}]}.
                +specification:

                {application, Application,
                +  [{description,  Description},
                +   {id,           Id},
                +   {vsn,          Vsn},
                +   {modules,      Modules},
                +   {maxP,         MaxP},
                +   {maxT,         MaxT},
                +   {registered,   Names},
                +   {included_applications, Apps},
                +   {optional_applications, Apps},
                +   {applications, Apps},
                +   {env,          Env},
                +   {mod,          Start},
                +   {start_phases, Phases},
                +   {runtime_dependencies, RTDeps}]}.
                 
                              Value                Default
                              -----                -------
                -Application  atom()               -
                -Description  string()             ""
                -Id           string()             ""
                -Vsn          string()             ""
                -Modules      [Module]             []
                -MaxP         int()                infinity
                -MaxT         int()                infinity
                -Names        [Name]               []
                -Apps         [App]                []
                -Env          [{Par,Val}]          []
                -Start        {Module,StartArgs}   []
                -Phases       [{Phase,PhaseArgs}]  undefined
                -RTDeps       [ApplicationVersion] []
                -
                -Module = Name = App = Par = Phase = atom()
                -Val = StartArgs = PhaseArgs = term()
                -ApplicationVersion = string()
                • Application - Application name.

                For the application controller, all keys are optional. The respective default +Application atom() - +Description string() "" +Id string() "" +Vsn string() "" +Modules [Module] [] +MaxP int() infinity +MaxT int() infinity +Names [Name] [] +Apps [App] [] +Env [{Par,Val}] [] +Start {Module,StartArgs} [] +Phases [{Phase,PhaseArgs}] undefined +RTDeps [ApplicationVersion] [] + +Module = Name = App = Par = Phase = atom() +Val = StartArgs = PhaseArgs = term() +ApplicationVersion = string()

                • Application - Application name.

                For the application controller, all keys are optional. The respective default values are used for any omitted keys.

                The functions in systools require more information. If they are used, the following keys are mandatory:

                • description
                • vsn
                • modules
                • registered
                • applications

                The other keys are ignored by systools.

                • description - A one-line description of the application.

                • id - Product identification, or similar.

                • vsn - Version of the application.

                • modules - All modules introduced by this application. systools uses this list when generating start scripts and tar files. A module can only be @@ -211,7 +211,7 @@

                  Module:start_phase(Phase,Type,PhaseArgs) for each start phase defined by key start_phases. Only after this extended start procedure, application:start(Application) returns.

                  Start phases can be used to synchronize startup of an application and its -included applications. In this case, key mod must be specified as follows:

                  {mod, {application_starter,[Module,StartArgs]}}

                  The application master then calls Module:start/2 for the primary +included applications. In this case, key mod must be specified as follows:

                  {mod, {application_starter,[Module,StartArgs]}}

                  The application master then calls Module:start/2 for the primary application, followed by calls to Module:start_phase/3 for each start phase (as defined for the primary application), both for the primary application and for each of its included applications, for which the start phase is defined.

                  This implies that for an included application, the set of start phases must be diff --git a/prs/9277/lib/kernel-10.2/doc/html/application.html b/prs/9277/lib/kernel-10.2/doc/html/application.html index 59d8570ad2f7b..e9ddc277f9438 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/application.html +++ b/prs/9277/lib/kernel-10.2/doc/html/application.html @@ -1653,7 +1653,7 @@

                  load(AppDescr, Distributed)

                  restart the application on another node. If Time is not specified, it defaults to 0 and the application is restarted immediately.

                  Nodes is a list of node names where the application can run, in priority from left to right. Node names can be grouped using tuples to indicate that they have -the same priority.

                  Example:

                  Nodes = [cp1@cave, {cp2@cave, cp3@cave}]

                  This means that the application is preferably to be started at cp1@cave. If +the same priority.

                  Example:

                  Nodes = [cp1@cave, {cp2@cave, cp3@cave}]

                  This means that the application is preferably to be started at cp1@cave. If cp1@cave is down, the application is to be started at cp2@cave or cp3@cave.

                  If Distributed == default, the value for the application in the Kernel configuration parameter distributed is used.

                  diff --git a/prs/9277/lib/kernel-10.2/doc/html/code.html b/prs/9277/lib/kernel-10.2/doc/html/code.html index 15158126ffd9f..114f0998e34dd 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/code.html +++ b/prs/9277/lib/kernel-10.2/doc/html/code.html @@ -193,11 +193,11 @@

                  mnesia-4.4.7, the archive file must be named mnesia-4.4.7.ez and it must contain a top directory named mnesia-4.4.7. If the version part of the name is omitted, it must also be omitted in the archive. That is, a mnesia.ez archive -must contain a mnesia top directory.

                  An archive file for an application can, for example, be created like this:

                  zip:create("mnesia-4.4.7.ez",
                  -	["mnesia-4.4.7"],
                  -	[{cwd, code:lib_dir()},
                  -	 {compress, all},
                  -	 {uncompress,[".beam",".app"]}]).

                  Any file in the archive can be compressed, but to speed up the access of +must contain a mnesia top directory.

                  An archive file for an application can, for example, be created like this:

                  zip:create("mnesia-4.4.7.ez",
                  +	["mnesia-4.4.7"],
                  +	[{cwd, code:lib_dir()},
                  +	 {compress, all},
                  +	 {uncompress,[".beam",".app"]}]).

                  Any file in the archive can be compressed, but to speed up the access of frequently read files, it can be a good idea to store beam and app files uncompressed in the archive.

                  Normally the top directory of an application is located in library directory $OTPROOT/lib or in a directory referred to by environment variable ERL_LIBS. @@ -1875,10 +1875,10 @@

                  atomic_load(Modules)

                  the code already exists.

                • sticky_directory - The object code resides in a sticky directory.

                • pending_on_load - A previously loaded module contains an -on_load function that never finished.

                If it is important to minimize the time that an application is inactive while changing code, use prepare_loading/1 and finish_loading/1 instead of -atomic_load/1. Here is an example:

                {ok,Prepared} = code:prepare_loading(Modules),
                +atomic_load/1. Here is an example:

                {ok,Prepared} = code:prepare_loading(Modules),
                 %% Put the application into an inactive state or do any
                 %% other preparation needed before changing the code.
                -ok = code:finish_loading(Prepared),
                +ok = code:finish_loading(Prepared),
                 %% Resume the application.
                @@ -2431,8 +2431,8 @@

                get_object_code(Module)

                code for the module. This is useful if code is to be loaded on a remote node in a distributed system. For example, loading module Module on a node Node is done as follows:

                ...
                -{_Module, Binary, Filename} = code:get_object_code(Module),
                -erpc:call(Node, code, load_binary, [Module, Filename, Binary]),
                +{_Module, Binary, Filename} = code:get_object_code(Module),
                +erpc:call(Node, code, load_binary, [Module, Filename, Binary]),
                 ...
                @@ -2551,7 +2551,7 @@

                lib_dir()

                Returns the library directory, $OTPROOT/lib, where $OTPROOT is the root -directory of Erlang/OTP.

                Example:

                1> code:lib_dir().
                +directory of Erlang/OTP.

                Example:

                1> code:lib_dir().
                 "/usr/local/otp/lib"
                @@ -2590,7 +2590,7 @@

                lib_dir(Name)

                /usr/local/otp/lib/mnesia-4.2.2/ebin is returned. This means that the library directory for an application is the same, regardless if the application resides in an archive or not.

                Warning

                Archives are experimental. In a future release, they can be removed or -their behavior can change.

                Example:

                > code:lib_dir(mnesia).
                +their behavior can change.

                Example:

                > code:lib_dir(mnesia).
                 "/usr/local/otp/lib/mnesia-4.23"

                Returns {error, bad_name} if Name is not the name of an application under $OTPROOT/lib or on a directory referred to through environment variable ERL_LIBS. Fails with an exception if Name has the wrong type.

                Warning

                For backward compatibility, Name is also allowed to be a string. That will @@ -2633,7 +2633,7 @@

                lib_dir(Name, SubDir)

                situation is different. Some of the subdirectories can reside as regular directories while others reside in an archive file. It is not checked whether this directory exists.

                Instead of using this function, use code:lib_dir/1 -and filename:join/2.

                Example:

                1> filename:join(code:lib_dir(megaco), "priv").
                +and filename:join/2.

                Example:

                1> filename:join(code:lib_dir(megaco), "priv").
                 "/usr/local/otp/lib/megaco-3.9.1.1/priv"

                Fails with an exception if Name or SubDir has the wrong type.

                @@ -3092,7 +3092,7 @@

                root_dir()

                Returns the root directory of Erlang/OTP, which is the directory where it is -installed.

                Example:

                1> code:root_dir().
                +installed.

                Example:

                1> code:root_dir().
                 "/usr/local/otp"
                diff --git a/prs/9277/lib/kernel-10.2/doc/html/config.html b/prs/9277/lib/kernel-10.2/doc/html/config.html index b15785fd9a17a..dea927dbfe88f 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/config.html +++ b/prs/9277/lib/kernel-10.2/doc/html/config.html @@ -152,9 +152,9 @@

                File Syntax

                -

                The configuration file is to be called Name.config, where Name is any name.

                File .config contains a single Erlang term and has the following syntax:

                [{Application1, [{Par11, Val11}, ...]},
                +

                The configuration file is to be called Name.config, where Name is any name.

                File .config contains a single Erlang term and has the following syntax:

                [{Application1, [{Par11, Val11}, ...]},
                  ...
                - {ApplicationN, [{ParN1, ValN1}, ...]}].
                • Application = atom() - Application name.

                • Par = atom() - Name of a configuration parameter.

                • Val = term() - Value of a configuration parameter.

                + {ApplicationN, [{ParN1, ValN1}, ...]}].

                • Application = atom() - Application name.

                • Par = atom() - Name of a configuration parameter.

                • Val = term() - Value of a configuration parameter.

                diff --git a/prs/9277/lib/kernel-10.2/doc/html/dist/search_data-A693B63B.js b/prs/9277/lib/kernel-10.2/doc/html/dist/search_data-A693B63B.js new file mode 100644 index 0000000000000..a8265e7a92aa3 --- /dev/null +++ b/prs/9277/lib/kernel-10.2/doc/html/dist/search_data-A693B63B.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"behaviour","title":"application","doc":"Generic OTP application functions\n\nIn OTP, _application_ denotes a component implementing some specific\nfunctionality, that can be started and stopped as a unit, and that can be reused\nin other systems. This module interacts with _application controller_, a process\nstarted at every Erlang runtime system. This module contains functions for\ncontrolling applications (for example, starting and stopping applications), and\nfunctions to access information about applications (for example, configuration\nparameters).\n\nAn application is defined by an _application specification_. The specification\nis normally located in an _application resource file_ named `Application.app`,\nwhere `Application` is the application name. For details about the application\nspecification, see [`app`](app.md).\n\nThis module can also be viewed as a behaviour for an application implemented\naccording to the OTP design principles as a supervision tree. The definition of\nhow to start and stop the tree is to be located in an _application callback\nmodule_, exporting a predefined set of functions.\n\nFor details about applications and behaviours, see\n[OTP Design Principles](`e:system:design_principles.md`).","ref":"application.html"},{"type":"behaviour","title":"See Also - application","doc":"[OTP Design Principles](`e:system:design_principles.md`),\n[kernel](kernel_app.md), [app](app.md)","ref":"application.html#module-see-also"},{"type":"callback","title":"application.config_change/3","doc":"This function is called by an application after a code replacement, if the\nconfiguration parameters have changed.\n\n`Changed` is a list of parameter-value tuples including all configuration\nparameters with changed values.\n\n`New` is a list of parameter-value tuples including all added configuration\nparameters.\n\n`Removed` is a list of all removed parameters.","ref":"application.html#c:config_change/3"},{"type":"function","title":"application.ensure_all_started/1","doc":"","ref":"application.html#ensure_all_started/1"},{"type":"function","title":"application.ensure_all_started/2","doc":"","ref":"application.html#ensure_all_started/2"},{"type":"function","title":"application.ensure_all_started/3","doc":"`Applications` is either an an `t:atom/0` or a list of `t:atom/0` representing\nmultiple applications.\n\nThis function is equivalent to calling [`start/1,2`](`start/1`) repeatedly on\nall dependencies that are not yet started of each application. Optional\ndependencies will also be loaded and started if they are available.\n\nThe `Mode` argument controls if the applications should be started in `serial`\nmode (one at a time) or `concurrent` mode. In concurrent mode, a dependency\ngraph is built and the leaves of the graph are started concurrently and\nrecursively. In both modes, no assertion can be made about the order the\napplications are started. If not supplied, it defaults to `serial`.\n\nReturns `{ok, AppNames}` for a successful start or for an already started\napplication (which is, however, omitted from the `AppNames` list).\n\nThe function reports `{error, {AppName,Reason}}` for errors, where `Reason` is\nany possible reason returned by [`start/1,2`](`start/1`) when starting a\nspecific dependency.\n\nIf an error occurs, the applications started by the function are stopped to\nbring the set of running applications back to its initial state.","ref":"application.html#ensure_all_started/3"},{"type":"function","title":"application.ensure_started/1","doc":"Equivalent to [`start(Application)`](`start/1`) except it returns `ok` for\nalready started applications.","ref":"application.html#ensure_started/1"},{"type":"function","title":"application.ensure_started/2","doc":"Equivalent to [`start(Application, Type)`](`start/2`) except it returns `ok` for\nalready started applications.","ref":"application.html#ensure_started/2"},{"type":"function","title":"application.get_all_env/0","doc":"","ref":"application.html#get_all_env/0"},{"type":"function","title":"application.get_all_env/1","doc":"Returns the configuration parameters and their values for `Application`.\n\nIf the specified application is not loaded, or if the process executing the call\ndoes not belong to any application, the function returns `[]`.","ref":"application.html#get_all_env/1"},{"type":"function","title":"application.get_all_key/0","doc":"","ref":"application.html#get_all_key/0"},{"type":"function","title":"application.get_all_key/1","doc":"Returns the application specification keys and their values for `Application`.\nIf the argument is omitted, it defaults to the application of the calling\nprocess.\n\nIf the specified application is not loaded, the function returns `undefined`. If\nthe process executing the call does not belong to any application, the function\nreturns `[]`.","ref":"application.html#get_all_key/1"},{"type":"function","title":"application.get_application/0","doc":"","ref":"application.html#get_application/0"},{"type":"function","title":"application.get_application/1","doc":"Returns the name of the application to which the process `Pid` or the module\n`Module` belongs.\n\nIf the specified process does not belong to any application, or if the specified\nprocess or module does not exist, the function returns `undefined`.","ref":"application.html#get_application/1"},{"type":"function","title":"application.get_env/1","doc":"","ref":"application.html#get_env/1"},{"type":"function","title":"application.get_env/2","doc":"Returns the value of configuration parameter `Par` for `Application`.\n\nReturns `undefined` if any of the following applies:\n\n- The specified application is not loaded.\n- The configuration parameter does not exist.\n- The process executing the call does not belong to any application.","ref":"application.html#get_env/2"},{"type":"function","title":"application.get_env/3","doc":"Works like `get_env/2` but returns value `Def` when configuration parameter\n`Par` does not exist.","ref":"application.html#get_env/3"},{"type":"function","title":"application.get_key/1","doc":"","ref":"application.html#get_key/1"},{"type":"function","title":"application.get_key/2","doc":"Returns the value of the application specification key `Key` for `Application`.\n\nReturns `undefined` if any of the following applies:\n\n- The specified application is not loaded.\n- The specification key does not exist.\n- The process executing the call does not belong to any application.","ref":"application.html#get_key/2"},{"type":"function","title":"application.get_supervisor/1","doc":"Returns the `Pid` of the supervisor running at the root of `Application`.\n\nIf the specified application does not exist or does not define a callback\nmodule, the function returns `undefined`.","ref":"application.html#get_supervisor/1"},{"type":"function","title":"application.load/1","doc":"","ref":"application.html#load/1"},{"type":"function","title":"application.load/2","doc":"Loads the application specification for an application into the application\ncontroller. It also loads the application specifications for any included\napplications. Notice that the function does not load the Erlang object code.\n\nThe application can be specified by its name `Application`. In this case, the\napplication controller searches the code path for the application resource file\n`Application.app` and loads the specification it contains.\n\nThe application specification can also be specified directly as a tuple\n`AppSpec`, having the format and contents as described in [`app`](app.md).\n\nIf `Distributed == {Application,[Time,]Nodes}`, the application becomes\ndistributed. The argument overrides the value for the application in the Kernel\nconfiguration parameter `distributed`. `Application` must be the application\nname (same as in the first argument). If a node crashes and `Time` is specified,\nthe application controller waits for `Time` milliseconds before attempting to\nrestart the application on another node. If `Time` is not specified, it defaults\nto `0` and the application is restarted immediately.\n\n`Nodes` is a list of node names where the application can run, in priority from\nleft to right. Node names can be grouped using tuples to indicate that they have\nthe same priority.\n\n_Example:_\n\n```erlang\nNodes = [cp1@cave, {cp2@cave, cp3@cave}]\n```\n\nThis means that the application is preferably to be started at `cp1@cave`. If\n`cp1@cave` is down, the application is to be started at `cp2@cave` or\n`cp3@cave`.\n\nIf `Distributed == default`, the value for the application in the Kernel\nconfiguration parameter `distributed` is used.","ref":"application.html#load/2"},{"type":"function","title":"application.loaded_applications/0","doc":"Returns a list with information about the applications, and included\napplications, which are loaded using `load/1,2`. `Application` is the\napplication name. `Description` and `Vsn` are the values of their `description`\nand `vsn` application specification keys, respectively.","ref":"application.html#loaded_applications/0"},{"type":"function","title":"application.permit/2","doc":"Changes the permission for `Application` to run at the current node. The\napplication must be loaded using `load/1,2` for the function to have effect.\n\nIf the permission of a loaded, but not started, application is set to `false`,\n`start` returns `ok` but the application is not started until the permission is\nset to `true`.\n\nIf the permission of a running application is set to `false`, the application is\nstopped. If the permission later is set to `true`, it is restarted.\n\nIf the application is distributed, setting the permission to `false` means that\nthe application will be started at, or moved to, another node according to how\nits distribution is configured (see `load/2`).\n\nThe function does not return until the application is started, stopped, or\nsuccessfully moved to another node. However, in some cases where permission is\nset to `true`, the function returns `ok` even though the application is not\nstarted. This is true when an application cannot start because of dependencies\nto other applications that are not yet started. When they are started,\n`Application` is started as well.\n\nBy default, all applications are loaded with permission `true` on all nodes. The\npermission can be configured using the Kernel configuration parameter\n`permissions`.","ref":"application.html#permit/2"},{"type":"callback","title":"application.prep_stop/1","doc":"This function is called when an application is about to be stopped, before\nshutting down the processes of the application.\n\n`State` is the state returned from [`Module:start/2`](`c:start/2`), or `[]` if\nno state was returned. `NewState` is any term and is passed to\n[`Module:stop/1`](`c:stop/1`).\n\nThe function is optional. If it is not defined, the processes are terminated and\nthen [`Module:stop(State)`](`c:stop/1`) is called.","ref":"application.html#c:prep_stop/1"},{"type":"function","title":"application.set_env/1","doc":"","ref":"application.html#set_env/1"},{"type":"function","title":"application.set_env/2","doc":"Sets the configuration `Config` for multiple applications.\n\nIt is equivalent to calling [`set_env/4`](`set_env/4`) on each application\nindividually, except it is more efficient. The given `Config` is validated before\nthe configuration is set.\n\n[`set_env/2`](`set_env/2`) uses the standard `gen_server` time-out value (5000\nms). Option `timeout` can be specified if another time-out value is useful, for\nexample, in situations where the application controller is heavily loaded.\n\nOption `persistent` can be set to `true` to guarantee that parameters set with\n[`set_env/2`](`set_env/2`) are not overridden by those defined in the\napplication resource file on load. This means that persistent values will stick\nafter the application is loaded and also on application reload.\n\nIf an application is given more than once or if an application has the same key\ngiven more than once, the behaviour is undefined and a warning message will be\nlogged. In future releases, an error will be raised.\n\n> #### Warning {: .warning }\n>\n> Use this function only if you know what you are doing, that is, on your own\n> applications. It is very application-dependent and configuration\n> parameter-dependent when and how often the value is read by the application.\n> Careless use of this function can put the application in a weird,\n> inconsistent, and malfunctioning state.","ref":"application.html#set_env/2"},{"type":"function","title":"application.set_env/3","doc":"","ref":"application.html#set_env/3"},{"type":"function","title":"application.set_env/4","doc":"Sets the value of configuration parameter `Par` for `Application`.\n\n[`set_env/4`](`set_env/4`) uses the standard `gen_server` time-out value (5000\nms). Option `timeout` can be specified if another time-out value is useful, for\nexample, in situations where the application controller is heavily loaded.\n\nIf [`set_env/4`](`set_env/4`) is called before the application is loaded, the\napplication environment values specified in file `Application.app` override the\nones previously set. This is also true for application reloads.\n\nOption `persistent` can be set to `true` to guarantee that parameters set with\n[`set_env/4`](`set_env/4`) are not overridden by those defined in the\napplication resource file on load. This means that persistent values will stick\nafter the application is loaded and also on application reload.\n\n> #### Warning {: .warning }\n>\n> Use this function only if you know what you are doing, that is, on your own\n> applications. It is very application-dependent and configuration\n> parameter-dependent when and how often the value is read by the application.\n> Careless use of this function can put the application in a weird,\n> inconsistent, and malfunctioning state.","ref":"application.html#set_env/4"},{"type":"function","title":"application.start/1","doc":"","ref":"application.html#start/1"},{"type":"function","title":"application.start/2","doc":"Starts `Application`. If it is not loaded, the application controller first\nloads it using [`load/1`](`load/1`). It ensures that any included applications\nare loaded, but does not start them. That is assumed to be taken care of in the\ncode for `Application`.\n\nThe application controller checks the value of the application specification key\n`applications`, to ensure that all applications needed to be started before this\napplication are running. If an application is missing and the application is not\nmarked as optional, `{error,{not_started,App}}` is returned, where `App` is the\nname of the missing application. Note this function makes no attempt to start\nany of the applications listed in `applications`, not even optional ones. See\n[`ensure_all_started/1,2`](`ensure_all_started/1`) for recursively starting the\ncurrent application and its dependencies.\n\nOnce validated, the application controller then creates an _application master_\nfor the application. The application master becomes the group leader of all the\nprocesses in the application. I/O is forwarded to the previous group leader,\nthough, this is just a way to identify processes that belong to the application.\nUsed for example to find itself from any process, or, reciprocally, to kill them\nall when it terminates.\n\nThe application master starts the application by calling the application\ncallback function [`Module:start/2`](`c:start/2`) as defined by the application\nspecification key `mod`.\n\nArgument `Type` specifies the type of the application. If omitted, it defaults\nto `temporary`.\n\n- If a permanent application terminates, all other applications and the entire\n Erlang node are also terminated.\n- If a transient application terminates:\n - with `Reason == normal`, this is reported but no other applications are\n terminated.\n - abnormally, all other applications and the entire Erlang node are also\n terminated.\n- If a temporary application terminates, this is reported but no other\n applications are terminated.\n\nNotice that an application can always be stopped explicitly by calling\n[`stop/1`](`stop/1`). Regardless of the type of the application, no other\napplications are affected.\n\nNotice also that the transient type is of little practical use, because when a\nsupervision tree terminates, the reason is set to `shutdown`, not `normal`.","ref":"application.html#start/2"},{"type":"callback","title":"application.start/2","doc":"This function is called whenever an application is started using `start/1,2`,\nand is to start the processes of the application. If the application is\nstructured according to the OTP design principles as a supervision tree, this\nmeans starting the top supervisor of the tree.\n\n`StartType`{: #start_type } defines the type of start:\n\n- `normal` if it is a normal startup.\n- `normal` also if the application is distributed and started at the current\n node because of a failover from another node, and the application\n specification key `start_phases == undefined`.\n- `{takeover,Node}` if the application is distributed and started at the current\n node because of a takeover from `Node`, either because\n [`takeover/2`](`takeover/2`) has been called or because the current node has\n higher priority than `Node`.\n- `{failover,Node}` if the application is distributed and started at the current\n node because of a failover from `Node`, and the application specification key\n `start_phases /= undefined`.\n\n`StartArgs` is the `StartArgs` argument defined by the application specification\nkey `mod`.\n\nThe function is to return `{ok,Pid}` or `{ok,Pid,State}`, where `Pid` is the pid\nof the top supervisor and `State` is any term. If omitted, `State` defaults to\n`[]`. If the application is stopped later, `State` is passed to\n[`Module:prep_stop/1`](`c:prep_stop/1`).","ref":"application.html#c:start/2"},{"type":"callback","title":"application.start_phase/3","doc":"Starts an application with included applications, when synchronization is needed\nbetween processes in the different applications during startup.\n\nThe start phases are defined by the application specification key\n`start_phases == [{Phase,PhaseArgs}]`. For included applications, the set of\nphases must be a subset of the set of phases defined for the including\napplication.\n\nThe function is called for each start phase (as defined for the primary\napplication) for the primary application and all included applications, for\nwhich the start phase is defined.\n\nFor a description of `StartType`, see [`Module:start/2`](`c:start/2`).","ref":"application.html#c:start_phase/3"},{"type":"function","title":"application.start_type/0","doc":"This function is intended to be called by a process belonging to an application,\nwhen the application is started, to determine the start type, which is\n`StartType` or `local`.\n\nFor a description of `StartType`, see\n[`Module:start/2`](`m:application#start_type`).\n\n`local` is returned if only parts of the application are restarted (by a\nsupervisor), or if the function is called outside a startup.\n\nIf the process executing the call does not belong to any application, the\nfunction returns `undefined`.","ref":"application.html#start_type/0"},{"type":"function","title":"application.stop/1","doc":"Stops `Application`. The application master calls\n[`Module:prep_stop/1`](`c:prep_stop/1`), if such a function is defined, and then\ntells the top supervisor of the application to shut down (see `m:supervisor`).\n\nThis means that the entire supervision tree, including included applications, is\nterminated in reversed start order. After the shutdown, the application master\ncalls [`Module:stop/1`](`c:stop/1`). `Module` is the callback module as defined\nby the application specification key `mod`.\n\nLast, the application master terminates. Notice that all processes with the\napplication master as group leader, that is, processes spawned from a process\nbelonging to the application, are also terminated.\n\nWhen stopped, the application is still loaded.\n\nTo stop a distributed application, [`stop/1`](`stop/1`) must be called on all\nnodes where it can execute (that is, on all nodes where it has been started).\nThe call to [`stop/1`](`stop/1`) on the node where the application currently\nexecutes stops its execution. The application is not moved between nodes, as\n[`stop/1`](`stop/1`) is called on the node where the application currently\nexecutes before [`stop/1`](`stop/1`) is called on the other nodes.","ref":"application.html#stop/1"},{"type":"callback","title":"application.stop/1","doc":"This function is called whenever an application has stopped. It is intended to\nbe the opposite of [`Module:start/2`](`c:start/2`) and is to do any necessary\ncleaning up. The return value is ignored.\n\n`State` is the return value of [`Module:prep_stop/1`](`c:prep_stop/1`), if such\na function exists. Otherwise `State` is taken from the return value of\n[`Module:start/2`](`c:start/2`).","ref":"application.html#c:stop/1"},{"type":"function","title":"application.takeover/2","doc":"Takes over the distributed application `Application`, which executes at another\nnode `Node`.\n\nAt the current node, the application is restarted by calling\n[`Module:start({takeover,Node},StartArgs)`](`c:start/2`). `Module` and\n`StartArgs` are retrieved from the loaded application specification. The\napplication at the other node is not stopped until the startup is completed,\nthat is, when [`Module:start/2`](`c:start/2`) and any calls to\n[`Module:start_phase/3`](`c:start_phase/3`) have returned.\n\nThus, two instances of the application run simultaneously during the takeover,\nso that data can be transferred from the old to the new instance. If this is not\nan acceptable behavior, parts of the old instance can be shut down when the new\ninstance is started. However, the application cannot be stopped entirely, at\nleast the top supervisor must remain alive.\n\nFor a description of `Type`, see [`start/1,2`](`start/1`).","ref":"application.html#takeover/2"},{"type":"function","title":"application.unload/1","doc":"Unloads the application specification for `Application` from the application\ncontroller. It also unloads the application specifications for any included\napplications. Notice that the function does not purge the Erlang object code.","ref":"application.html#unload/1"},{"type":"function","title":"application.unset_env/2","doc":"","ref":"application.html#unset_env/2"},{"type":"function","title":"application.unset_env/3","doc":"Removes the configuration parameter `Par` and its value for `Application`.\n\n[`unset_env/3`](`unset_env/3`) uses the standard `gen_server` time-out value\n(5000 ms). Option `timeout` can be specified if another time-out value is\nuseful, for example, in situations where the application controller is heavily\nloaded.\n\n[`unset_env/3`](`unset_env/3`) also allows the persistent option to be passed\n(see `set_env/4`).\n\n> #### Warning {: .warning }\n>\n> Use this function only if you know what you are doing, that is, on your own\n> applications. It is very application-dependent and configuration\n> parameter-dependent when and how often the value is read by the application.\n> Careless use of this function can put the application in a weird,\n> inconsistent, and malfunctioning state.","ref":"application.html#unset_env/3"},{"type":"function","title":"application.which_applications/0","doc":"","ref":"application.html#which_applications/0"},{"type":"function","title":"application.which_applications/1","doc":"Returns a list with information about the applications that are currently\nrunning.\n\n`Application` is the application name. `Description` and `Vsn` are the\nvalues of their `description` and `vsn` application specification keys,\nrespectively.\n\nA `Timeout` argument can be specified in situations where the application\ncontroller is heavily loaded.","ref":"application.html#which_applications/1"},{"type":"type","title":"application.application_opt/0","doc":"The built-in options available to an application.\n\nSee [app](app.md) for descriptions of the options.","ref":"application.html#t:application_opt/0"},{"type":"type","title":"application.application_spec/0","doc":"An application specification.","ref":"application.html#t:application_spec/0"},{"type":"type","title":"application.restart_type/0","doc":"The type of restart behaviour an application should have.","ref":"application.html#t:restart_type/0"},{"type":"type","title":"application.start_type/0","doc":"The reason for the application to be started on the current node.","ref":"application.html#t:start_type/0"},{"type":"type","title":"application.tuple_of/1","doc":"A tuple where the elements are of type `T`.","ref":"application.html#t:tuple_of/1"},{"type":"module","title":"code","doc":"Interface to the Erlang code server process.\n\nThis module contains the interface to the Erlang _code server_, which deals with\nthe loading of compiled code into a running Erlang runtime system.\n\nThe runtime system can be started in _interactive_ or _embedded_ mode. Which one\nis decided by the command-line flag `-mode`:\n\n```bash\n% erl -mode embedded\n```\n\nThe modes are as follows:\n\n- In _interactive_ mode, which is default, only the modules needed by\n the runtime system are loaded during system startup. Other code is\n dynamically loaded when first referenced. When a call to a function\n in a certain module is made, and that module is not loaded, the code\n server searches for and tries to load that module.\n\n- In _embedded_ mode, modules are not auto-loaded. Trying to use a\n module that has not been loaded results in an error. This mode is\n recommended when the boot script loads all modules, as it is\n typically done in OTP releases. (Code can still be loaded later by\n explicitly ordering the code server to do so).\n\nTo prevent accidentally reloading of modules affecting the Erlang runtime\nsystem, directories `kernel`, `stdlib`, and `compiler` are considered _sticky_.\nThis means that the system issues a warning and rejects the request if a user\ntries to reload a module residing in any of them. The feature can be disabled by\nusing command-line flag `-nostick`.","ref":"code.html"},{"type":"module","title":"Code Path - code","doc":"In interactive mode, the code server maintains a _code path_,\nconsisting of a list of directories, which it searches sequentially\nwhen trying to load a module.\n\nInitially, the code path consists of the current working directory and all\nErlang object code directories under library directory `$OTPROOT/lib`, where\n`$OTPROOT` is the installation directory of Erlang/OTP, `code:root_dir()`.\nDirectories can be named `Name[-Vsn]` and the code server, by default, chooses\nthe directory with the highest version number among those having the same\n`Name`. Suffix `-Vsn` is optional. If an `ebin` directory exists under\n`Name[-Vsn]`, this directory is added to the code path.\n\nEnvironment variable `ERL_LIBS` (defined in the operating system) can be used to\ndefine more library directories to be handled in the same way as the standard\nOTP library directory described above, except that directories without an `ebin`\ndirectory are ignored.\n\nAll application directories found in the additional directories appear before\nthe standard OTP applications, except for the Kernel and STDLIB applications,\nwhich are placed before any additional applications. In other words, modules\nfound in any of the additional library directories override modules with the\nsame name in OTP, except for modules in Kernel and STDLIB.\n\nEnvironment variable `ERL_LIBS` (if defined) is to contain a colon-separated\n(for Unix-like systems) or semicolon-separated (for Windows) list of additional\nlibraries.\n\n_Example:_\n\nOn a Unix-like system, `ERL_LIBS` can be set to the following:\n\n```text\n/usr/local/jungerl:/home/some_user/my_erlang_lib\n```\n\nThe code paths specified by `$OTPROOT`, `ERL_LIBS`, and boot scripts have their\nlistings cached by default (except for `\".\"`) The code server will\nlookup the contents in their directories once and avoid future file system\ntraversals. Therefore, modules added to such directories after the Erlang VM\nboots will not be picked up. This behaviour can be disabled by setting\n`-cache_boot_paths false` or by calling `code:set_path(code:get_path())`.\n\n> #### Change {: .info }\n>\n> The support for caching directories in the code path was added\n> in Erlang/OTP 26.\n\nDirectories given by the command line options `-pa` and `-pz` are not\ncached by default. Many of the functions that manipulate the code path\naccept the `cache` atom as an optional argument to enable caching\nselectively.","ref":"code.html#module-code-path"},{"type":"module","title":"Loading of Code From Archive Files - code","doc":"> #### Change {: .info }\n>\n> The existing experimental support for archive files will be changed\n> in a future release. As of Erlang/OTP 27, the function `code:lib_dir/2`,\n> the `-code_path_choice` flag, and using `m:erl_prim_loader` for\n> reading files from an archive are deprecated.\n>\n> `escript` scripts that use archive files should use\n> `escript:extract/2` to read data files from its archive instead of using\n> `code:lib_dir/2` and `m:erl_prim_loader`.\n\nThe Erlang archives are `ZIP` files with extension `.ez`. Erlang archives can\nalso be [enclosed in `escript`](`m:escript`) files whose file extension is arbitrary.\n\nErlang archive files can contain entire Erlang applications or parts of\napplications. The structure in an archive file is the same as the directory\nstructure for an application. If you, for example, create an archive of\n`mnesia-4.4.7`, the archive file must be named `mnesia-4.4.7.ez` and it must\ncontain a top directory named `mnesia-4.4.7`. If the version part of the name is\nomitted, it must also be omitted in the archive. That is, a `mnesia.ez` archive\nmust contain a `mnesia` top directory.\n\nAn archive file for an application can, for example, be created like this:\n\n```erlang\nzip:create(\"mnesia-4.4.7.ez\",\n\t[\"mnesia-4.4.7\"],\n\t[{cwd, code:lib_dir()},\n\t {compress, all},\n\t {uncompress,[\".beam\",\".app\"]}]).\n```\n\nAny file in the archive can be compressed, but to speed up the access of\nfrequently read files, it can be a good idea to store `beam` and `app` files\nuncompressed in the archive.\n\nNormally the top directory of an application is located in library directory\n`$OTPROOT/lib` or in a directory referred to by environment variable `ERL_LIBS`.\nAt startup, when the initial code path is computed, the code server also looks\nfor archive files in these directories and possibly adds `ebin` directories in\narchives to the code path. The code path then contains paths to directories that\nlook like `$OTPROOT/lib/mnesia.ez/mnesia/ebin` or\n`$OTPROOT/lib/mnesia-4.4.7.ez/mnesia-4.4.7/ebin`.\n\nThe code server uses module `erl_prim_loader` in ERTS (possibly through\n`erl_boot_server`) to read code files from archives. However, the functions in\n`erl_prim_loader` can also be used by other applications to read files from\narchives. For example, the call\n`erl_prim_loader:list_dir( \"/otp/root/lib/mnesia-4.4.7.ez/mnesia-4.4.7/examples/bench)\"`\nwould list the contents of a directory inside an archive. See\n`m:erl_prim_loader`.\n\nAn application archive file and a regular application directory can coexist.\nThis can be useful when it is needed to have parts of the application as regular\nfiles. A typical case is the `priv` directory, which must reside as a regular\ndirectory to link in drivers dynamically and start port programs. For other\napplications that do not need this, directory `priv` can reside in the archive\nand the files under the directory `priv` can be read through `erl_prim_loader`.\n\nWhen a directory is added to the code path and when the entire code path is\n(re)set, the code server decides which subdirectories in an application that are\nto be read from the archive and which that are to be read as regular files. If\ndirectories are added or removed afterwards, the file access can fail if the\ncode path is not updated (possibly to the same path as before, to trigger the\ndirectory resolution update).\n\nFor each directory on the second level in the application archive (`ebin`,\n`priv`, `src`, and so on), the code server first chooses the regular directory\nif it exists and second from the archive. Function `code:lib_dir/2` returns the\npath to the subdirectory. For example, `code:lib_dir(megaco, ebin)` can return\n`/otp/root/lib/megaco-3.9.1.1.ez/megaco-3.9.1.1/ebin` while\n`code:lib_dir(megaco, priv)` can return `/otp/root/lib/megaco-3.9.1.1/priv`.\n\nWhen an `escript` file contains an archive, there are no restrictions on the\nname of the `escript` and no restrictions on how many applications that can be\nstored in the embedded archive. Single Beam files can also reside on the top\nlevel in the archive. At startup, the top directory in the embedded archive and\nall (second level) `ebin` directories in the embedded archive are added to the\ncode path. See [`escript`](`e:erts:escript_cmd.md`).\n\nA future-proof way for `escript` scripts to read data files from the archive is\nto use the `escript:extract/2` function.\n\nWhen the choice of directories in the code path is `strict` (which is\nthe default as of Erlang/OTP 27), the directory that ends up in the\ncode path is exactly the stated one. This means that if, for example,\nthe directory `$OTPROOT/lib/mnesia-4.4.7/ebin` is explicitly added to\nthe code path, the code server does not load files from\n`$OTPROOT/lib/mnesia-4.4.7.ez/mnesia-4.4.7/ebin`.\n\nThis behavior can be controlled through command-line flag\n`-code_path_choice Choice`. If the flag is set to `relaxed`, the code server\ninstead chooses a suitable directory depending on the actual file structure. If\na regular application `ebin` directory exists, it is chosen. Otherwise, the\ndirectory `ebin` in the archive is chosen if it exists. If neither of them\nexists, the original directory is chosen.\n\nCommand-line flag `-code_path_choice Choice` also affects how module `init`\ninterprets the `boot script`. The interpretation of the explicit code paths in\nthe `boot script` can be `strict` or `relaxed`. It is particularly useful to set\nthe flag to `relaxed` when elaborating with code loading from archives without\nediting the `boot script`. The default has changed to `strict` in OTP 27 and the\noption is scheduled for removal in OTP 28. See module `m:init` in the\nErts application.","ref":"code.html#module-loading-of-code-from-archive-files"},{"type":"module","title":"Current and Old Code - code","doc":"The code for a module can exist in two variants in a system: _current code_ and\n_old code_. When a module is loaded into the system for the first time, the\nmodule code becomes *current* and the global _export table_ is updated with\nreferences to all functions exported from the module.\n\nWhen a new instance of the module is loaded, the code of the previous\ninstance becomes *old*, and all export entries referring to the\nprevious instance are removed. After that, the new instance is loaded\nas for the first time, and becomes current.\n\nBoth old and current code for a module are valid, and can even be executed\nconcurrently. The difference is that exported functions in old code are\nunavailable. Hence, a global call cannot be made to an exported function in old\ncode, but old code can still be executed because of processes lingering in it.\n\nIf a third instance of the module is loaded, the code server removes (purges)\nthe old code and any processes lingering in it are terminated. Then the third\ninstance becomes current and the previously current code becomes old.\n\nFor more information about old and current code, and how to make a process\nswitch from old to current code, see section Compilation and Code Loading in the\n[Erlang Reference Manual](`e:system:code_loading.md`).","ref":"code.html#module-current-and-old-code"},{"type":"module","title":"Native Coverage Support - code","doc":"In runtime systems that use the JIT, native coverage is a light-weight\nway to find out which functions or lines that have been executed, or\nhow many times each function or line has been executed.\n\n> #### Change {: .info }\n>\n> The support for native coverage was added in Erlang/OTP 27.\n\nNative coverage works by instrumenting code at load-time. When a\nmodule has been instrumented for native coverage collection it is not\npossible to later disable the coverage collection, except by reloading\nthe module. However, the overhead for keeping coverage collection\nrunning is often neligible, especially for [coverage\nmode](`t:coverage_mode/0`) `function` that only keeps track of which\nfunctions that have been executed.\n\nThe `m:cover` tool in the Tools application will automatically use the\nnative coverage support if the runtime system supports it.\n\nIt is only necessary to use the functionality described next if\n`m:cover` is not sufficient, for example:\n\n* If one wants to collect coverage information for the code that runs\n when the runtime system is starting (module `m:init` and so on).\n `m:cover` can only be used when the Erlang system has started, and\n it will reload every module that is to be analyzed.\n\n* If it is necessary to collect coverage information with the absolute\n minimum disturbance of the test system. `m:cover` always counts how\n many times each line is executed (coverage mode `line_counters`),\n but by using native coverage one can use a less expensive coverage\n mode such as `function`, which has almost negligible overhead.","ref":"code.html#module-native-coverage-support"},{"type":"module","title":"Short summary of using native coverage - code","doc":"If the `line` or `line_counters` coverage mode is to be used,\nthe code to be tested must be compiled with option\n[`line_coverage`](`e:compiler:compile#line_coverage`).\n\nUse [set_coverage_mode(Mode)](`set_coverage_mode/1`) to set a\n[coverage mode](`t:coverage_mode/0`) for all code subsequently\nloaded, or set it with option [\\+JPcover](`e:erts:erl_cmd.md#%2BJPcover`)\nfor `erl`.\n\nOptionally reset coverage information for all\nmodules that are to be tested by calling\n[reset_coverage(Module)](`reset_coverage/1`).\n\nRun the code whose coverage information is to be collected.\n\nRead out the counters for all interesting modules by calling\n[get_coverage(Level, Module)](`get_coverage/2`), where `Level`\nis either `function` or `line`.","ref":"code.html#module-short-summary-of-using-native-coverage"},{"type":"module","title":"The other native coverage BIFs - code","doc":"The following BIFs are sometimes useful, for example to fail gracefully\nif the runtime system does not support native coverage:\n\n* [coverage_support()](`coverage_support/0`) - check whether\n the runtime system supports native coverage\n\n* [get_coverage_mode()](`get_coverage_mode/0`) - get the current\n coverage mode\n\n* [get_coverage_mode(Module)](`get_coverage_mode/1`) - get the coverage\n mode for module `Module`","ref":"code.html#module-the-other-native-coverage-bifs"},{"type":"module","title":"Argument Types and Invalid Arguments - code","doc":"Module and application names are atoms, while file and directory names are\nstrings. For backward compatibility reasons, some functions accept both strings\nand atoms, but a future release will probably only allow the arguments that are\ndocumented.\n\nFunctions in this module generally fail with an exception if they are passed an\nincorrect type (for example, an integer or a tuple where an atom is expected).\nAn error tuple is returned if the argument type is correct, but there are some\nother errors (for example, a non-existing directory is specified to\n[`set_path/1`](`set_path/1`)).\n\n[](){: #error_reasons }","ref":"code.html#module-argument-types-and-invalid-arguments"},{"type":"module","title":"Error Reasons for Code-Loading Functions - code","doc":"Functions that load code (such as [`load_file/1`](`load_file/1`)) will return\n`{error,Reason}` if the load operation fails. Here follows a description of the\ncommon reasons.\n\n- **`badfile`** - The object code has an incorrect format or the module name in\n the object code is not the expected module name.\n\n- **`nofile`** - No file with object code was found.\n\n- **`not_purged`** - The object code could not be loaded because an old version\n of the code already existed.\n\n- **`on_load_failure`** - The module has an\n [\\-on_load function](`e:system:code_loading.md#on_load`) that failed when it\n was called.\n\n- **`sticky_directory`** - The object code resides in a sticky directory.","ref":"code.html#module-error-reasons-for-code-loading-functions"},{"type":"function","title":"code.add_path/1","doc":"","ref":"code.html#add_path/1"},{"type":"function","title":"code.add_path/2","doc":"","ref":"code.html#add_path/2"},{"type":"function","title":"code.add_patha/1","doc":"","ref":"code.html#add_patha/1"},{"type":"function","title":"code.add_patha/2","doc":"Adds `Dir` to the beginning of the code path.\n\nIf `Dir` exists, it is removed from the old position in the code path.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns `true` if successful, or `{error, bad_directory}` if `Dir` is\nnot the name of a directory.","ref":"code.html#add_patha/2"},{"type":"function","title":"code.add_paths/1","doc":"","ref":"code.html#add_paths/1"},{"type":"function","title":"code.add_paths/2","doc":"","ref":"code.html#add_paths/2"},{"type":"function","title":"code.add_pathsa/1","doc":"","ref":"code.html#add_pathsa/1"},{"type":"function","title":"code.add_pathsa/2","doc":"Traverses `Dirs` and adds each `Dir` to the beginning of the code path.\n\nThis means that the order of `Dirs` is reversed in the resulting code\npath. For example, if `Dirs` is `[Dir1,Dir2]`, the resulting path will\nbe `[Dir2,Dir1|OldCodePath]`.\n\nIf a `Dir` already exists in the code path, it is removed from the old position.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nAlways returns `ok`, regardless of the validity of each individual `Dir`.","ref":"code.html#add_pathsa/2"},{"type":"function","title":"code.add_pathsz/1","doc":"","ref":"code.html#add_pathsz/1"},{"type":"function","title":"code.add_pathsz/2","doc":"Adds the directories in `Dirs` to the end of the code path.\n\nDirectories that are already present in the path will not be added.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nAlways returns `ok`, regardless of the validity of each individual `Dir`.","ref":"code.html#add_pathsz/2"},{"type":"function","title":"code.add_pathz/1","doc":"","ref":"code.html#add_pathz/1"},{"type":"function","title":"code.add_pathz/2","doc":"Adds `Dir` as the directory last in the code path.\n\nIf `Dir` already exists in the path, it is not added.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns `true` if successful, or `{error, bad_directory}` if `Dir` is\nnot the name of a directory.","ref":"code.html#add_pathz/2"},{"type":"function","title":"code.all_available/0","doc":"Returns a list of tuples `{Module, Filename, Loaded}` for all available modules.\n\nA module is considered to be available if it either is loaded or would be loaded\nif called. `Filename` is normally the absolute filename, as described for\n`is_loaded/1`.","ref":"code.html#all_available/0"},{"type":"function","title":"code.all_loaded/0","doc":"Returns a list of tuples `{Module, Loaded}` for all loaded modules.\n\n`Loaded` is normally the absolute filename, as described for `is_loaded/1`.","ref":"code.html#all_loaded/0"},{"type":"function","title":"code.atomic_load/1","doc":"Tries to load all of the modules in the list `Modules` atomically.\n\nThat means that either all modules are loaded at the same time, or\nnone of the modules are loaded if there is a problem with any of the\nmodules.\n\nLoading can fail for one the following reasons:\n\n- **`badfile`** - The object code has an incorrect format or the module name in\n the object code is not the expected module name.\n\n- **`nofile`** - No file with object code exists.\n\n- **`on_load_not_allowed`** - A module contains an\n [\\-on_load function](`e:system:code_loading.md#on_load`).\n\n- **`duplicated`** - A module is included more than once in `Modules`.\n\n- **`not_purged`** - The object code cannot be loaded because an old version of\n the code already exists.\n\n- **`sticky_directory`** - The object code resides in a sticky directory.\n\n- **`pending_on_load`** - A previously loaded module contains an `-on_load`\n function that never finished.\n\nIf it is important to minimize the time that an application is inactive while\nchanging code, use `prepare_loading/1` and `finish_loading/1` instead of\n[`atomic_load/1`](`atomic_load/1`). Here is an example:\n\n```erlang\n{ok,Prepared} = code:prepare_loading(Modules),\n%% Put the application into an inactive state or do any\n%% other preparation needed before changing the code.\nok = code:finish_loading(Prepared),\n%% Resume the application.\n```","ref":"code.html#atomic_load/1"},{"type":"function","title":"code.clash/0","doc":"Searches all directories in the code path for module names with identical names\nand writes a report to `stdout`.","ref":"code.html#clash/0"},{"type":"function","title":"code.clear_cache/0","doc":"Clears the code path cache.\n\nIf a directory is cached, its cache is cleared once and then it will\nbe recalculated and cached once more in a future traversal.\n\nTo clear the cache for a single path, either re-add it to the code\npath (with [`add_path/2`](`add_path/2`)) or replace it (with\n[`replace_path/3`](`replace_path/3`)). To disable all caching, reset\nthe code path with `code:set_path(code:get_path())`.\n\nAlways returns `ok`.","ref":"code.html#clear_cache/0"},{"type":"function","title":"code.compiler_dir/0","doc":"Returns the compiler library directory.\n\nEquivalent to [`code:lib_dir(compiler)`](`code:lib_dir/1`).","ref":"code.html#compiler_dir/0"},{"type":"function","title":"code.coverage_support/0","doc":"Returns `true` if the system supports coverage and `false` otherwise.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","ref":"code.html#coverage_support/0"},{"type":"function","title":"code.del_path/1","doc":"Deletes a directory from the code path.\n\nThe argument can be an atom `Name`, in which case the directory with\nthe name `.../Name[-Vsn][/ebin]` is deleted from the code path. Also,\nthe complete directory name `Dir` can be specified as argument.\n\nReturns:\n\n- **`true`** - If successful\n\n- **`false`** - If the directory is not found\n\n- **`{error, bad_name}`** - If the argument is invalid","ref":"code.html#del_path/1"},{"type":"function","title":"code.del_paths/1","doc":"Deletes directories from the code path.\n\nThe argument is a list of either atoms or complete directory names. If\n`Name` is an atom, the directory with the name `.../Name[-Vsn][/ebin]` is\ndeleted from the code path.\n\nAlways returns `ok`, regardless of the validity of each individual\n`NamesOrDirs`.","ref":"code.html#del_paths/1"},{"type":"function","title":"code.delete/1","doc":"Removes the current code for `Module`, that is, the current code for `Module` is\nmade old.\n\nThis means that processes can continue to execute the code in the\nmodule, but no external function calls can be made to it.\n\nReturns `true` if successful, or `false` if there is old code for `Module` that\nmust be purged first, or if `Module` is not a (loaded) module.","ref":"code.html#delete/1"},{"type":"function","title":"code.ensure_loaded/1","doc":"Tries to load a module in the same way as `load_file/1`, unless the module is\nalready loaded.\n\nIf called concurrently, this function ensures that only one process\nattempts to load said module at a given time.\n\nIn embedded mode, it does not load a module that is not already loaded, but\nreturns `{error, embedded}` instead. See\n[Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of other possible error reasons.","ref":"code.html#ensure_loaded/1"},{"type":"function","title":"code.ensure_modules_loaded/1","doc":"Tries to load any modules not already loaded in the list `Modules` in the same\nway as `load_file/1`.\n\nUnlike `ensure_loaded/1`, modules are loaded even in `embedded` mode.\n\nReturns `ok` if successful, or `{error,[{Module,Reason}]}` if loading of some\nmodules fails. See\n[Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of other possible error reasons.","ref":"code.html#ensure_modules_loaded/1"},{"type":"function","title":"code.finish_loading/1","doc":"Tries to load code for all modules that have been previously prepared by\n`prepare_loading/1`.\n\nThe loading occurs atomically, meaning that either all modules are\nloaded at the same time, or none of the modules are loaded.\n\nThis function can fail with one of the following error reasons:\n\n- **`not_purged`** - The object code cannot be loaded because an old version of\n the code already exists.\n\n- **`sticky_directory`** - The object code resides in a sticky directory.\n\n- **`pending_on_load`** - A previously loaded module contains an `-on_load`\n function that never finished.","ref":"code.html#finish_loading/1"},{"type":"function","title":"code.get_coverage/2","doc":"Return either `function` or `line` coverage data for module `Module`.\n\nIf Level is `function`, returns function coverage for the given module\naccording to its [coverage mode](`t:coverage_mode/0`):\n\n- **`function`** - For each function in module Module, a boolean indicating\n whether that function has been executed at least once is returned.\n\n- **`function_counters`** - For each function in module Module, an integer\n giving the number of times that line has been executed is returned.\n\n- **`line`** - For each function in module Module, a boolean indicating whether\n that function has been executed at least once is returned.\n\n- **`line_counters`** - For each function in module Module, a boolean indicating\n whether that function has been executed at least once is returned (note that\n in this mode, counters for the number of times each function has been executed\n **cannot** be retrieved).\n\nIf Level is `line`, returns line coverage for the given module according to its\ncoverage mode:\n\n- **`line`** - For each executable line in the module, a boolean indicating\n whether that line has been executed at least once is returned.\n\n- **`line_counters`** - For each executable line in the module, an integer\n giving the number of times that line was executed is returned.\n\nLevel `cover_id_line` is used by the `m:cover` tool.\n\nFailures:\n\n- **`badarg`** - If `Level` is not `function` or `line`.\n\n- **`badarg`** - If `Module` is not an atom.\n\n- **`badarg`** - If `Module` does not refer to a loaded module.\n\n- **`badarg`** - If `Module` was not loaded in another coverage mode than\n `none`.\n\n- **`badarg`** - If Level is `line` and `Module` has not been loaded with either\n `line` or `line_counters` enabled.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","ref":"code.html#get_coverage/2"},{"type":"function","title":"code.get_coverage_mode/0","doc":"Returns the coverage mode as set by option\n[\\+JPcover](`e:erts:erl_cmd.md#%2BJPcover`) for `erl` or `set_coverage_mode/1`.\n\nFailure:\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","ref":"code.html#get_coverage_mode/0"},{"type":"function","title":"code.get_coverage_mode/1","doc":"Get coverage mode for the given module.\n\nFailures:\n\n- **`badarg`** - If `Module` is not an atom.\n\n- **`badarg`** - If `Module` does not refer to a loaded module.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","ref":"code.html#get_coverage_mode/1"},{"type":"function","title":"code.get_doc/1","doc":"Returns [EEP 48](https://www.erlang.org/eeps/eep-0048.html) style\ndocumentation for `Module` if available.\n\nIf `Module` is not found in the code path, this function returns\n`{error,non_existing}`.\n\nIf no documentation can be found this function attempts to generate\ndocumentation from the debug information in the module. If no debug\ninformation is available, this function returns `{error,missing}`.\n\nFor more information about the documentation chunk see\n[Documentation Storage and Format](eep48_chapter.md) in\nKernel's User's Guide.","ref":"code.html#get_doc/1"},{"type":"function","title":"code.get_mode/0","doc":"Returns an atom describing the mode of the code server: `interactive` or\n`embedded`.\n\nThis information is useful when an external entity (for example, an IDE)\nprovides additional code for a running node. If the code server is in\ninteractive mode, it only has to add the path to the code. If the code server is\nin embedded mode, the code must be loaded with `load_binary/3`.","ref":"code.html#get_mode/0"},{"type":"function","title":"code.get_object_code/1","doc":"Returns the object code for module `Module` if found in the code path.\n\nReturns `{Module, Binary, Filename}` if successful, otherwise\n`error`. `Binary` is a binary data object, which contains the object\ncode for the module. This is useful if code is to be loaded on a\nremote node in a distributed system. For example, loading module\n`Module` on a node `Node` is done as follows:\n\n```erlang\n...\n{_Module, Binary, Filename} = code:get_object_code(Module),\nerpc:call(Node, code, load_binary, [Module, Filename, Binary]),\n...\n```","ref":"code.html#get_object_code/1"},{"type":"function","title":"code.get_path/0","doc":"Returns the code path.","ref":"code.html#get_path/0"},{"type":"function","title":"code.is_loaded/1","doc":"Checks whether `Module` is loaded.\n\nIf it is, `{file, Loaded}` is returned, otherwise `false`.\n\nNormally, `Loaded` is the absolute filename `Filename` from which the code is\nobtained. If the module is preloaded (see [`script(4)`](`e:sasl:script.md`)),\n`Loaded =:= preloaded`. If the module is Cover-compiled (see `m:cover`),\n`Loaded =:= cover_compiled`.","ref":"code.html#is_loaded/1"},{"type":"function","title":"code.is_sticky/1","doc":"Returns `true` if `Module` is the name of a module that has been loaded from a\nsticky directory (in other words: an attempt to reload the module will fail), or\n`false` if `Module` is not a loaded module or is not sticky.","ref":"code.html#is_sticky/1"},{"type":"function","title":"code.lib_dir/0","doc":"Returns the library directory, `$OTPROOT/lib`, where `$OTPROOT` is the root\ndirectory of Erlang/OTP.\n\n_Example:_\n\n```erlang\n1> code:lib_dir().\n\"/usr/local/otp/lib\"\n```","ref":"code.html#lib_dir/0"},{"type":"function","title":"code.lib_dir/1","doc":"Returns the path for the *library directory*, the top directory, for an\napplication `Name` located under `$OTPROOT/lib` or in a directory referred to\nwith environment variable `ERL_LIBS`.\n\nIf a regular directory called `Name` or `Name-Vsn` exists in the code path with\nan `ebin` subdirectory, the path to this directory is returned (not the `ebin`\ndirectory).\n\nIf the directory refers to a directory in an archive, the archive name is\nstripped away before the path is returned. For example, if directory\n`/usr/local/otp/lib/mnesia-4.2.2.ez/mnesia-4.2.2/ebin` is in the path,\n`/usr/local/otp/lib/mnesia-4.2.2/ebin` is returned. This means that the library\ndirectory for an application is the same, regardless if the application resides\nin an archive or not.\n\n> #### Warning {: .info }\n>\n> Archives are experimental. In a future release, they can be removed or\n> their behavior can change.\n\n_Example:_\n\n```erlang\n> code:lib_dir(mnesia).\n\"/usr/local/otp/lib/mnesia-4.23\"\n```\n\nReturns `{error, bad_name}` if `Name` is not the name of an application under\n`$OTPROOT/lib` or on a directory referred to through environment variable\n`ERL_LIBS`. Fails with an exception if `Name` has the wrong type.\n\n> #### Warning {: .warning }\n>\n> For backward compatibility, `Name` is also allowed to be a string. That will\n> probably change in a future release.","ref":"code.html#lib_dir/1"},{"type":"function","title":"code.lib_dir/2","doc":"Returns the path to a subdirectory directly under the top directory of an\napplication.\n\n> #### Change {: .info }\n>\n> This function is part of the archive support, which is an experimental\n> feature that will be changed or removed in a future release.\n\nNormally the subdirectories reside under the top directory for the\napplication, but when applications at least partly reside in an archive, the\nsituation is different. Some of the subdirectories can reside as regular\ndirectories while others reside in an archive file. It is not checked whether\nthis directory exists.\n\nInstead of using this function, use [`code:lib_dir/1`](`code:lib_dir/1`)\nand `filename:join/2`.\n\n_Example:_\n\n```erlang\n1> filename:join(code:lib_dir(megaco), \"priv\").\n\"/usr/local/otp/lib/megaco-3.9.1.1/priv\"\n```\n\nFails with an exception if `Name` or `SubDir` has the wrong type.","ref":"code.html#lib_dir/2"},{"type":"function","title":"code.load_abs/1","doc":"Equivalent to [`load_file(Module)`](`load_file/1`), except that `Filename` is\nan absolute or relative filename.\n\nThe code path is not searched. It returns a value in the same way as\n`load_file/1`. Notice that `Filename` must not contain the extension\n(for example, `.beam`) because [`load_abs/1`](`load_abs/1`) adds the\ncorrect extension.","ref":"code.html#load_abs/1"},{"type":"function","title":"code.load_binary/3","doc":"Loads object code from a binary.\n\nThis function can be used to load object code on remote Erlang nodes. Argument\n`Binary` must contain object code for `Module`. `Filename` is only used by the\ncode server to keep a record of from which file the object code for `Module`\noriginates. Thus, `Filename` is not opened and read by the code server.\n\nReturns `{module, Module}` if successful, or `{error, Reason}` if loading fails.\nSee [Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of the possible error reasons.","ref":"code.html#load_binary/3"},{"type":"function","title":"code.load_file/1","doc":"Tries to load the Erlang module `Module` using the code path.\n\nIt looks for the object code file with an extension corresponding to\nthe Erlang machine used, for example, `Module.beam`. The loading fails\nif the module name found in the object code differs from the name\n`Module`. Use `load_binary/3` to load object code with a module name\nthat is different from the file name.\n\nReturns `{module, Module}` if successful, or `{error, Reason}` if loading fails.\nSee [Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of the possible error reasons.","ref":"code.html#load_file/1"},{"type":"function","title":"code.modified_modules/0","doc":"Returns the list of all currently loaded modules for which `module_status/1`\nreturns `modified`.\n\nSee also `all_loaded/0`.","ref":"code.html#modified_modules/0"},{"type":"function","title":"code.module_status/0","doc":"See `module_status/1` and `all_loaded/0` for details.","ref":"code.html#module_status/0"},{"type":"function","title":"code.module_status/1","doc":"Returns the status of `Module` in relation to object file on disk.\n\nThe status of a module can be one of:\n\n- **`not_loaded`** - If `Module` is not currently loaded.\n\n- **`loaded`** - If `Module` is loaded, and the object file exists and contains\n the same code.\n\n- **`removed`** - If `Module` is loaded, but no corresponding object file can be\n found in the code path.\n\n- **`modified`** - If `Module` is loaded, but the object file contains code with\n a different MD5 checksum.\n\nPreloaded modules are always reported as `loaded`, without inspecting the\ncontents on disk. Cover-compiled modules will always be reported as `modified`\nif an object file exists, or as `removed` otherwise. Modules whose load path is\nan empty string (which is the convention for auto-generated code) will only be\nreported as `loaded` or `not_loaded`.\n\nSee also `modified_modules/0`.","ref":"code.html#module_status/1"},{"type":"function","title":"code.objfile_extension/0","doc":"Returns the object code file extension corresponding to the Erlang machine used.\n\nFor the official Erlang/OTP release, the return value is always `.beam`.","ref":"code.html#objfile_extension/0"},{"type":"function","title":"code.prepare_loading/1","doc":"Prepares to load the modules in the list `Modules`.\n\nFinish the loading by calling\n[finish_loading(Prepared)](`finish_loading/1`).\n\nThis function can fail with one of the following error reasons:\n\n- **`badfile`** - The object code has an incorrect format or the module name in\n the object code is not the expected module name.\n\n- **`nofile`** - No file with object code exists.\n\n- **`on_load_not_allowed`** - A module contains an\n [\\-on_load function](`e:system:code_loading.md#on_load`).\n\n- **`duplicated`** - A module is included more than once in `Modules`.","ref":"code.html#prepare_loading/1"},{"type":"function","title":"code.priv_dir/1","doc":"Returns the path to the `priv` directory in an application.\n\n> #### Warning {: .warning }\n>\n> For backward compatibility, `Name` is also allowed to be a string. That will\n> probably change in a future release.","ref":"code.html#priv_dir/1"},{"type":"function","title":"code.purge/1","doc":"Purges the code for `Module`, that is, removes code marked as old.\n\nIf some processes still linger in the old code, these processes are\nkilled before the code is removed.\n\n> #### Change {: .info }\n>\n> As of Erlang/OTP 20.0, a process is only considered to be lingering in the\n> code if it has direct references to the code. For more information see\n> documentation of `erlang:check_process_code/3`, which is used in order to\n> determine whether a process is lingering.\n\nReturns `true` if successful and any process is needed to be killed, otherwise\n`false`.","ref":"code.html#purge/1"},{"type":"function","title":"code.replace_path/2","doc":"","ref":"code.html#replace_path/2"},{"type":"function","title":"code.replace_path/3","doc":"Replaces an old occurrence of a directory named `.../Name[-Vsn][/ebin]` in the\ncode path, with `Dir`.\n\nIf `Name` does not exist, it adds the new directory `Dir` last in the\ncode path. The new directory must also be named\n`.../Name[-Vsn][/ebin]`. This function is to be used if a new version\nof the directory (library) is added to a running system.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns:\n\n- **`true`** - If successful\n\n- **`{error, bad_name}`** - If `Name` is not found\n\n- **`{error, bad_directory}`** - If `Dir` does not exist\n\n- **`{error, {badarg, [Name, Dir]}}`** - If `Name` or `Dir` is invalid","ref":"code.html#replace_path/3"},{"type":"function","title":"code.reset_coverage/1","doc":"Resets coverage information for module `Module`.\n\nIf the [coverage mode](`t:coverage_mode/0`) is either `function` or\n`line`, all booleans for `Module` keeping track of executed functions\nor lines are set to `false`.\n\nIf the coverage mode is either `function_counters` or\n`line_counters`, all counters for `Module` are reset to zero.\n\nFailures:\n\n- **`badarg`** - If `Module` is not an atom.\n\n- **`badarg`** - If `Module` does not refer to a loaded module.\n\n- **`badarg`** - If `Module` was not loaded with coverage enabled.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","ref":"code.html#reset_coverage/1"},{"type":"function","title":"code.root_dir/0","doc":"Returns the root directory of Erlang/OTP, which is the directory where it is\ninstalled.\n\n_Example:_\n\n```erlang\n1> code:root_dir().\n\"/usr/local/otp\"\n```","ref":"code.html#root_dir/0"},{"type":"function","title":"code.set_coverage_mode/1","doc":"Sets the coverage mode for modules that are subsequently loaded, similar to\noption [\\+JPcover](`e:erts:erl_cmd.md#%2BJPcover`) for `erl`.\n\nThe coverage mode will have the following effect on code that is\nloaded following this call:\n\n- **`function`** - All modules that are loaded will be instrumented to keep\n track of which functions are executed. Information about which functions that\n have been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`).\n\n- **`function_counters`** - All modules that are loaded will be instrumented to\n count how many times each function is executed. Information about how many\n times each function has been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`).\n\n- **`line`** - When modules that have been compiled with the\n [`line_coverage`](`m:compile#line_coverage`) option are loaded, they will be\n instrumented to keep track of which lines have been executed. Information\n about which lines have been executed can be retrieved by calling\n [`get_coverage(line, Module)`](`get_coverage/2`), and information about which\n functions that have been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`).\n\n- **`line_counters`** - When modules that have been compiled with the\n [`line_coverage`](`m:compile#line_coverage`) option are loaded, they will be\n instrumented to count the number of times each line is executed. Information\n about how many times each line has been executed can be retrieved by calling\n [`get_coverage(line, Module)`](`get_coverage/2`), and information about which\n functions that have been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`) (note that in this mode,\n counters for the number of times each function has been executed **cannot** be\n retrieved).\n\n- **`none`** - Modules will be loaded without coverage instrumentation.\n\nReturns the previous coverage mode.\n\nFailures:\n\n- **`badarg`** - If `Mode` is not a valid coverage mode.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","ref":"code.html#set_coverage_mode/1"},{"type":"function","title":"code.set_path/1","doc":"","ref":"code.html#set_path/1"},{"type":"function","title":"code.set_path/2","doc":"Sets the code path to the list of directories `Path`.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns:\n\n- **`true`** - If successful\n\n- **`{error, bad_directory}`** - If any `Dir` is not a directory name","ref":"code.html#set_path/2"},{"type":"function","title":"code.soft_purge/1","doc":"Purges the code for `Module`, that is, removes code marked as old, but only if\nno processes linger in it.\n\n> #### Change {: .info }\n>\n> As of Erlang/OTP 20.0, a process is only considered to be lingering in the\n> code if it has direct references to the code. For more information see\n> documentation of `erlang:check_process_code/3`, which is used in order to\n> determine whether a process is lingering.\n\nReturns `false` if the module cannot be purged because of processes lingering in\nold code, otherwise `true`.","ref":"code.html#soft_purge/1"},{"type":"function","title":"code.stick_dir/1","doc":"Marks `Dir` as sticky.\n\nReturns `ok` if successful, otherwise `error`.","ref":"code.html#stick_dir/1"},{"type":"function","title":"code.unstick_dir/1","doc":"Unsticks a directory that is marked as sticky.\n\nReturns `ok` if successful, otherwise `error`.","ref":"code.html#unstick_dir/1"},{"type":"function","title":"code.where_is_file/1","doc":"Searches the code path for `Filename`, which is a file of arbitrary type.\n\nIf found, the full name is returned. `non_existing` is returned if the\nfile cannot be found. The function can be useful, for example, to\nlocate application resource files.","ref":"code.html#where_is_file/1"},{"type":"function","title":"code.which/1","doc":"If the module is not loaded, this function searches the code path for the first\nfile containing object code for `Module` and returns the absolute filename.\n\n- If the module is loaded, it returns the name of the file containing the loaded\n object code.\n\n- If the module is preloaded, `preloaded` is returned.\n\n- If the module is Cover-compiled, `cover_compiled` is returned.\n\n- If the module cannot be found, `non_existing` is returned.","ref":"code.html#which/1"},{"type":"type","title":"code.add_path_ret/0","doc":"","ref":"code.html#t:add_path_ret/0"},{"type":"type","title":"code.cache/0","doc":"","ref":"code.html#t:cache/0"},{"type":"type","title":"code.coverage_mode/0","doc":"","ref":"code.html#t:coverage_mode/0"},{"type":"type","title":"code.load_error_rsn/0","doc":"","ref":"code.html#t:load_error_rsn/0"},{"type":"type","title":"code.load_ret/0","doc":"","ref":"code.html#t:load_ret/0"},{"type":"type","title":"code.loaded_filename/0","doc":"","ref":"code.html#t:loaded_filename/0"},{"type":"type","title":"code.loaded_ret_atoms/0","doc":"","ref":"code.html#t:loaded_ret_atoms/0"},{"type":"type","title":"code.module_status/0","doc":"","ref":"code.html#t:module_status/0"},{"type":"opaque","title":"code.prepared_code/0","doc":"An opaque term holding prepared code.","ref":"code.html#t:prepared_code/0"},{"type":"type","title":"code.replace_path_ret/0","doc":"","ref":"code.html#t:replace_path_ret/0"},{"type":"type","title":"code.set_path_ret/0","doc":"","ref":"code.html#t:set_path_ret/0"},{"type":"module","title":"erl_ddll","doc":"Dynamic driver loader and linker.\n\nThis module provides an interface for loading and unloading _Erlang linked-in\ndrivers_ in runtime.\n\n> #### Note {: .info }\n>\n> This is a large reference document. For casual use of this module, and for\n> most real world applications, the descriptions of functions `load/2` and\n> `unload/1` are enough to getting started.\n\nThe driver is to be provided as a dynamically linked library in an object code\nformat specific for the platform in use, that is, `.so` files on most Unix\nsystems and `.ddl` files on Windows. An Erlang linked-in driver must provide\nspecific interfaces to the emulator, so this module is not designed for loading\narbitrary dynamic libraries. For more information about Erlang drivers, see\n[`erl_driver`](`e:erts:erl_driver.md`) .\n\n[](){: #users }\n\nWhen describing a set of functions (that is, a module, a part of a module, or an\napplication), executing in a process and wanting to use a ddll-driver, we use\nthe term _user_. A process can have many users (different modules needing the\nsame driver) and many processes running the same code, making up many _users_ of\na driver.\n\nIn the basic scenario, each user loads the driver before starting to use it and\nunloads the driver when done. The reference counting keeps track of processes\nand the number of loads by each process. This way the driver is only unloaded\nwhen no one wants it (it has no user). The driver also keeps track of ports that\nare opened to it. This enables delay of unloading until all ports are closed, or\nkilling of all ports that use the driver when it is unloaded.\n\n[](){: #scenarios }\n\nThe interface supports two basic scenarios of loading and unloading. Each\nscenario can also have the option of either killing ports when the driver is\nunloading, or waiting for the ports to close themselves. The scenarios are as\nfollows:\n\n- **_Load and Unload on a \"When Needed Basis\"_** - This (most common) scenario\n simply supports that each [user](`m:erl_ddll#users`) of the driver loads it\n when needed and unloads it when no longer needed. The driver is always\n reference counted and as long as a process keeping the driver loaded is still\n alive, the driver is present in the system.\n\n Each [user](`m:erl_ddll#users`) of the driver use _literally_ the same\n pathname for the driver when demanding load, but the\n [users](`m:erl_ddll#users`) are not concerned with if the driver is already\n loaded from the file system or if the object code must be loaded from file\n system.\n\n The following two pairs of functions support this scenario:\n\n - **_load/2 and unload/1_** - When using the `load/unload` interfaces, the\n driver is not unloaded until the _last port_ using the driver is closed.\n Function [`unload/1`](`unload/1`) can return immediately, as the\n [users](`m:erl_ddll#users`) have no interest in when the unloading occurs.\n The driver is unloaded when no one needs it any longer.\n\n If a process having the driver loaded dies, it has the same effect as if\n unloading is done.\n\n When loading, function [`load/2`](`load/2`) returns `ok` when any instance\n of the driver is present. Thus, if a driver is waiting to get unloaded\n (because of open ports), it simply changes state to no longer need\n unloading.\n\n - **_load_driver/2 and unload_driver/1_** - These interfaces are intended to\n be used when it is considered an error that ports are open to a driver that\n no [user](`m:erl_ddll#users`) has loaded. The ports that are still open when\n the last [user](`m:erl_ddll#users`) calls\n [`unload_driver/1`](`unload_driver/1`) or when the last process having the\n driver loaded dies, are killed with reason `driver_unloaded`.\n\n The function names `load_driver` and `unload_driver` are kept for backward\n compatibility.\n\n- **_Loading and Reloading for Code Replacement_** - This scenario can occur if\n the driver code needs replacement during operation of the Erlang emulator.\n Implementing driver code replacement is a little more tedious than Beam code\n replacement, as one driver cannot be loaded as both \"old\" and \"new\" code. All\n [users](`m:erl_ddll#users`) of a driver must have it closed (no open ports)\n before the old code can be unloaded and the new code can be loaded.\n\n The unloading/loading is done as one atomic operation, blocking all processes\n in the system from using the driver in question while in progress.\n\n The preferred way to do driver code replacement is to let _one single process_\n keep track of the driver. When the process starts, the driver is loaded. When\n replacement is required, the driver is reloaded. Unload is probably never\n done, or done when the process exits. If more than one\n [user](`m:erl_ddll#users`) has a driver loaded when code replacement is\n demanded, the replacement cannot occur until the last \"other\"\n [user](`m:erl_ddll#users`) has unloaded the driver.\n\n Demanding reload when a reload is already in progress is always an error.\n Using the high-level functions, it is also an error to demand reloading when\n more than one [user](`m:erl_ddll#users`) has the driver loaded.\n\n To simplify driver replacement, avoid designing your system so that more than\n one [user](`m:erl_ddll#users`) has the driver loaded.\n\n The two functions for reloading drivers are to be used together with\n corresponding load functions to support the two different behaviors concerning\n open ports:\n\n - **_load/2 and reload/2_** - This pair of functions is used when reloading is\n to be done after the last open port to the driver is closed.\n\n As [`reload/2`](`reload/2`) waits for the reloading to occur, a misbehaving\n process keeping open ports to the driver (or keeping the driver loaded) can\n cause infinite waiting for reload. Time-outs must be provided outside of the\n process demanding the reload or by using the low-level interface\n `try_load/3` in combination with driver monitors.\n\n - **_load_driver/2 and reload_driver/2_** - This pair of functions are used\n when open ports to the driver are to be killed with reason `driver_unloaded`\n to allow for new driver code to get loaded.\n\n However, if another process has the driver loaded, calling `reload_driver`\n returns error code `pending_process`. As stated earlier, the recommended\n design is to not allow other [users](`m:erl_ddll#users`) than the \"driver\n reloader\" to demand loading of the driver in question.","ref":"erl_ddll.html"},{"type":"module","title":"See Also - erl_ddll","doc":"[`erl_driver(4)`](`e:erts:erl_driver.md`), [`driver_entry(4)`](`e:erts:driver_entry.md`)","ref":"erl_ddll.html#module-see-also"},{"type":"function","title":"erl_ddll.demonitor/1","doc":"Removes a driver monitor in much the same way as `erlang:demonitor/1` in ERTS\ndoes with process monitors.\n\nFor details about how to create driver monitors, see `monitor/2`,\n`try_load/3`, and `try_unload/2`.\n\nThe function throws a `badarg` exception if the parameter is not a\n`t:reference/0`.","ref":"erl_ddll.html#demonitor/1"},{"type":"function","title":"erl_ddll.format_error/1","doc":"Takes an `ErrorDesc` returned by load, unload, or reload functions and returns a\nstring that describes the error or warning.\n\n> #### Note {: .info }\n>\n> Because of peculiarities in the dynamic loading interfaces on different\n> platforms, the returned string is only guaranteed to describe the correct\n> error _if format_error/1 is called in the same instance of the Erlang virtual\n> machine as the error appeared in_ (meaning the same operating system process).","ref":"erl_ddll.html#format_error/1"},{"type":"function","title":"erl_ddll.info/0","doc":"Returns a list of tuples `{DriverName, InfoList}`, where `InfoList` is the\nresult of calling `info/1` for that `DriverName`. Only dynamically linked-in\ndrivers are included in the list.","ref":"erl_ddll.html#info/0"},{"type":"function","title":"erl_ddll.info/1","doc":"Returns a list of tuples `{Tag, Value}`, where `Tag` is the information item and\n`Value` is the result of calling `info/2` with this driver name and this tag.\nThe result is a tuple list containing all information available about a driver.\n\nThe following tags appears in the list:\n\n- `processes`\n- `driver_options`\n- `port_count`\n- `linked_in_driver`\n- `permanent`\n- `awaiting_load`\n- `awaiting_unload`\n\nFor a detailed description of each value, see `info/2`.\n\nThe function throws a `badarg` exception if the driver is not present in the\nsystem.","ref":"erl_ddll.html#info/1"},{"type":"function","title":"erl_ddll.info/2","doc":"Returns specific information about one aspect of a driver. Parameter `Tag`\nspecifies which aspect to get information about. The return `Value` differs\nbetween different tags:\n\n- **`processes`** - Returns all processes containing [users](`m:erl_ddll#users`)\n of the specific drivers as a list of tuples `{pid(),integer() >= 0}`, where\n `t:integer/0` denotes the number of users in process `t:pid/0`.\n\n- **`driver_options`** - Returns a list of the driver options provided when\n loading, and any options set by the driver during initialization. The only\n valid option is `kill_ports`.\n\n- **`port_count`** - Returns the number of ports (an `integer() >= 0`) using the\n driver.\n\n- **`linked_in_driver`** - Returns a `t:boolean/0`, which is `true` if the\n driver is a statically linked-in one, otherwise `false`.\n\n- **`permanent`** - Returns a `t:boolean/0`, which is `true` if the driver has\n made itself permanent (and is _not_ a statically linked-in driver), otherwise\n `false`.\n\n- **`awaiting_load`** - Returns a list of all processes having monitors for\n `loading` active. Each process is returned as `{pid(),integer() >= 0}`, where\n `t:integer/0` is the number of monitors held by process `t:pid/0`.\n\n- **`awaiting_unload`** - Returns a list of all processes having monitors for\n `unloading` active. Each process is returned as `{pid(),integer() >= 0}`,\n where `t:integer/0` is the number of monitors held by process `t:pid/0`.\n\nIf option `linked_in_driver` or `permanent` returns `true`, all other options\nreturn `linked_in_driver` or `permanent`, respectively.\n\nThe function throws a `badarg` exception if the driver is not present in the\nsystem or if the tag is not supported.","ref":"erl_ddll.html#info/2"},{"type":"function","title":"erl_ddll.load/2","doc":"Loads and links the dynamic driver `Name`. `Path` is a file path to the\ndirectory containing the driver. `Name` must be a shareable object/dynamic\nlibrary. Two drivers with different `Path` parameters cannot be loaded under the\nsame name. `Name` is a string or atom containing at least one character.\n\nThe `Name` specified is to correspond to the filename of the dynamically\nloadable object file residing in the directory specified as `Path`, but\n_without_ the extension (that is, `.so`). The driver name provided in the driver\ninitialization routine must correspond with the filename, in much the same way\nas Erlang module names correspond to the names of the `.beam` files.\n\nIf the driver was previously unloaded, but is still present because of open\nports to it, a call to [`load/2`](`load/2`) stops the unloading and keeps the\ndriver (as long as `Path` is the same), and `ok` is returned. If you really want\nthe object code to be reloaded, use `reload/2` or the low-level interface\n`try_load/3` instead. See also the description of\n[`different scenarios`](`m:erl_ddll#scenarios`) for loading/unloading in the\nintroduction.\n\nIf more than one process tries to load an already loaded driver with the same\n`Path`, or if the same process tries to load it many times, the function returns\n`ok`. The emulator keeps track of the [`load/2`](`load/2`) calls, so that a\ncorresponding number of `unload/2` calls must be done from the same process\nbefore the driver gets unloaded. It is therefore safe for an application to load\na driver that is shared between processes or applications when needed. It can\nsafely be unloaded without causing trouble for other parts of the system.\n\nIt is not allowed to load multiple drivers with the same name but with different\n`Path` parameters.\n\n> #### Note {: .info }\n>\n> `Path` is interpreted literally, so that all loaders of the same driver must\n> specify the same _literal_ `Path` string, although different paths can point\n> out the same directory in the file system (because of use of relative paths\n> and links).\n\nOn success, the function returns `ok`. On failure, the return value is\n`{error,ErrorDesc}`, where `ErrorDesc` is an opaque term to be translated into\nhuman readable form by function `format_error/1`.\n\nFor more control over the error handling, use the `try_load/3` interface\ninstead.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#load/2"},{"type":"function","title":"erl_ddll.load_driver/2","doc":"Works essentially as [`load/2`](`load/2`), but loads the driver with other\noptions. All ports using the driver are killed with reason `driver_unloaded`\nwhen the driver is to be unloaded.\n\nThe number of loads and unloads by different [users](`m:erl_ddll#users`)\ninfluences the loading and unloading of a driver file. The port killing\ntherefore only occurs when the _last_ [user](`m:erl_ddll#users`) unloads the\ndriver, or when the last process having loaded the driver exits.\n\nThis interface (or at least the name of the functions) is kept for backward\ncompatibility. Using `try_load/3` with `{driver_options,[kill_ports]}` in the\noption list gives the same effect regarding the port killing.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#load_driver/2"},{"type":"function","title":"erl_ddll.loaded_drivers/0","doc":"Returns a list of all the available drivers, both (statically) linked-in and\ndynamically loaded ones.\n\nThe driver names are returned as a list of strings rather than a list of atoms\nfor historical reasons.\n\nFor more information about drivers, see [`info`](`info/0`).","ref":"erl_ddll.html#loaded_drivers/0"},{"type":"function","title":"erl_ddll.monitor/2","doc":"Creates a driver monitor and works in many ways as `erlang:monitor/2` in ERTS,\ndoes for processes. When a driver changes state, the monitor results in a\nmonitor message that is sent to the calling process. `MonitorRef` returned by\nthis function is included in the message sent.\n\nAs with process monitors, each driver monitor set only generates _one single\nmessage_. The monitor is \"destroyed\" after the message is sent, so it is then\nnot needed to call `demonitor/1`.\n\n`MonitorRef` can also be used in subsequent calls to `demonitor/1` to remove a\nmonitor.\n\nThe function accepts the following parameters:\n\n- **`Tag`** - The monitor tag is always `driver`, as this function can only be\n used to create driver monitors. In the future, driver monitors will be\n integrated with process monitors, why this parameter has to be specified for\n consistence.\n\n- **`Item`** - Parameter `Item` specifies which driver to monitor (the driver\n name) and which state change to monitor. The parameter is a tuple of arity two\n whose first element is the driver name and second element is one of the\n following:\n\n - **`loaded`** - Notifies when the driver is reloaded (or loaded if loading is\n underway). It only makes sense to monitor drivers that are in the process of\n being loaded or reloaded. A future driver name for loading cannot be\n monitored. That only results in a `DOWN` message sent immediately.\n Monitoring for loading is therefore most useful when triggered by function\n `try_load/3`, where the monitor is created _because_ the driver is in such a\n pending state.\n\n Setting a driver monitor for `loading` eventually leads to one of the\n following messages being sent:\n\n - **`{'UP', reference(), driver, Name, loaded}`** - This message is sent\n either immediately if the driver is already loaded and no reloading is\n pending, or when reloading is executed if reloading is pending.\n\n The [user](`m:erl_ddll#users`) is expected to know if reloading is\n demanded before creating a monitor for loading.\n\n - **`{'UP', reference(), driver, Name, permanent}`** - This message is sent\n if reloading was expected, but the (old) driver made itself permanent\n before reloading. It is also sent if the driver was permanent or\n statically linked-in when trying to create the monitor.\n\n - **`{'DOWN', reference(), driver, Name, load_cancelled}`** - This message\n arrives if reloading was underway, but the requesting\n [user](`m:erl_ddll#users`) cancelled it by dying or calling `try_unload/2`\n (or [`unload/1`](`unload/1`)/[`unload_driver/1`](`unload_driver/1`)) again\n before it was reloaded.\n\n - **`{'DOWN', reference(), driver, Name, {load_failure, Failure}}`** - This\n message arrives if reloading was underway but the loading for some reason\n failed. The `Failure` term is one of the errors that can be returned from\n `try_load/3`. The error term can be passed to `format_error/1` for\n translation into human readable form. Notice that the translation must be\n done in the same running Erlang virtual machine as the error was detected\n in.\n\n - **`unloaded`** - Monitors when a driver gets unloaded. If one monitors a\n driver that is not present in the system, one immediately gets notified that\n the driver got unloaded. There is no guarantee that the driver was ever\n loaded.\n\n A driver monitor for unload eventually results in one of the following\n messages being sent:\n\n - **`{'DOWN', reference(), driver, Name, unloaded}`** - The monitored driver\n instance is now unloaded. As the unload can be a result of a\n [`reload/2`](`reload/2`) request, the driver can once again have been\n loaded when this message arrives.\n\n - **`{'UP', reference(), driver, Name, unload_cancelled}`** - This message\n is sent if unloading was expected, but while the driver was waiting for\n all ports to get closed, a new [user](`m:erl_ddll#users`) of the driver\n appeared, and the unloading was cancelled.\n\n This message appears if `{ok, pending_driver}` was returned from\n `try_unload/2` for the last [user](`m:erl_ddll#users`) of the driver, and\n then `{ok, already_loaded}` is returned from a call to `try_load/3`.\n\n If one _really_ wants to monitor when the driver gets unloaded, this\n message distorts the picture, because no unloading was done. Option\n `unloaded_only` creates a monitor similar to an `unloaded` monitor, but\n never results in this message.\n\n - **`{'UP', reference(), driver, Name, permanent}`** - This message is sent\n if unloading was expected, but the driver made itself permanent before\n unloading. It is also sent if trying to monitor a permanent or statically\n linked-in driver.\n\n - **`unloaded_only`** - A monitor created as `unloaded_only` behaves exactly\n as one created as `unloaded` except that the\n `{'UP', reference(), driver, Name, unload_cancelled}` message is never sent,\n but the monitor instead persists until the driver _really_ gets unloaded.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#monitor/2"},{"type":"function","title":"erl_ddll.reload/2","doc":"Reloads the driver named `Name` from a possibly different `Path` than previously\nused. This function is used in the code change\n[`scenario`](`m:erl_ddll#scenarios`) described in the introduction.\n\nIf there are other [users](`m:erl_ddll#users`) of this driver, the function\nreturns `{error, pending_process}`, but if there are no other users, the\nfunction call hangs until all open ports are closed.\n\n> #### Note {: .info }\n>\n> Avoid mixing multiple [users](`m:erl_ddll#users`) with driver reload requests.\n\nTo avoid hanging on open ports, use function `try_load/3` instead.\n\nThe `Name` and `Path` parameters have exactly the same meaning as when calling\nthe plain function `load/2`.\n\nOn success, the function returns `ok`. On failure, the function returns an\nopaque error, except the `pending_process` error described earlier. The opaque\nerrors are to be translated into human readable form by function\n`format_error/1`.\n\nFor more control over the error handling, use the `try_load/3` interface\ninstead.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#reload/2"},{"type":"function","title":"erl_ddll.reload_driver/2","doc":"Works exactly as `reload/2`, but for drivers loaded with the `load_driver/2`\ninterface.\n\nAs this interface implies that ports are killed when the last user disappears,\nthe function does not hang waiting for ports to get closed.\n\nFor more details, see [`scenarios`](`m:erl_ddll#scenarios`) in this module\ndescription and the function description for `reload/2`.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#reload_driver/2"},{"type":"function","title":"erl_ddll.try_load/3","doc":"Provides more control than the [`load/2`](`load/2`)/[`reload/2`](`reload/2`) and\n[`load_driver/2`](`load_driver/2`)/[`reload_driver/2`](`reload_driver/2`)\ninterfaces. It never waits for completion of other operations related to the\ndriver, but immediately returns the status of the driver as one of the\nfollowing:\n\n- **`{ok, loaded}`** - The driver was loaded and is immediately usable.\n\n- **`{ok, already_loaded}`** - The driver was already loaded by another process\n or is in use by a living port, or both. The load by you is registered and a\n corresponding `try_unload` is expected sometime in the future.\n\n- **`{ok, pending_driver}`or `{ok, pending_driver, reference()}`** - The load\n request is registered, but the loading is delayed because an earlier instance\n of the driver is still waiting to get unloaded (open ports use it). Still,\n unload is expected when you are done with the driver. This return value\n _mostly_ occurs when options `{reload,pending_driver}` or `{reload,pending}`\n are used, but _can_ occur when another [user](`m:erl_ddll#users`) is unloading\n a driver in parallel and driver option `kill_ports` is set. In other words,\n this return value always needs to be handled.\n\n- **`{ok, pending_process}`or `{ok, pending_process, reference()}`** - The load\n request is registered, but the loading is delayed because an earlier instance\n of the driver is still waiting to get unloaded by another\n [user](`m:erl_ddll#users`) (not only by a port, in which case\n `{ok,pending_driver}` would have been returned). Still, unload is expected\n when you are done with the driver. This return value _only_ occurs when option\n `{reload,pending}` is used.\n\nWhen the function returns `{ok, pending_driver}` or `{ok, pending_process}`, one\ncan get information about when the driver is _actually_ loaded by using option\n`{monitor, MonitorOption}`.\n\nWhen monitoring is requested, and a corresponding `{ok, pending_driver}` or\n`{ok, pending_process}` would be returned, the function instead returns a tuple\n`{ok, PendingStatus, reference()}` and the process then gets a monitor message\nlater, when the driver gets loaded. The monitor message to expect is described\nin the function description of `monitor/2`.\n\n> #### Note {: .info }\n>\n> In case of loading, monitoring can _not_ only get triggered by using option\n> `{reload, ReloadOption}`, but also in special cases where the load error is\n> transient. Thus, `{monitor, pending_driver}` is to be used under basically\n> _all_ real world circumstances.\n\nThe function accepts the following parameters:\n\n- **`Path`** - The file system path to the directory where the driver object\n file is located. The filename of the object file (minus extension) must\n correspond to the driver name (used in parameter `Name`) and the driver must\n identify itself with the same name. `Path` can be provided as an _iolist()_,\n meaning it can be a list of other `t:iolist/0`s, characters (8-bit integers),\n or binaries, all to be flattened into a sequence of characters.\n\n The (possibly flattened) `Path` parameter must be consistent throughout the\n system. A driver is to, by all [users](`m:erl_ddll#users`), be loaded using\n the same _literal_ `Path`. The exception is when _reloading_ is requested, in\n which case `Path` can be specified differently. Notice that all\n [users](`m:erl_ddll#users`) trying to load the driver later need to use the\n _new_ `Path` if `Path` is changed using a `reload` option. This is yet another\n reason to have _only one loader_ of a driver one wants to upgrade in a running\n system.\n\n- **`Name`** - This parameter is the name of the driver to be used in subsequent\n calls to function [`erlang:open_port`](`erlang:open_port/2`) in ERTS. The name\n can be specified as an `t:iolist/0` or an `t:atom/0`. The name specified when\n loading is used to find the object file (with the help of `Path` and the\n system-implied extension suffix, that is, `.so`). The name by which the driver\n identifies itself must also be consistent with this `Name` parameter, much as\n the module name of a Beam file much corresponds to its filename.\n\n- **`OptionList`** - Some options can be specified to control the loading\n operation. The options are specified as a list of two-tuples. The tuples have\n the following values and meanings:\n\n - **`{driver_options, DriverOptionList}`** - This is to provide options that\n changes its general behavior and \"sticks\" to the driver throughout its\n lifespan.\n\n The driver options for a specified driver name need always to be consistent,\n _even when the driver is reloaded_, meaning that they are as much a part of\n the driver as the name.\n\n The only allowed driver option is `kill_ports`, which means that all ports\n opened to the driver are killed with exit reason `driver_unloaded` when no\n process any longer has the driver loaded. This situation arises either when\n the last [user](`m:erl_ddll#users`) calls `try_unload/2`, or when the last\n process having loaded the driver exits.\n\n - **`{monitor, MonitorOption}`** - A `MonitorOption` tells\n [`try_load/3`](`try_load/3`) to trigger a driver monitor under certain\n conditions. When the monitor is triggered, the function returns a\n three-tuple `{ok, PendingStatus, reference()}`, where `t:reference/0` is the\n monitor reference for the driver monitor.\n\n Only one `MonitorOption` can be specified. It is one of the following:\n\n - The atom `pending`, which means that a monitor is to be created whenever a\n load operation is delayed,\n - The atom `pending_driver`, in which a monitor is created whenever the\n operation is delayed because of open ports to an otherwise unused driver.\n\n Option `pending_driver` is of little use, but is present for completeness,\n as it is well defined which reload options that can give rise to which\n delays. However, it can be a good idea to use the same `MonitorOption` as\n the `ReloadOption`, if present.\n\n If reloading is not requested, it can still be useful to specify option\n `monitor`, as forced unloads (driver option `kill_ports` or option\n `kill_ports` to `try_unload/2`) trigger a transient state where driver\n loading cannot be performed until all closing ports are closed. Thus, as\n `try_unload` can, in almost all situations, return `{ok, pending_driver}`,\n always specify at least `{monitor, pending_driver}` in production code (see\n the monitor discussion earlier).\n\n - **`{reload, ReloadOption}`** - This option is used to _reload_ a driver from\n disk, most often in a code upgrade scenario. Having a `reload` option also\n implies that parameter `Path` does _not_ need to be consistent with earlier\n loads of the driver.\n\n To reload a driver, the process must have loaded the driver before, that is,\n there must be an active [user](`m:erl_ddll#users`) of the driver in the\n process.\n\n The `reload` option can be either of the following:\n\n - **`pending`** - With the atom `pending`, reloading is requested for any\n driver and is effectuated when _all_ ports opened to the driver are\n closed. The driver replacement in this case takes place regardless if\n there are still pending [users](`m:erl_ddll#users`) having the driver\n loaded.\n\n The option also triggers port-killing (if driver option `kill_ports` is\n used) although there are pending users, making it usable for forced driver\n replacement, but laying much responsibility on the driver\n [users](`m:erl_ddll#users`). The pending option is seldom used as one does\n not want other [users](`m:erl_ddll#users`) to have loaded the driver when\n code change is underway.\n\n - **`pending_driver`** - This option is more useful. Here, reloading is\n queued if the driver is _not_ loaded by any other\n [users](`m:erl_ddll#users`), but the driver has opened ports, in which\n case `{ok, pending_driver}` is returned (a `monitor` option is\n recommended).\n\n If the driver is unloaded (not present in the system), error code\n `not_loaded` is returned. Option `reload` is intended for when the user has\n already loaded the driver in advance.\n\nThe function can return numerous errors, some can only be returned given a\ncertain combination of options.\n\nSome errors are opaque and can only be interpreted by passing them to function\n`format_error/1`, but some can be interpreted directly:\n\n- **`{error,linked_in_driver}`** - The driver with the specified name is an\n Erlang statically linked-in driver, which cannot be manipulated with this API.\n\n- **`{error,inconsistent}`** - The driver is already loaded with other\n `DriverOptionList` or a different _literal_ `Path` argument.\n\n This can occur even if a `reload` option is specified, if `DriverOptionList`\n differs from the current.\n\n- **`{error, permanent}`** - The driver has requested itself to be permanent,\n making it behave like an Erlang linked-in driver and can no longer be\n manipulated with this API.\n\n- **`{error, pending_process}`** - The driver is loaded by other\n [users](`m:erl_ddll#users`) when option `{reload, pending_driver}` was\n specified.\n\n- **`{error, pending_reload}`** - Driver reload is already requested by another\n [user](`m:erl_ddll#users`) when option `{reload, ReloadOption}` was specified.\n\n- **`{error, not_loaded_by_this_process}`** - Appears when option `reload` is\n specified. The driver `Name` is present in the system, but there is no\n [user](`m:erl_ddll#users`) of it in this process.\n\n- **`{error, not_loaded}`** - Appears when option `reload` is specified. The\n driver `Name` is not in the system. Only drivers loaded by this process can be\n reloaded.\n\nAll other error codes are to be translated by function `format_error/1`. Notice\nthat calls to `format_error` are to be performed from the same running instance\nof the Erlang virtual machine as the error is detected in, because of\nsystem-dependent behavior concerning error values.\n\nIf the arguments or options are malformed, the function throws a `badarg`\nexception.","ref":"erl_ddll.html#try_load/3"},{"type":"function","title":"erl_ddll.try_unload/2","doc":"This is the low-level function to unload (or decrement reference counts of) a\ndriver. It can be used to force port killing, in much the same way as the driver\noption `kill_ports` implicitly does. Also, it can trigger a monitor either\nbecause other [users](`m:erl_ddll#users`) still have the driver loaded or\nbecause open ports use the driver.\n\nUnloading can be described as the process of telling the emulator that this\nparticular part of the code in this particular process (that is, this\n[user](`m:erl_ddll#users`)) no longer needs the driver. That can, if there are\nno other users, trigger unloading of the driver, in which case the driver name\ndisappears from the system and (if possible) the memory occupied by the driver\nexecutable code is reclaimed.\n\nIf the driver has option `kill_ports` set, or if `kill_ports` is specified as an\noption to this function, all pending ports using this driver are killed when\nunloading is done by the last [user](`m:erl_ddll#users`). If no port-killing is\ninvolved and there are open ports, the unloading is delayed until no more open\nports use the driver. If, in this case, another [user](`m:erl_ddll#users`) (or\neven this user) loads the driver again before the driver is unloaded, the\nunloading never takes place.\n\nTo allow the [user](`m:erl_ddll#users`) to _request unloading_ to wait for\n_actual unloading_, `monitor` triggers can be specified in much the same way as\nwhen loading. However, as [users](`m:erl_ddll#users`) of this function seldom\nare interested in more than decrementing the reference counts, monitoring is\nseldom needed.\n\n> #### Note {: .info }\n>\n> If option `kill_ports` is used, monitor trigging is crucial, as the ports are\n> not guaranteed to be killed until the driver is unloaded. Thus, a monitor must\n> be triggered for at least the `pending_driver` case.\n\nThe possible monitor messages to expect are the same as when using option\n`unloaded` to function `monitor/2`.\n\nThe function returns one of the following statuses upon success:\n\n- **`{ok, unloaded}`** - The driver was immediately unloaded, meaning that the\n driver name is now free to use by other drivers and, if the underlying OS\n permits it, the memory occupied by the driver object code is now reclaimed.\n\n The driver can only be unloaded when there are no open ports using it and no\n more [users](`m:erl_ddll#users`) require it to be loaded.\n\n- **`{ok, pending_driver}`or `{ok, pending_driver, reference()}`** - Indicates\n that this call removed the last [user](`m:erl_ddll#users`) from the driver,\n but there are still open ports using it. When all ports are closed and no new\n [users](`m:erl_ddll#users`) have arrived, the driver is reloaded and the name\n and memory reclaimed.\n\n This return value is valid even if option `kill_ports` was used, as killing\n ports can be a process that does not complete immediately. However, the\n condition is in that case transient. Monitors are always useful to detect when\n the driver is really unloaded.\n\n- **`{ok, pending_process}`or `{ok, pending_process, reference()}`** - The\n unload request is registered, but other [users](`m:erl_ddll#users`) still hold\n the driver. Notice that the term `pending_process` can refer to the running\n process; there can be more than one [user](`m:erl_ddll#users`) in the same\n process.\n\n This is a normal, healthy, return value if the call was just placed to inform\n the emulator that you have no further use of the driver. It is the most common\n return value in the most common [`scenario`](`m:erl_ddll#scenarios`) described\n in the introduction.\n\nThe function accepts the following parameters:\n\n- **`Name`** - `Name` is the name of the driver to be unloaded. The name can be\n specified as an `t:iolist/0` or as an `t:atom/0`.\n\n- **`OptionList`** - Argument `OptionList` can be used to specify certain\n behavior regarding ports and triggering monitors under certain conditions:\n\n - **`kill_ports`** - Forces killing of all ports opened using this driver,\n with exit reason `driver_unloaded`, if you are the _last_\n [user](`m:erl_ddll#users`) of the driver.\n\n If other [users](`m:erl_ddll#users`) have the driver loaded, this option has\n no effect.\n\n To get the consistent behavior of killing ports when the last\n [user](`m:erl_ddll#users`) unloads, use driver option `kill_ports` when\n loading the driver instead.\n\n - **`{monitor, MonitorOption}`** - Creates a driver monitor if the condition\n specified in `MonitorOption` is true. The valid options are:\n\n - **`pending_driver`** - Creates a driver monitor if the return value is to\n be `{ok, pending_driver}`.\n\n - **`pending`** - Creates a monitor if the return value is\n `{ok, pending_driver}` or `{ok, pending_process}`.\n\n The `pending_driver` `MonitorOption` is by far the most useful. It must be\n used to ensure that the driver really is unloaded and the ports closed\n whenever option `kill_ports` is used, or the driver can have been loaded\n with driver option `kill_ports`.\n\n Using the monitor triggers in the call to `try_unload` ensures that the\n monitor is added before the unloading is executed, meaning that the monitor\n is always properly triggered, which is not the case if\n [`monitor/2`](`monitor/2`) is called separately.\n\nThe function can return the following error conditions, all well specified (no\nopaque values):\n\n- **`{error, linked_in_driver}`** - You were trying to unload an Erlang\n statically linked-in driver, which cannot be manipulated with this interface\n (and cannot be unloaded at all).\n\n- **`{error, not_loaded}`** - The driver `Name` is not present in the system.\n\n- **`{error, not_loaded_by_this_process}`** - The driver `Name` is present in\n the system, but there is no [user](`m:erl_ddll#users`) of it in this process.\n\n As a special case, drivers can be unloaded from processes that have done no\n corresponding call to [`try_load/3`](`try_load/3`) if, and only if, there are\n _no users of the driver at all_, which can occur if the process containing the\n last user dies.\n\n- **`{error, permanent}`** - The driver has made itself permanent, in which case\n it can no longer be manipulated by this interface (much like a statically\n linked-in driver).\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#try_unload/2"},{"type":"function","title":"erl_ddll.unload/1","doc":"Unloads, or at least dereferences the driver named `Name`. If the caller is the\nlast [user](`m:erl_ddll#users`) of the driver, and no more open ports use the\ndriver, the driver gets unloaded. Otherwise, unloading is delayed until all\nports are closed and no [users](`m:erl_ddll#users`) remain.\n\nIf there are other [users](`m:erl_ddll#users`) of the driver, the reference\ncounts of the driver is merely decreased, so that the caller is no longer\nconsidered a [user](`m:erl_ddll#users`) of the driver. For use scenarios, see\nthe [`description`](`m:erl_ddll#scenarios`) in the beginning of this module.\n\nThe `ErrorDesc` returned is an opaque value to be passed further on to function\n`format_error/1`. For more control over the operation, use the `try_unload/2`\ninterface.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#unload/1"},{"type":"function","title":"erl_ddll.unload_driver/1","doc":"Unloads, or at least dereferences the driver named `Name`. If the caller is the\nlast [user](`m:erl_ddll#users`) of the driver, all remaining open ports using\nthe driver are killed with reason `driver_unloaded` and the driver eventually\ngets unloaded.\n\nIf there are other [users](`m:erl_ddll#users`) of the driver, the reference\ncounts of the driver is merely decreased, so that the caller is no longer\nconsidered a [user](`m:erl_ddll#users`). For use scenarios, see the\n[`description`](`m:erl_ddll#scenarios`) in the beginning of this module.\n\nThe `ErrorDesc` returned is an opaque value to be passed further on to function\n`format_error/1`. For more control over the operation, use the `try_unload/2`\ninterface.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","ref":"erl_ddll.html#unload_driver/1"},{"type":"type","title":"erl_ddll.driver/0","doc":"","ref":"erl_ddll.html#t:driver/0"},{"type":"type","title":"erl_ddll.path/0","doc":"","ref":"erl_ddll.html#t:path/0"},{"type":"module","title":"error_handler","doc":"Default system error handler.\n\nThis module defines what happens when certain types of errors occur.\n\nYou can change the error handler of a process by calling\n[`erlang:process_flag(error_handler, NewErrorHandler)`](`erlang#process_flag_error_handler`).","ref":"error_handler.html"},{"type":"module","title":"Notes - error_handler","doc":"The code in `error_handler` is complex. Do not change it without fully\nunderstanding the interaction between the error handler, the `init` process of\nthe code server, and the I/O mechanism of the code.\n\nCode changes that seem small can cause a deadlock, as unforeseen consequences\ncan occur. The use of `input` is dangerous in this type of code.","ref":"error_handler.html#module-notes"},{"type":"function","title":"error_handler.raise_undef_exception/3","doc":"Raises an `undef` exception with a stacktrace, indicating that\n`Module:Function/N` is undefined.","ref":"error_handler.html#raise_undef_exception/3"},{"type":"function","title":"error_handler.undefined_function/3","doc":"This function is called by the runtime system if a call is made to\n`Module:Function(Arg1,.., ArgN)` and `Module:Function/N` is undefined. Notice\nthat this function is evaluated inside the process making the original call.\n\nThis function first attempts to autoload `Module`. If that is not possible, an\n`undef` exception is raised.\n\nIf it is possible to load `Module` and function `Function/N` is exported, it is\ncalled.\n\nOtherwise, if function `'$handle_undefined_function'/2` is exported, it is\ncalled as `'$handle_undefined_function'(`Function, Args).\n\n> #### Warning {: .warning }\n>\n> Defining `'$handle_undefined_function'/2` in ordinary application code is\n> highly discouraged. It is very easy to make subtle errors that can take a long\n> time to debug. Furthermore, none of the tools for static code analysis (such\n> as Dialyzer and Xref) supports the use of `'$handle_undefined_function'/2` and\n> no such support will be added. Only use this function after having carefully\n> considered other, less dangerous, solutions. One example of potential\n> legitimate use is creating stubs for other sub-systems during testing and\n> debugging.\n\nOtherwise an `undef` exception is raised.","ref":"error_handler.html#undefined_function/3"},{"type":"function","title":"error_handler.undefined_lambda/3","doc":"This function is evaluated if a call is made to `Fun(Arg1,.., ArgN)` when the\nmodule defining the fun is not loaded. The function is evaluated inside the\nprocess making the original call.\n\nIf `Module` is interpreted, the interpreter is invoked and the return value of\nthe interpreted `Fun(Arg1,.., ArgN)` call is returned.\n\nOtherwise, it returns, if possible, the value of [`apply(Fun, Args)`](`apply/2`)\nafter an attempt is made to autoload `Module`. If this is not possible, the call\nfails with exit reason `undef`.","ref":"error_handler.html#undefined_lambda/3"},{"type":"module","title":"heart","doc":"Heartbeat monitoring of an Erlang runtime system.\n\nThis modules contains the interface to the `heart` process. `heart` sends\nperiodic heartbeats to an external port program, which is also named `heart`.\nThe purpose of the `heart` port program is to check that the Erlang runtime\nsystem it is supervising is still running. If the port program has not received\nany heartbeats within `HEART_BEAT_TIMEOUT` seconds (defaults to 60 seconds), the\nsystem can be rebooted.\n\nAn Erlang runtime system to be monitored by a heart program is to be started\nwith command-line flag `-heart` (see also [`erl(1)`](`e:erts:erl_cmd.md`)). The\n`heart` process is then started automatically:\n\n```text\n% erl -heart ...\n```\n\nIf the system is to be rebooted because of missing heartbeats, or a terminated\nErlang runtime system, environment variable `HEART_COMMAND` must be set before\nthe system is started. If this variable is not set, a warning text is printed\nbut the system does not reboot.\n\nTo reboot on Windows, `HEART_COMMAND` can be set to `heart -shutdown` (included\nin the Erlang delivery) or to any other suitable program that can activate a\nreboot.\n\nThe environment variable `HEART_BEAT_TIMEOUT` can be used to configure the heart\ntime-outs; it can be set in the operating system shell before Erlang is started\nor be specified at the command line:\n\n```text\n% erl -heart -env HEART_BEAT_TIMEOUT 30 ...\n```\n\nThe value (in seconds) must be in the range `10 < X <= 65535`.\n\nWhen running on OSs lacking support for monotonic time, `heart` is susceptible\nto system clock adjustments of more than `HEART_BEAT_TIMEOUT` seconds. When this\nhappens, `heart` times out and tries to reboot the system. This can occur, for\nexample, if the system clock is adjusted automatically by use of the Network\nTime Protocol (NTP).\n\nIf a crash occurs, an `erl_crash.dump` is _not_ written unless environment\nvariable `ERL_CRASH_DUMP_SECONDS` is set:\n\n```text\n% erl -heart -env ERL_CRASH_DUMP_SECONDS 10 ...\n```\n\nIf a regular core dump is wanted, let `heart` know by setting the kill signal to\nabort using environment variable `HEART_KILL_SIGNAL=SIGABRT`. If unset, or not\nset to `SIGABRT`, the default behavior is a kill signal using `SIGKILL`:\n\n```text\n% erl -heart -env HEART_KILL_SIGNAL SIGABRT ...\n```\n\nIf heart should _not_ kill the Erlang runtime system, this can be indicated\nusing the environment variable `HEART_NO_KILL=TRUE`. This can be useful if the\ncommand executed by heart takes care of this, for example as part of a specific\ncleanup sequence. If unset, or not set to `TRUE`, the default behaviour will be\nto kill as described above.\n\n```text\n% erl -heart -env HEART_NO_KILL 1 ...\n```\n\nFurthermore, `ERL_CRASH_DUMP_SECONDS` has the following behavior on `heart`:\n\n- **`ERL_CRASH_DUMP_SECONDS=0`** - Suppresses the writing of a crash dump file\n entirely, thus rebooting the runtime system immediately. This is the same as\n not setting the environment variable.\n\n- **`ERL_CRASH_DUMP_SECONDS=-1`** - Setting the environment variable to a\n negative value does not reboot the runtime system until the crash dump file is\n completely written.\n\n- **`ERL_CRASH_DUMP_SECONDS=S`** - `heart` waits for `S` seconds to let the\n crash dump file be written. After `S` seconds, `heart` reboots the runtime\n system, whether the crash dump file is written or not.\n\nIn the following descriptions, all functions fail with reason `badarg` if\n`heart` is not started.","ref":"heart.html"},{"type":"function","title":"heart.clear_callback/0","doc":"Removes the validation callback call before heartbeats.","ref":"heart.html#clear_callback/0"},{"type":"function","title":"heart.clear_cmd/0","doc":"Clears the temporary boot command. If the system terminates, the normal\n`HEART_COMMAND` is used to reboot.","ref":"heart.html#clear_cmd/0"},{"type":"function","title":"heart.get_callback/0","doc":"Get the validation callback. If the callback is cleared, `none` will be\nreturned.","ref":"heart.html#get_callback/0"},{"type":"function","title":"heart.get_cmd/0","doc":"Gets the temporary reboot command. If the command is cleared, the empty string\nis returned.","ref":"heart.html#get_cmd/0"},{"type":"function","title":"heart.get_options/0","doc":"Returns `{ok, Options}` where `Options` is a list of current options enabled for\nheart. If the callback is cleared, `none` will be returned.","ref":"heart.html#get_options/0"},{"type":"function","title":"heart.set_callback/2","doc":"This validation callback will be executed before any heartbeat is sent to the\nport program. For the validation to succeed it needs to return with the value\n`ok`.\n\nAn exception within the callback will be treated as a validation failure.\n\nThe callback will be removed if the system reboots.","ref":"heart.html#set_callback/2"},{"type":"function","title":"heart.set_cmd/1","doc":"Sets a temporary reboot command. This command is used if a `HEART_COMMAND` other\nthan the one specified with the environment variable is to be used to reboot the\nsystem. The new Erlang runtime system uses (if it misbehaves) environment\nvariable `HEART_COMMAND` to reboot.\n\nLimitations: Command string `Cmd` is sent to the `heart` program as an ISO\nLatin-1 or UTF-8 encoded binary, depending on the filename encoding mode of the\nemulator (see `file:native_name_encoding/0`). The size of the encoded binary\nmust be less than 2047 bytes.","ref":"heart.html#set_cmd/1"},{"type":"function","title":"heart.set_options/1","doc":"Valid options `set_options` are:\n\n- **`check_schedulers`** - If enabled, a signal will be sent to each scheduler\n to check its responsiveness. The system check occurs before any heartbeat sent\n to the port program. If any scheduler is not responsive enough the heart\n program will not receive its heartbeat and thus eventually terminate the node.\n\nReturns with the value `ok` if the options are valid.","ref":"heart.html#set_options/1"},{"type":"type","title":"heart.heart_option/0","doc":"","ref":"heart.html#t:heart_option/0"},{"type":"module","title":"os","doc":"Operating system-specific functions.\n\nThe functions in this module are operating system-specific. Careless use of\nthese functions results in programs that will only run on a specific platform.\nOn the other hand, with careful use, these functions can be of help in enabling\na program to run on most platforms.\n\n> #### Note {: .info }\n>\n> The functions in this module will raise a `badarg` exception if their\n> arguments contain invalid characters according to the description in the \"Data\n> Types\" section.","ref":"os.html"},{"type":"function","title":"os.cmd/1","doc":"","ref":"os.html#cmd/1"},{"type":"function","title":"os.cmd/2","doc":"Executes `Command` in a command shell of the target OS, captures the standard\noutput and standard error of the command, and returns this result as a string.\n\nThe command shell can be set using the\n[kernel configuration parameter](kernel_app.md#os_cmd_shell), by default the\nshell is detected upon system startup.\n\n_Examples:_\n\n```erlang\nLsOut = os:cmd(\"ls\"), % on unix platform\nDirOut = os:cmd(\"dir\"), % on Win32 platform\n```\n\nNotice that in some cases, standard output of a command when called from another\nprogram can differ, compared with the standard output of the command when called\ndirectly from an OS command shell.\n\nThe possible options are:\n\n- **`max_size`** - The maximum size of the data returned by the `os:cmd` call.\n This option is a safety feature that should be used when the command executed\n can return a very large, possibly infinite, result.\n\n ```erlang\n > os:cmd(\"cat /dev/zero\", #{ max_size => 20 }).\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\n ```","ref":"os.html#cmd/2"},{"type":"function","title":"os.env/0","doc":"Returns a list of all environment variables. Each environment variable is\nexpressed as a tuple `{VarName,Value}`, where `VarName` is the name of the\nvariable and `Value` its value.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings can\ncontain characters with codepoints > 255.","ref":"os.html#env/0"},{"type":"function","title":"os.find_executable/1","doc":"Equivalent to [`find_executable(Name, Path)`](`find_executable/2`) where\n`Path` is the current execution path (that is, the environment variable `PATH`\non Unix and Windows).","ref":"os.html#find_executable/1"},{"type":"function","title":"os.find_executable/2","doc":"Look up an executable program, with the specified name and a search path, in the\nsame way as the underlying OS.\n\n`Path` is to conform to the syntax of execution paths on the OS.\nReturns the absolute filename of the executable program `Name`, or `false` if\nthe program is not found.","ref":"os.html#find_executable/2"},{"type":"function","title":"os.getenv/0","doc":"Returns a list of all environment variables. Each environment variable is\nexpressed as a single string on the format `\"VarName=Value\"`, where `VarName` is\nthe name of the variable and `Value` its value.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings can\ncontain characters with codepoints > 255.\n\nConsider using `env/0` for a nicer 2-tuple format.","ref":"os.html#getenv/0"},{"type":"function","title":"os.getenv/1","doc":"Returns the `Value` of the environment variable `VarName`, or `false` if the\nenvironment variable is undefined.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings\n`VarName` and `Value` can contain characters with codepoints > 255.","ref":"os.html#getenv/1"},{"type":"function","title":"os.getenv/2","doc":"Returns the `Value` of the environment variable `VarName`, or `DefaultValue` if\nthe environment variable is undefined.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings\n`VarName` and `Value` can contain characters with codepoints > 255.","ref":"os.html#getenv/2"},{"type":"function","title":"os.getpid/0","doc":"Returns the process identifier of the current Erlang emulator in the format most\ncommonly used by the OS environment.\n\nReturns `Value` as a string containing the (usually) numerical identifier for a process.\n\n- On Unix, this is typically the return value of the `getpid/0` system call.\n- On Windows, the process id as returned by the `GetCurrentProcessId()` system call\n is used.","ref":"os.html#getpid/0"},{"type":"function","title":"os.perf_counter/0","doc":"Returns the current performance counter value in `perf_counter`\n[time unit](`t:erlang:time_unit/0`). This is a highly optimized call that\nmight not be traceable.","ref":"os.html#perf_counter/0"},{"type":"function","title":"os.perf_counter/1","doc":"Returns a performance counter that can be used as a very fast and high\nresolution timestamp.\n\nThis counter is read directly from the hardware or operating system with the\nsame guarantees. This means that two consecutive calls to the function are not\nguaranteed to be monotonic, though it most likely will be. The performance\ncounter will be converted to the resolution passed as an argument.\n\n```erlang\n1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).\n176525861\n2> T2 - T1.\n10004\n```","ref":"os.html#perf_counter/1"},{"type":"function","title":"os.putenv/2","doc":"Sets a new `Value` for environment variable `VarName`.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings\n`VarName` and `Value` can contain characters with codepoints > 255.\n\nOn Unix platforms, the environment is set using UTF-8 encoding if Unicode\nfilename translation is in effect. On Windows, the environment is set using wide\ncharacter interfaces.","ref":"os.html#putenv/2"},{"type":"function","title":"os.set_signal/2","doc":"Enables or disables OS signals.\n\nEach signal my be set to one of the following options:\n\n- **`ignore`** - This signal will be ignored.\n\n- **`default`** - This signal will use the default signal handler for the\n operating system.\n\n- **`handle`** - This signal will notify\n [`erl_signal_server`](kernel_app.md#erl_signal_server) when it is received by\n the Erlang runtime system.","ref":"os.html#set_signal/2"},{"type":"function","title":"os.system_time/0","doc":"Returns the current [OS system time](`e:erts:time_correction.md#os-system-time`)\nin `native` [time unit](`t:erlang:time_unit/0`).\n\n> #### Note {: .info }\n>\n> This time is _not_ a monotonically increasing time.","ref":"os.html#system_time/0"},{"type":"function","title":"os.system_time/1","doc":"Returns the current [OS system time](`e:erts:time_correction.md#os-system-time`)\nconverted into the `Unit` passed as argument.\n\nCalling `os:system_time(Unit)` is equivalent to\n[`erlang:convert_time_unit`](`erlang:convert_time_unit/3`)([`os:system_time()`](`system_time/0`)`, native, Unit)`.\n\n> #### Note {: .info }\n>\n> This time is _not_ a monotonically increasing time.","ref":"os.html#system_time/1"},{"type":"function","title":"os.timestamp/0","doc":"Returns the current [OS system time](`e:erts:time_correction.md#os-system-time`)\nin the same format as `erlang:timestamp/0`.\n\nThe tuple can be used together with function `calendar:now_to_universal_time/1`\nor `calendar:now_to_local_time/1` to get calendar time. Using the calendar time,\ntogether with the `MicroSecs` part of the return tuple from this function,\nallows you to log time stamps in high resolution and consistent with the time in\n the rest of the OS.\n\nExample of code formatting a string in format \"DD Mon YYYY HH:MM:SS.mmmmmm\",\nwhere DD is the day of month, Mon is the textual month name, YYYY is the year,\nHH:MM:SS is the time, and mmmmmm is the microseconds in six positions:\n\n```erlang\n-module(print_time).\n-export([format_utc_timestamp/0]).\nformat_utc_timestamp() ->\n TS = {_,_,Micro} = os:timestamp(),\n {{Year,Month,Day},{Hour,Minute,Second}} =\ncalendar:now_to_universal_time(TS),\n Mstr = element(Month,{\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\n \"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"}),\n io_lib:format(\"~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w\",\n [Day,Mstr,Year,Hour,Minute,Second,Micro]).\n```\n\nThis module can be used as follows:\n\n```erlang\n1> io:format(\"~s~n\",[print_time:format_utc_timestamp()]).\n29 Apr 2009 9:55:30.051711\n```\n\nOS system time can also be retrieved by `system_time/0` and `system_time/1`.","ref":"os.html#timestamp/0"},{"type":"function","title":"os.type/0","doc":"Returns the `Osfamily` and, in some cases, the `Osname` of the current OS.\n\nOn Unix, `Osname` has the same value as `uname -s` returns, but in lower case.\nFor example, on Solaris 1 and 2, it is `sunos`.\n\nOn Windows, `Osname` is `nt`.\n\n> #### Note {: .info }\n>\n> Think twice before using this function. Use module `m:filename` if you want to\n> inspect or build filenames in a portable way. Avoid matching on atom `Osname`.","ref":"os.html#type/0"},{"type":"function","title":"os.unsetenv/1","doc":"Deletes the environment variable `VarName`.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the string\n`VarName` can contain characters with codepoints > 255.","ref":"os.html#unsetenv/1"},{"type":"function","title":"os.version/0","doc":"Returns the OS version. On most systems, this function returns a tuple, but a\nstring is returned instead if the system has versions that cannot be expressed\nas three numbers.\n\n> #### Note {: .info }\n>\n> Think twice before using this function. If you still need to use it, always\n> `call os:type()` first.","ref":"os.html#version/0"},{"type":"type","title":"os.env_var_name/0","doc":"A string containing valid characters on the specific OS for environment variable\nnames using [`file:native_name_encoding()`](`file:native_name_encoding/0`)\nencoding.\n\nNull characters (integer value zero) are not allowed. On Unix, `=`\ncharacters are not allowed. On Windows, a `=` character is only allowed as the\nvery first character in the string.","ref":"os.html#t:env_var_name/0"},{"type":"type","title":"os.env_var_name_value/0","doc":"Assuming that environment variables has been correctly set, a strings containing\nvalid characters on the specific OS for environment variable names and values\nusing [`file:native_name_encoding()`](`file:native_name_encoding/0`) encoding.\n\nThe first `=` characters appearing in the string separates environment variable\nname (on the left) from environment variable value (on the right).","ref":"os.html#t:env_var_name_value/0"},{"type":"type","title":"os.env_var_value/0","doc":"A string containing valid characters on the specific OS for environment variable\nvalues using [`file:native_name_encoding()`](`file:native_name_encoding/0`)\nencoding.\n\nNull characters (integer value zero) are not allowed.","ref":"os.html#t:env_var_value/0"},{"type":"type","title":"os.os_command/0","doc":"All characters needs to be valid characters on the specific OS using\n[`file:native_name_encoding()`](`file:native_name_encoding/0`) encoding. Null\ncharacters (integer value zero) are not allowed.","ref":"os.html#t:os_command/0"},{"type":"type","title":"os.os_command_opts/0","doc":"Options for [`os:cmd/2`](`cmd/2`).\n\n- **`max_size`** - The maximum size of the data returned by the `os:cmd/2` call.\n See the [`os:cmd/2`](`cmd/2`) documentation for more details.","ref":"os.html#t:os_command_opts/0"},{"type":"module","title":"auth","doc":"Erlang network authentication server.\n\nFor a description of the Magic Cookie system, refer\nto [Distributed Erlang](`e:system:distributed.md`) in the Erlang Reference\nManual.","ref":"auth.html"},{"type":"function","title":"auth.cookie/0","doc":"Use [`erlang:get_cookie()`](`erlang:get_cookie/0`) in ERTS instead.","ref":"auth.html#cookie/0"},{"type":"function","title":"auth.cookie/1","doc":"Use [`erlang:set_cookie(node(), Cookie)` in ERTS](`erlang:set_cookie/2`)\ninstead.","ref":"auth.html#cookie/1"},{"type":"function","title":"auth.is_auth/1","doc":"Returns `yes` if communication with `Node` is authorized.\n\nUse [`net_adm:ping(Node)`](`net_adm:ping/1`) instead.\n\nNotice that a connection to `Node` is established in this case. Returns `no` if\n`Node` does not exist or communication is not authorized (it has another cookie\nthan `auth` thinks it has).","ref":"auth.html#is_auth/1"},{"type":"function","title":"auth.node_cookie/1","doc":"Equivalent to [`node_cookie(Node, Cookie)`](`node_cookie/2`).","ref":"auth.html#node_cookie/1"},{"type":"function","title":"auth.node_cookie/2","doc":"Sets the magic cookie of `Node` to `Cookie` and verifies the status of the\nauthorization.\n\nEquivalent to calling [`erlang:set_cookie(Node, Cookie)`](`erlang:set_cookie/2`),\nfollowed by [`auth:is_auth(Node)`](`is_auth/1`).","ref":"auth.html#node_cookie/2"},{"type":"type","title":"auth.cookie/0","doc":"","ref":"auth.html#t:cookie/0"},{"type":"module","title":"erl_boot_server","doc":"Boot server for other Erlang machines.\n\nThis server is used to assist diskless Erlang nodes that fetch all Erlang code\nfrom another machine.\n\nThis server is used to fetch all code, including the start script, if an Erlang\nruntime system is started with command-line flag `-loader inet`. All hosts\nspecified with command-line flag `-hosts Host` must have one instance of this\nserver running.\n\nThis server can be started with the Kernel configuration parameter\n`start_boot_server`.\n\nThe `erl_boot_server` can read regular files and files in archives. See `m:code`\nand `m:erl_prim_loader` in ERTS.\n\n> #### Warning {: .warning }\n>\n> The support for loading code from archive files is experimental. It is\n> released before it is ready to obtain early feedback. The file format,\n> semantics, interfaces, and so on, can be changed in a future release.","ref":"erl_boot_server.html"},{"type":"module","title":"SEE ALSO - erl_boot_server","doc":"[`erts:init`](`m:init`), [`erts:erl_prim_loader`](`m:erl_prim_loader`)","ref":"erl_boot_server.html#module-see-also"},{"type":"function","title":"erl_boot_server.add_slave/1","doc":"Adds a `Slave` node to the list of allowed slave hosts.","ref":"erl_boot_server.html#add_slave/1"},{"type":"function","title":"erl_boot_server.delete_slave/1","doc":"Deletes a `Slave` node from the list of allowed slave hosts.","ref":"erl_boot_server.html#delete_slave/1"},{"type":"function","title":"erl_boot_server.start/1","doc":"Starts the boot server. `Slaves` is a list of IP addresses for hosts, which are\nallowed to use this server as a boot server.","ref":"erl_boot_server.html#start/1"},{"type":"function","title":"erl_boot_server.start_link/1","doc":"Starts the boot server and links to the caller. This function is used to start\nthe server if it is included in a supervision tree.","ref":"erl_boot_server.html#start_link/1"},{"type":"function","title":"erl_boot_server.which_slaves/0","doc":"Returns the current list of allowed slave hosts.","ref":"erl_boot_server.html#which_slaves/0"},{"type":"module","title":"erl_epmd","doc":"Erlang interface towards epmd\n\nThis module communicates with the EPMD daemon, see [epmd](`e:erts:epmd_cmd.md`).\nTo implement your own epmd module please see\n[ERTS User's Guide: How to Implement an Alternative Node Discovery for Erlang Distribution](`e:erts:alt_disco.md`)","ref":"erl_epmd.html"},{"type":"function","title":"erl_epmd.address_please/3","doc":"Called by the distribution module to resolves the `Host` to an IP address of a\nremote node.\n\nAs an optimization this function may also return the port and version of the\nremote node. If port and version are returned `port_please/3` will not be\ncalled.","ref":"erl_epmd.html#address_please/3"},{"type":"function","title":"erl_epmd.listen_port_please/2","doc":"Called by the distribution module to get which port the local node should listen\nto when accepting new distribution requests.","ref":"erl_epmd.html#listen_port_please/2"},{"type":"function","title":"erl_epmd.names/1","doc":"Called by [`net_adm:names/0`](`m:net_adm`). `Host` defaults to the localhost.\nReturns the names and associated port numbers of the Erlang nodes that `epmd`\nregistered at the specified host. Returns `{error, address}` if `epmd` is not\noperational.\n\n_Example:_\n\n```erlang\n(arne@dunn)1> erl_epmd:names(localhost).\n{ok,[{\"arne\",40262}]}\n```","ref":"erl_epmd.html#names/1"},{"type":"function","title":"erl_epmd.port_please/2","doc":"","ref":"erl_epmd.html#port_please/2"},{"type":"function","title":"erl_epmd.port_please/3","doc":"Requests the distribution port for the given node of an EPMD instance. Together\nwith the port it returns a distribution protocol version which has been 5 since\nErlang/OTP R6.","ref":"erl_epmd.html#port_please/3"},{"type":"function","title":"erl_epmd.register_node/2","doc":"","ref":"erl_epmd.html#register_node/2"},{"type":"function","title":"erl_epmd.register_node/3","doc":"Registers the node with `epmd` and tells epmd what port will be used for the\ncurrent node. It returns a creation number. This number is incremented on each\nregister to help differentiate a new node instance connecting to epmd with the\nsame name.\n\nAfter the node has successfully registered with epmd it will automatically\nattempt reconnect to the daemon if the connection is broken.","ref":"erl_epmd.html#register_node/3"},{"type":"function","title":"erl_epmd.start_link/0","doc":"This function is invoked as this module is added as a child of the\n`erl_distribution` supervisor.","ref":"erl_epmd.html#start_link/0"},{"type":"module","title":"erpc","doc":"Enhanced Remote Procedure Call\n\nThis module provide services similar to Remote Procedure Calls. A remote\nprocedure call is a method to call a function on a remote node and collect the\nanswer. It is used for collecting information on a remote node, or for running a\nfunction with some specific side effects on the remote node.\n\nThis is an enhanced subset of the operations provided by the `m:rpc` module.\nEnhanced in the sense that it makes it possible to distinguish between returned\nvalue, raised exceptions, and other errors. `erpc` also has better performance\nand scalability than the original `rpc` implementation. However, current `rpc`\nmodule will utilize `erpc` in order to also provide these properties when\npossible.\n\nIn order for an `erpc` operation to succeed, the remote node also needs to\nsupport `erpc`. Typically only ordinary Erlang nodes as of OTP 23 have `erpc`\nsupport.\n\nNote that it is up to the user to ensure that correct code to execute via `erpc`\nis available on the involved nodes.\n\n> #### Note {: .info }\n>\n> For some important information about distributed signals, see the\n> [Blocking Signaling Over Distribution](`e:system:ref_man_processes.md#blocking-signaling-over-distribution`)\n> section in the _Processes_ chapter of the _Erlang Reference Manual_. Blocking\n> signaling can, for example, cause timeouts in `erpc` to be significantly\n> delayed.","ref":"erpc.html"},{"type":"function","title":"erpc.call/2","doc":"","ref":"erpc.html#call/2"},{"type":"function","title":"erpc.call/3","doc":"Equivalent to\n[`erpc:call(Node, erlang, apply, [Fun,[]], Timeout)`](`call/5`).\n\nMay raise all the same exceptions as [`call/5`](`call/5`) plus an `{erpc, badarg}`\n`error` exception if `Fun` is not a fun of zero arity.","ref":"erpc.html#call/3"},{"type":"function","title":"erpc.call/4","doc":"","ref":"erpc.html#call/4"},{"type":"function","title":"erpc.call/5","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node` and\nreturns the corresponding value `Result`. `Timeout` sets an upper time limit for\nthe `call` operation to complete.\n\nThe `call()` function only returns if the applied function successfully returned\nwithout raising any uncaught exceptions, the operation did not time out, and no\nfailures occurred. In all other cases an exception is raised. The following\nexceptions, listed by exception class, can currently be raised by `call()`:\n\n- **`throw`** - The applied function called [`throw(Value)`](`throw/1`) and did\n not catch this exception. The exception reason `Value` equals the argument\n passed to [`throw/1`](`throw/1`).\n\n- **`exit`** - Exception reason:\n\n - **`{exception, ExitReason}`** - The applied function called\n [`exit(ExitReason)`](`exit/1`) and did not catch this exception. The exit\n reason `ExitReason` equals the argument passed to [`exit/1`](`exit/1`).\n\n - **`{signal, ExitReason}`** - The process that applied the function received\n an exit signal and terminated due to this signal. The process terminated\n with exit reason `ExitReason`.\n\n- **`error`** - Exception reason:\n\n - **`{exception, ErrorReason, StackTrace}`** - A runtime error occurred which\n raised an error exception while applying the function, and the applied\n function did not catch the exception. The error reason `ErrorReason`\n indicates the type of error that occurred. `StackTrace` is formatted as when\n caught in a `try/catch` construct. The `StackTrace` is limited to the\n applied function and functions called by it.\n\n - **`{erpc, ERpcErrorReason}`** - The `erpc` operation failed. The following\n `ERpcErrorReason`s are the most common ones:\n\n - **`badarg`** - If any one of these are true:\n\n - `Node` is not an atom.\n - `Module` is not an atom.\n - `Function` is not an atom.\n - `Args` is not a list. Note that the list is not verified to be a proper\n list at the client side.\n - `Timeout` is invalid.\n\n - **`noconnection`** - The connection to `Node` was lost or could not be\n established. The function may or may not be applied.\n\n - **`system_limit`** - The `erpc` operation failed due to some system limit\n being reached. This typically due to failure to create a process on the\n remote node `Node`, but can be other things as well.\n\n - **`timeout`** - The `erpc` operation timed out. The function may or may\n not be applied.\n\n - **`notsup`** - The remote node `Node` does not support this `erpc`\n operation.\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a timeout or a connection loss), the caller will not receive\nany further information about the result if/when the applied function completes.\nIf the applied function explicitly communicates with the calling process, such\ncommunication may, of course, reach the calling process.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, a server, or a freshly\n> spawned process.","ref":"erpc.html#call/5"},{"type":"function","title":"erpc.cast/2","doc":"Equivalent to [`erpc:cast(Node,erlang,apply,[Fun,[]])`](`cast/4`).\n\n[`cast/2`](`cast/2`) fails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Fun` is not a a fun of zero arity.","ref":"erpc.html#cast/2"},{"type":"function","title":"erpc.cast/4","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node`. No\nresponse is delivered to the calling process. `cast()` returns immediately after\nthe cast request has been sent. Any failures beside bad arguments are silently\nignored.\n\n[`cast/4`](`cast/4`) fails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","ref":"erpc.html#cast/4"},{"type":"function","title":"erpc.check_response/2","doc":"Check if a message is a response to a `call` request previously made by the\ncalling process using `send_request/4`.\n\n`RequestId` should be the value returned from the previously made\n[`send_request/4`](`send_request/4`) call, and the\ncorresponding response should not already have been received and handled to\ncompletion by [`check_response/2`](`check_response/2`), `receive_response/2`, or\n`wait_response/2`. `Message` is the message to check.\n\nIf `Message` does not correspond to the response, the atom `no_response` is\nreturned. If `Message` corresponds to the response, the `call` operation is\ncompleted and either the result is returned as `{response, Result}` where\n`Result` corresponds to the value returned from the applied function or an\nexception is raised. The exceptions that can be raised corresponds to the same\nexceptions as can be raised by `call/4`. That is, no `{erpc, timeout}` `error`\nexception can be raised. `check_response()` will fail with an `{erpc, badarg}`\nexception if/when an invalid `RequestId` is detected.\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a connection loss), the caller will not receive any further\ninformation about the result if/when the applied function completes. If the\napplied function explicitly communicates with the calling process, such\ncommunication may, of course, reach the calling process.","ref":"erpc.html#check_response/2"},{"type":"function","title":"erpc.check_response/3","doc":"Check if a message is a response to a `call` request corresponding to a request\nidentifier saved in `RequestIdCollection`. All request identifiers of\n`RequestIdCollection` must correspond to requests that have been made using\n`send_request/4` or `send_request/6`, and all requests must have been made by\nthe process calling this function.\n\n`Label` is the label associated with the request identifier of the request that\nthe response corresponds to. A request identifier is associated with a label\nwhen [adding a request identifier](`reqids_add/3`) in a\n[request identifier collection](`t:request_id_collection/0`), or when sending\nthe request using `send_request/6`.\n\nCompared to `check_response/2`, the returned result associated with a specific\nrequest identifier or an exception associated with a specific request identifier\nwill be wrapped in a 3-tuple. The first element of this tuple equals the value\nthat would have been produced by [`check_response/2`](`check_response/2`), the\nsecond element equals the `Label` associated with the specific request\nidentifier, and the third element `NewRequestIdCollection` is a possibly\nmodified request identifier collection. The `error` exception `{erpc, badarg}`\nis not associated with any specific request identifier, and will hence not be\nwrapped.\n\nIf `RequestIdCollection` is empty, the atom `no_request` will be returned. If\n`Message` does not correspond to any of the request identifiers in\n`RequestIdCollection`, the atom `no_response` is returned.\n\nIf `Delete` equals `true`, the association with `Label` will have been deleted\nfrom `RequestIdCollection` in the resulting `NewRequestIdCollection`. If\n`Delete` equals `false`, `NewRequestIdCollection` will equal\n`RequestIdCollection`. Note that deleting an association is not for free and\nthat a collection containing already handled requests can still be used by\nsubsequent calls to [`check_response/3`](`check_response/3`),\n`receive_response/3`, and `wait_response/3`. However, without deleting handled\nassociations, the above calls will not be able to detect when there are no more\noutstanding requests to handle, so you will have to keep track of this some\nother way than relying on a `no_request` return. Note that if you pass a\ncollection only containing associations of already handled or abandoned requests\nto [`check_response/3`](`check_response/3`), it will always return\n`no_response`.\n\nNote that a response might have been consumed uppon an `{erpc, badarg}`\nexception and if so, will be lost for ever.","ref":"erpc.html#check_response/3"},{"type":"function","title":"erpc.multicall/2","doc":"","ref":"erpc.html#multicall/2"},{"type":"function","title":"erpc.multicall/3","doc":"Equivalent to\n[`erpc:multicall(Nodes, erlang, apply, [Fun,[]], Timeout)`](`multicall/5`).\n\nMay raise all the same exceptions as [`multicall/5`](`multicall/5`) plus an\n`{erpc, badarg}` `error` exception if `Fun` is not a fun of zero arity.","ref":"erpc.html#multicall/3"},{"type":"function","title":"erpc.multicall/4","doc":"","ref":"erpc.html#multicall/4"},{"type":"function","title":"erpc.multicall/5","doc":"Performs multiple `call` operations in parallel on multiple nodes.\n\nThat is, evaluates [`apply(Module, Function, Args)`](`apply/3`) on the nodes `Nodes` in\nparallel. `Timeout` sets an upper time limit for all `call` operations to\ncomplete. The result is returned as a list where the result from each node is\nplaced at the same position as the node name is placed in `Nodes`. Each item in\nthe resulting list is formatted as either:\n\n- **`{ok, Result}`** - The `call` operation for this specific node returned\n `Result`.\n\n- **`{Class, ExceptionReason}`** - The `call` operation for this specific node\n raised an exception of class `Class` with exception reason `ExceptionReason`.\n These correspond to the exceptions that `call/5` can raise.\n\n[`multicall/5`](`multicall/5`) fails with an `{erpc, badarg}` `error` exception\nif:\n\n- `Nodes` is not a proper list of atoms. Note that some requests may already\n have been sent when the failure occurs. That is, the function may or may not\n be applied on some nodes.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\nThe call `erpc:multicall(Nodes, Module, Function, Args)` is equivalent to the\ncall `erpc:multicall(Nodes, Module, Function, Args, infinity)`. These calls are\nalso equivalent to calling `my_multicall(Nodes, Module, Function, Args)` below\nif one disregard performance and failure behavior. `multicall()` can utilize a\nselective receive optimization which removes the need to scan the message queue\nfrom the beginning in order to find a matching message. The\n`send_request()/receive_response()` combination can, however, not utilize this\noptimization.\n\n```erlang\nmy_multicall(Nodes, Module, Function, Args) ->\n ReqIds = lists:map(fun (Node) ->\n erpc:send_request(Node, Module, Function, Args)\n end,\n Nodes),\n lists:map(fun (ReqId) ->\n try\n {ok, erpc:receive_response(ReqId, infinity)}\n catch\n Class:Reason ->\n {Class, Reason}\n end\n end,\n ReqIds).\n```\n\nIf an `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a timeout, connection loss, or an improper `Nodes` list), the\ncaller will not receive any further information about the result if/when the\napplied function completes. If the applied function communicates with the\ncalling process, such communication may, of course, reach the calling process.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, a server, or a freshly\n> spawned process.","ref":"erpc.html#multicall/5"},{"type":"function","title":"erpc.multicast/2","doc":"Equivalent to\n[`erpc:multicast(Nodes,erlang,apply,[Fun,[]])`](`multicast/4`).\n\n[`multicast/2`](`multicast/2`) fails with an `{erpc, badarg}` `error` exception\nif:\n\n- `Nodes` is not a proper list of atoms.\n- `Fun` is not a a fun of zero arity.","ref":"erpc.html#multicast/2"},{"type":"function","title":"erpc.multicast/4","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the nodes `Nodes`. No\nresponse is delivered to the calling process. `multicast()` returns immediately\nafter the cast requests have been sent. Any failures beside bad arguments are\nsilently ignored.\n\n[`multicast/4`](`multicast/4`) fails with an `{erpc, badarg}` `error` exception\nif:\n\n- `Nodes` is not a proper list of atoms. Note that some requests may already\n have been sent when the failure occurs. That is, the function may or may not\n be applied on some nodes.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","ref":"erpc.html#multicast/4"},{"type":"function","title":"erpc.receive_response/1","doc":"","ref":"erpc.html#receive_response/1"},{"type":"function","title":"erpc.receive_response/2","doc":"Receive a response to a `call` request previously made by the calling process\nusing `send_request/4`.\n\n`RequestId` should be the value returned from the\npreviously made [`send_request/4`](`send_request/4`) call, and the corresponding\nresponse should not already have been received and handled to completion by\n`receive_response()`, [`check_response/4`](`check_response/2`), or\n[`wait_response/4`](`wait_response/2`).\n\n`Timeout` sets an upper time limit on how long to wait for a response. If the\noperation times out, the request identified by `RequestId` will be abandoned,\nthen an `{erpc, timeout}` `error` exception will be raised. That is, no response\ncorresponding to the request will ever be received after a timeout. If a\nresponse is received, the `call` operation is completed and either the result is\nreturned or an exception is raised. The exceptions that can be raised\ncorresponds to the same exceptions as can be raised by `call/5`.\n[`receive_response/2`](`receive_response/2`) will fail with an `{erpc, badarg}`\nexception if/when an invalid `RequestId` is detected or if an invalid `Timeout`\nis passed.\n\nA call to the function `my_call(Node, Module, Function, Args, Timeout)` below is\nequivalent to the call\n[`erpc:call(Node, Module, Function, Args, Timeout)`](`call/5`) if one disregards\nperformance. `call()` can utilize a selective receive optimization which removes\nthe need to scan the message queue from the beginning in order to find a\nmatching message. The `send_request()/receive_response()` combination can,\nhowever, not utilize this optimization.\n\n```erlang\nmy_call(Node, Module, Function, Args, Timeout) ->\n RequestId = erpc:send_request(Node, Module, Function, Args),\n erpc:receive_response(RequestId, Timeout).\n```\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a timeout, or a connection loss), the caller will not receive\nany further information about the result if/when the applied function completes.\nIf the applied function explicitly communicates with the calling process, such\ncommunication may, of course, reach the calling process.","ref":"erpc.html#receive_response/2"},{"type":"function","title":"erpc.receive_response/3","doc":"Receive a response to a `call` request corresponding to a request identifier\nsaved in `RequestIdCollection`. All request identifiers of `RequestIdCollection`\nmust correspond to requests that have been made using `send_request/4` or\n`send_request/6`, and all requests must have been made by the process calling\nthis function.\n\n`Label` is the label associated with the request identifier of the request that\nthe response corresponds to. A request identifier is associated with a label\nwhen [adding a request identifier](`reqids_add/3`) in a\n[request identifier collection](`t:request_id_collection/0`), or when sending\nthe request using `send_request/6`.\n\nCompared to `receive_response/2`, the returned result associated with a specific\nrequest identifier or an exception associated with a specific request identifier\nwill be wrapped in a 3-tuple. The first element of this tuple equals the value\nthat would have been produced by [`receive_response/2`](`receive_response/2`),\nthe second element equals the `Label` associated with the specific request\nidentifier, and the third element `NewRequestIdCollection` is a possibly\nmodified request identifier collection. The `error` exceptions `{erpc, badarg}`\nand `{erpc, timeout}` are not associated with any specific request identifiers,\nand will hence not be wrapped.\n\nIf `RequestIdCollection` is empty, the atom `no_request` will be returned.\n\nIf the operation times out, all requests identified by `RequestIdCollection`\nwill be abandoned, then an `{erpc, timeout}` `error` exception will be raised.\nThat is, no responses corresponding to any of the request identifiers in\n`RequestIdCollection` will ever be received after a timeout. The difference\nbetween [`receive_response/3`](`receive_response/3`) and `wait_response/3` is\nthat [`receive_response/3`](`receive_response/3`) abandons the requests at\ntimeout so that any potential future responses are ignored, while\n[`wait_response/3`](`wait_response/3`) does not.\n\nIf `Delete` equals `true`, the association with `Label` will have been deleted\nfrom `RequestIdCollection` in the resulting `NewRequestIdCollection`. If\n`Delete` equals `false`, `NewRequestIdCollection` will equal\n`RequestIdCollection`. Note that deleting an association is not for free and\nthat a collection containing already handled requests can still be used by\nsubsequent calls to [`receive_response/3`](`receive_response/3`),\n`check_response/3`, and `wait_response/3`. However, without deleting handled\nassociations, the above calls will not be able to detect when there are no more\noutstanding requests to handle, so you will have to keep track of this some\nother way than relying on a `no_request` return. Note that if you pass a\ncollection only containing associations of already handled or abandoned requests\nto [`receive_response/3`](`receive_response/3`), it will always block until a\ntimeout determined by `Timeout` is triggered.\n\nNote that a response might have been consumed uppon an `{erpc, badarg}`\nexception and if so, will be lost for ever.","ref":"erpc.html#receive_response/3"},{"type":"function","title":"erpc.reqids_add/3","doc":"Saves `RequestId` and associates a `Label` with the request identifier by adding\nthis information to `RequestIdCollection` and returning the resulting request\nidentifier collection.","ref":"erpc.html#reqids_add/3"},{"type":"function","title":"erpc.reqids_new/0","doc":"Returns a new empty request identifier collection. A request identifier\ncollection can be utilized in order the handle multiple outstanding requests.\n\nRequest identifiers of requests made by `send_request/4` can be saved in a\nrequest identifier collection using `reqids_add/3`. Such a collection of request\nidentifiers can later be used in order to get one response corresponding to a\nrequest in the collection by passing the collection as argument to\n`check_response/3`, `receive_response/3`, and `wait_response/3`.\n\n`reqids_size/1` can be used to determine the amount of request identifiers in a\nrequest identifier collection.","ref":"erpc.html#reqids_new/0"},{"type":"function","title":"erpc.reqids_size/1","doc":"Returns the amount of request identifiers saved in `RequestIdCollection`.","ref":"erpc.html#reqids_size/1"},{"type":"function","title":"erpc.reqids_to_list/1","doc":"Returns a list of `{RequestId, Label}` tuples which corresponds to all request\nidentifiers with their associated labels present in the `RequestIdCollection`\ncollection.","ref":"erpc.html#reqids_to_list/1"},{"type":"function","title":"erpc.send_request/2","doc":"Equivalent to\n[`erpc:send_request(Node, erlang, apply, [Fun, []])`](`send_request/4`).\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Fun` is not a fun of zero arity.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","ref":"erpc.html#send_request/2"},{"type":"function","title":"erpc.send_request/4","doc":"Send an asynchronous `call` request to the node `Node`.\n\n[`send_request/4`](`send_request/4`) returns a request identifier that later is\nto be passed to either `receive_response/2`, `wait_response/2`, or,\n`check_response/2` in order to get the response of the call request. Besides\npassing the request identifier directly to these functions, it can also be added\nin a request identifier collection using `reqids_add/3`. Such a collection of\nrequest identifiers can later be used in order to get one response corresponding\nto a request in the collection by passing the collection as argument to\n`receive_response/3`, `wait_response/3`, or, `check_response/3`. If you are\nabout to save the request identifier in a request identifier collection, you may\nwant to consider using `send_request/6` instead.\n\nA call to the function `my_call(Node, Module, Function, Args, Timeout)` below is\nequivalent to the call\n[`erpc:call(Node, Module, Function, Args, Timeout)`](`call/5`) if one disregards\nperformance. `call()` can utilize a selective receive optimization which removes\nthe need to scan the message queue from the beginning in order to find a\nmatching message. The `send_request()/receive_response()` combination can,\nhowever, not utilize this optimization.\n\n```erlang\nmy_call(Node, Module, Function, Args, Timeout) ->\n RequestId = erpc:send_request(Node, Module, Function, Args),\n erpc:receive_response(RequestId, Timeout).\n```\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.\n\nEquivalent to\n[`erpc:send_request(Node, erlang, apply, [Fun,[]]), Label, RequestIdCollection)`](`send_request/6`).\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Fun` is not a fun of zero arity.\n- `RequestIdCollection` is detected not to be request identifier collection.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","ref":"erpc.html#send_request/4"},{"type":"function","title":"erpc.send_request/6","doc":"Send an asynchronous `call` request to the node `Node`. The `Label` will be\nassociated with the request identifier of the operation and added to the\nreturned request identifier collection `NewRequestIdCollection`. The collection\ncan later be used in order to get one response corresponding to a request in the\ncollection by passing the collection as argument to `receive_response/3`,\n`wait_response/3`, or, `check_response/3`.\n\nEquivalent to\n[`erpc:reqids_add`](`reqids_add/3`)([`erpc:send_request`](`send_request/4`)`(Node, Module, Function, Args), Label, RequestIdCollection)`,\nbut calling [`send_request/6`](`send_request/6`) is slightly more efficient.\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n- `RequestIdCollection` is detected not to be request identifier collection.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","ref":"erpc.html#send_request/6"},{"type":"function","title":"erpc.wait_response/1","doc":"Equivalent to [`erpc:wait_response(RequestId, 0)`](`wait_response/2`).\nThat is, poll for a response message to a `call` request previously made by the\ncalling process.","ref":"erpc.html#wait_response/1"},{"type":"function","title":"erpc.wait_response/2","doc":"Wait or poll for a response message to a `call` request previously made by the\ncalling process using `send_request/4`.\n\n`RequestId` should be the value returned from the previously made `send_request()`\ncall, and the corresponding response should not already have been received and\nhandled to completion by `check_response/2`, `receive_response/2`, or `wait_response()`.\n\n`WaitTime` sets an upper time limit on how long to wait for a response. If no\nresponse is received before the `WaitTime` timeout has triggered, the atom\n`no_response` is returned. It is valid to continue waiting for a response as\nmany times as needed up until a response has been received and completed by\n`check_response()`, `receive_response()`, or `wait_response()`. If a response is\nreceived, the `call` operation is completed and either the result is returned as\n`{response, Result}` where `Result` corresponds to the value returned from the\napplied function or an exception is raised. The exceptions that can be raised\ncorresponds to the same exceptions as can be raised by `call/4`. That is, no\n`{erpc, timeout}` `error` exception can be raised.\n[`wait_response/2`](`wait_response/2`) will fail with an `{erpc, badarg}`\nexception if/when an invalid `RequestId` is detected or if an invalid `WaitTime`\nis passed.\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a too large wait time value, or a connection loss), the caller\nwill not receive any further information about the result if/when the applied\nfunction completes. If the applied function explicitly communicates with the\ncalling process, such communication may, of course, reach the calling process.","ref":"erpc.html#wait_response/2"},{"type":"function","title":"erpc.wait_response/3","doc":"Wait or poll for a response to a `call` request corresponding to a request\nidentifier saved in `RequestIdCollection`. All request identifiers of\n`RequestIdCollection` must correspond to requests that have been made using\n`send_request/4` or `send_request/6`, and all requests must have been made by\nthe process calling this function.\n\n`Label` is the label associated with the request identifier of the request that\nthe response corresponds to. A request identifier is associated with a label\nwhen [adding a request identifier](`reqids_add/3`) in a\n[request identifier collection](`t:request_id_collection/0`), or when sending\nthe request using `send_request/6`.\n\nCompared to `wait_response/2`, the returned result associated with a specific\nrequest identifier or an exception associated with a specific request identifier\nwill be wrapped in a 3-tuple. The first element of this tuple equals the value\nthat would have been produced by [`wait_response/2`](`wait_response/2`), the\nsecond element equals the `Label` associated with the specific request\nidentifier, and the third element `NewRequestIdCollection` is a possibly\nmodified request identifier collection. The `error` exception `{erpc, badarg}`\nis not associated with any specific request identifier, and will hence not be\nwrapped.\n\nIf `RequestIdCollection` is empty, `no_request` will be returned. If no response\nis received before the `WaitTime` timeout has triggered, the atom `no_response`\nis returned. It is valid to continue waiting for a response as many times as\nneeded up until a response has been received and completed by\n`check_response()`, `receive_response()`, or `wait_response()`. The difference\nbetween `receive_response/3` and [`wait_response/3`](`wait_response/3`) is that\n[`receive_response/3`](`receive_response/3`) abandons requests at timeout so\nthat any potential future responses are ignored, while\n[`wait_response/3`](`wait_response/3`) does not.\n\nIf `Delete` equals `true`, the association with `Label` will have been deleted\nfrom `RequestIdCollection` in the resulting `NewRequestIdCollection`. If\n`Delete` equals `false`, `NewRequestIdCollection` will equal\n`RequestIdCollection`. Note that deleting an association is not for free and\nthat a collection containing already handled requests can still be used by\nsubsequent calls to [`wait_response/3`](`wait_response/3`), `check_response/3`,\nand `receive_response/3`. However, without deleting handled associations, the\nabove calls will not be able to detect when there are no more outstanding\nrequests to handle, so you will have to keep track of this some other way than\nrelying on a `no_request` return. Note that if you pass a collection only\ncontaining associations of already handled or abandoned requests to\n[`wait_response/3`](`wait_response/3`), it will always block until a timeout\ndetermined by `WaitTime` is triggered and then return `no_response`.\n\nNote that a response might have been consumed uppon an `{erpc, badarg}`\nexception and if so, will be lost for ever.","ref":"erpc.html#wait_response/3"},{"type":"type","title":"erpc.caught_call_exception/0","doc":"","ref":"erpc.html#t:caught_call_exception/0"},{"type":"opaque","title":"erpc.request_id/0","doc":"An opaque request identifier. For more information see `send_request/4`.","ref":"erpc.html#t:request_id/0"},{"type":"opaque","title":"erpc.request_id_collection/0","doc":"An opaque collection of request identifiers (`t:request_id/0`) where each\nrequest identifier can be associated with a label chosen by the user. For more\ninformation see `reqids_new/0`.","ref":"erpc.html#t:request_id_collection/0"},{"type":"type","title":"erpc.stack_item/0","doc":"","ref":"erpc.html#t:stack_item/0"},{"type":"type","title":"erpc.timeout_time/0","doc":"The timeout time used by erpc functions.\n\nThe value can be:\n\n- **`0..4294967295`** - Timeout relative to current time in milliseconds.\n\n- **`infinity`** - Infinite timeout. That is, the operation will never time out.\n\n- **`{abs, Timeout}`** - An absolute\n [Erlang monotonic time](`erlang:monotonic_time/1`) timeout in milliseconds.\n That is, the operation will time out when\n [`erlang:monotonic_time(millisecond)`](`erlang:monotonic_time/1`) returns a\n value larger than or equal to `Timeout`. `Timeout` is not allowed to identify\n a time further into the future than `4294967295` milliseconds. Identifying the\n timeout using an absolute timeout value is especially handy when you have a\n deadline for responses corresponding to a complete collection of requests\n (`t:request_id_collection/0`) , since you do not have to recalculate the\n relative time until the deadline over and over again.","ref":"erpc.html#t:timeout_time/0"},{"type":"module","title":"global","doc":"A global name registration facility.\n\nThis module consists of the following services:\n\n- Registration of global names\n- Global locks\n- Maintenance of the fully connected network\n\n[](){: #prevent_overlapping_partitions }\n\nAs of OTP 25, `global` will by default prevent overlapping partitions due to\nnetwork issues by actively disconnecting from nodes that reports that they have\nlost connections to other nodes. This will cause fully connected partitions to\nform instead of leaving the network in a state with overlapping partitions.\n\n> #### Warning {: .warning }\n>\n> Prevention of overlapping partitions can be disabled using the\n> [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n> Kernel parameter, making `global` behave like it used to do. This is,\n> however, problematic for all applications expecting a fully connected network\n> to be provided, such as for example `mnesia`, but also for `global` itself. A\n> network of overlapping partitions might cause the internal state of `global`\n> to become inconsistent. Such an inconsistency can remain even after such\n> partitions have been brought together to form a fully connected network again.\n> The effect on other applications that expects that a fully connected network\n> is maintained may vary, but they might misbehave in very subtle hard to detect\n> ways during such a partitioning. Since you might get hard to detect issues\n> without this fix, you are _strongly_ advised _not_ to disable this fix. Also\n> note that this fix _has_ to be enabled on _all_ nodes in the network in order\n> to work properly.\n\n> #### Note {: .info }\n>\n> None of the above services will be reliably delivered unless both of the\n> kernel parameters [`connect_all`](kernel_app.md#connect_all) and\n> [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n> are enabled. Calls to the `global` API will, however, _not_ fail even though\n> one or both of them are disabled. You will just get unreliable results.\n\nThese services are controlled through the process `global_name_server` that\nexists on every node. The global name server starts automatically when a node is\nstarted. With the term _global_ is meant over a system consisting of many Erlang\nnodes.\n\nThe ability to globally register names is a central concept in the programming\nof distributed Erlang systems. In this module, the equivalent of the\n[`register/2`](`register/2`) and [`whereis/1`](`whereis/1`) BIFs (for local name\nregistration) are provided, but for a network of Erlang nodes. A registered name\nis an alias for a process identifier (pid). The global name server monitors\nglobally registered pids. If a process terminates, the name is also globally\nunregistered.\n\nThe registered names are stored in replica global name tables on every node.\nThere is no central storage point. Thus, the translation of a name to a pid is\nfast, as it is always done locally. For any action resulting in a change to the\nglobal name table, all tables on other nodes are automatically updated.\n\nGlobal locks have lock identities and are set on a specific resource. For\nexample, the specified resource can be a pid. When a global lock is set, access\nto the locked resource is denied for all resources other than the lock\nrequester.\n\nBoth the registration and lock services are atomic. All nodes involved in these\nactions have the same view of the information.\n\nThe global name server also performs the critical task of continuously\nmonitoring changes in node configuration. If a node that runs a globally\nregistered process goes down, the name is globally unregistered. To this end,\nthe global name server subscribes to `nodeup` and `nodedown` messages sent from\nmodule `net_kernel`. Relevant Kernel application variables in this context are\n[`net_setuptime`](kernel_app.md#net_setuptime), [`net_ticktime`](kernel_app.md#net_ticktime),\nand [`dist_auto_connect`](kernel_app.md#dist_auto_connect).\n\nThe name server also maintains a fully connected network. For example, if node\n`N1` connects to node `N2` (which is already connected to `N3`), the global name\nservers on the nodes `N1` and `N3` ensure that also `N1` and `N3` are connected.\nIn this case, the name registration service cannot be used, but the lock\nmechanism still works.\n\nIf the global name server fails to connect nodes (`N1` and `N3` in the example),\na warning event is sent to the error logger. The presence of such an event does\nnot exclude the nodes to connect later (you can, for example, try command\n`rpc:call(N1, net_adm, ping, [N2])` in the Erlang shell), but it indicates a\nnetwork problem.\n\n> #### Note {: .info }\n>\n> If the fully connected network is not set up properly, try first to increase\n> the value of `net_setuptime`.","ref":"global.html"},{"type":"module","title":"See Also - global","doc":"`m:global_group`, `m:net_kernel`","ref":"global.html#module-see-also"},{"type":"function","title":"global.del_lock/1","doc":"","ref":"global.html#del_lock/1"},{"type":"function","title":"global.del_lock/2","doc":"Deletes the lock `Id` synchronously.","ref":"global.html#del_lock/2"},{"type":"function","title":"global.disconnect/0","doc":"Disconnect from all other nodes known to `global`.\n\nA list of node names (in an unspecified order) is returned which corresponds to\nthe nodes that were disconnected. All disconnect operations performed have completed when\n`global:disconnect/0` returns.\n\nThe disconnects will be made in such a way that only the current node will be\nremoved from the cluster of `global` nodes. If\n[`prevent_overlapping_partitions`] is\nenabled and you disconnect, from other nodes in the cluster of `global` nodes,\nby other means, `global` on the other nodes may partition the remaining nodes in\norder to ensure that no overlapping partitions appear. Even if\n[`prevent_overlapping_partitions`] is disabled, you should preferably use\n`global:disconnect/0` in order to remove current node from a cluster of `global`\nnodes, since you otherwise likely _will_ create overlapping partitions which\nmight [cause problems](`m:global#prevent_overlapping_partitions`).\n\nNote that if the node is going to be halted, there is _no_ need to remove it\nfrom a cluster of `global` nodes explicitly by calling `global:disconnect/0`\nbefore halting it. The removal from the cluster is taken care of automatically\nwhen the node halts regardless of whether [`prevent_overlapping_partitions`] is\nenabled or not.\n\nIf current node has been configured to be part of a\n[_global group_](`m:global_group`), only connected and/or synchronized nodes in\nthat group are known to `global`, so `global:disconnect/0` will _only_\ndisconnect from those nodes. If current node is _not_ part of a _global group_,\nall [connected visible nodes](`erlang:nodes/0`) will be known to `global`, so\n`global:disconnect/0` will disconnect from all those nodes.\n\nNote that information about connected nodes does not instantaneously reach\n`global`, so the caller might see a node part of the result returned by\n[`nodes()`](`erlang:nodes/0`) while it still is not known to `global`. The\ndisconnect operation will, however, still not cause any overlapping partitions\nwhen [`prevent_overlapping_partitions`] is enabled. If\n[`prevent_overlapping_partitions`] is disabled, overlapping partitions might form\nin this case.\n\nNote that when [`prevent_overlapping_partitions`] is enabled, you may see warning\nreports on other nodes when they detect that current node has disconnected.\nThese are in this case completely harmless and can be ignored.\n\n[`prevent_overlapping_partitions`]: kernel_app.md#prevent_overlapping_partitions","ref":"global.html#disconnect/0"},{"type":"function","title":"global.notify_all_name/3","doc":"The function unregisters both pids and sends the message\n`{global_name_conflict, Name, OtherPid}` to both processes.\n\nCan be used as a name resolving function for `register_name/3` and\n`re_register_name/3`.","ref":"global.html#notify_all_name/3"},{"type":"function","title":"global.random_exit_name/3","doc":"The function randomly selects one of the pids for registration and kills the\nother one.\n\nCan be used as a name resolving function for `register_name/3` and\n`re_register_name/3`.","ref":"global.html#random_exit_name/3"},{"type":"function","title":"global.random_notify_name/3","doc":"The function randomly selects one of the pids for registration, and sends the\nmessage `{global_name_conflict, Name}` to the other pid.\n\nCan be used as a name resolving function for `register_name/3` and\n`re_register_name/3`.","ref":"global.html#random_notify_name/3"},{"type":"function","title":"global.re_register_name/2","doc":"","ref":"global.html#re_register_name/2"},{"type":"function","title":"global.re_register_name/3","doc":"Atomically changes the registered name `Name` on all nodes to refer to `Pid`.\n\nFunction `Resolve` has the same behavior as in\n[`register_name/2,3`](`register_name/2`).","ref":"global.html#re_register_name/3"},{"type":"function","title":"global.register_name/2","doc":"","ref":"global.html#register_name/2"},{"type":"function","title":"global.register_name/3","doc":"Globally associates name `Name` with a pid, that is, globally notifies all nodes\nof a new global name in a network of Erlang nodes.\n\nWhen new nodes are added to the network, they are informed of the globally\nregistered names that already exist. The network is also informed of any global\nnames in newly connected nodes. If any name clashes are discovered, function\n`Resolve` is called. Its purpose is to decide which pid is correct. If the\nfunction crashes, or returns anything other than one of the pids, the name is\nunregistered. This function is called once for each name clash.\n\n> #### Warning {: .warning }\n>\n> If you plan to change code without restarting your system, you must use an\n> external fun (`fun Module:Function/Arity`) as function `Resolve`. If you use a\n> local fun, you can never replace the code for the module that the fun belongs\n> to.\n\nThree predefined resolve functions exist:\n[`random_exit_name/3`](`random_exit_name/3`),\n[`random_notify_name/3`](`random_notify_name/3`), and\n[`notify_all_name/3`](`notify_all_name/3`).\n\nThis function is completely synchronous, that is, when this function returns,\nthe name is either registered on all nodes or none.\n\nThe function returns `yes` if successful, `no` if it fails. For example, `no` is\nreturned if an attempt is made to register an already registered process or to\nregister a process with a name that is already in use.\n\n> #### Note {: .info }\n>\n> Releases up to and including Erlang/OTP R10 did not check if the process was\n> already registered. The global name table could therefore become inconsistent.\n> The old (buggy) behavior can be chosen by giving the Kernel application\n> variable `global_multi_name_action` the value `allow`.\n\nIf a process with a registered name dies, or the node goes down, the name is\nunregistered on all nodes.","ref":"global.html#register_name/3"},{"type":"function","title":"global.registered_names/0","doc":"Returns a list of all globally registered names.","ref":"global.html#registered_names/0"},{"type":"function","title":"global.send/2","doc":"Sends message `Msg` to the pid globally registered as `Name`.\n\nIf `Name` is not a globally registered name, the calling function exits with\nreason `{badarg, {Name, Msg}}`.","ref":"global.html#send/2"},{"type":"function","title":"global.set_lock/1","doc":"","ref":"global.html#set_lock/1"},{"type":"function","title":"global.set_lock/2","doc":"","ref":"global.html#set_lock/2"},{"type":"function","title":"global.set_lock/3","doc":"Sets a lock on the specified nodes on using `t:id/0`.\n\nIf a lock already exists on `ResourceId` for another requester than `LockRequesterId`,\nand `Retries` is not equal to `0`, the process sleeps for a while and tries to\nexecute the action later. When `Retries` attempts have been made, `false` is\nreturned, otherwise `true`. If `Retries` is `infinity`, `true` is eventually\nreturned (unless the lock is never released).\n\nThis function is completely synchronous.\n\nIf a process that holds a lock dies, or the node goes down, the locks held by\nthe process are deleted.\n\nThe global name server keeps track of all processes sharing the same lock, that\nis, if two processes set the same lock, both processes must delete the lock.\n\nThis function does not address the problem of a deadlock. A deadlock can never\noccur as long as processes only lock one resource at a time. A deadlock can\noccur if some processes try to lock two or more resources. It is up to the\napplication to detect and rectify a deadlock.\n\n> #### Note {: .info }\n>\n> Avoid the following values of `ResourceId`, otherwise Erlang/OTP does not work\n> properly:\n>\n> - `dist_ac`\n> - `global`\n> - `mnesia_adjust_log_writes`\n> - `mnesia_table_lock`","ref":"global.html#set_lock/3"},{"type":"function","title":"global.sync/0","doc":"Synchronizes the global name server with all nodes known to this node.\n\nThese are the nodes that are returned from [`nodes()`](`erlang:nodes/0`). When\nthis function returns, the global name server receives global information from\nall nodes. This function can be called when new nodes are added to the network.\n\nThe only possible error reason `Reason` is\n`{\"global_groups definition error\", Error}`.","ref":"global.html#sync/0"},{"type":"function","title":"global.trans/2","doc":"","ref":"global.html#trans/2"},{"type":"function","title":"global.trans/3","doc":"","ref":"global.html#trans/3"},{"type":"function","title":"global.trans/4","doc":"Sets a lock on `Id` (using `set_lock/3`).\n\nIf this succeeds, `Fun()` is evaluated and the result `Res` is returned.\nReturns `aborted` if the lock attempt fails. If `Retries` is set to `infinity`,\nthe transaction does not abort.\n\n`infinity` is the default setting and is used if no value is specified for\n`Retries`.","ref":"global.html#trans/4"},{"type":"function","title":"global.unregister_name/1","doc":"Removes the globally registered name `Name` from the network of Erlang nodes.","ref":"global.html#unregister_name/1"},{"type":"function","title":"global.whereis_name/1","doc":"Returns the pid with the globally registered name `Name`. Returns `undefined` if\nthe name is not globally registered.","ref":"global.html#whereis_name/1"},{"type":"type","title":"global.id/0","doc":"A lock id used to set or delete lock `ResourceId` on behalf of `LockRequesterId`.","ref":"global.html#t:id/0"},{"type":"type","title":"global.method/0","doc":"","ref":"global.html#t:method/0"},{"type":"type","title":"global.retries/0","doc":"","ref":"global.html#t:retries/0"},{"type":"type","title":"global.trans_fun/0","doc":"","ref":"global.html#t:trans_fun/0"},{"type":"module","title":"global_group","doc":"Grouping nodes to global name registration groups.\n\nThis module makes it possible to partition the nodes of a system into _global\ngroups_. Each global group has its own global namespace, see `m:global`.\n\nThe main advantage of dividing systems into global groups is that the background\nload decreases while the number of nodes to be updated is reduced when\nmanipulating globally registered names.\n\nThe Kernel configuration parameter [`global_groups`](kernel_app.md#global_groups)\ndefines the global groups:\n\n```erlang\n{global_groups, [GroupTuple :: group_tuple()]}\n```\n\nFor the processes and nodes to run smoothly using the global group\nfunctionality, the following criteria must be met:\n\n- An instance of the global group server, `global_group`, must be running on\n each node. The processes are automatically started and synchronized when a\n node is started.\n- All involved nodes must agree on the global group definition, otherwise the\n behavior of the system is undefined.\n- _All_ nodes in the system must belong to exactly one global group.\n\nIn the following descriptions, a _group node_ is a node belonging to the same\nglobal group as the local node.","ref":"global_group.html"},{"type":"module","title":"Notes - global_group","doc":"- In the situation where a node has lost its connections to other nodes in its\n global group, but has connections to nodes in other global groups, a request\n from another global group can produce an incorrect or misleading result. For\n example, the isolated node can have inaccurate information about registered\n names in its global group.\n- Function [`send/2,3`](`send/2`) is not secure.\n- Distribution of applications is highly dependent of the global group\n definitions. It is not recommended that an application is distributed over\n many global groups, as the registered names can be moved to another global\n group at failover/takeover. Nothing prevents this to be done, but the\n application code must then handle the situation.","ref":"global_group.html#module-notes"},{"type":"module","title":"See Also - global_group","doc":"`m:global`, [`erl`](`e:erts:erl_cmd.md`)","ref":"global_group.html#module-see-also"},{"type":"function","title":"global_group.global_groups/0","doc":"Returns a tuple containing the name of the global group that the local node\nbelongs to, and the list of all other known group names.\n\nReturns `undefined` if no global groups are defined.","ref":"global_group.html#global_groups/0"},{"type":"function","title":"global_group.info/0","doc":"Returns a list containing information about the global groups. Each list element\nis a tuple. The order of the tuples is undefined.\n\n- **`{state, State}`** - If the local node is part of a global group, `State` is\n equal to `synced`. If no global groups are defined, `State` is equal to\n `no_conf`.\n\n- **`{own_group_name, GroupName}`** - The name (atom) of the group that the\n local node belongs to.\n\n- **`{own_group_nodes, Nodes}`** - A list of node names (atoms), the group\n nodes.\n\n- **`{synced_nodes, Nodes}`** - A list of node names, the group nodes currently\n synchronized with the local node.\n\n- **`{sync_error, Nodes}`** - A list of node names, the group nodes with which\n the local node has failed to synchronize.\n\n- **`{no_contact, Nodes}`** - A list of node names, the group nodes to which\n there are currently no connections.\n\n- **`{other_groups, Groups}`** - `Groups` is a list of tuples\n `{GroupName, Nodes}`, specifying the name and nodes of the other global\n groups.\n\n- **`{monitoring, Pids}`** - A list of pids, specifying the processes that have\n subscribed to `nodeup` and `nodedown` messages.","ref":"global_group.html#info/0"},{"type":"function","title":"global_group.monitor_nodes/1","doc":"Alter the calling process' subscription of node status change messages.\n\nIf `Flag` is equal to `true` the calling process starts subscribing to\nnode status change messages. If equal to `false` it stops subscribing.\n\nA process that has subscribed receives the messages `{nodeup, Node}` and\n`{nodedown, Node}` when a group node connects or disconnects, respectively.","ref":"global_group.html#monitor_nodes/1"},{"type":"function","title":"global_group.own_nodes/0","doc":"Returns the names of all group nodes, regardless of their current status.","ref":"global_group.html#own_nodes/0"},{"type":"function","title":"global_group.registered_names/1","doc":"Returns a list of all names that are globally registered on the specified node\nor in the specified global group.","ref":"global_group.html#registered_names/1"},{"type":"function","title":"global_group.send/2","doc":"Sends `Msg` to the pid represented by the globally registered name `Name`.\n\n`send/2` searches for `Name` any any global group. The global groups are searched\nin the order that they appear in the value of configuration parameter\n[`global_groups`](kernel_app.md#global_groups).\n\nIf `Name` is found, message `Msg` is sent to the corresponding pid. The pid is\nalso the return value of the function. If the name is not found, the function\nreturns `{badarg, {Name, Msg}}`.","ref":"global_group.html#send/2"},{"type":"function","title":"global_group.send/3","doc":"Equivalent to [`send(Name, Msg)`](`send/2`) except that he search is limited\nto the node or global group specified by `Where`.","ref":"global_group.html#send/3"},{"type":"function","title":"global_group.sync/0","doc":"Synchronizes the group nodes, that is, the global name servers on the group\nnodes. Also checks the names globally registered in the current global group and\nunregisters them on any known node not part of the group.\n\nIf synchronization is not possible, an error report is sent to the error logger\n(see also `m:error_logger`.\n\nReturns `{error, {'invalid global_groups definition', Bad}}` if configuration\nparameter `global_groups` has an invalid value `Bad`.","ref":"global_group.html#sync/0"},{"type":"function","title":"global_group.whereis_name/1","doc":"Searched for `Name` in any global group.\n\nThe global groups are searched in the order that they appear in the value\nof configuration parameter `global_groups`.\n\nIf `Name` is found, the corresponding pid is returned. If the name is not found,\nthe function returns `undefined`.","ref":"global_group.html#whereis_name/1"},{"type":"function","title":"global_group.whereis_name/2","doc":"Equivalent to [`whereis_name(Name)`](`whereis_name/1`) except that he search is limited\nto the node or global group specified by `Where`.","ref":"global_group.html#whereis_name/2"},{"type":"type","title":"global_group.group_name/0","doc":"","ref":"global_group.html#t:group_name/0"},{"type":"type","title":"global_group.group_tuple/0","doc":"A `GroupTuple` without `PublishType` is the same as a `GroupTuple` with\n`PublishType` equal to `normal`.","ref":"global_group.html#t:group_tuple/0"},{"type":"type","title":"global_group.info_item/0","doc":"","ref":"global_group.html#t:info_item/0"},{"type":"type","title":"global_group.name/0","doc":"A registered name.","ref":"global_group.html#t:name/0"},{"type":"type","title":"global_group.publish_type/0","doc":"A node started with command-line flag `-hidden` (see\n[`erl`](`e:erts:erl_cmd.md`)) is said to be a _hidden_ node. A hidden node\nestablishes hidden connections to nodes not part of the same global group, but\nnormal (visible) connections to nodes part of the same global group.\n\nA global group defined with `PublishType` equal to `hidden` is said to be a\nhidden global group. All nodes in a hidden global group are hidden nodes,\nwhether they are started with command-line flag `-hidden` or not.","ref":"global_group.html#t:publish_type/0"},{"type":"type","title":"global_group.sync_state/0","doc":"","ref":"global_group.html#t:sync_state/0"},{"type":"type","title":"global_group.where/0","doc":"","ref":"global_group.html#t:where/0"},{"type":"module","title":"net_adm","doc":"Various Erlang net administration routines.\n\nThis module contains various network utility functions.","ref":"net_adm.html"},{"type":"module","title":"Files - net_adm","doc":"File `.hosts.erlang` consists of a number of host names written as Erlang terms.\nIt is looked for in the current work directory, the user's home directory, and\n`$OTPROOT` (the root directory of Erlang/OTP), in that order.\n\nThe format of file `.hosts.erlang` must be one host name per line. The host\nnames must be within quotes.\n\n_Example:_\n\n```text\n'super.eua.ericsson.se'.\n'renat.eua.ericsson.se'.\n'grouse.eua.ericsson.se'.\n'gauffin1.eua.ericsson.se'.\n^ (new line)\n```","ref":"net_adm.html#module-files"},{"type":"function","title":"net_adm.dns_hostname/1","doc":"Returns the official name of `Host`, or `{error, Host}` if no such name is\nfound. See also `m:inet`.","ref":"net_adm.html#dns_hostname/1"},{"type":"function","title":"net_adm.host_file/0","doc":"Reads file `.hosts.erlang`, see section [Files](`m:net_adm#module-files`). Returns the\nhosts in this file as a list. Returns `{error, Reason}` if the file cannot be\nread or the Erlang terms on the file cannot be interpreted.","ref":"net_adm.html#host_file/0"},{"type":"function","title":"net_adm.localhost/0","doc":"Returns the name of the local host. If Erlang was started with command-line flag\n`-name`, `Name` is the fully qualified name.","ref":"net_adm.html#localhost/0"},{"type":"function","title":"net_adm.names/0","doc":"","ref":"net_adm.html#names/0"},{"type":"function","title":"net_adm.names/1","doc":"Returns the names and associated port numbers of the Erlang nodes that `epmd`\nregistered at the specified host.\n\nSimilar to `epmd -names`, see [`erts:epmd`](`e:erts:epmd_cmd.md`).\n\nReturns `{error, address}` if `epmd` is not operational.\n\n_Example:_\n\n```erlang\n(arne@dunn)1> net_adm:names().\n{ok,[{\"arne\",40262}]}\n```","ref":"net_adm.html#names/1"},{"type":"function","title":"net_adm.ping/1","doc":"Sets up a connection to `Node`. Returns `pong` if it is successful, otherwise\n`pang`.","ref":"net_adm.html#ping/1"},{"type":"function","title":"net_adm.world/0","doc":"","ref":"net_adm.html#world/0"},{"type":"function","title":"net_adm.world/1","doc":"Calls [`names(Host)`](`names/1`) for all hosts that are specified in the Erlang\nhost file `.hosts.erlang`, collects the replies, and then evaluates\n[`ping(Node)`](`ping/1`) on all those nodes. Returns the list of all nodes that\nare successfully pinged.\n\nIf `Arg == verbose`, the function writes information about which nodes it is\npinging to `stdout`.\n\nThis function can be useful when a node is started, and the names of the other\nnetwork nodes are not initially known.\n\nReturns `{error, Reason}` if `host_file/0` returns `{error, Reason}`.","ref":"net_adm.html#world/1"},{"type":"function","title":"net_adm.world_list/1","doc":"","ref":"net_adm.html#world_list/1"},{"type":"function","title":"net_adm.world_list/2","doc":"Same as [`world/0,1`](`world/1`), but the hosts are specified as argument\ninstead of being read from `.hosts.erlang`.","ref":"net_adm.html#world_list/2"},{"type":"type","title":"net_adm.verbosity/0","doc":"","ref":"net_adm.html#t:verbosity/0"},{"type":"module","title":"net_kernel","doc":"Erlang networking kernel.\n\nThe net kernel is a system process, registered as `net_kernel`, which must be\noperational for distributed Erlang to work. The purpose of this process is to\nimplement parts of the BIFs [`spawn/4`](`spawn/4`) and\n[`spawn_link/4`](`spawn_link/4`), and to provide monitoring of the network.\n\nAn Erlang node is started using command-line flag `-name` or `-sname`:\n\n```text\n$ erl -sname foobar\n```\n\nIt is also possible to call [`net_kernel:start(foobar, #{})`](`start/2`)\ndirectly from the normal Erlang shell prompt:\n\n```erlang\n1> net_kernel:start(foobar, #{name_domain => shortnames}).\n{ok,<0.64.0>}\n(foobar@gringotts)2>\n```\n\nIf the node is started with command-line flag `-sname`, the node name is\n`foobar@Host`, where `Host` is the short name of the host (not the fully\nqualified domain name). If started with flag `-name`, the node name is\n`foobar@Host`, where `Host` is the fully qualified domain name. For more\ninformation, see [`erl`](`e:erts:erl_cmd.md`).\n\nNormally, connections are established automatically when another node is\nreferenced. This functionality can be disabled by setting Kernel configuration\nparameter `dist_auto_connect` to `never`, see [`kernel(6)`](kernel_app.md). In\nthis case, connections must be established explicitly by calling\n`connect_node/1`.\n\nWhich nodes that are allowed to communicate with each other is handled by the\nmagic cookie system, see section [Distributed Erlang](`e:system:distributed.md`)\nin the Erlang Reference Manual.\n\n> #### Warning {: .warning }\n>\n> Starting a distributed node without also specifying\n> [`-proto_dist inet_tls`](`e:erts:erl_cmd.md#proto_dist`) will expose the node\n> to attacks that may give the attacker complete access to the node and in\n> extension the cluster. When using un-secure distributed nodes, make sure that\n> the network is configured to keep potential attackers out. See the\n> [Using SSL for Erlang Distribution](`e:ssl:ssl_distribution.md`) User's Guide\n> for details on how to setup a secure distributed node.","ref":"net_kernel.html"},{"type":"function","title":"net_kernel.allow/1","doc":"Permits access to the specified set of nodes.\n\nBefore the first call to [`allow/1`](`allow/1`), any node with the correct\ncookie can be connected. When [`allow/1`](`allow/1`) is called, a list of\nallowed nodes is established. Any access attempts made from (or to) nodes not in\nthat list will be rejected.\n\nSubsequent calls to [`allow/1`](`allow/1`) will add the specified nodes to the\nlist of allowed nodes. It is not possible to remove nodes from the list.\n\nReturns `error` if any element in `Nodes` is not an atom.","ref":"net_kernel.html#allow/1"},{"type":"function","title":"net_kernel.connect_node/1","doc":"Establishes a connection to `Node`.\n\nReturns `true` if a connection was established or was already established or if\n`Node` is the local node itself. Returns `false` if the connection attempt failed,\nand `ignored` if the local node is not alive.","ref":"net_kernel.html#connect_node/1"},{"type":"function","title":"net_kernel.get_net_ticktime/0","doc":"Returns currently used net tick time in seconds.\n\nFor more information see the [`net_ticktime`](kernel_app.md#net_ticktime)\n`Kernel` parameter.\n\nDefined return values (`Res`):\n\n- **`NetTicktime`** - `net_ticktime` is `NetTicktime` seconds.\n\n- **`{ongoing_change_to, NetTicktime}`** - `net_kernel` is currently changing\n `net_ticktime` to `NetTicktime` seconds.\n\n- **`ignored`** - The local node is not alive.","ref":"net_kernel.html#get_net_ticktime/0"},{"type":"function","title":"net_kernel.get_state/0","doc":"Get the current state of the distribution for the local node.\n\nReturns a map with (at least) the following key-value pairs:\n\n- **`started => Started`** - Valid values for `Started`:\n\n - **`no`** - The distribution is not started. In this state none of the other\n keys below are present in the map.\n\n - **`static`** - The distribution was started with command line arguments\n [`-name`](`e:erts:erl_cmd.md#name`) or\n [`-sname`](`e:erts:erl_cmd.md#sname`).\n\n - **`dynamic`** - The distribution was started with\n [`net_kernel:start/1`](`start/1`) and can be stopped with\n [`net_kernel:stop/0`](`start/1`).\n\n- **`name => Name`** - The name of the node. Same as returned by `erlang:node/0`\n except when `name_type` is `dynamic` in which case `Name` may be `undefined`\n (instead of `nonode@nohost`).\n\n- **`name_type => NameType`** - Valid values for `NameType`:\n\n - **`static`** - The node has a static node name set by the node itself.\n\n - **`dynamic`** - The distribution was started in\n [dynamic node name](`e:system:distributed.md#dyn_node_name`) mode, and will\n get its node name assigned from the first node it connects to. If key `name`\n has value `undefined` that has not happened yet.\n\n- **`name_domain => NameDomain`** - Valid values for `NameDomain`:\n\n - **`shortnames`** - The distribution was started to use node names with a\n short host portion (not fully qualified).\n\n - **`longnames`** - The distribution was started to use node names with a long\n fully qualified host portion.","ref":"net_kernel.html#get_state/0"},{"type":"function","title":"net_kernel.getopts/2","doc":"Get one or more options for the distribution socket connected to `Node`.\n\nIf `Node` is a connected node the return value is the same as from\n[`inet:getopts(Sock, Options)`](`inet:getopts/2`) where `Sock` is the\ndistribution socket for `Node`.\n\nReturns `ignored` if the local node is not alive or `{error, noconnection}` if\n`Node` is not connected.","ref":"net_kernel.html#getopts/2"},{"type":"function","title":"net_kernel.monitor_nodes/1","doc":"","ref":"net_kernel.html#monitor_nodes/1"},{"type":"function","title":"net_kernel.monitor_nodes/2","doc":"The calling process subscribes or unsubscribes to node status change messages. A\n`nodeup` message is delivered to all subscribing processes when a new node is\nconnected, and a `nodedown` message is delivered when a node is disconnected.\n\nIf `Flag` is `true`, a new subscription is started. If `Flag` is `false`, all\nprevious subscriptions started with the same `Options` are stopped. Two option\nlists are considered the same if they contain the same set of options.\n\nDelivery guarantees of `nodeup`/`nodedown` messages:\n\n- `nodeup` messages are delivered before delivery of any signals from the remote\n node through the newly established connection.\n- `nodedown` messages are delivered after all the signals from the remote node\n over the connection have been delivered.\n- `nodeup` messages are delivered after the corresponding node appears in\n results from `erlang:nodes()`.\n- `nodedown` messages are delivered after the corresponding node has disappeared\n in results from `erlang:nodes()`.\n- As of OTP 23.0, a `nodedown` message for a connection being taken down will be\n delivered before a `nodeup` message due to a new connection to the same node.\n Prior to OTP 23.0, this was not guaranteed to be the case.\n\nThe format of the node status change messages depends on `Options`. If `Options`\nis the empty list or if `net_kernel:monitor_nodes/1` is called, the format is as\nfollows:\n\n```erlang\n{nodeup, Node} | {nodedown, Node}\n Node = node()\n```\n\nWhen `Options` is the empty map or empty list, the caller will only subscribe\nfor status change messages for visible nodes. That is, only nodes that appear in\nthe result of `erlang:nodes/0`.\n\nIf `Options` equals anything other than the empty list, the format of the status\nchange messages is as follows:\n\n```erlang\n{nodeup, Node, Info} | {nodedown, Node, Info}\n Node = node()\n Info = #{Tag => Val} | [{Tag, Val}]\n```\n\n`Info` is either a map or a list of 2-tuples. Its content depends on `Options`.\nIf `Options` is a map, `Info` will also be a map. If `Options` is a list, `Info`\nwill also be a list.\n\nWhen `Options` is a map, currently the following associations are allowed:\n\n- **`connection_id => boolean()`** - If the value of the association equals\n `true`, a `connection_id => ConnectionId` association will be included in the\n `Info` map where `ConnectionId` is the connection identifier of the connection\n coming up or going down. For more info about this connection identifier see\n the documentation of [erlang:nodes/2](`m:erlang#connection_id`).\n\n- **`node_type => NodeType`** - Valid values for `NodeType`:\n\n - **`visible`** - Subscribe to node status change messages for visible nodes\n only. The association `node_type => visible` will be included in the `Info`\n map.\n\n - **`hidden`** - Subscribe to node status change messages for hidden nodes\n only. The association `node_type => hidden` will be included in the `Info`\n map.\n\n - **`all`** - Subscribe to node status change messages for both visible and\n hidden nodes. The association `node_type => visible | hidden` will be\n included in the `Info` map.\n\n If no `node_type => NodeType` association is included in the `Options` map,\n the caller will subscribe for status change messages for visible nodes only,\n but _no_ `node_type => visible` association will be included in the `Info`\n map.\n\n- **`nodedown_reason => boolean()`** - If the value of the association equals\n `true`, a `nodedown_reason => Reason` association will be included in the\n `Info` map for `nodedown` messages.\n\n [](){: #nodedown_reasons } `Reason` can, depending on which distribution\n module or process that is used, be any term, but for the standard TCP\n distribution module it is one of the following:\n\n - **`connection_setup_failed`** - The connection setup failed (after `nodeup`\n messages were sent).\n\n - **`no_network`** - No network is available.\n\n - **`net_kernel_terminated`** - The `net_kernel` process terminated.\n\n - **`shutdown`** - Unspecified connection shutdown.\n\n - **`connection_closed`** - The connection was closed.\n\n - **`disconnect`** - The connection was disconnected (forced from the current\n node).\n\n - **`net_tick_timeout`** - Net tick time-out.\n\n - **`send_net_tick_failed`** - Failed to send net tick over the connection.\n\n - **`get_status_failed`** - Status information retrieval from the `Port`\n holding the connection failed.\n\nWhen `Options` is a list, currently `ListOption` can be one of the following:\n\n- **`connection_id`** - A `{connection_id, ConnectionId}` tuple will be included\n in `Info` where `ConnectionId` is the connection identifier of the connection\n coming up or going down. For more info about this connection identifier see\n the documentation of [erlang:nodes/2](`m:erlang#connection_id`).\n\n- **`{node_type, NodeType}`** - Valid values for `NodeType`:\n\n - **`visible`** - Subscribe to node status change messages for visible nodes\n only. The tuple `{node_type, visible}` will be included in the `Info` list.\n\n - **`hidden`** - Subscribe to node status change messages for hidden nodes\n only. The tuple `{node_type, hidden}` will be included in the `Info` list.\n\n - **`all`** - Subscribe to node status change messages for both visible and\n hidden nodes. The tuple `{node_type, visible | hidden}` will be included in\n the `Info` list.\n\n If no `{node_type, NodeType}` option has been given. The caller will subscribe\n for status change messages for visible nodes only, but _no_\n `{node_type, visible}` tuple will be included in the `Info` list.\n\n- **`nodedown_reason`** - The tuple `{nodedown_reason, Reason}` will be included\n in the `Info` list for `nodedown` messages.\n\n See the documentation of the\n [`nodedown_reason => boolean()`](`m:net_kernel#nodedown_reasons`) association\n above for information about possible `Reason` values.\n\nExample:\n\n```erlang\n(a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).\nok\n(a@localhost)2> flush().\nShell got {nodeup,b@localhost,\n #{connection_id => 3067552,node_type => visible}}\nShell got {nodeup,c@localhost,\n #{connection_id => 13892107,node_type => hidden}}\nShell got {nodedown,b@localhost,\n #{connection_id => 3067552,node_type => visible,\n nodedown_reason => connection_closed}}\nShell got {nodedown,c@localhost,\n #{connection_id => 13892107,node_type => hidden,\n nodedown_reason => net_tick_timeout}}\nShell got {nodeup,b@localhost,\n #{connection_id => 3067553,node_type => visible}}\nok\n(a@localhost)3>\n```","ref":"net_kernel.html#monitor_nodes/2"},{"type":"function","title":"net_kernel.set_net_ticktime/1","doc":"","ref":"net_kernel.html#set_net_ticktime/1"},{"type":"function","title":"net_kernel.set_net_ticktime/2","doc":"Sets `net_ticktime` (see [`kernel(6)`](kernel_app.md)) to `NetTicktime` seconds.\n`TransitionPeriod` defaults to `60`.\n\nSome definitions:\n\n- **Minimum transition traffic interval (`MTTI`)** -\n `minimum(NetTicktime, PreviousNetTicktime)*1000 div 4` milliseconds.\n\n- **Transition period** - The time of the least number of consecutive `MTTI`s to\n cover `TransitionPeriod` seconds following the call to\n [`set_net_ticktime/2`](`set_net_ticktime/2`) (that is,\n ((`TransitionPeriod*1000 - 1) div MTTI + 1)*MTTI` milliseconds).\n\nIf `NetTicktime #### Note {: .info }\n>\n> The `net_ticktime` changes must be initiated on all nodes in the network (with\n> the same `NetTicktime`) before the end of any transition period on any node;\n> otherwise connections can erroneously be disconnected.\n\nReturns one of the following:\n\n- **`unchanged`** - `net_ticktime` already has the value of `NetTicktime` and is\n left unchanged.\n\n- **`change_initiated`** - `net_kernel` initiated the change of `net_ticktime`\n to `NetTicktime` seconds.\n\n- **`{ongoing_change_to, NewNetTicktime}`** - The request is _ignored_ because\n `net_kernel` is busy changing `net_ticktime` to `NewNetTicktime` seconds.","ref":"net_kernel.html#set_net_ticktime/2"},{"type":"function","title":"net_kernel.setopts/2","doc":"Set one or more options for distribution sockets. Argument `Node` can be either\none node name or the atom `new` to affect the distribution sockets of all future\nconnected nodes.\n\nThe return value is the same as from `inet:setopts/2` or `{error, noconnection}`\nif `Node` is not a connected node or `new`.\n\nIf `Node` is `new` the `Options` will then also be added to kernel configuration\nparameters [inet_dist_listen_options](kernel_app.md#inet_dist_listen_options)\nand [inet_dist_connect_options](kernel_app.md#inet_dist_connect_options).\n\nReturns `ignored` if the local node is not alive.","ref":"net_kernel.html#setopts/2"},{"type":"function","title":"net_kernel.start/1","doc":"Turns a non-distributed node into a distributed node by starting `net_kernel`\nand other necessary processes.\n\n`Options` list can only be exactly one of the following lists (order is\nimporant):\n\n- **`[Name]`** - The same as `net_kernel:start([Name, longnames, 15000])`.\n\n- **`[Name, NameDomain]`** - The same as\n `net_kernel:start([Name, NameDomain, 15000])`.\n\n- **`[Name, NameDomain, TickTime]`** - The same as\n [`net_kernel:start(Name, #{name_domain => NameDomain, net_ticktime => ((TickTime*4-1) div 1000) + 1, net_tickintensity => 4})`](`start/2`).\n Note that `TickTime` is _not_ the same as net tick time expressed in\n milliseconds. `TickTime` is the time between ticks when net tick intensity\n equals `4`.","ref":"net_kernel.html#start/1"},{"type":"function","title":"net_kernel.start/2","doc":"Turns a non-distributed node into a distributed node by starting `net_kernel`\nand other necessary processes.\n\nIf `Name` is set to _`undefined`_ the distribution will be started to request a\ndynamic node name from the first node it connects to. See\n[Dynamic Node Name](`e:system:distributed.md#dyn_node_name`). Setting `Name` to\n`undefined` implies options `dist_listen => false` and `hidden => true`.\n\nCurrently supported options:\n\n- **`name_domain => NameDomain`** - Determines the host name part of the node\n name. If `NameDomain` equals `longnames`, fully qualified domain names will be\n used which also is the default. If `NameDomain` equals `shortnames`, only the\n short name of the host will be used.\n\n- **`net_ticktime => NetTickTime`** - _Net tick time_ to use in seconds.\n Defaults to the value of the [`net_ticktime`](kernel_app.md#net_ticktime)\n `kernel(6)` parameter. For more information about _net tick time_, see the\n `kernel` parameter. However, note that if the value of the `kernel` parameter\n is invalid, it will silently be replaced by a valid value, but if an invalid\n `NetTickTime` value is passed as option value to this function, the call will\n fail.\n\n- **`net_tickintensity => NetTickIntensity`** - _Net tick intensity_ to use.\n Defaults to the value of the\n [`net_tickintensity`](kernel_app.md#net_tickintensity) `kernel(6)` parameter.\n For more information about _net tick intensity_, see the `kernel` parameter.\n However, note that if the value of the `kernel` parameter is invalid, it will\n silently be replaced by a valid value, but if an invalid `NetTickIntensity`\n value is passed as option value to this function, the call will fail.\n\n- **`dist_listen => boolean()`** - Enable or disable listening for incoming\n connections. Defaults to the value of the\n [`-dist_listen`](`e:erts:erl_cmd.md#dist_listen`) `erl` command line argument.\n Note that `dist_listen => false` implies `hidden => true`.\n\n If `undefined` has been passed as `Name`, the `dist_listen` option will be\n overridden with `dist_listen => false`.\n\n- **`hidden => boolean()`** - Enable or disable hidden node. Defaults to `true`\n if the [`-hidden`](`e:erts:erl_cmd.md#hidden`) `erl` command line argument has\n been passed; otherwise `false`.\n\n If `undefined` has been passed as `Name`, or the option `dist_listen` equals\n `false`, the `hidden` option will be overridden with `hidden => true`.","ref":"net_kernel.html#start/2"},{"type":"function","title":"net_kernel.stop/0","doc":"Turns a distributed node into a non-distributed node.\n\nFor other nodes in the network, this is the same as the node going down.\nOnly possible when the net kernel was started using `start/2`, otherwise\n`{error, not_allowed}` is returned. Returns `{error, not_found}` if the local\nnode is not alive.","ref":"net_kernel.html#stop/0"},{"type":"type","title":"net_kernel.connection_state/0","doc":"","ref":"net_kernel.html#t:connection_state/0"},{"type":"type","title":"net_kernel.connection_type/0","doc":"","ref":"net_kernel.html#t:connection_type/0"},{"type":"module","title":"pg","doc":"Distributed named process groups.\n\nThis module implements process groups. A message can be sent to one, some, or\nall group members.\n\nUp until OTP 17 there used to exist an experimental `pg` module in `stdlib`.\nThis `pg` module is not the same module as that experimental `pg` module, and\nonly share the same module name.\n\nA group of processes can be accessed by a common name. For example, if there is\na group named `foobar`, there can be a set of processes (which can be located on\ndifferent nodes) that are all members of the group `foobar`. There are no\nspecial functions for sending a message to the group. Instead, client functions\nare to be written with the functions `get_members/1` and `get_local_members/1`\nto determine which processes are members of the group. Then the message can be\nsent to one or more group members.\n\nIf a member terminates, it is automatically removed from the group.\n\nA process may join multiple groups. It may join the same group multiple times.\nIt is only allowed to join processes running on local node.\n\nProcess Groups implement strong eventual consistency. Process Groups membership\nview may temporarily diverge. For example, when processes on `node1` and `node2`\njoin concurrently, `node3` and `node4` may receive updates in a different order.\n\nMembership view is not transitive. If `node1` is not directly connected to\n`node2`, they will not see each other groups. But if both are connected to\n`node3`, `node3` will have the full view.\n\nGroups are automatically created when any process joins, and are removed when\nall processes leave the group. Non-existing group is considered empty\n(containing no processes).\n\nProcess groups can be organised into multiple scopes. Scopes are completely\nindependent of each other. A process may join any number of groups in any number\nof scopes. Scopes are designed to decouple single mesh into a set of overlay\nnetworks, reducing amount of traffic required to propagate group membership\ninformation. Default scope `pg` is started automatically when\n[Kernel](kernel_app.md#start_pg) is configured to do so.\n\n> #### Note {: .info }\n>\n> Scope name is used to register process locally, and to name an ETS table. If\n> there is another process registered under this name, or another ETS table\n> exists, scope fails to start.\n>\n> Local membership is not preserved if scope process exits and restarts.\n>\n> A scope can be kept local-only by using a scope name that is unique\n> cluster-wide, e.g. the node name: `pg:start_link(node()).`","ref":"pg.html"},{"type":"module","title":"See Also - pg","doc":"[Kernel](kernel_app.md)","ref":"pg.html#module-see-also"},{"type":"function","title":"pg.demonitor/1","doc":"","ref":"pg.html#demonitor/1"},{"type":"function","title":"pg.demonitor/2","doc":"Unsubscribes the caller from updates (scope or group). Flushes all outstanding\nupdates that were already in the message queue of the calling process.","ref":"pg.html#demonitor/2"},{"type":"function","title":"pg.get_local_members/1","doc":"","ref":"pg.html#get_local_members/1"},{"type":"function","title":"pg.get_local_members/2","doc":"Returns all processes running on the local node in the group `Group`. Processes\nare returned in no specific order. This function is optimised for speed.","ref":"pg.html#get_local_members/2"},{"type":"function","title":"pg.get_members/1","doc":"","ref":"pg.html#get_members/1"},{"type":"function","title":"pg.get_members/2","doc":"Returns all processes in the group `Group`. Processes are returned in no\nspecific order. This function is optimised for speed.","ref":"pg.html#get_members/2"},{"type":"function","title":"pg.join/2","doc":"","ref":"pg.html#join/2"},{"type":"function","title":"pg.join/3","doc":"Joins single process or multiple processes to the group `Group`. A process can\njoin a group many times and must then leave the group the same number of times.\n\n`PidOrPids` may contain the same process multiple times.","ref":"pg.html#join/3"},{"type":"function","title":"pg.leave/2","doc":"","ref":"pg.html#leave/2"},{"type":"function","title":"pg.leave/3","doc":"Makes the process `PidOrPids` leave the group `Group`. If the process is not a\nmember of the group, `not_joined` is returned.\n\nWhen list of processes is passed as `PidOrPids`, function returns `not_joined`\nonly when all processes of the list are not joined.","ref":"pg.html#leave/3"},{"type":"function","title":"pg.monitor/1","doc":"","ref":"pg.html#monitor/1"},{"type":"function","title":"pg.monitor/2","doc":"Subscribes the caller to updates for the specified group.\n\nReturns list of processes currently in the group, and a reference to match the\nupcoming notifications.\n\nSee `monitor_scope/0` for the update message structure.","ref":"pg.html#monitor/2"},{"type":"function","title":"pg.monitor_scope/0","doc":"","ref":"pg.html#monitor_scope/0"},{"type":"function","title":"pg.monitor_scope/1","doc":"Subscribes the caller to updates from the specified scope.\n\nReturns content of the entire scope and a reference to match the upcoming\nnotifications.\n\nWhenever any group membership changes, an update message is sent to the\nsubscriber:\n\n```erlang\n{Ref, join, Group, [JoinPid1, JoinPid2]}\n```\n\n```erlang\n{Ref, leave, Group, [LeavePid1]}\n```","ref":"pg.html#monitor_scope/1"},{"type":"function","title":"pg.start/1","doc":"Starts additional scope.","ref":"pg.html#start/1"},{"type":"function","title":"pg.start_link/0","doc":"Starts the default `pg` scope within supervision tree.\n\nKernel may be configured to do it automatically by setting\nthe Kernel configuration parameter [`start_pg`](kernel_app.md#start_pg).","ref":"pg.html#start_link/0"},{"type":"function","title":"pg.start_link/1","doc":"Equivalent to [`start(Scope)`](`start/1`), except that it also creates\na `link/1` with the calling process.","ref":"pg.html#start_link/1"},{"type":"function","title":"pg.which_groups/0","doc":"","ref":"pg.html#which_groups/0"},{"type":"function","title":"pg.which_groups/1","doc":"Returns a list of all known groups.","ref":"pg.html#which_groups/1"},{"type":"type","title":"pg.group/0","doc":"The identifier of a process group.","ref":"pg.html#t:group/0"},{"type":"module","title":"rpc","doc":"Remote Procedure Call services.\n\nThis module contains services similar to Remote Procedure Calls. It also\ncontains broadcast facilities and parallel evaluators. A remote procedure call\nis a method to call a function on a remote node and collect the answer. It is\nused for collecting information on a remote node, or for running a function with\nsome specific side effects on the remote node.\n\n> #### Note {: .info }\n>\n> `rpc:call/4` and friends makes it quite hard to distinguish between successful\n> results, raised exceptions, and other errors. This cannot be changed due to\n> compatibility reasons. As of OTP 23, a new module `m:erpc` was introduced in\n> order to provide an API that makes it possible to distinguish between the\n> different results. The `erpc` module provides a subset (however, the central\n> subset) of the functionality available in the `rpc` module. The `erpc`\n> implementation also provides a more scalable implementation with better\n> performance than the original `rpc` implementation. However, since the\n> introduction of `erpc`, the `rpc` module implements large parts of its central\n> functionality using `erpc`, so the `rpc` module won't not suffer scalability\n> wise and performance wise compared to `erpc`.\n\n> #### Note {: .info }\n>\n> For some important information about distributed signals, see the\n> [Blocking Signaling Over Distribution](`e:system:ref_man_processes.md#blocking-signaling-over-distribution`)\n> section in the _Processes_ chapter of the _Erlang Reference Manual_. Blocking\n> signaling can, for example, cause timeouts in `rpc` to be significantly\n> delayed.","ref":"rpc.html"},{"type":"function","title":"rpc.abcast/2","doc":"Equivalent to [`abcast([node()|nodes()], Name, Msg)`](`abcast/3`).","ref":"rpc.html#abcast/2"},{"type":"function","title":"rpc.abcast/3","doc":"Broadcasts the message `Msg` asynchronously to the registered process `Name` on\nthe specified nodes.","ref":"rpc.html#abcast/3"},{"type":"function","title":"rpc.async_call/4","doc":"Implements _call streams with promises_, a type of RPC that does not suspend the\ncaller until the result is finished. Instead, a key is returned, which can be\nused later to collect the value. The key can be viewed as a promise to deliver\nthe answer.\n\nIn this case, the key `Key` is returned, which can be used in a subsequent call\nto `yield/1` or [`nb_yield/1,2`](`nb_yield/1`) to retrieve the value of\nevaluating [`apply(Module, Function, Args)`](`apply/3`) on node `Node`.\n\n> #### Note {: .info }\n>\n> If you want the ability to distinguish between results, you may want to\n> consider using the [`erpc:send_request()`](`erpc:send_request/4`) function\n> from the `erpc` module instead. This also gives you the ability retrieve the\n> results in other useful ways.\n\n> #### Note {: .info }\n>\n> `yield/1` and [`nb_yield/1,2`](`nb_yield/1`) must be called by the same\n> process from which this function was made otherwise they will never yield\n> correctly.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be an `rpc` server, another server, or a freshly spawned\n> process.","ref":"rpc.html#async_call/4"},{"type":"function","title":"rpc.block_call/4","doc":"The same as calling\n[`rpc:block_call(Node, Module, Function, Args, infinity)`](`block_call/5`).","ref":"rpc.html#block_call/4"},{"type":"function","title":"rpc.block_call/5","doc":"The same as calling\n[`rpc:call(Node, Module, Function, Args, Timeout)`](`call/5`) with the exception\nthat it also blocks other `rpc:block_call/5` operations from executing\nconcurrently on the node `Node`.\n\n> #### Warning {: .warning }\n>\n> Note that it also blocks other operations than just `rpc:block_call/5`\n> operations, so use it with care.","ref":"rpc.html#block_call/5"},{"type":"function","title":"rpc.call/4","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node` and\nreturns the corresponding value `Res`, or `{badrpc, Reason}` if the call fails.\nThe same as calling\n[`rpc:call(Node, Module, Function, Args, infinity)`](`call/5`).","ref":"rpc.html#call/4"},{"type":"function","title":"rpc.call/5","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node` and\nreturns the corresponding value `Res`, or `{badrpc, Reason}` if the call fails.\n`Timeout` is a time-out value in milliseconds. If the call times out, `Reason`\nis `timeout`.\n\nIf the reply arrives after the call times out, no message contaminates the\ncaller's message queue.\n\n> #### Note {: .info }\n>\n> If you want the ability to distinguish between results, you may want to\n> consider using the [`erpc:call()`](`erpc:call/4`) function from the `erpc`\n> module instead.\n\n> #### Note {: .info }\n>\n> Here follows the details of what exactly is returned.\n>\n> `{badrpc, Reason}` will be returned in the following circumstances:\n>\n> - The called function fails with an `exit` exception.\n> - The called function fails with an `error` exception.\n> - The called function returns a term that matches `{'EXIT', _}`.\n> - The called function `throws` a term that matches `{'EXIT', _}`.\n>\n> `Res` is returned in the following circumstances:\n>\n> - The called function returns normally with a term that does **not** match\n> `{'EXIT',_}`.\n> - The called function `throw`s a term that does **not** match `{'EXIT',_}`.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, an `rpc` server, another\n> server, or a freshly spawned process.","ref":"rpc.html#call/5"},{"type":"function","title":"rpc.cast/4","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node`. No\nresponse is delivered and the calling process is not suspended until the\nevaluation is complete, as is the case with [`call/4,5`](`call/4`).\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be an `rpc` server, another server, or a freshly spawned\n> process.","ref":"rpc.html#cast/4"},{"type":"function","title":"rpc.eval_everywhere/3","doc":"Equivalent to\n[`eval_everywhere([node()|nodes()], Module, Function, Args)`](`eval_everywhere/4`).","ref":"rpc.html#eval_everywhere/3"},{"type":"function","title":"rpc.eval_everywhere/4","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the specified nodes.\nNo answers are collected.","ref":"rpc.html#eval_everywhere/4"},{"type":"function","title":"rpc.multi_server_call/2","doc":"Equivalent to\n[`multi_server_call([node()|nodes()], Name, Msg)`](`multi_server_call/3`).","ref":"rpc.html#multi_server_call/2"},{"type":"function","title":"rpc.multi_server_call/3","doc":"Can be used when interacting with servers called `Name` on the specified nodes.\nIt is assumed that the servers receive messages in the format `{From, Msg}` and\nreply using `From ! {Name, Node, Reply}`, where `Node` is the name of the node\nwhere the server is located. The function returns `{Replies, BadNodes}`, where\n`Replies` is a list of all `Reply` values, and `BadNodes` is one of the\nfollowing:\n\n- A list of the nodes that do not exist\n- A list of the nodes where the server does not exist\n- A list of the nodes where the server terminated before sending any reply.","ref":"rpc.html#multi_server_call/3"},{"type":"function","title":"rpc.multicall/3","doc":"Equivalent to\n[`multicall([node()|nodes()], Module, Function, Args, infinity)`](`multicall/5`).","ref":"rpc.html#multicall/3"},{"type":"function","title":"rpc.multicall/4","doc":"Equivalent to\n[`multicall(Nodes, Module, Function, Args, infinity)`](`multicall/5`).\n\nEquivalent to\n[`multicall([node()|nodes()], Module, Function, Args, Timeout)`](`multicall/5`).","ref":"rpc.html#multicall/4"},{"type":"function","title":"rpc.multicall/5","doc":"In contrast to an RPC, a multicall is an RPC that is sent concurrently from one\nclient to multiple servers. This is useful for collecting information from a set\nof nodes, or for calling a function on a set of nodes to achieve some side\neffects. It is semantically the same as iteratively making a series of RPCs on\nall the nodes, but the multicall is faster, as all the requests are sent at the\nsame time and are collected one by one as they come back.\n\nThe function evaluates [`apply(Module, Function, Args)`](`apply/3`) on the\nspecified nodes and collects the answers. It returns `{ResL, BadNodes}`, where\n`BadNodes` is a list of the nodes that do not exist, and `ResL` is a list of the\nreturn values, or `{badrpc, Reason}` for failing calls. `Timeout` is a time\n(integer) in milliseconds, or `infinity`.\n\nThe following example is useful when new object code is to be loaded on all\nnodes in the network, and indicates some side effects that RPCs can produce:\n\n```erlang\n%% Find object code for module Mod\n{Mod, Bin, File} = code:get_object_code(Mod),\n\n%% and load it on all nodes including this one\n{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),\n\n%% and then maybe check the ResL list.\n```\n\n> #### Note {: .info }\n>\n> If you want the ability to distinguish between results, you may want to\n> consider using the [`erpc:multicall()`](`erpc:multicall/4`) function from the\n> `erpc` module instead.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, an `rpc` server, another\n> server, or a freshly spawned process.","ref":"rpc.html#multicall/5"},{"type":"function","title":"rpc.nb_yield/1","doc":"Equivalent to [`nb_yield(Key, 0)`](`nb_yield/2`).","ref":"rpc.html#nb_yield/1"},{"type":"function","title":"rpc.nb_yield/2","doc":"Non-blocking version of `yield/1`. It returns the tuple `{value, Val}` when the\ncomputation is finished, or `timeout` when `Timeout` milliseconds has elapsed.\n\nSee the note in `call/4` for more details of Val.\n\n> #### Note {: .info }\n>\n> This function must be called by the same process from which `async_call/4` was\n> made otherwise it will only return `timeout`.","ref":"rpc.html#nb_yield/2"},{"type":"function","title":"rpc.parallel_eval/1","doc":"Evaluates, for every tuple in `FuncCalls`,\n[`apply(Module, Function, Args)`](`apply/3`) on some node in the network.\nReturns the list of return values, in the same order as in `FuncCalls`.","ref":"rpc.html#parallel_eval/1"},{"type":"function","title":"rpc.pinfo/1","doc":"Location transparent version of the BIF `erlang:process_info/1` in ERTS.","ref":"rpc.html#pinfo/1"},{"type":"function","title":"rpc.pinfo/2","doc":"Location transparent version of the BIF `erlang:process_info/2` in ERTS.","ref":"rpc.html#pinfo/2"},{"type":"function","title":"rpc.pmap/3","doc":"Evaluates [`apply(Module, Function, [Elem|ExtraArgs])`](`apply/3`) for every\nelement `Elem` in `List1`, in parallel. Returns the list of return values, in\nthe same order as in `List1`.","ref":"rpc.html#pmap/3"},{"type":"function","title":"rpc.sbcast/2","doc":"Equivalent to [`sbcast([node()|nodes()], Name, Msg)`](`sbcast/3`).","ref":"rpc.html#sbcast/2"},{"type":"function","title":"rpc.sbcast/3","doc":"Broadcasts the message `Msg` synchronously to the registered process `Name` on\nthe specified nodes.\n\nReturns `{GoodNodes, BadNodes}`, where `GoodNodes` is the list of nodes that\nhave `Name` as a registered process.\n\nThe function is synchronous in the sense that it is known that all servers have\nreceived the message when the call returns. It is not possible to know that the\nservers have processed the message.\n\nAny further messages sent to the servers, after this function has returned, are\nreceived by all servers after this message.","ref":"rpc.html#sbcast/3"},{"type":"function","title":"rpc.server_call/4","doc":"Can be used when interacting with a server called `Name` on node `Node`. It is\nassumed that the server receives messages in the format `{From, Msg}` and\nreplies using `From ! {ReplyWrapper, Node, Reply}`. This function makes such a\nserver call and ensures that the entire call is packed into an atomic\ntransaction, which either succeeds or fails. It never hangs, unless the server\nitself hangs.\n\nThe function returns the answer `Reply` as produced by the server `Name`, or\n`{error, Reason}`.","ref":"rpc.html#server_call/4"},{"type":"function","title":"rpc.yield/1","doc":"Returns the promised answer from a previous `async_call/4`. If the answer is\navailable, it is returned immediately. Otherwise, the calling process is\nsuspended until the answer arrives from `Node`.\n\n> #### Note {: .info }\n>\n> This function must be called by the same process from which `async_call/4` was\n> made otherwise it will never return.\n\nSee the note in `call/4` for more details of the return value.","ref":"rpc.html#yield/1"},{"type":"opaque","title":"rpc.key/0","doc":"Opaque value returned by `async_call/4`.","ref":"rpc.html#t:key/0"},{"type":"module","title":"file","doc":"File interface module.\n\nThis module provides an interface to the file system.\n\n> #### Warning {: .warning }\n>\n> File operations are only guaranteed to appear atomic when going through the\n> same file server. A NIF or other OS process may observe intermediate steps on\n> certain operations on some operating systems, eg. renaming an existing file on\n> Windows, or [`write_file_info/2`](`write_file_info/2`) on any OS at the time\n> of writing.\n\nRegarding filename encoding, the Erlang VM can operate in two modes. The current\nmode can be queried using function `native_name_encoding/0`. It returns `latin1`\nor `utf8`.\n\nIn `latin1` mode, the Erlang VM does not change the encoding of filenames. In\n`utf8` mode, filenames can contain Unicode characters greater than 255 and the\nVM converts filenames back and forth to the native filename encoding (usually\nUTF-8, but UTF-16 on Windows).\n\nThe default mode depends on the operating system. Windows, MacOS X and Android\nenforce consistent filename encoding and therefore the VM uses `utf8` mode.\n\nOn operating systems with transparent naming (for example, all Unix systems\nexcept MacOS X), default is `utf8` if the terminal supports UTF-8, otherwise\n`latin1`. The default can be overridden using `+fnl` (to force `latin1` mode) or\n`+fnu` (to force `utf8` mode) when starting [`erl`](`e:erts:erl_cmd.md`).\n\nOn operating systems with transparent naming, files can be inconsistently named,\nfor example, some files are encoded in UTF-8 while others are encoded in ISO\nLatin-1. The concept of _raw filenames_ is introduced to handle file systems\nwith inconsistent naming when running in `utf8` mode.\n\nA _raw filename_ is a filename specified as a binary. The Erlang VM does not\ntranslate a filename specified as a binary on systems with transparent naming.\n\nWhen running in `utf8` mode, functions `list_dir/1` and `read_link/1` never\nreturn raw filenames. To return all filenames including raw filenames, use\nfunctions [`list_dir_all/1`](`m:file#list_dir_all`) and\n[`read_link_all/1`](`m:file#read_link_all`).\n\nSee also section\n[Notes About Raw Filenames](`e:stdlib:unicode_usage.md#notes-about-raw-filenames`)\nin the STDLIB User's Guide.\n\n> #### Note {: .info }\n>\n> File operations used to accept filenames containing null characters (integer\n> value zero). This caused the name to be truncated and in some cases arguments\n> to primitive operations to be mixed up. Filenames containing null characters\n> inside the filename are now _rejected_ and will cause primitive file\n> operations fail.","ref":"file.html"},{"type":"module","title":"POSIX Error Codes - file","doc":"- `eacces` \\- Permission denied\n- `eagain` \\- Resource temporarily unavailable\n- `ebadf` \\- Bad file number\n- `ebusy` \\- File busy\n- `edquot` \\- Disk quota exceeded\n- `eexist` \\- File already exists\n- `efault` \\- Bad address in system call argument\n- `efbig` \\- File too large\n- `eintr` \\- Interrupted system call\n- `einval` \\- Invalid argument\n- `eio` \\- I/O error\n- `eisdir` \\- Illegal operation on a directory\n- `eloop` \\- Too many levels of symbolic links\n- `emfile` \\- Too many open files\n- `emlink` \\- Too many links\n- `enametoolong` \\- Filename too long\n- `enfile` \\- File table overflow\n- `enodev` \\- No such device\n- `enoent` \\- No such file or directory\n- `enomem` \\- Not enough memory\n- `enospc` \\- No space left on device\n- `enotblk` \\- Block device required\n- `enotdir` \\- Not a directory\n- `enotsup` \\- Operation not supported\n- `enxio` \\- No such device or address\n- `eperm` \\- Not owner\n- `epipe` \\- Broken pipe\n- `erofs` \\- Read-only file system\n- `espipe` \\- Invalid seek\n- `esrch` \\- No such process\n- `estale` \\- Stale remote file handle\n- `exdev` \\- Cross-device link","ref":"file.html#module-posix-error-codes"},{"type":"module","title":"Performance - file","doc":"For increased performance, raw files are recommended.\n\nA normal file is really a process so it can be used as an I/O device (see\n`m:io`). Therefore, when data is written to a normal file, the sending of the\ndata to the file process, copies all data that are not binaries. Opening the\nfile in binary mode and writing binaries is therefore recommended. If the file\nis opened on another node, or if the file server runs as slave to the file\nserver of another node, also binaries are copied.\n\n> #### Note {: .info }\n>\n> Raw files use the file system of the host machine of the node. For normal\n> files (non-raw), the file server is used to find the files, and if the node is\n> running its file server as slave to the file server of another node, and the\n> other node runs on some other host machine, they can have different file\n> systems. However, this is seldom a problem.\n\n`open/2` can be given the options `delayed_write` and `read_ahead` to turn on\ncaching, which will reduce the number of operating system calls and greatly\nimprove performance for small reads and writes. However, the overhead won't\ndisappear completely and it's best to keep the number of file operations to a\nminimum. As a contrived example, the following function writes 4MB in 2.5\nseconds when tested:\n\n```erlang\ncreate_file_slow(Name) ->\n {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),\n create_file_slow_1(Fd, 4 bsl 20),\n file:close(Fd).\n\ncreate_file_slow_1(_Fd, 0) ->\n ok;\ncreate_file_slow_1(Fd, M) ->\n ok = file:write(Fd, <<0>>),\n create_file_slow_1(Fd, M - 1).\n```\n\nThe following functionally equivalent code writes 128 bytes per call to\n`write/2` and so does the same work in 0.08 seconds, which is roughly 30 times\nfaster:\n\n```erlang\ncreate_file(Name) ->\n {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),\n create_file_1(Fd, 4 bsl 20),\n file:close(Fd),\n ok.\n\ncreate_file_1(_Fd, 0) ->\n ok;\ncreate_file_1(Fd, M) when M >= 128 ->\n ok = file:write(Fd, <<0:(128)/unit:8>>),\n create_file_1(Fd, M - 128);\ncreate_file_1(Fd, M) ->\n ok = file:write(Fd, <<0:(M)/unit:8>>),\n create_file_1(Fd, M - 1).\n```\n\nWhen writing data it's generally more efficient to write a list of binaries\nrather than a list of integers. It is not needed to flatten a deep list before\nwriting. On Unix hosts, scatter output, which writes a set of buffers in one\noperation, is used when possible. In this way\n[`write(FD, [Bin1, Bin2 | Bin3])`](`write/2`) writes the contents of the\nbinaries without copying the data at all, except for perhaps deep down in the\noperating system kernel.\n\n> #### Warning {: .warning }\n>\n> If an error occurs when accessing an open file with module `m:io`, the process\n> handling the file exits. The dead file process can hang if a process tries to\n> access it later. This will be fixed in a future release.","ref":"file.html#module-performance"},{"type":"module","title":"See Also - file","doc":"`m:filename`","ref":"file.html#module-see-also"},{"type":"function","title":"file.advise/4","doc":"[`advise/4`](`advise/4`) can be used to announce an intention to access file\ndata in a specific pattern in the future, thus allowing the operating system to\nperform appropriate optimizations.\n\nOn some platforms, this function might have no effect.","ref":"file.html#advise/4"},{"type":"function","title":"file.allocate/3","doc":"[`allocate/3`](`allocate/3`) can be used to preallocate space for a file.\n\nThis function only succeeds in platforms that provide this feature.","ref":"file.html#allocate/3"},{"type":"function","title":"file.change_group/2","doc":"Changes group of a file. See `write_file_info/2`.","ref":"file.html#change_group/2"},{"type":"function","title":"file.change_mode/2","doc":"Changes permissions of a file. See `write_file_info/2`.","ref":"file.html#change_mode/2"},{"type":"function","title":"file.change_owner/2","doc":"Changes owner of a file. See `write_file_info/2`.","ref":"file.html#change_owner/2"},{"type":"function","title":"file.change_owner/3","doc":"Changes owner and group of a file. See `write_file_info/2`.","ref":"file.html#change_owner/3"},{"type":"function","title":"file.change_time/2","doc":"Changes the modification and access times of a file. See `write_file_info/2`.","ref":"file.html#change_time/2"},{"type":"function","title":"file.change_time/3","doc":"Changes the modification and last access times of a file. See\n`write_file_info/2`.","ref":"file.html#change_time/3"},{"type":"function","title":"file.close/1","doc":"Closes the file referenced by `IoDevice`. It mostly returns `ok`, except for\nsome severe errors such as out of memory.\n\nNotice that if option `delayed_write` was used when opening the file,\n[`close/1`](`close/1`) can return an old write error and not even try to close\nthe file. See `open/2`.","ref":"file.html#close/1"},{"type":"function","title":"file.consult/1","doc":"Reads Erlang terms, separated by `.`, from `Filename`. Returns one of the\nfollowing:\n\n- **`{ok, Terms}`** - The file was successfully read.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang terms in the file. To convert the three-element tuple to an English\n description of the error, use `format_error/1`.\n\n_Example:_\n\n```text\nf.txt: {person, \"kalle\", 25}.\n {person, \"pelle\", 30}.\n```\n\n```erlang\n1> file:consult(\"f.txt\").\n{ok,[{person,\"kalle\",25},{person,\"pelle\",30}]}\n```\n\nThe encoding of `Filename` can be set by a comment, as described in\n[`epp`](`m:epp#encoding`).","ref":"file.html#consult/1"},{"type":"function","title":"file.copy/2","doc":"","ref":"file.html#copy/2"},{"type":"function","title":"file.copy/3","doc":"Copies `ByteCount` bytes from `Source` to `Destination`. `Source` and\n`Destination` refer to either filenames or IO devices from, for example,\n[`open/2`](`open/2`).\n\nArgument `Modes` is a list of possible modes, see `open/2`, and defaults to\n`[]`.\n\nIf both `Source` and `Destination` refer to filenames, the files are opened with\n`[read, binary]` and `[write, binary]` prepended to their mode lists,\nrespectively, to optimize the copy.\n\nIf `Source` refers to a filename, it is opened with `read` mode prepended to the\nmode list before the copy, and closed when done.\n\nIf `Destination` refers to a filename, it is opened with `write` mode prepended\nto the mode list before the copy, and closed when done.\n\nReturns `{ok, BytesCopied}`, where `BytesCopied` is the number of bytes that was\ncopied, which can be less than `ByteCount` if end of file was encountered on the\nsource. If the operation fails, `{error, Reason}` is returned.\n\nTypical error reasons: as for `open/2` if a file had to be opened, and as for\n`read/2` and `write/2`.","ref":"file.html#copy/3"},{"type":"function","title":"file.datasync/1","doc":"Ensures that any buffers kept by the operating system (not by the Erlang runtime\nsystem) are written to disk. In many ways it resembles `fsync` but it does not\nupdate some of the metadata of the file, such as the access time. On some\nplatforms this function has no effect.\n\nApplications that access databases or log files often write a tiny data fragment\n(for example, one line in a log file) and then call `fsync()` immediately to\nensure that the written data is physically stored on the hard disk.\nUnfortunately, `fsync()` always initiates two write operations: one for the\nnewly written data and another one to update the modification time stored in the\n`inode`. If the modification time is not a part of the transaction concept,\n`fdatasync()` can be used to avoid unnecessary `inode` disk write operations.\n\nAvailable only in some POSIX systems, this call results in a call to `fsync()`,\nor has no effect in systems not providing the `fdatasync()` syscall.","ref":"file.html#datasync/1"},{"type":"function","title":"file.del_dir/1","doc":"Tries to delete directory `Dir`. The directory must be empty before it can be\ndeleted. Returns `ok` if successful.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for the parent directories\n of `Dir`.\n\n- **`eexist`** - The directory is not empty.\n\n- **`enoent`** - The directory does not exist.\n\n- **`enotdir`** - A component of `Dir` is not a directory. On some platforms,\n `enoent` is returned instead.\n\n- **`einval`** - Attempt to delete the current directory. On some platforms,\n `eacces` is returned instead.","ref":"file.html#del_dir/1"},{"type":"function","title":"file.del_dir_r/1","doc":"Deletes file or directory `File`. If `File` is a directory, its contents is\nfirst recursively deleted. Returns:\n\n- **`ok`** - The operation completed without errors.\n\n- **`{error, posix()}`** - An error occurred when accessing or deleting `File`.\n If some file or directory under `File` could not be deleted, `File` cannot be\n deleted as it is non-empty, and `{error, eexist}` is returned.","ref":"file.html#del_dir_r/1"},{"type":"function","title":"file.delete/1","doc":"","ref":"file.html#delete/1"},{"type":"function","title":"file.delete/2","doc":"Tries to delete file `Filename`. Returns `ok` if successful.\n\nIf the option `raw` is set, the file server is not called. This can be useful in\nparticular during the early boot stage when the file server is not yet\nregistered, to still be able to delete local files.\n\nTypical error reasons:\n\n- **`enoent`** - The file does not exist.\n\n- **`eacces`** - Missing permission for the file or one of its parents.\n\n- **`eperm`** - The file is a directory and the user is not superuser.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.\n\n- **`einval`** - `Filename` has an improper type, such as tuple.\n\n> #### Warning {: .warning }\n>\n> In a future release, a bad type for argument `Filename` will probably generate\n> an exception.","ref":"file.html#delete/2"},{"type":"function","title":"file.eval/1","doc":"Reads and evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression) from `Filename`. The result of the evaluation\nis not returned; any expression sequence in the file must be there for its side\neffect.\n\nReturns one of the following:\n\n- **`ok`** - The file was read and evaluated.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. To convert the three-element tuple to an\n English description of the error, use `format_error/1`.\n\nThe encoding of `Filename` can be set by a comment, as described in\n[`epp`](`m:epp#encoding`).","ref":"file.html#eval/1"},{"type":"function","title":"file.eval/2","doc":"The same as [`eval/1`](`eval/1`), but the variable bindings `Bindings` are used\nin the evaluation. For information about the variable bindings, see\n`m:erl_eval`.","ref":"file.html#eval/2"},{"type":"function","title":"file.format_error/1","doc":"Given the error reason returned by any function in this module, returns a\ndescriptive string of the error in English.","ref":"file.html#format_error/1"},{"type":"function","title":"file.get_cwd/0","doc":"Returns `{ok, Dir}`, where `Dir` is the current working directory of the file\nserver.\n\n> #### Note {: .info }\n>\n> In rare circumstances, this function can fail on Unix. It can occur if read\n> permission does not exist for the parent directories of the current directory.\n\nA typical error reason:\n\n- **`eacces`** - Missing read permission for one of the parents of the current\n directory.","ref":"file.html#get_cwd/0"},{"type":"function","title":"file.get_cwd/1","doc":"Returns `{ok, Dir}` or `{error, Reason}`, where `Dir` is the current working\ndirectory of the specified drive.\n\n`Drive` is to be of the form `Letter:`, for example, `c:`.\n\nReturns `{error, enotsup}` on platforms that have no concept of current drive\n(Unix, for example).\n\nTypical error reasons:\n\n- **`enotsup`** - The operating system has no concept of drives.\n\n- **`eacces`** - The drive does not exist.\n\n- **`einval`** - The format of `Drive` is invalid.","ref":"file.html#get_cwd/1"},{"type":"function","title":"file.list_dir/1","doc":"Lists all files in a directory, _except_ files with raw filenames. Returns\n`{ok, Filenames}` if successful, otherwise `{error, Reason}`. `Filenames` is a\nlist of the names of all the files in the directory. The names are not sorted.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for `Dir` or one of its\n parent directories.\n\n- **`enoent`** - The directory does not exist.\n\n- **`{no_translation, Filename}`** - `Filename` is a `t:binary/0` with\n characters coded in ISO Latin-1 and the VM was started with parameter `+fnue`.","ref":"file.html#list_dir/1"},{"type":"function","title":"file.list_dir_all/1","doc":"[](){: #list_dir_all } Lists all the files in a directory, including files with\nraw filenames. Returns `{ok, Filenames}` if successful, otherwise\n`{error, Reason}`. `Filenames` is a list of the names of all the files in the\ndirectory. The names are not sorted.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for `Dir` or one of its\n parent directories.\n\n- **`enoent`** - The directory does not exist.","ref":"file.html#list_dir_all/1"},{"type":"function","title":"file.make_dir/1","doc":"Tries to create directory `Dir`. Missing parent directories are _not_ created.\nReturns `ok` if successful.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for the parent directories\n of `Dir`.\n\n- **`eexist`** - A file or directory named `Dir` exists already.\n\n- **`enoent`** - A component of `Dir` does not exist.\n\n- **`enospc`** - No space is left on the device.\n\n- **`enotdir`** - A component of `Dir` is not a directory. On some platforms,\n `enoent` is returned instead.","ref":"file.html#make_dir/1"},{"type":"function","title":"file.make_link/2","doc":"Makes a hard link from `Existing` to `New` on platforms supporting links (Unix\nand Windows). This function returns `ok` if the link was successfully created,\notherwise `{error, Reason}`. On platforms not supporting links,\n`{error,enotsup}` is returned.\n\nTypical error reasons:\n\n- **`eacces`** - Missing read or write permissions for the parent directories of\n `Existing` or `New`.\n\n- **`eexist`** - `New` already exists.\n\n- **`enotsup`** - Hard links are not supported on this platform.","ref":"file.html#make_link/2"},{"type":"function","title":"file.make_symlink/2","doc":"Creates a symbolic link `New` to the file or directory `Existing` on platforms\nsupporting symbolic links (most Unix systems and Windows, beginning with Vista).\n`Existing` does not need to exist. Returns `ok` if the link is successfully\ncreated, otherwise `{error, Reason}`. On platforms not supporting symbolic\nlinks, `{error, enotsup}` is returned.\n\nTypical error reasons:\n\n- **`eacces`** - Missing read or write permissions for the parent directories of\n `Existing` or `New`.\n\n- **`eexist`** - `New` already exists.\n\n- **`enotsup`** - Symbolic links are not supported on this platform.\n\n- **`eperm`** - User does not have privileges to create symbolic links\n (`SeCreateSymbolicLinkPrivilege` on Windows).","ref":"file.html#make_symlink/2"},{"type":"function","title":"file.native_name_encoding/0","doc":"[](){: #native_name_encoding } Returns the filename encoding mode. If it is\n`latin1`, the system translates no filenames. If it is `utf8`, filenames are\nconverted back and forth to the native filename encoding (usually UTF-8, but\nUTF-16 on Windows).","ref":"file.html#native_name_encoding/0"},{"type":"function","title":"file.open/2","doc":"Opens file `File` in the mode determined by `Modes`, which can contain one or\nmore of the following options:\n\n- **`read`** - The file, which must exist, is opened for reading.\n\n- **`write`** - The file is opened for writing. It is created if it does not\n exist. If the file exists and `write` is not combined with `read`, the file is\n truncated.\n\n- **`append`** - The file is opened for writing. It is created if it does not\n exist. Every write operation to a file opened with `append` takes place at the\n end of the file.\n\n- **`exclusive`** - The file is opened for writing. It is created if it does not\n exist. If the file exists, `{error, eexist}` is returned.\n\n > #### Warning {: .warning }\n >\n > This option does not guarantee exclusiveness on file systems not supporting\n > `O_EXCL` properly, such as NFS. Do not depend on this option unless you know\n > that the file system supports it (in general, local file systems are safe).\n\n- **`raw`** - [](){: #raw } Allows faster access to a file, as no Erlang process\n is needed to handle the file. However, a file opened in this way has the\n following limitations:\n\n - The functions in the `io` module cannot be used, as they can only talk to an\n Erlang process. Instead, use functions `read/2`, `read_line/1`, and\n `write/2`.\n - Especially if [`read_line/1`](`read_line/1`) is to be used on a `raw` file,\n it is recommended to combine this option with option `{read_ahead, Size}` as\n line-oriented I/O is inefficient without buffering.\n - Only the Erlang process that opened the file can use it.\n - A remote Erlang file server cannot be used. The computer on which the Erlang\n node is running must have access to the file system (directly or through\n NFS).\n\n- **`binary`** - Read operations on the file return binaries rather than lists.\n\n- **`{delayed_write, Size, Delay}`** - Data in subsequent [`write/2`](`write/2`)\n calls is buffered until at least `Size` bytes are buffered, or until the\n oldest buffered data is `Delay` milliseconds old. Then all buffered data is\n written in one operating system call. The buffered data is also flushed before\n some other file operation than [`write/2`](`write/2`) is executed.\n\n The purpose of this option is to increase performance by reducing the number\n of operating system calls. Thus, the [`write/2`](`write/2`) calls must be for\n sizes significantly less than `Size`, and not interspersed by too many other\n file operations.\n\n When this option is used, the result of [`write/2`](`write/2`) calls can\n prematurely be reported as successful, and if a write error occurs, the error\n is reported as the result of the next file operation, which is not executed.\n\n For example, when `delayed_write` is used, after a number of\n [`write/2`](`write/2`) calls, [`close/1`](`close/1`) can return\n `{error, enospc}`, as there is not enough space on the disc for previously\n written data. [`close/1`](`close/1`) must probably be called again, as the\n file is still open.\n\n- **`delayed_write`** - The same as `{delayed_write, Size, Delay}` with\n reasonable default values for `Size` and `Delay` (roughly some 64 KB, 2\n seconds).\n\n- **`{read_ahead, Size}`** - Activates read data buffering. If\n [`read/2`](`read/2`) calls are for significantly less than `Size` bytes, read\n operations to the operating system are still performed for blocks of `Size`\n bytes. The extra data is buffered and returned in subsequent\n [`read/2`](`read/2`) calls, giving a performance gain as the number of\n operating system calls is reduced.\n\n The `read_ahead` buffer is also highly used by function\n [`read_line/1`](`read_line/1`) in `raw` mode, therefore this option is\n recommended (for performance reasons) when accessing raw files using that\n function.\n\n If [`read/2`](`read/2`) calls are for sizes not significantly less than, or\n even greater than `Size` bytes, no performance gain can be expected.\n\n- **`read_ahead`** - The same as `{read_ahead, Size}` with a reasonable default\n value for `Size` (roughly some 64 KB).\n\n- **`compressed`** - Makes it possible to read or write gzip compressed files.\n Option `compressed` must be combined with `read` or `write`, but not both.\n Notice that the file size obtained with `read_file_info/1` does probably not\n match the number of bytes that can be read from a compressed file.\n\n- **`compressed_one`** - Read one member of a gzip compressed file. Option\n `compressed_one` can only be combined with `read`.\n\n- **`{encoding, Encoding}`** - Makes the file perform automatic translation of\n characters to and from a specific (Unicode) encoding. Notice that the data\n supplied to `write/2` or returned by `read/2` still is byte-oriented; this\n option denotes only how data is stored in the disk file.\n\n Depending on the encoding, different methods of reading and writing data is\n preferred. The default encoding of `latin1` implies using this module (`file`)\n for reading and writing data as the interfaces provided here work with\n byte-oriented data. Using other (Unicode) encodings makes the `m:io` functions\n `get_chars`, `get_line`, and `put_chars` more suitable, as they can work with\n the full Unicode range.\n\n If data is sent to an `t:io_device/0` in a format that cannot be converted to\n the specified encoding, or if data is read by a function that returns data in\n a format that cannot cope with the character range of the data, an error\n occurs and the file is closed.\n\n Allowed values for `Encoding`:\n\n - **`latin1`** - The default encoding. Bytes supplied to the file, that is,\n `write/2` are written \"as is\" on the file. Likewise, bytes read from the\n file, that is, `read/2` are returned \"as is\". If module `m:io` is used for\n writing, the file can only cope with Unicode characters up to code point 255\n (the ISO Latin-1 range).\n\n - **`unicode or utf8`** - Characters are translated to and from UTF-8 encoding\n before they are written to or read from the file. A file opened in this way\n can be readable using function `read/2`, as long as no data stored on the\n file lies beyond the ISO Latin-1 range (0..255), but failure occurs if the\n data contains Unicode code points beyond that range. The file is best read\n with the functions in the Unicode aware module `m:io`.\n\n Bytes written to the file by any means are translated to UTF-8 encoding\n before being stored on the disk file.\n\n - **`utf16 or {utf16,big}`** - Works like `unicode`, but translation is done\n to and from big endian UTF-16 instead of UTF-8.\n\n - **`{utf16,little}`** - Works like `unicode`, but translation is done to and\n from little endian UTF-16 instead of UTF-8.\n\n - **`utf32 or {utf32,big}`** - Works like `unicode`, but translation is done\n to and from big endian UTF-32 instead of UTF-8.\n\n - **`{utf32,little}`** - Works like `unicode`, but translation is done to and\n from little endian UTF-32 instead of UTF-8.\n\n The Encoding can be changed for a file \"on the fly\" by using function\n `io:setopts/2`. So a file can be analyzed in latin1 encoding for, for example,\n a BOM, positioned beyond the BOM and then be set for the right encoding before\n further reading. For functions identifying BOMs, see module `m:unicode`.\n\n This option is not allowed on `raw` files.\n\n- **`ram`** - `File` must be `t:iodata/0`. Returns an `t:fd/0`, which lets\n module `file` operate on the data in-memory as if it is a file.\n\n- **`sync`** - On platforms supporting it, enables the POSIX `O_SYNC`\n synchronous I/O flag or its platform-dependent equivalent (for example,\n `FILE_FLAG_WRITE_THROUGH` on Windows) so that writes to the file block until\n the data is physically written to disk. However, be aware that the exact\n semantics of this flag differ from platform to platform. For example, none of\n Linux or Windows guarantees that all file metadata are also written before the\n call returns. For precise semantics, check the details of your platform\n documentation. On platforms with no support for POSIX `O_SYNC` or equivalent,\n use of the `sync` flag causes `open` to return `{error, enotsup}`.\n\n- **`directory`** - Allows `open` to work on directories.\n\nReturns:\n\n- **`{ok, IoDevice}`** - The file is opened in the requested mode. `IoDevice` is\n a reference to the file.\n\n- **`{error, Reason}`** - The file cannot be opened.\n\n`IoDevice` is really the pid of the process that handles the file. This process\nmonitors the process that originally opened the file (the owner process). If the\nowner process terminates, the file is closed and the process itself terminates\ntoo. An `IoDevice` returned from this call can be used as an argument to the I/O\nfunctions (see `m:io`).\n\n> #### Warning {: .warning }\n>\n> While this function can be used to open any file, we recommend against using\n> it for NFS-mounted files, FIFOs, devices, or similar since they can cause IO\n> threads to hang forever.\n>\n> If your application needs to interact with these kinds of files we recommend\n> breaking out those parts to a port program instead.\n\n> #### Note {: .info }\n>\n> In previous versions of `file`, modes were specified as one of the atoms\n> `read`, `write`, or `read_write` instead of a list. This is still allowed for\n> reasons of backwards compatibility, but is not to be used for new code. Also\n> note that `read_write` is not allowed in a mode list.\n\nTypical error reasons:\n\n- **`enoent`** - The file does not exist.\n\n- **`eacces`** - Missing permission for reading the file or searching one of the\n parent directories.\n\n- **`eisdir`** - The named file is a directory.\n\n- **`enotdir`** - A component of the filename is not a directory, or the\n filename itself is not a directory if `directory` mode was specified. On some\n platforms, `enoent` is returned instead.\n\n- **`enospc`** - There is no space left on the device (if `write` access was\n specified).","ref":"file.html#open/2"},{"type":"function","title":"file.path_consult/2","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then reads\nErlang terms, separated by `.`, from the file.\n\nReturns one of the following:\n\n- **`{ok, Terms, FullName}`** - The file is successfully read. `FullName` is the\n full name of the file.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang terms in the file. Use `format_error/1` to convert the three-element\n tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","ref":"file.html#path_consult/2"},{"type":"function","title":"file.path_eval/2","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then reads\nand evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression), from the file. The result of evaluation is\nnot returned; any expression sequence in the file must be there for its side\neffect.\n\nReturns one of the following:\n\n- **`{ok, FullName}`** - The file is read and evaluated. `FullName` is the full\n name of the file.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. Use `format_error/1` to convert the\n three-element tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","ref":"file.html#path_eval/2"},{"type":"function","title":"file.path_open/3","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then opens\nthe file in the mode determined by `Modes`.\n\nReturns one of the following:\n\n- **`{ok, IoDevice, FullName}`** - The file is opened in the requested mode.\n `IoDevice` is a reference to the file and `FullName` is the full name of the\n file.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - The file cannot be opened.","ref":"file.html#path_open/3"},{"type":"function","title":"file.path_script/2","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then reads\nand evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression), from the file.\n\nReturns one of the following:\n\n- **`{ok, Value, FullName}`** - The file is read and evaluated. `FullName` is\n the full name of the file and `Value` the value of the last expression.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. Use `format_error/1` to convert the\n three-element tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","ref":"file.html#path_script/2"},{"type":"function","title":"file.path_script/3","doc":"The same as [`path_script/2`](`path_script/2`) but the variable bindings\n`Bindings` are used in the evaluation. See `m:erl_eval` about variable bindings.","ref":"file.html#path_script/3"},{"type":"function","title":"file.position/2","doc":"Sets the position of the file referenced by `IoDevice` to `Location`. Returns\n`{ok, NewPosition}` (as absolute offset) if successful, otherwise\n`{error, Reason}`. `Location` is one of the following:\n\n- **`Offset`** - The same as `{bof, Offset}`.\n\n- **`{bof, Offset}`** - Absolute offset.\n\n- **`{cur, Offset}`** - Offset from the current position.\n\n- **`{eof, Offset}`** - Offset from the end of file.\n\n- **`bof | cur | eof`** - The same as above with `Offset` 0.\n\nNotice that offsets are counted in bytes, not in characters. If the file is\nopened using some other `encoding` than `latin1`, one byte does not correspond\nto one character. Positioning in such a file can only be done to known character\nboundaries. That is, to a position earlier retrieved by getting a current\nposition, to the beginning/end of the file or to some other position _known_ to\nbe on a correct character boundary by some other means (typically beyond a byte\norder mark in the file, which has a known byte-size).\n\nA typical error reason is:\n\n- **`einval`** - Either `Location` is illegal, or it is evaluated to a negative\n offset in the file. Notice that if the resulting position is a negative value,\n the result is an error, and after the call the file position is undefined.","ref":"file.html#position/2"},{"type":"function","title":"file.pread/2","doc":"Performs a sequence of [`pread/3`](`pread/3`) in one operation, which is more\nefficient than calling them one at a time. Returns `{ok, [Data, ...]}` or\n`{error, Reason}`, where each `Data`, the result of the corresponding `pread`,\nis either a list or a binary depending on the mode of the file, or `eof` if the\nrequested position is beyond end of file.\n\nAs the position is specified as a byte-offset, take special caution when working\nwith files where `encoding` is set to something else than `latin1`, as not every\nbyte position is a valid character boundary on such a file.","ref":"file.html#pread/2"},{"type":"function","title":"file.pread/3","doc":"Combines [`position/2`](`position/2`) and [`read/2`](`read/2`) in one operation,\nwhich is more efficient than calling them one at a time.\n\n`Location` is only allowed to be an integer for `raw` and `ram` modes.\n\nThe current position of the file after the operation is undefined for `raw` mode\nand unchanged for `ram` mode.\n\nAs the position is specified as a byte-offset, take special caution when working\nwith files where `encoding` is set to something else than `latin1`, as not every\nbyte position is a valid character boundary on such a file.","ref":"file.html#pread/3"},{"type":"function","title":"file.pwrite/2","doc":"Performs a sequence of [`pwrite/3`](`pwrite/3`) in one operation, which is more\nefficient than calling them one at a time. Returns `ok` or\n`{error, {N, Reason}}`, where `N` is the number of successful writes done before\nthe failure.\n\nWhen positioning in a file with other `encoding` than `latin1`, caution must be\ntaken to set the position on a correct character boundary. For details, see\n`position/2`.","ref":"file.html#pwrite/2"},{"type":"function","title":"file.pwrite/3","doc":"Combines [`position/2`](`position/2`) and [`write/2`](`write/2`) in one\noperation, which is more efficient than calling them one at a time.\n\n`Location` is only allowed to be an integer for `raw` and `ram` modes.\n\nThe current position of the file after the operation is undefined for `raw` mode\nand unchanged for `ram` mode.\n\nWhen positioning in a file with other `encoding` than `latin1`, caution must be\ntaken to set the position on a correct character boundary. For details, see\n`position/2`.","ref":"file.html#pwrite/3"},{"type":"function","title":"file.read/2","doc":"Reads `Number` bytes/characters from the file referenced by `IoDevice`.\n\nThe functions `read/2`, `pread/3`, and `read_line/1` are the only ways to read from\na file opened in `raw` mode (although they work for normally opened files, too).\n\nFor files where `encoding` is set to something else than `latin1`, one character\ncan be represented by more than one byte on the file. The parameter `Number`\nalways denotes the number of _characters_ read from the file, while the position\nin the file can be moved much more than this number when reading a Unicode file.\n\nAlso, if `encoding` is set to something else than `latin1`, the\n[`read/2`](`read/2`) call fails if the data contains characters larger than 255,\nwhich is why `io:get_chars/3` is to be preferred when reading such a file.\n\nThe function returns:\n\n- **`{ok, Data}`** - If the file was opened in binary mode, the read bytes are\n returned in a binary, otherwise in a list. The list or binary is shorter than\n the number of bytes requested if end of file was reached.\n\n- **`eof`** - Returned if `Number>0` and end of file was reached before anything\n at all could be read.\n\n- **`{error, Reason}`** - An error occurred.\n\nTypical error reasons:\n\n- **`ebadf`** - The file is not opened for reading.\n\n- **`{no_translation, unicode, latin1}`** - The file is opened with another\n `encoding` than `latin1` and the data in the file cannot be translated to the\n byte-oriented data that this function returns.","ref":"file.html#read/2"},{"type":"function","title":"file.read_file/1","doc":"","ref":"file.html#read_file/1"},{"type":"function","title":"file.read_file/2","doc":"Returns `{ok, Binary}`, where `Binary` is a binary data object that contains the\ncontents of `Filename`, or `{error, Reason}` if an error occurs.\n\nIf the option `raw` is set, the file server is not called.\n\nTypical error reasons:\n\n- **`enoent`** - The file does not exist.\n\n- **`eacces`** - Missing permission for reading the file, or for searching one\n of the parent directories.\n\n- **`eisdir`** - The named file is a directory.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.\n\n- **`enomem`** - There is not enough memory for the contents of the file.","ref":"file.html#read_file/2"},{"type":"function","title":"file.read_file_info/1","doc":"","ref":"file.html#read_file_info/1"},{"type":"function","title":"file.read_file_info/2","doc":"Retrieves information about a file. Returns `{ok, FileInfo}` if successful,\notherwise `{error, Reason}`.\n\n`FileInfo` is a record `file_info`, defined in the Kernel include file `file.hrl`.\nInclude the following directive in the module from which the function is called:\n\n```erlang\n-include_lib(\"kernel/include/file.hrl\").\n```\n\nThe time type returned in `atime`, `mtime`, and `ctime` is dependent on the time\ntype set in `Opts :: {time, Type}` as follows:\n\n- **`local`** - Returns local time.\n\n- **`universal`** - Returns universal time.\n\n- **`posix`** - Returns seconds since or before Unix time epoch, which is\n 1970-01-01 00:00 UTC.\n\nDefault is `{time, local}`.\n\nIf the option `raw` is set, the file server is not called and only information\nabout local files is returned. Note that this will break this module's atomicity\nguarantees as it can race with a concurrent call to\n[`write_file_info/1,2` ](`write_file_info/2`).\n\nThis option has no effect when the function is given an I/O device instead of a\nfile name. Use `open/2` with the `raw` mode to obtain a file descriptor first.\n\n> #### Note {: .info }\n>\n> As file times are stored in POSIX time on most OS, it is faster to query file\n> information with option `posix`.\n\nThe record `file_info` contains the following fields:\n\n- **`size = ` `t:non_neg_integer/0`** - Size of file in bytes.\n\n- **`type = device | directory | other | regular`** - The type of the file. Can\n also contain `symlink` when returned from\n [read_link_info/1,2](`read_link_info/1`).\n\n- **`access = read | write | read_write | none`** - The current system access to\n the file.\n\n- **`atime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n read.\n\n- **`mtime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n written.\n\n- **`ctime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The interpretation of this\n time field depends on the operating system. On Unix, it is the last time the\n file or the `inode` was changed. In Windows, it is the create time.\n\n- **`mode = ` `t:non_neg_integer/0`** - The file permissions as the sum of the following\n bit values:\n\n - **`8#00400`** - read permission: owner\n\n - **`8#00200`** - write permission: owner\n\n - **`8#00100`** - execute permission: owner\n\n - **`8#00040`** - read permission: group\n\n - **`8#00020`** - write permission: group\n\n - **`8#00010`** - execute permission: group\n\n - **`8#00004`** - read permission: other\n\n - **`8#00002`** - write permission: other\n\n - **`8#00001`** - execute permission: other\n\n - **`16#800`** - set user id on execution\n\n - **`16#400`** - set group id on execution\n\n On Unix platforms, other bits than those listed above may be set.\n\n- **`links = ` `t:non_neg_integer/0`** - Number of links to the file (this is always 1\n for file systems that have no concept of links).\n\n- **`major_device = ` `t:non_neg_integer/0`** - Identifies the file system where the\n file is located. In Windows, the number indicates a drive as follows: 0 means\n A:, 1 means B:, and so on.\n\n- **`minor_device = ` `t:non_neg_integer/0`** - Only valid for character devices on\n Unix. In all other cases, this field is zero.\n\n- **`inode = ` `t:non_neg_integer/0`** - Gives the `inode` number. On non-Unix file\n systems, this field is zero.\n\n- **`uid = ` `t:non_neg_integer/0`** - Indicates the owner of the file. On non-Unix file\n systems, this field is zero.\n\n- **`gid = ` `t:non_neg_integer/0`** - Gives the group that the owner of the file\n belongs to. On non-Unix file systems, this field is zero.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search permission for one of the parent directories of\n the file.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.","ref":"file.html#read_file_info/2"},{"type":"function","title":"file.read_line/1","doc":"Reads a line of bytes/characters from the file referenced by `IoDevice`.\n\nLines are defined to be delimited by the linefeed (LF, `\\n`) character, but any\ncarriage return (CR, `\\r`) followed by a newline is also treated as a single LF\ncharacter (the carriage return is silently ignored). The line is returned\n_including_ the LF, but excluding any CR immediately followed by an LF. This\nbehaviour is consistent with the behaviour of `io:get_line/2`. If end of file is\nreached without any LF ending the last line, a line with no trailing LF is\nreturned.\n\nThe function can be used on files opened in `raw` mode. However, it is\ninefficient to use it on `raw` files if the file is not opened with option\n`{read_ahead, Size}` specified. Thus, combining `raw` and `{read_ahead, Size}`\nis highly recommended when opening a text file for raw line-oriented reading.\n\nIf `encoding` is set to something else than `latin1`, the\n[`read_line/1`](`read_line/1`) call fails if the data contains characters larger\nthan 255, why `io:get_line/2` is to be preferred when reading such a file.\n\nThe function returns:\n\n- **`{ok, Data}`** - One line from the file is returned, including the trailing\n LF, but with CRLF sequences replaced by a single LF (see above).\n\n If the file is opened in binary mode, the read bytes are returned in a binary,\n otherwise in a list.\n\n- **`eof`** - Returned if end of file was reached before anything at all could\n be read.\n\n- **`{error, Reason}`** - An error occurred.\n\nTypical error reasons:\n\n- **`ebadf`** - The file is not opened for reading.\n\n- **`{no_translation, unicode, latin1}`** - The file is opened with another\n `encoding` than `latin1` and the data on the file cannot be translated to the\n byte-oriented data that this function returns.","ref":"file.html#read_line/1"},{"type":"function","title":"file.read_link/1","doc":"[](){: #read_link_all } Returns `{ok, Filename}` if `Name` refers to a symbolic\nlink that is not a raw filename, or `{error, Reason}` otherwise. On platforms\nthat do not support symbolic links, the return value is `{error,enotsup}`.\n\nTypical error reasons:\n\n- **`einval`** - `Name` does not refer to a symbolic link or the name of the\n file that it refers to does not conform to the expected encoding.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotsup`** - Symbolic links are not supported on this platform.","ref":"file.html#read_link/1"},{"type":"function","title":"file.read_link_all/1","doc":"Returns `{ok, Filename}` if `Name` refers to a symbolic link or\n`{error, Reason}` otherwise. On platforms that do not support symbolic links,\nthe return value is `{error,enotsup}`.\n\nNotice that `Filename` can be either a list or a binary.\n\nTypical error reasons:\n\n- **`einval`** - `Name` does not refer to a symbolic link.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotsup`** - Symbolic links are not supported on this platform.","ref":"file.html#read_link_all/1"},{"type":"function","title":"file.read_link_info/1","doc":"","ref":"file.html#read_link_info/1"},{"type":"function","title":"file.read_link_info/2","doc":"Works like [`read_file_info/1,2`](`read_file_info/2`) except that if `Name` is a\nsymbolic link, information about the link is returned in the `file_info` record\nand the `type` field of the record is set to `symlink`.\n\nIf the option `raw` is set, the file server is not called and only information\nabout local files is returned. Note that this will break this module's atomicity\nguarantees as it can race with a concurrent call to\n[`write_file_info/1,2`](`write_file_info/2`)\n\nIf `Name` is not a symbolic link, this function returns the same result as\n[`read_file_info/1`](`read_file_info/1`). On platforms that do not support\nsymbolic links, this function is always equivalent to\n[`read_file_info/1`](`read_file_info/1`).","ref":"file.html#read_link_info/2"},{"type":"function","title":"file.rename/2","doc":"Tries to rename the file `Source` to `Destination`. It can be used to move files\n(and directories) between directories, but it is not sufficient to specify the\ndestination only. The destination filename must also be specified. For example,\nif `bar` is a normal file and `foo` and `baz` are directories,\n[`rename(\"foo/bar\", \"baz\")`](`rename/2`) returns an error, but\n[`rename(\"foo/bar\", \"baz/bar\")`](`rename/2`) succeeds. Returns `ok` if it is\nsuccessful.\n\n> #### Note {: .info }\n>\n> Renaming of open files is not allowed on most platforms (see `eacces` below).\n\nTypical error reasons:\n\n- **`eacces`** - Missing read or write permissions for the parent directories of\n `Source` or `Destination`. On some platforms, this error is given if either\n `Source` or `Destination` is open.\n\n- **`eexist`** - `Destination` is not an empty directory. On some platforms,\n also given when `Source` and `Destination` are not of the same type.\n\n- **`einval`** - `Source` is a root directory, or `Destination` is a\n subdirectory of `Source`.\n\n- **`eisdir`** - `Destination` is a directory, but `Source` is not.\n\n- **`enoent`** - `Source` does not exist.\n\n- **`enotdir`** - `Source` is a directory, but `Destination` is not.\n\n- **`exdev`** - `Source` and `Destination` are on different file systems.","ref":"file.html#rename/2"},{"type":"function","title":"file.script/1","doc":"Reads and evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression), from the file.\n\nReturns one of the following:\n\n- **`{ok, Value}`** - The file is read and evaluated. `Value` is the value of\n the last expression.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. Use `format_error/1` to convert the\n three-element tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","ref":"file.html#script/1"},{"type":"function","title":"file.script/2","doc":"The same as [`script/1`](`script/1`) but the variable bindings `Bindings` are\nused in the evaluation. See `m:erl_eval` about variable bindings.","ref":"file.html#script/2"},{"type":"function","title":"file.sendfile/2","doc":"Sends the file `Filename` to `Socket`. Returns `{ok, BytesSent}` if successful,\notherwise `{error, Reason}`.","ref":"file.html#sendfile/2"},{"type":"function","title":"file.sendfile/5","doc":"Sends `Bytes` from the file referenced by `RawFile` beginning at `Offset` to\n`Socket`. Returns `{ok, BytesSent}` if successful, otherwise `{error, Reason}`.\nIf `Bytes` is set to `0` all data after the specified `Offset` is sent.\n\nThe file used must be opened using the `raw` flag, and the process calling\n`sendfile` must be the controlling process of the socket. See\n`gen_tcp:controlling_process/2` or module [`socket`'s](`socket:setopt/3`)\n[level `otp` socket option ](`t:socket:otp_socket_option/0`)`controlling_process`.\n\nIf the OS used does not support non-blocking `sendfile`, an Erlang fallback\nusing `read/2` and `gen_tcp:send/2` is used.\n\nThe option list can contain the following options:\n\n- **`chunk_size`** - The chunk size used by the Erlang fallback to send data. If\n using the fallback, set this to a value that comfortably fits in the systems\n memory. Default is 20 MB.","ref":"file.html#sendfile/5"},{"type":"function","title":"file.set_cwd/1","doc":"Sets the current working directory of the file server to `Dir`. Returns `ok` if\nsuccessful.\n\nThe functions in the module `file` usually treat binaries as raw filenames, that\nis, they are passed \"as is\" even when the encoding of the binary does not agree\nwith [`native_name_encoding()`](`native_name_encoding/0`). However, this\nfunction expects binaries to be encoded according to the value returned by\n`native_name_encoding/0`.\n\nTypical error reasons are:\n\n- **`enoent`** - The directory does not exist.\n\n- **`enotdir`** - A component of `Dir` is not a directory. On some platforms,\n `enoent` is returned.\n\n- **`eacces`** - Missing permission for the directory or one of its parents.\n\n- **`badarg`** - `Dir` has an improper type, such as tuple.\n\n- **`no_translation`** - `Dir` is a `t:binary/0` with characters coded in\n ISO-latin-1 and the VM is operating with unicode filename encoding.\n\n> #### Warning {: .warning }\n>\n> In a future release, a bad type for argument `Dir` will probably generate an\n> exception.","ref":"file.html#set_cwd/1"},{"type":"function","title":"file.sync/1","doc":"Ensures that any buffers kept by the operating system (not by the Erlang runtime\nsystem) are written to disk. On some platforms, this function might have no\neffect.\n\nA typical error reason is:\n\n- **`enospc`** - Not enough space left to write the file.","ref":"file.html#sync/1"},{"type":"function","title":"file.truncate/1","doc":"Truncates the file referenced by `IoDevice` at the current position. Returns\n`ok` if successful, otherwise `{error, Reason}`.","ref":"file.html#truncate/1"},{"type":"function","title":"file.write/2","doc":"Writes `Bytes` to the file referenced by `IoDevice`. This function is the only\nway to write to a file opened in `raw` mode (although it works for normally\nopened files too). Returns `ok` if successful, and `{error, Reason}` otherwise.\n\nIf the file is opened with `encoding` set to something else than `latin1`, each\nbyte written can result in many bytes being written to the file, as the byte\nrange 0..255 can represent anything between one and four bytes depending on\nvalue and UTF encoding type. If you want to write `t:unicode:chardata/0` to the\n`IoDevice` you should use `io:put_chars/2` instead.\n\nTypical error reasons:\n\n- **`ebadf`** - The file is not opened for writing.\n\n- **`enospc`** - No space is left on the device.","ref":"file.html#write/2"},{"type":"function","title":"file.write_file/2","doc":"Writes the contents of the `iodata` term `Bytes` to file `Filename`. The file is\ncreated if it does not exist. If it exists, the previous contents are\noverwritten. Returns `ok` if successful, otherwise `{error, Reason}`.\n\nTypical error reasons:\n\n- **`enoent`** - A component of the filename does not exist.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.\n\n- **`enospc`** - No space is left on the device.\n\n- **`eacces`** - Missing permission for writing the file or searching one of the\n parent directories.\n\n- **`eisdir`** - The named file is a directory.","ref":"file.html#write_file/2"},{"type":"function","title":"file.write_file/3","doc":"Same as [`write_file/2`](`write_file/2`), but takes a third argument `Modes`, a\nlist of possible modes, see `open/2`. The mode flags `binary` and `write` are\nimplicit, so they are not to be used.","ref":"file.html#write_file/3"},{"type":"function","title":"file.write_file_info/2","doc":"","ref":"file.html#write_file_info/2"},{"type":"function","title":"file.write_file_info/3","doc":"Changes file information. Returns `ok` if successful, otherwise\n`{error, Reason}`.\n\n`FileInfo` is a record `file_info`, defined in the Kernel\ninclude file `file.hrl`. Include the following directive in the module from\nwhich the function is called:\n\n```erlang\n-include_lib(\"kernel/include/file.hrl\").\n```\n\nThe time type set in `atime`, `mtime`, and `ctime` depends on the time type set\nin `Opts :: {time, Type}` as follows:\n\n- **`local`** - Interprets the time set as local.\n\n- **`universal`** - Interprets it as universal time.\n\n- **`posix`** - Must be seconds since or before Unix time epoch, which is\n 1970-01-01 00:00 UTC.\n\nDefault is `{time, local}`.\n\nIf the option `raw` is set, the file server is not called and only information\nabout local files is returned.\n\nThe following fields are used from the record, if they are specified:\n\n- **`atime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n read.\n\n- **`mtime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n written.\n\n- **`ctime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - On Unix, any value\n specified for this field is ignored (the \"ctime\" for the file is set to the\n current time). On Windows, this field is the new creation time to set for the\n file.\n\n- **`mode = ` `t:non_neg_integer/0`** - The file permissions as the sum of the following\n bit values:\n\n - **`8#00400`** - Read permission: owner\n\n - **`8#00200`** - Write permission: owner\n\n - **`8#00100`** - Execute permission: owner\n\n - **`8#00040`** - Read permission: group\n\n - **`8#00020`** - Write permission: group\n\n - **`8#00010`** - Execute permission: group\n\n - **`8#00004`** - Read permission: other\n\n - **`8#00002`** - Write permission: other\n\n - **`8#00001`** - Execute permission: other\n\n - **`16#800`** - Set user id on execution\n\n - **`16#400`** - Set group id on execution\n\n On Unix platforms, other bits than those listed above may be set.\n\n- **`uid = ` `t:non_neg_integer/0`** - Indicates the file owner. Ignored for non-Unix\n file systems.\n\n- **`gid = ` `t:non_neg_integer/0`** - Gives the group that the file owner belongs to.\n Ignored for non-Unix file systems.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search permission for one of the parent directories of\n the file.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.","ref":"file.html#write_file_info/3"},{"type":"type","title":"file.date_time/0","doc":"Must denote a valid date and time.","ref":"file.html#t:date_time/0"},{"type":"type","title":"file.deep_list/0","doc":"","ref":"file.html#t:deep_list/0"},{"type":"type","title":"file.delete_option/0","doc":"","ref":"file.html#t:delete_option/0"},{"type":"type","title":"file.fd/0","doc":"A file descriptor representing a file opened in [`raw`](`m:file#raw`) mode.","ref":"file.html#t:fd/0"},{"type":"type","title":"file.file_info/0","doc":"","ref":"file.html#t:file_info/0"},{"type":"type","title":"file.file_info_option/0","doc":"","ref":"file.html#t:file_info_option/0"},{"type":"type","title":"file.filename/0","doc":"A file name as returned from `m:file` API functions.\n\nSee the documentation of the `t:name_all/0` type.","ref":"file.html#t:filename/0"},{"type":"type","title":"file.filename_all/0","doc":"A file name as returned from `m:file` API functions.\n\nSee the documentation of the `t:name_all/0` type.","ref":"file.html#t:filename_all/0"},{"type":"type","title":"file.io_device/0","doc":"An IO device as returned by `open/2`.\n\n`t:io_server/0` is returned by default and `t:fd/0` is returned if the `raw` option is given.","ref":"file.html#t:io_device/0"},{"type":"type","title":"file.io_server/0","doc":"A process handling the I/O protocol.","ref":"file.html#t:io_server/0"},{"type":"type","title":"file.location/0","doc":"","ref":"file.html#t:location/0"},{"type":"type","title":"file.mode/0","doc":"","ref":"file.html#t:mode/0"},{"type":"type","title":"file.name/0","doc":"A restricted file name used as input into `m:file` API functions.\n\nIf VM is in Unicode filename mode, `t:string/0` and `t:char/0` are allowed to\nbe > 255. See also the documentation of the `t:name_all/0` type.","ref":"file.html#t:name/0"},{"type":"type","title":"file.name_all/0","doc":"A file name used as input into `m:file` API functions.\n\nIf VM is in Unicode filename mode, characters are allowed to be > 255.\n`RawFilename` is a filename not subject to Unicode translation, meaning that it\ncan contain characters not conforming to the Unicode encoding expected from the\nfile system (that is, non-UTF-8 characters although the VM is started in Unicode\nfilename mode). Null characters (integer value zero) are _not_ allowed in\nfilenames (not even at the end).","ref":"file.html#t:name_all/0"},{"type":"type","title":"file.posix/0","doc":"An atom that is named from the POSIX error codes used in Unix, and in the\nruntime libraries of most C compilers.","ref":"file.html#t:posix/0"},{"type":"type","title":"file.posix_file_advise/0","doc":"","ref":"file.html#t:posix_file_advise/0"},{"type":"type","title":"file.read_file_option/0","doc":"","ref":"file.html#t:read_file_option/0"},{"type":"type","title":"file.sendfile_option/0","doc":"","ref":"file.html#t:sendfile_option/0"},{"type":"module","title":"gen_sctp","doc":"Interface to SCTP sockets.\n\nThis module provides functions for communicating over SCTP sockets.\nThe implementation assumes that the OS kernel supports SCTP\n[(RFC 2960)](http://www.rfc-archive.org/getrfc.php?rfc=2960)\nthrough the user-level\n[Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\nDuring development, this implementation was tested on:\n\n- Linux Fedora Core 5.0 (kernel 2.6.15-2054 or later is needed)\n- Solaris 10, 11\n\nDuring OTP adaptation it was tested on:\n\n- SUSE Linux Enterprise Server 10 (x86_64) kernel 2.6.16.27-0.6-smp, with\n lksctp-tools-1.0.6\n- Briefly on Solaris 10\n- SUSE Linux Enterprise Server 10 Service Pack 1 (x86_64) kernel\n 2.6.16.54-0.2.3-smp with lksctp-tools-1.0.7\n- FreeBSD 8.2\n\nThis module was written for one-to-many style sockets (type `seqpacket`).\nWith the addition of `peeloff/2`, one-to-one style sockets (type `stream`)\nwere introduced.\n\nRecord definitions for this module can be found using:\n\n```erlang\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n```\n\nThese record definitions use the \"new\" spelling 'adaptation',\nnot the deprecated 'adaption', regardless of which spelling\nthe underlying C API uses.\n\n[](){: #options } SCTP Socket Options\n-------------------------------------\n\nThe set of admissible SCTP socket options is by construction orthogonal\nto the sets of TCP, UDP, and generic `inet` options. Here are only\noptions listed that are allowed for SCTP sockets.\n\nOptions can be set on the socket when calling [`open/1,2`](`open/1`),\nand changed when calling [`connect/4,5`](`connect/4`) or\nby calling `inet:setopts/2`. They can be retrieved using `inet:getopts/2`.\n\n- **`{mode, list|binary} | list | binary`** [](){: #option-binary } [](){: #option-list } -\n Determines the type of data returned from [`recv/1,2`](`recv/1`)\n or in _active mode_ data messages.\n\n- **`{active, false|true|once|N}`** [](){: #option-active }\n\n - If `false` (_passive mode_, the default), the caller must do an explicit\n [`recv`](`recv/1`) call to retrieve the available data from the socket.\n\n - If `true|once|N` (_active modes_) received data or events are sent\n to the owning process. See [`open/0..2`](`open/0`) for the message format.\n\n - If `true` (fully _active mode_) there is no flow control.\n\n > #### Note {: .info }\n >\n > Note that this can cause the message queue to overflow\n > causing for example the virtual machine to run out of memory and crash.\n\n - If `once`, only one message is automatically placed in the message queue,\n and the mode resets to passive. This provides flow control\n and the possibility for the receiver to listen for incoming\n SCTP data interleaved with other inter-process messages.\n\n - If `active` is specified as an integer `N` in the range -32768 to 32767\n (inclusive), that number is added to the socket's data messages counter.\n If the result of the addition is negative, the counter is set to `0`.\n Once the counter reaches `0`, either through the delivery of messages\n or by being explicitly set with `inet:setopts/2`, the socket mode\n resets to passive (`{active, false}`). When a socket in `{active, N}`\n mode transitions to passive mode, the message `{sctp_passive, Socket}`\n is sent to the controlling process to notify that if it wants to receive\n more data messages from the socket, it must call `inet:setopts/2`\n to set the socket back into an active mode.\n\n- **`{tos, integer()}`** - Sets the Type-Of-Service field on the IP datagrams\n that are sent, to the specified value. This effectively determines a\n prioritization policy for the outbound packets. The acceptable values are\n system-dependent.\n\n- **`{priority, integer()}`** - A protocol-independent equivalent of `tos`\n above. Setting priority implies setting `tos` as well.\n\n- **`{dontroute, true|false}`** - Defaults to `false`.\n If `true`, the kernel does not send packets through any gateway,\n but only sends them to directly connected hosts.\n\n- **`{reuseaddr, true|false}`** - Defaults to `false`.\n If `true`, the local binding address `{IP,Port}` of the socket can be\n reused immediately. No waiting in state `CLOSE_WAIT` is performed\n (can be required for some types of servers).\n\n- **`{sndbuf, integer()}`** - The size, in bytes, of the OS kernel send buffer\n for this socket. Sending errors would occur for datagrams larger than\n `val(sndbuf)`. Setting this option also adjusts the size of\n the driver buffer (see `buffer` above).\n\n- **`{recbuf, integer()}`** - The size, in bytes, of the OS kernel receive\n buffer for this socket. Sending errors would occur for datagrams\n larger than `val(recbuf)`. Setting this option also adjusts the size\n of the driver buffer (see `buffer` above).\n\n### [](){: #option_non_block_send }\n\n- **`{non_block_send, boolean()}`** - A send call that would otherwise block (hang),\n will instead immediately return with e.g. `{error, eagain}`\n *if* this option has been set to `true`.\n Defaults to `false`.\n\n- **`{sctp_module, module()}`** - Overrides which callback module is used.\nDefaults to `inet_sctp` for IPv4 and `inet6_sctp` for IPv6.\n\n- **`{sctp_rtoinfo, #sctp_rtoinfo{}}`**\n\n ```erlang\n #sctp_rtoinfo{\n assoc_id = assoc_id(),\n initial = integer(),\n max = integer(),\n min = integer()\n }\n ```\n\n Determines retransmission time-out parameters, in milliseconds, for the\n association(s) specified by `assoc_id`.\n\n `assoc_id = 0` (default) indicates the whole endpoint. See\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\n for the exact semantics of the field values.\n\n- **`{sctp_associnfo, #sctp_assocparams{}}`**\n\n ```erlang\n #sctp_assocparams{\n assoc_id = assoc_id(),\n asocmaxrxt = integer(),\n number_peer_destinations = integer(),\n peer_rwnd = integer(),\n local_rwnd = integer(),\n cookie_life = integer()\n }\n ```\n\n Determines association parameters for the association(s) specified by\n `assoc_id`.\n\n `assoc_id = 0` (default) indicates the whole endpoint. See\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\n for the discussion of their semantics. Rarely used.\n\n- **`{sctp_initmsg, #sctp_initmsg{}}`**\n\n ```erlang\n #sctp_initmsg{\n num_ostreams = integer(),\n max_instreams = integer(),\n max_attempts = integer(),\n max_init_timeo = integer()\n }\n ```\n\n Determines the default parameters that this socket tries to negotiate\n with its peer while establishing an association with it. Is to be set after\n [`open/*`](`open/1`) but before the first [`connect/*`](`connect/4`).\n `#sctp_initmsg{}` can also be used as ancillary data with the first call of\n [`send/*`](`send/3`) to a new peer (when a new association is created).\n\n - **`num_ostreams`** - Number of outbound streams\n\n - **`max_instreams`** - Maximum number of inbound streams\n\n - **`max_attempts`** - Maximum retransmissions while establishing an\n association\n\n - **`max_init_timeo`** - Time-out, in milliseconds, for establishing an\n association\n\n- **`{sctp_autoclose, integer() >= 0}`** - Determines the time, in seconds,\n after which an idle association is automatically closed. `0` means that the\n association is never automatically closed.\n\n- **`{sctp_nodelay, true|false}`** - Turns on|off the Nagle algorithm for\n merging small packets into larger ones. This improves throughput at the\n expense of latency.\n\n- **`{sctp_disable_fragments, true|false}`** - If `true`, induces an error on an\n attempt to send a message larger than the current PMTU size (which would\n require fragmentation/reassembling). Notice that message fragmentation does\n not affect the logical atomicity of its delivery; this option is provided for\n performance reasons only.\n\n- **`{sctp_i_want_mapped_v4_addr, true|false}`** - Turns on|off automatic\n mapping of IPv4 addresses into IPv6 ones (if the socket address family is\n `AF_INET6`).\n\n- **`{sctp_maxseg, integer()}`** - Determines the maximum chunk size if message\n fragmentation is used. If `0`, the chunk size is limited by the Path MTU only.\n\n- **`{sctp_primary_addr, #sctp_prim{}}`**\n\n ```erlang\n #sctp_prim{\n assoc_id = assoc_id(),\n addr = {IP, Port}\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n For the association specified by `assoc_id`, `{IP,Port}` must be one of the\n peer addresses. This option determines that the specified address is treated\n by the local SCTP stack as the primary address of the peer.\n\n- **`{sctp_set_peer_primary_addr, #sctp_setpeerprim{}}`**\n\n ```erlang\n #sctp_setpeerprim{\n assoc_id = assoc_id(),\n addr = {IP, Port}\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n When set, informs the peer to use `{IP, Port}` as the primary address of the\n local endpoint for the association specified by `assoc_id`.\n\n\n- **`{sctp_adaptation_layer, #sctp_setadaptation{}}`** [](){: #option-sctp_adaptation_layer }\n\n ```erlang\n #sctp_setadaptation{\n adaptation_ind = integer()\n }\n ```\n\n When set, requests that the local endpoint uses the value specified by\n `adaptation_ind` as the Adaptation Indication parameter for establishing\n new associations. For details, see\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\n- **`{sctp_peer_addr_params, #sctp_paddrparams{}}`**\n\n ```erlang\n #sctp_paddrparams{\n assoc_id = assoc_id(),\n address = {IP, Port},\n hbinterval = integer(),\n pathmaxrxt = integer(),\n pathmtu = integer(),\n sackdelay = integer(),\n flags = list()\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n Determines various per-address parameters for the association specified by\n `assoc_id` and the peer address `address` (the SCTP protocol supports\n multi-homing, so more than one address can correspond to a specified\n association).\n\n - **`hbinterval`** - Heartbeat interval, in milliseconds\n\n - **`pathmaxrxt`** - Maximum number of retransmissions before this address is\n considered unreachable (and an alternative address is selected)\n\n - **`pathmtu`** - Fixed Path MTU, if automatic discovery is disabled (see\n `flags` below)\n\n - **`sackdelay`** - Delay, in milliseconds, for SAC messages (if the delay is\n enabled, see `flags` below)\n\n - **`flags`** - The following flags are available:\n\n - **`hb_enable`** - Enables heartbeat\n\n - **`hb_disable`** - Disables heartbeat\n\n - **`hb_demand`** - Initiates heartbeat immediately\n\n - **`pmtud_enable`** - Enables automatic Path MTU discovery\n\n - **`pmtud_disable`** - Disables automatic Path MTU discovery\n\n - **`sackdelay_enable`** - Enables SAC delay\n\n - **`sackdelay_disable`** - Disables SAC delay\n\n- **`{sctp_default_send_param, #sctp_sndrcvinfo{}}`**\n\n [](){: #record-sctp_sndrcvinfo }\n ```erlang\n #sctp_sndrcvinfo{\n stream = integer(),\n ssn = integer(),\n flags = list(),\n ppid = integer(),\n context = integer(),\n timetolive = integer(),\n tsn = integer(),\n cumtsn = integer(),\n assoc_id = assoc_id()\n }\n ```\n\n `#sctp_sndrcvinfo{}` is used both in this socket option, and as\n ancillary data while sending or receiving SCTP messages. When set\n as an option, it provides default values for subsequent\n [`send`](`send/3`) calls on the association specified by `assoc_id`.\n\n `assoc_id = 0` (default) indicates the whole endpoint.\n\n The following fields typically must be specified by the sender:\n\n - **`sinfo_stream`** - Stream number (0-base) within the association to send\n the messages through;\n\n - **`sinfo_flags`** - The following flags are recognised:\n\n - **`unordered`** - The message is to be sent unordered\n\n - **`addr_over`** - The address specified in [`send`](`send/3`) overwrites\n the primary peer address\n\n - **`abort`** - Aborts the current association without flushing any unsent\n data\n\n - **`eof`** - Gracefully shuts down the current association, with flushing\n of unsent data\n\n Other fields are rarely used. For complete information, see\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\n- **`{sctp_events, #sctp_event_subscribe{}}`** [](){: #option-sctp_events }\n\n ```erlang\n #sctp_event_subscribe{\n data_io_event = true | false,\n association_event = true | false,\n address_event = true | false,\n send_failure_event = true | false,\n peer_error_event = true | false,\n shutdown_event = true | false,\n partial_delivery_event = true | false,\n adaptation_layer_event = true | false\n }\n ```\n\n This option determines which [SCTP Events](#sctp-events) that are to be\n received (through [`recv/*`](`recv/1`)) along with the data. The only\n exception is `data_io_event`, which enables or disables receiving of\n [`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) ancillary data,\n not events. By default, all flags except `adaptation_layer_event` are enabled,\n although `sctp_data_io_event` and `association_event` are used by the driver\n itself and not exported to the user level.\n\n- **`{sctp_delayed_ack_time, #sctp_assoc_value{}}`**\n\n ```erlang\n #sctp_assoc_value{\n assoc_id = assoc_id(),\n assoc_value = integer()\n }\n ```\n\n Rarely used. Determines the ACK time (specified by `assoc_value`, in\n milliseconds) for the specified association or the whole endpoint if\n `assoc_value = 0` (default).\n\n- **`{sctp_status, #sctp_status{}}`**\n\n ```erlang\n #sctp_status{\n assoc_id = assoc_id(),\n state = atom(),\n rwnd = integer(),\n unackdata = integer(),\n penddata = integer(),\n instrms = integer(),\n outstrms = integer(),\n fragmentation_point = integer(),\n primary = #sctp_paddrinfo{}\n }\n ```\n\n This option is read-only. It determines the status of the SCTP association\n specified by `assoc_id`. The following are the possible values of `state`\n (the state designations are mostly self-explanatory):\n\n - **`sctp_state_empty`** - Default. Means that no other state is active.\n\n - **`sctp_state_closed`**\n\n - **`sctp_state_cookie_wait`**\n\n - **`sctp_state_cookie_echoed`**\n\n - **`sctp_state_established`**\n\n - **`sctp_state_shutdown_pending`**\n\n - **`sctp_state_shutdown_sent`**\n\n - **`sctp_state_shutdown_received`**\n\n - **`sctp_state_shutdown_ack_sent`**\n\n Semantics of the other fields:\n\n - **`sstat_rwnd`** - Current receiver window size of the association\n\n - **`sstat_unackdata`** - Number of unacked data chunks\n\n - **`sstat_penddata`** - Number of data chunks pending receipt\n\n - **`sstat_instrms`** - Number of inbound streams\n\n - **`sstat_outstrms`** - Number of outbound streams\n\n - **`sstat_fragmentation_point`** - Message size at which SCTP fragmentation\n occurs\n\n - **`sstat_primary`** - Information on the current primary peer address (see\n below for the format of `#sctp_paddrinfo{}`)\n\n\n- **`{sctp_get_peer_addr_info, #sctp_paddrinfo{}}`** [](){: #option-sctp_get_peer_addr_info }\n\n ```erlang\n #sctp_paddrinfo{\n assoc_id = assoc_id(),\n address = {IP, Port},\n state = inactive | active | unconfirmed,\n cwnd = integer(),\n srtt = integer(),\n rto = integer(),\n mtu = integer()\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n This option is read-only. It determines the parameters specific to\n the peer address specified by `address` within the association specified\n by `assoc_id`. Field `address` fmust be set by the caller; all other fields\n are filled in on return. If `assoc_id = 0` (default), the `address`\n is automatically translated into the corresponding association ID.\n This option is rarely used. For the semantics of all fields, see\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\n[](){: #examples } SCTP Examples\n--------------------------------\n\nExample of an Erlang SCTP server that receives SCTP messages\nand prints them on the standard output:\n\n```erlang\n-module(sctp_server).\n\n-export([server/0,server/1,server/2]).\n-include_lib(\"kernel/include/inet.hrl\").\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n\nserver() ->\n server(any, 2006).\n\nserver([Host,Port]) when is_list(Host), is_list(Port) ->\n {ok, #hostent{h_addr_list = [IP|_]}} = inet:gethostbyname(Host),\n io:format(\"~w -> ~w~n\", [Host, IP]),\n server([IP, list_to_integer(Port)]).\n\nserver(IP, Port) when is_tuple(IP) orelse IP == any orelse IP == loopback,\n is_integer(Port) ->\n {ok,S} = gen_sctp:open(Port, [{recbuf,65536}, {ip,IP}]),\n io:format(\"Listening on ~w:~w. ~w~n\", [IP,Port,S]),\n ok = gen_sctp:listen(S, true),\n server_loop(S).\n\nserver_loop(S) ->\n case gen_sctp:recv(S) of\n {error, Error} ->\n io:format(\"SCTP RECV ERROR: ~p~n\", [Error]);\n Data ->\n io:format(\"Received: ~p~n\", [Data])\n end,\n server_loop(S).\n```\n\nExample of an Erlang SCTP client interacting with the above server.\nNote that in this example the client creates an association with\nthe server with 5 outbound streams. Therefore, sending of `\"Test 0\"`\nover stream 0 succeeds, but sending of `\"Test 5\"` over stream 5 fails.\nThe client then `abort`s the association, which results in that\nthe corresponding event is received on the server side.\n\n```erlang\n-module(sctp_client).\n\n-export([client/0, client/1, client/2]).\n-include_lib(\"kernel/include/inet.hrl\").\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n\nclient() ->\n client([localhost]).\n\nclient([Host]) ->\n client(Host, 2006);\n\nclient([Host, Port]) when is_list(Host), is_list(Port) ->\n client(Host,list_to_integer(Port)),\n init:stop().\n\nclient(Host, Port) when is_integer(Port) ->\n {ok,S} = gen_sctp:open(),\n {ok,Assoc} = gen_sctp:connect\n (S, Host, Port, [{sctp_initmsg,#sctp_initmsg{num_ostreams=5}}]),\n io:format(\"Connection Successful, Assoc=~p~n\", [Assoc]),\n\n io:write(gen_sctp:send(S, Assoc, 0, <<\"Test 0\">>)),\n io:nl(),\n timer:sleep(10000),\n io:write(gen_sctp:send(S, Assoc, 5, <<\"Test 5\">>)),\n io:nl(),\n timer:sleep(10000),\n io:write(gen_sctp:abort(S, Assoc)),\n io:nl(),\n\n timer:sleep(1000),\n gen_sctp:close(S).\n```\n\nA simple Erlang SCTP client that uses the `connect_init` API:\n\n```erlang\n-module(ex3).\n\n-export([client/4]).\n-include_lib(\"kernel/include/inet.hrl\").\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n\nclient(Peer1, Port1, Peer2, Port2)\n when is_tuple(Peer1), is_integer(Port1), is_tuple(Peer2), is_integer(Port2) ->\n {ok,S} = gen_sctp:open(),\n SctpInitMsgOpt = {sctp_initmsg,#sctp_initmsg{num_ostreams=5}},\n ActiveOpt = {active, true},\n Opts = [SctpInitMsgOpt, ActiveOpt],\n ok = gen_sctp:connect(S, Peer1, Port1, Opts),\n ok = gen_sctp:connect(S, Peer2, Port2, Opts),\n io:format(\"Connections initiated~n\", []),\n client_loop(S, Peer1, Port1, undefined, Peer2, Port2, undefined).\n\nclient_loop(S, Peer1, Port1, AssocId1, Peer2, Port2, AssocId2) ->\n receive\n {sctp, S, Peer1, Port1, {_Anc, SAC}}\n when is_record(SAC, sctp_assoc_change), AssocId1 == undefined ->\n io:format(\"Association 1 connect result: ~p. AssocId: ~p~n\",\n [SAC#sctp_assoc_change.state,\n SAC#sctp_assoc_change.assoc_id]),\n client_loop(S, Peer1, Port1, SAC#sctp_assoc_change.assoc_id,\n Peer2, Port2, AssocId2);\n\n {sctp, S, Peer2, Port2, {_Anc, SAC}}\n when is_record(SAC, sctp_assoc_change), AssocId2 == undefined ->\n io:format(\"Association 2 connect result: ~p. AssocId: ~p~n\",\n [SAC#sctp_assoc_change.state, SAC#sctp_assoc_change.assoc_id]),\n client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2,\n SAC#sctp_assoc_change.assoc_id);\n\n {sctp, S, Peer1, Port1, Data} ->\n io:format(\"Association 1: received ~p~n\", [Data]),\n client_loop(S, Peer1, Port1, AssocId1,\n Peer2, Port2, AssocId2);\n\n {sctp, S, Peer2, Port2, Data} ->\n io:format(\"Association 2: received ~p~n\", [Data]),\n client_loop(S, Peer1, Port1, AssocId1,\n Peer2, Port2, AssocId2);\n\n Other ->\n io:format(\"Other ~p~n\", [Other]),\n client_loop(S, Peer1, Port1, AssocId1,\n Peer2, Port2, AssocId2)\n\n after 5000 ->\n ok\n end.\n```\n\n[](){: #seealso } See Also\n--------------------------\n\n`m:gen_tcp`, `m:gen_udp`, `m:inet`,\n[RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) (Stream Control\nTransmission Protocol),\n[Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)","ref":"gen_sctp.html"},{"type":"function","title":"gen_sctp.abort/2","doc":"Abort an association.\n\nAbnormally terminates the association specified by `Assoc`,\nwithout flushing unsent data. The socket itself remains open.\nOther associations opened on this socket are still valid,\nand the socket can be used in new associations.","ref":"gen_sctp.html#abort/2"},{"type":"function","title":"gen_sctp.close/1","doc":"Close an SCTP socket.\n\nCloses the socket and all associations on it. The unsent data is flushed\nas for `eof/2`. The [`close/1`](`close/1`) call is blocking\ndepending of the value of the [`linger`](`m:inet#option-linger`)\nsocket [option]. If it is `false` or the linger time-out expires,\nthe call returns and unsent data is flushed in the background.","ref":"gen_sctp.html#close/1"},{"type":"function","title":"gen_sctp.connect/3","doc":"","ref":"gen_sctp.html#connect/3"},{"type":"function","title":"gen_sctp.connect/4","doc":"Establish an association with a peer.\n\nWith arguments `Addr` and `Port`, equivalent to\n[`connect(Socket, Addr, Port, Opts, infinity)`](`connect/5`).\n\nWith arguments `SockAddr` and `Opts` _(since OTP 24.3)_, equivalent to\n[`connect(Socket, Addr, Port, Opts, Timeout)`](`connect/5`)\nwhere `Addr` and `Port` are extracted from `SockAddr`.","ref":"gen_sctp.html#connect/4"},{"type":"function","title":"gen_sctp.connect/5","doc":"Establish an association with a peer.\n\nEstablishes a new association for socket `Socket`, with the peer\n(SCTP server socket) specified by `Addr` and `Port`.\n`Timeout`, is expressed in milliseconds.\nA socket can be associated with multiple peers.\nThe socket has to be of type `seqpacket`.\n\n> #### Warning {: .warning }\n>\n> Using a value of `Timeout` less than the maximum time taken by the OS to\n> establish an association (around 4.5 minutes if the default values from\n> [RFC 4960](https://tools.ietf.org/html/rfc4960) are used), can result in\n> inconsistent or incorrect return values. This is especially relevant for\n> associations sharing the same `Socket` (that is, source address and port), as\n> the controlling process blocks until `connect/*` returns.\n> [`connect_init/*`](`connect_init/4`) provides an alternative without this\n> limitation.\n\n### [](){: #record-sctp_assoc_change } `#sctp_assoc_change{}`\n\nThe result of `connect/*` is an `#sctp_assoc_change{}` event that contains,\nin particular, the new [Association ID](`t:assoc_id/0`):\nl\n```erlang\n#sctp_assoc_change{\n state = atom(),\n error = integer(),\n outbound_streams = integer(),\n inbound_streams = integer(),\n assoc_id = assoc_id()\n}\n```\n\nThe number of outbound and inbound streams for the association\ncan be set by giving an `sctp_initmsg` option to `connect` as in:\n\n```erlang\nconnect(Socket, Ip, Port>,\n [{sctp_initmsg,#sctp_initmsg{num_ostreams=OutStreams,\n max_instreams=MaxInStreams}}])\n```\n\nAll options `Opt` are set on the socket before the association is attempted.\nIf an option record has undefined field values, the options record\nis first read from the socket for those values. In effect,\n`Opt` option records only need to define field values to change\nbefore connecting.\n\nThe returned `outbound_streams` and `inbound_streams` are the number of\nstream on the socket. These can be different from the requested values\n(`OutStreams` and `MaxInStreams`, respectively), if the peer\nrequires lower values.\n\n`state` can have the following values:\n\n- **`comm_up`** - Association is successfully established. This indicates\n a successful completion of `connect`.\n\n- **`cant_assoc`** - The association cannot be established\n (`connect/*` failure).\n\nOther states do not normally occur in the output from `connect/*`.\nRather, they can occur in `#sctp_assoc_change{}` events received\ninstead of data from [`recv/*`](`recv/1`) calls or socket messages.\nAll of them indicate losing the association because of various\nerror conditions, and are listed here for the sake of completeness:\n\n- **`comm_lost`**\n\n- **`restart`**\n\n- **`shutdown_comp`**\n\nThe field `error` can provide more detailed diagnostics. Its value\ncan be converted into a string using `error_string/1`.","ref":"gen_sctp.html#connect/5"},{"type":"function","title":"gen_sctp.connect_init/3","doc":"","ref":"gen_sctp.html#connect_init/3"},{"type":"function","title":"gen_sctp.connect_init/4","doc":"Start establishing an association with a peer.\n\nWith arguments `Addr` and `Port`, equivalent to\n[`connect_init(Socket, Addr, Port, Opts, infinity)`](`connect/5`).\n\nWith arguments `SockAddr` and `Opts` _(since OTP 24.3)_, equivalent to\n[`connect_init(Socket, Addr, Port, Opts, Timeout)`](`connect/5`)\nwhere `Addr` and `Port` are extracted from `SockAddr`.","ref":"gen_sctp.html#connect_init/4"},{"type":"function","title":"gen_sctp.connect_init/5","doc":"Start establishing an association with a peer.\n\nInitiates a new association for socket `Socket`, with the peer\n(SCTP server socket) specified by `Addr` and `Port`.\n\nThe fundamental difference between this API and `connect/*` is that\nthe return value is that of the underlying OS `connect(2)` system call.\nIf `ok` is returned, the operation has been succesfully initiated,\nand the final result result of the association establishment\nis sent to the socket owner (controlling process) as an\n[`#sctp_assoc_change{}`](#record-sctp_assoc_change) event.\nThe socket owner must be prepared to receive this, the\n[`recv/*`](`recv/1`) call has to be polled, depending on the value\nof the [active option](#option-active).\n\nThe parameters are as described for [`connect/*`](`connect/5`),\nexcept the `Timeout` value since for this function, the time-out only\napplies to the name resolving of `Addr` when it is a `t:inet:hostname/0`.","ref":"gen_sctp.html#connect_init/5"},{"type":"function","title":"gen_sctp.connectx_init/3","doc":"Start establishing an association with a peer (multiple addresses).\n\nSimilar to `connectx_init/5` except using socket addresses, and not having a\n`Timeout`. Since the addresses do not need lookup and the connect is\nnon-blocking this call returns immediately.\n\nThe value of each socket address `port` must be the same or zero.\nAt least one socket address must have a non-zero `port`","ref":"gen_sctp.html#connectx_init/3"},{"type":"function","title":"gen_sctp.connectx_init/4","doc":"","ref":"gen_sctp.html#connectx_init/4"},{"type":"function","title":"gen_sctp.connectx_init/5","doc":"Start establishing an association with a peer (multiple addresses).\n\nInitiates a new association for socket `Socket`, with the peer\n(SCTP server socket) specified by `Addrs` and `Port`.\n\nThis API is similar to `connect_init/*` except the underlying OS\n`sctp_connectx(3)` system call is used, that accepts multiple\ndestination addresses.\n\nIf successful, the association ID is returned which will be received in a\nsubsequent [`#sctp_assoc_change{}`](#record-sctp_assoc_change)\nevent.\n\nThe parameters are as described in `connect_init/5`\n\n> #### Note {: .info }\n> This API allows the OS to use all Addrs when establishing an association,\n> but does not guarantee it will. Therefore, if the connection fails,\n> the user may want to rotate the order of addresses for a subsequent call.","ref":"gen_sctp.html#connectx_init/5"},{"type":"function","title":"gen_sctp.controlling_process/2","doc":"Change the controlling process (owner) of a socket.\n\nAssigns a new controlling process `Pid` to `Socket`.\nSee `gen_udp:controlling_process/2`.","ref":"gen_sctp.html#controlling_process/2"},{"type":"function","title":"gen_sctp.eof/2","doc":"Terminate an association gracefully.\n\nGracefully terminates the association specified by `Assoc`, flushing\nall unsent data. The socket itself remains open. Other associations\nopened on this socket are still valid. The socket can be used\nin new associations.","ref":"gen_sctp.html#eof/2"},{"type":"function","title":"gen_sctp.error_string/1","doc":"Translate an error number into a string or atom.\n\nTranslates an SCTP error number from, for example, `#sctp_remote_error{}`\nor `#sctp_send_failed{}` into an explanatory string, or into\none of the atoms `ok` for no error, or `unknown_error`\nfor an unrecognized integer.","ref":"gen_sctp.html#error_string/1"},{"type":"function","title":"gen_sctp.listen/2","doc":"Make an SCTP socket listen to incoming associations.\n\nThe socket will listen on the IP address(es) and port number it is bound to.\n\nFor type `seqpacket`, sockets (the default), the argument`IsServer`\nmust be a `t:boolean/0`. In contrast to `stream` sockets, there is\nno listening queue length. If `IsServer` is `true`, the socket accepts\nnew associations, that is, it becomes an SCTP server socket.\n\nFor type `stream` sockets, the argument `Backlog` sets\nthe backlog queue length just like for TCP.","ref":"gen_sctp.html#listen/2"},{"type":"function","title":"gen_sctp.open/0","doc":"","ref":"gen_sctp.html#open/0"},{"type":"function","title":"gen_sctp.open/1","doc":"Create an SCTP socket.\n\nWith argument [`Port`](`t:inet:port_number/0`),\nequivalent to`open([{port, Port}]`.\n\nCreates an SCTP socket and binds it to the local addresses specified by all\n`{ip,IP}` (or synonymously `{ifaddr,IP}`) options (this feature is called\nSCTP multi-homing). The default `IP` and `Port` are `any` and `0`,\nmeaning bind to all local addresses on any free port.\n\nIt is also possible to use `{ifaddr, SockAddr}`, in which case it takes\nprecedence over the `ip` and `port` options. These options can however\nbe used to update the address and port of ifaddr (if they occur\nafter ifaddr in the options list), although this is not recommended.\n\nOther options:\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`inet`** - Sets up the socket for IPv4. This is the default.\n\nA default set of socket [options](#options) is used.\nIn particular, the socket is opened in [binary](#option-binary)\nand [passive](#option-active) mode, with SockType `seqpacket`,\nand with reasonably large [kernel](`m:inet#option-sndbuf`) and driver\n[buffers](`m:inet#option-buffer`).\n\nWhen the socket is in [passive](#option-active) mode,\ndata can be received through the [`recv/1,2`](`recv/1`) calls.\n\nWhen the socket is in [active](#option-active) mode,\ndata received data is delivered to the controlling process as messages:\n\n```erlang\n{sctp, Socket, FromIP, FromPort, {AncData, Data}}\n```\n\nSee [`recv/1,2`](`recv/1`) for a description of the message fields.\n\n> #### Note {: .info }\n>\n> This message format unfortunately differs slightly from the\n> [`gen_udp`](`gen_udp:open/1`) message format with ancillary data,\n> and from the [`recv/1,2`](`recv/1`) return tuple format.","ref":"gen_sctp.html#open/1"},{"type":"function","title":"gen_sctp.open/2","doc":"","ref":"gen_sctp.html#open/2"},{"type":"function","title":"gen_sctp.peeloff/2","doc":"Branch off an association into a new socket of type `stream`.\n\nThe existing association `Assoc` in the socket `Socket` (that has to\nbe of type `seqpacket`; one-to-many style) is branched off into\na new socket `NewSocket` of type `stream` (one-to-one style).\n\nThe existing association argument `Assoc` can be a\n[`#sctp_assoc_change{}`](#record-sctp_assoc_change) record as\nreturned from, for example, [`recv/*`](`recv/2`), [`connect/*`](`connect/5`),\nor from a listening socket in active mode.\nIt can also be just the field `assoc_id` `t:integer/0` from such a record.","ref":"gen_sctp.html#peeloff/2"},{"type":"function","title":"gen_sctp.recv/1","doc":"","ref":"gen_sctp.html#recv/1"},{"type":"function","title":"gen_sctp.recv/2","doc":"Receive a `Data` message.\n\nReceives the `Data` message from any association of the socket.\nIf the receive times out, `{error,timeout}` is returned. The default\ntime-out is `infinity`. `FromIP` and `FromPort` indicate the address\nof the sender.\n\n`AncData` is a list of ancillary data items received with the main `Data`.\nThis list can be empty, or contain a single\n[`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) record,\nif receiving ancillary data is enabled\n(see option [`sctp_events`](#option-sctp_events)).\nPer default, it is enabled, as such ancillary data provides an easy way\nto determine the association and stream over which the message was received.\n(An alternative way is to get the association ID from `FromIP` and `FromPort`\nusing socket option\n[`sctp_get_peer_addr_info`](#option-sctp_get_peer_addr_info),\nbut this does still not give the stream number).\n\n`AncData` may also contain [ancillary data](`t:inet:ancillary_data/0`)\nfrom the socket [options](#options)\n[`recvtos`](`m:inet#option-recvtos`),\n[`recvtclass`](`m:inet#option-recvtclass`) or\n[`recvttl`](`m:inet#option-recvttl`), if that is supported for the socket\nby the platform.\n\nThe `Data` received can, depending on the socket [mode](#option-binary)\nbe a `t:binary/0` or a `t:list/0` of bytes (integers in the range\n`0` through `255`), or it can be an SCTP event.\n\n### [](){: #sctp-events } Possible SCTP events\n\n- [`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo)\n- [`#sctp_assoc_change{}`](#record-sctp_assoc_change)\n- ```erlang\n #sctp_paddr_change{\n addr = {ip_address(),port()},\n state = atom(),\n error = integer(),\n assoc_id = assoc_id()\n }\n ```\n\n Indicates change of the status of the IP address of the peer specified by\n `addr` within association `assoc_id`. Possible values of `state` (mostly\n self-explanatory) include:\n\n - **`addr_unreachable`**\n\n - **`addr_available`**\n\n - **`addr_removed`**\n\n - **`addr_added`**\n\n - **`addr_made_prim`**\n\n - **`addr_confirmed`**\n\n In case of an error (for example, `addr_unreachable`), the field `error`\n provides more diagnostics. In such cases, event `#sctp_paddr_change{}`\n is automatically converted into an `error` term returned by\n [`recv`](`recv/1`). The `error` field value can be converted\n into a string using `error_string/1`.\n\n- ```erlang\n #sctp_send_failed{\n flags = true | false,\n error = integer(),\n info = #sctp_sndrcvinfo{},\n assoc_id = assoc_id()\n data = binary()\n }\n ```\n\n The sender can receive this event if a send operation fails.\n\n - **`flags`** - A Boolean specifying if the data has been transmitted\n over the wire.\n\n - **`error`** - Provides extended diagnostics, use\n [`error_string/1`.](`error_string/1`)\n\n - **`info`** - The original\n [`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) record\n used in the failed [`send/*`.](`send/3`)\n\n - **`data`** - The whole original data chunk attempted to be sent.\n\n In the current implementation of the Erlang/SCTP binding, this event is\n internally converted into an `error` term returned by [`recv/*`](`recv/1`).\n\n- ```erlang\n #sctp_adaptation_event{\n adaptation_ind = integer(),\n assoc_id = assoc_id()\n }\n ```\n\n Delivered when a peer sends an adaptation layer indication parameter\n (configured through option\n [`sctp_adaptation_layer`](#option-sctp_adaptation_layer)).\n Notie that with the current implementation of the Erlang/SCTP binding,\n this event is disabled by default.\n\n- ```erlang\n #sctp_pdapi_event{\n indication = sctp_partial_delivery_aborted,\n assoc_id = assoc_id()\n }\n ```\n\n A partial delivery failure. In the current implementation\n of the Erlang/SCTP binding, this event is internally converted\n into an `error` term returned by [`recv/*`](`recv/1`).","ref":"gen_sctp.html#recv/2"},{"type":"function","title":"gen_sctp.send/3","doc":"Send a `Data` message, full-featured.\n\nSends the `Data` message with all sending parameters from a\n[`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) record.\nThis way, the user can specify the PPID (passed to the remote end)\nand context (passed to the local SCTP layer), which can be used,\nfor example, for error identification. However, such a fine grained\nuser control is rarely required. The function [`send/4`](`send/4`)\nis sufficient for most applications.\n\n> #### Note {: .info }\n>\n> Send is normally blocking, but if the socket option\n> [`non_block_send`](#option_non_block_send) is set to true,\n> the function will return with e.g. {error, eagain}\n> in the case when the function would otherwise block.\n> It is then up to the user to try again later.","ref":"gen_sctp.html#send/3"},{"type":"function","title":"gen_sctp.send/4","doc":"Send a data message.\n\nSends a `Data` message on the association `Assoc` and `Stream`.\n\n`Assoc` can be specified with a\n[`#sctp_assoc_change{}`](#record-sctp_assoc_change) record\nfrom an association establishment, or as the `t:assoc_id/0`\n`t:integer/0` field value.\n\n> #### Note {: .info }\n>\n> Send is normally blocking, but if the socket option\n> [`non_block_send`](#option_non_block_send) is set to true,\n> the function will return with e.g. {error, eagain}\n> in the case when the function would otherwise block.\n> It is then up to the user to try again later.","ref":"gen_sctp.html#send/4"},{"type":"type","title":"gen_sctp.assoc_id/0","doc":"Association ID.\n\nAn opaque term returned in, for example, `#sctp_paddr_change{}`, which\nidentifies an association for an SCTP socket. The term is opaque except for the\nspecial value `0`, which has a meaning such as \"the whole endpoint\" or \"all\nfuture associations\".","ref":"gen_sctp.html#t:assoc_id/0"},{"type":"type","title":"gen_sctp.elementary_option/0","doc":"","ref":"gen_sctp.html#t:elementary_option/0"},{"type":"type","title":"gen_sctp.elementary_option_name/0","doc":"","ref":"gen_sctp.html#t:elementary_option_name/0"},{"type":"type","title":"gen_sctp.option/0","doc":"[SCTP Socket Option](#options) name and value, to set.","ref":"gen_sctp.html#t:option/0"},{"type":"type","title":"gen_sctp.option_name/0","doc":"[SCTP Socket Option](#options) name, to get.","ref":"gen_sctp.html#t:option_name/0"},{"type":"type","title":"gen_sctp.option_value/0","doc":"[SCTP Socket Option](#options) name and value, what you get.","ref":"gen_sctp.html#t:option_value/0"},{"type":"type","title":"gen_sctp.record_option/0","doc":"","ref":"gen_sctp.html#t:record_option/0"},{"type":"type","title":"gen_sctp.ro_option/0","doc":"","ref":"gen_sctp.html#t:ro_option/0"},{"type":"type","title":"gen_sctp.sctp_socket/0","doc":"Socket identifier returned from [`open/*`](`open/0`).","ref":"gen_sctp.html#t:sctp_socket/0"},{"type":"module","title":"gen_tcp","doc":"Interface to TCP/IP sockets.\n\nThis module provides functions for communicating over TCP/IP\nprotocol sockets.\n\nThe following code fragment is a simple example of a client connecting to a\nserver at port 5678, transferring a binary, and closing the connection:\n\n```erlang\nclient() ->\n SomeHostInNet = \"localhost\", % to make it runnable on one machine\n {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,\n [binary, {packet, 0}]),\n ok = gen_tcp:send(Sock, \"Some Data\"),\n ok = gen_tcp:close(Sock).\n```\n\nAt the other end, a server is listening on port 5678, accepts the connection,\nand receives the binary:\n\n```erlang\nserver() ->\n {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},\n {active, false}]),\n {ok, Sock} = gen_tcp:accept(LSock),\n {ok, Bin} = do_recv(Sock, []),\n ok = gen_tcp:close(Sock),\n ok = gen_tcp:close(LSock),\n Bin.\n\ndo_recv(Sock, Bs) ->\n case gen_tcp:recv(Sock, 0) of\n {ok, B} ->\n do_recv(Sock, [Bs, B]);\n {error, closed} ->\n {ok, list_to_binary(Bs)}\n end.\n```\n\nFor more examples, see section [Examples](#module-examples).\n\n> #### Note {: .info }\n>\n> Functions that create sockets can take an optional option;\n> `{inet_backend, Backend}` that, if specified, has to be the first option. This\n> selects the implementation backend towards the platform's socket API.\n>\n> This is a _temporary_ option that will be ignored in a future release.\n>\n> The default is `Backend = inet` that selects the traditional `inet_drv.c`\n> driver. The other choice is `Backend = socket` that selects the new `m:socket`\n> module and its NIF implementation.\n>\n> The system default can be changed when the node is started with the\n> application `kernel`'s configuration variable `inet_backend`.\n>\n> For `gen_tcp` with `inet_backend = socket` we have tried to be as \"compatible\"\n> as possible which has sometimes been impossible. Here is a list of cases when\n> the behaviour of inet-backend `inet` (default) and `socket` are different:\n>\n> - [Non-blocking send](#non_blocking_send)\n>\n> If a user calling [`gen_tcp:send/2`](`send/2`) with `inet_backend = inet`,\n> tries to send more data than there is room for in the OS buffers, the \"rest\n> data\" is buffered by the inet driver (and later sent in the background). The\n> effect for the user is that the call is non-blocking.\n>\n> This is _not_ the effect when `inet_backend = socket`, since there is no\n> buffering. Instead the user hangs either until all data has been sent or the\n> `send_timeout` timeout has been reached.\n>\n> - `shutdown/2` may hide errors\n>\n> The call does not involve the receive process state, and is done\n> right on the underlying socket. On for example Linux, it is a known\n> misbehaviour that it skips some checks so doing shutdown on a\n> listen socket returns `ok` while the logical result should have been\n> `{error, enotconn}`. The `inet_drv.c` driver did an extra check\n> and simulated the correct error, but with `Backend = socket`\n> it would introduce overhead to involve the receive process.\n>\n> - The option [nodelay](`m:inet#option-nodelay`) is a TCP specific option that\n> is _not_ compatible with `domain = local`.\n>\n> When using `inet_backend = socket`, trying to create a socket (via listen or\n> connect) with `domain = local` (for example with option \\{ifaddr,\n> \\{local,\"/tmp/test\"\\}\\}) _will fail_ with `{error, enotsup}`.\n>\n> This does not actually work for `inet_backend = inet` either, but in that\n> case the error is simply _ignored_, which is a _bad_ idea. We have chosen to\n> _not_ ignore this error for `inet_backend = socket`.\n>\n> - [Async shutdown write](#async_shutdown_write)\n>\n> Calling [gen_tcp:shutdown(Socket, write | read_write)](`shutdown/2`) on a\n> socket created with `inet_backend = socket` will take _immediate_ effect,\n> unlike for a socket created with `inet_backend = inet`.\n>\n> See [async shutdown write](#async_shutdown_write) for more info.\n>\n> - Windows require sockets (domain = `inet | inet6`) to be bound.\n>\n> _Currently_ all sockets created on Windows with `inet_backend = socket` will\n> be bound. If the user does not provide an address, gen_tcp will try to\n> 'figure out' an address itself.","ref":"gen_tcp.html"},{"type":"module","title":"Examples - gen_tcp","doc":"The following example illustrates use of option `{active,once}` and multiple\naccepts by implementing a server as a number of worker processes doing accept on\na single listening socket. Function `start/2` takes the number of worker\nprocesses and the port number on which to listen for incoming connections. If\n`LPort` is specified as `0`, an ephemeral port number is used, which is why the\nstart function returns the actual port number allocated:\n\n```erlang\nstart(Num,LPort) ->\n case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of\n {ok, ListenSock} ->\n start_servers(Num,ListenSock),\n {ok, Port} = inet:port(ListenSock),\n Port;\n {error,Reason} ->\n {error,Reason}\n end.\n\nstart_servers(0,_) ->\n ok;\nstart_servers(Num,LS) ->\n spawn(?MODULE,server,[LS]),\n start_servers(Num-1,LS).\n\nserver(LS) ->\n case gen_tcp:accept(LS) of\n {ok,S} ->\n loop(S),\n server(LS);\n Other ->\n io:format(\"accept returned ~w - goodbye!~n\",[Other]),\n ok\n end.\n\nloop(S) ->\n inet:setopts(S,[{active,once}]),\n receive\n {tcp,S,Data} ->\n Answer = process(Data), % Not implemented in this example\n gen_tcp:send(S,Answer),\n loop(S);\n {tcp_closed,S} ->\n io:format(\"Socket ~w closed [~w]~n\",[S,self()]),\n ok\n end.\n```\n\nExample of a simple client:\n\n```erlang\nclient(PortNo,Message) ->\n {ok,Sock} = gen_tcp:connect(\"localhost\",PortNo,[{active,false},\n {packet,2}]),\n gen_tcp:send(Sock,Message),\n A = gen_tcp:recv(Sock,0),\n gen_tcp:close(Sock),\n A.\n```\n\nThe `send` call does not accept a time-out option because time-outs on send is\nhandled through socket option `send_timeout`. The behavior of a send operation\nwith no receiver is mainly defined by the underlying TCP stack and the network\ninfrastructure. To write code that handles a hanging receiver that can\neventually cause the sender to hang on a `send` do like the following.\n\nConsider a process that receives data from a client process to be forwarded to a\nserver on the network. The process is connected to the server through TCP/IP and\ndoes not get any acknowledge for each message it sends, but has to rely on the\nsend time-out option to detect that the other end is unresponsive. Option\n`send_timeout` can be used when connecting:\n\n```erlang\n...\n{ok,Sock} = gen_tcp:connect(HostAddress, Port,\n [{active,false},\n {send_timeout, 5000},\n {packet,2}]),\n loop(Sock), % See below\n...\n```\n\nIn the loop where requests are handled, send time-outs can now be detected:\n\n```erlang\nloop(Sock) ->\n receive\n {Client, send_data, Binary} ->\n case gen_tcp:send(Sock,[Binary]) of\n {error, timeout} ->\n io:format(\"Send timeout, closing!~n\",\n []),\n handle_send_timeout(), % Not implemented here\n Client ! {self(),{error_sending, timeout}},\n %% Usually, it's a good idea to give up in case of a\n %% send timeout, as you never know how much actually\n %% reached the server, maybe only a packet header?!\n gen_tcp:close(Sock);\n {error, OtherSendError} ->\n io:format(\"Some other error on socket (~p), closing\",\n [OtherSendError]),\n Client ! {self(),{error_sending, OtherSendError}},\n gen_tcp:close(Sock);\n ok ->\n Client ! {self(), data_sent},\n loop(Sock)\n end\n end.\n```\n\nUsually it suffices to detect time-outs on receive, as most protocols include\nsome sort of acknowledgment from the server, but if the protocol is strictly one\nway, option `send_timeout` comes in handy.","ref":"gen_tcp.html#module-examples"},{"type":"function","title":"gen_tcp.accept/1","doc":"","ref":"gen_tcp.html#accept/1"},{"type":"function","title":"gen_tcp.accept/2","doc":"Accept an incoming connection request on a listen socket.\n\n`Socket` must be a socket returned from `listen/2`. `Timeout` specifies\na time-out value in milliseconds. Defaults to `infinity`.\n\nReturns:\n\n- `{ok, Socket}` if a connection is established\n- `{error, closed}` if `ListenSocket` is closed\n- `{error, timeout}` if no connection is established within `Timeout`\n- `{error, system_limit}` if all available ports in the Erlang emulator\n are in use\n- A POSIX error value if something else goes wrong, see `m:inet`\n about possible values\n\nTo send packets (outbound) on the returned `Socket`, use `send/2`.\nPackets sent from the peer (inbound) are delivered as messages\nto the socket owner; the process that created the socket.\nUnless `{active, false}` is specified in the option list when creating\nthe [listening socket](`listen/2`).\n\nSee `connect/4` about _active mode_ socket messages and _passive mode_.\n\n> #### Note {: .info }\n>\n> The `accept` call _doesn't have to be_ issued from the socket owner process.\n> Using version 5.5.3 and higher of the emulator, multiple simultaneous accept\n> calls can be issued from different processes, which allows for a pool of\n> acceptor processes handling incoming connections.","ref":"gen_tcp.html#accept/2"},{"type":"function","title":"gen_tcp.close/1","doc":"Close a TCP socket.\n\nNote that in most implementations of TCP, doing a `close` does not guarantee\nthat the data sent is delivered to the recipient. It is guaranteed that\nthe recepient will see all sent data before getting the close, but the\nsender gets no indication of that.\n\nIf the sender needs to know that the recepient has received all data\nthere are two common ways to achieve this:\n\n1. Use [`gen_tcp:shutdown(Sock, write)`](`shutdown/2`) to signal that no more\n data is to be sent and wait for the other side to acknowledge seeing\n its read side being closed, by closing its write side, which shows\n as a socket close on this side.\n2. Implement an acknowledgement in the protocol on top of TCP\n that both connection ends adhere to, indicating that all data\n has been seen. The socket option [`{packet, N}`](`m:inet#option-packet`)\n may be useful.","ref":"gen_tcp.html#close/1"},{"type":"function","title":"gen_tcp.connect/2","doc":"Equivalent to [`connect(SockAddr, Opts, infinity)`](`connect/3`).","ref":"gen_tcp.html#connect/2"},{"type":"function","title":"gen_tcp.connect/3","doc":"Create a socket connected to the specified address.","ref":"gen_tcp.html#connect/3"},{"type":"function","title":"With arguments `Address` and `Port` - gen_tcp.connect/3","doc":"Equivalent to [`connect(Address, Port, Opts, infinity)`](`connect/4`).","ref":"gen_tcp.html#connect/3-with-arguments-address-and-port"},{"type":"function","title":"With argument `SockAddr` **(since OTP 24.3)** - gen_tcp.connect/3","doc":"Connects to a remote listen socket specified by `SockAddr`\nwhere `t:socket:sockaddr_in6/0` for example allows specifying\nthe `scope_id` for link local IPv6 addresses.\n\n[IPv4 addresses](`t:socket:sockaddr_in/0`) on the same\n`t:map/0` format is also allowed.\n\nEquivalent to `connect/4`, besides the format of the destination address.","ref":"gen_tcp.html#connect/3-with-argument-sockaddr-since-otp-24-3"},{"type":"function","title":"gen_tcp.connect/4","doc":"Create a socket connected to the specified address.\n\nCreates a socket and connects it to a server on TCP port `Port`\non the host with IP address `Address`, that may also be a hostname.\n\n### `Opts` (connect options)\n\n- **`{ip, Address}`** - If the local host has many IP addresses,\n this option specifies which one to use.\n\n- **`{ifaddr, Address}`** - Same as `{ip, Address}`.\n\n However, if `Address` instead is a `t:socket:sockaddr_in/0` or\n `t:socket:sockaddr_in6/0` this takes precedence over any value\n previously set with the `ip` and `port` options. If these options\n (`ip` or/and `port`) however comes _after_ this option,\n they may be used to _update_ the corresponding fields of this option\n (for `ip`, the `addr` field, and for `port`, the `port` field).\n\n- **`{fd, integer() >= 0}`** - If a socket has somehow been connected without\n using `gen_tcp`, use this option to pass the file descriptor for it.\n If `{ip, Address}` and/or `{port, port_number()}` is combined\n with this option, the `fd` is bound to the specified interface\n and port before connecting. If these options are not specified,\n it is assumed that the `fd` is already bound appropriately.\n\n- **`inet`** - Sets up the socket for IPv4.\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`local`** - Sets up a Unix Domain Socket. See `t:inet:local_address/0`\n\n- **`{port, Port}`** - Specifies which local port number to use.\n\n- **`{tcp_module, module()}`** - Overrides which callback module is used.\n Defaults to `inet_tcp` for IPv4 and `inet6_tcp` for IPv6.\n\n- **`t:option/0`** - See `inet:setopts/2`.","ref":"gen_tcp.html#connect/4"},{"type":"function","title":"Socket Data - gen_tcp.connect/4","doc":"Packets can be sent to the peer (outbound) with\n[`send(Socket, Packet)`](`send/2`). Packets sent from the peer\n(inbound) are delivered as messages to the socket owner;\nthe process that created the socket, unless `{active, false}`\nis specified in the `Options` list.\n\n#### Active mode socket messages\n\n- **`{tcp, Socket, Data}`** - Inbound data from the socket.\n\n- **`{tcp_passive, Socket}`** -\n The socket was in `{active, N}` mode (see `inet:setopts/2` for details)\n and its message counter reached `0`, indicating that\n the socket has transitioned to passive (`{active, false}`) mode.\n\n\n- **`{tcp_closed, Socket}`** - The socket was closed.\n\n- **`{tcp_error, Socket, Reason}`** A socket error occurred.\n\n#### Passive mode\n\nIf `{active, false}` is specified in the option list for the socket,\npackets and errors are retrieved by calling [`recv/2,3`](`recv/3`)\n(`send/2` may also return errors).\n\n#### Timeout\n\nThe optional `Timeout` parameter specifies a connect time-out in milliseconds.\nDefaults to `infinity`.\n\n> #### Note {: .info }\n>\n> Keep in mind that if the underlying OS `connect()` call returns a timeout,\n> `gen_tcp:connect` will also return a timeout (i.e. `{error, etimedout}`),\n> even if a larger `Timeout` was specified (for example `infinity`).\n\n> #### Note {: .info }\n>\n> The default values for options specified to `connect` can be affected by the\n> Kernel configuration parameter `inet_default_connect_options`.\n> For details, see `m:inet`.","ref":"gen_tcp.html#connect/4-socket-data"},{"type":"function","title":"gen_tcp.controlling_process/2","doc":"Change the controlling process (owner) of a socket.\n\nAssigns a new controlling process `Pid` to `Socket`. The controlling process\nis the process that the socket sends messages to. If this function\nis called from any other process than the current controlling process,\n`{error, not_owner}` is returned.\n\nIf the process identified by `Pid` is not an existing local `t:pid/0`,\n`{error, badarg}` is returned. `{error, badarg}` may also be returned\nin some cases when `Socket` is closed during the execution of this function.\n\nIf the socket is in _active mode_, this function will transfer any messages\nfrom the socket in the mailbox of the caller to the new controlling process.\n\nIf any other process is interacting with the socket during the transfer,\nit may not work correctly and messages may remain in the caller's mailbox.\nFor instance, changing the sockets active mode during the transfer\ncould cause this.","ref":"gen_tcp.html#controlling_process/2"},{"type":"function","title":"gen_tcp.listen/2","doc":"Create a listen socket.\n\nCreates a socket and sets it to listen on port `Port` on the local host.\n\nIf `Port == 0`, the underlying OS assigns an available (ephemeral)\nport number, use `inet:port/1` to retrieve it.\n\nThe following options are available:\n\n- **`list`** - Received `Packet`s are delivered as lists of bytes,\n `[`[`byte/0`](`t:byte/0`)`]`.\n\n- **`binary`** - Received `Packet`s are delivered as `t:binary/0`s.\n\n- **`{backlog, B}`** - `B ::` `t:non_neg_integer/0`. The backlog value\n defines the maximum length that the queue of pending connections\n can grow to. Defaults to `5`.\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`inet`** - Sets up the socket for IPv4.\n\n- **`{fd, Fd}`** - If a socket has somehow been created without using\n `gen_tcp`, use this option to pass the file descriptor for it.\n\n- **`{ip, Address}`** - If the host has many IP addresses, this option\n specifies which one to listen on.\n\n- **`{port, Port}`** - Specifies which local port number to use.\n\n- **`{ifaddr, Address}`** - Same as `{ip, Address}`.\n\n However, if this instead is an `t:socket:sockaddr_in/0` or\n `t:socket:sockaddr_in6/0` this takes precedence over any value\n previously set with the `ip` and `port` options. If these options\n (`ip` or/and `port`) however comes _after_ this option,\n they may be used to _update_ their corresponding fields of this option\n (for `ip`, the `addr` field, and for `port`, the `port` field).\n\n- **`{tcp_module, module()}`** - Overrides which callback module is used.\n Defaults to `inet_tcp` for IPv4 and `inet6_tcp` for IPv6.\n\n- **`t:option/0`** - See `inet:setopts/2`.\n\nThe returned socket `ListenSocket` should be used when calling\n[`accept/1,2`](`accept/1`) to accept an incoming connection request.\n\n> #### Note {: .info }\n>\n> The default values for options specified to `listen` can be affected by the\n> Kernel configuration parameter `inet_default_listen_options`. For details, see\n> `m:inet`.","ref":"gen_tcp.html#listen/2"},{"type":"function","title":"gen_tcp.recv/2","doc":"","ref":"gen_tcp.html#recv/2"},{"type":"function","title":"gen_tcp.recv/3","doc":"Receive a packet, from a socket in _passive mode_.\n\nA closed socket is indicated by the return value `{error, closed}`.\nIf the socket is not in passive mode, the return value is `{error, einval}`.\n\nArgument `Length` is only meaningful when the socket is in `raw` mode and\ndenotes the number of bytes to read. If `Length` is `0`, all available\nbytes are returned. If `Length > 0`, exactly `Length` bytes are returned,\nor an error; except if the socket is closed from the other side,\nthen the last read before the one returning `{error, closed}`\nmay return less than `Length` bytes of data.\n\nThe optional `Timeout` parameter specifies a time-out in milliseconds.\nDefaults to `infinity`.\n\nAny process can receive data from a passive socket, even if that process is not\nthe controlling process of the socket. However, only one process can call this\nfunction on a socket at any given time. Using simultaneous calls to `recv` is\nnot recommended as the behavior depends on the socket implementation,\nand could return errors such as `{error, ealready}`.","ref":"gen_tcp.html#recv/3"},{"type":"function","title":"gen_tcp.send/2","doc":"Send a packet on a socket.\n\nThere is no `send/2` call with a time-out option; use socket option\n`send_timeout` if time-outs are desired. See section\n[Examples](#module-examples).\n\nThe return value `{error, {timeout, RestData}}` can only be returned when\n`inet_backend = socket`.\n\n[](){: #non_blocking_send }\n\n> #### Note {: .info }\n>\n> #### Non-blocking send.\n>\n> If the user tries to send more data than there is room for in the OS send\n> buffers, the 'rest data' is stored in (inet driver) internal buffers and later\n> sent in the background. The function immediately returns ok (_not_ informing\n> the caller that some date isn'nt sent yet). Any issue while\n> sending the 'rest data' may be returned later.\n>\n> When using `inet_backend = socket`, the behaviour is different. There is\n> _no_ buffering, instead the caller will \"hang\" until all of the data\n> has been sent or the send timeout (as specified by the `send_timeout`\n> option) expires (the function can \"hang\" even when using the `inet`\n> backend if the internal buffers are full).\n>\n> If this happens when using `packet =/= raw`, a partial package has been\n> written. A new package therefore _mustn't_ be written at this point,\n> as there is no way for the peer to distinguish this from data in\n> the current package. Instead, set package to raw, send the rest data\n> (as raw data) and then set package to the correct package type again.","ref":"gen_tcp.html#send/2"},{"type":"function","title":"gen_tcp.shutdown/2","doc":"Close the socket in one or both directions.\n\n`How == write` means closing the socket for writing, reading from it is still\npossible.\n\nIf `How == read` or there is no outgoing data buffered in the `Socket` port, the\nshutdown is performed immediately and any error encountered is returned in\n`Reason`.\n\nIf there is data buffered in the socket port, shutdown isn't performed\non the socket until that buffered data has been written to the OS\nprotocol stack. If any errors are encountered, the socket is closed\nand `{error, closed}` is returned by the next `recv/2` or `send/2` call.\n\nOption `{exit_on_close, false}` is useful if the peer performs a shurdown\nof its write side. Then the socket stays open for writing after\nreceive has indicated that the socket was closed.\n\n[](){: #async_shutdown_write }\n\n> #### Note {: .info }\n>\n> Async shutdown write (`How :: write | read_write`).\n>\n> If the shutdown attempt is made while the inet driver is sending\n> buffered data in the background, the shutdown is postponed until\n> all buffered data has been sent. This function immediately returns `ok`,\n> and the caller _isn't_ informed (that the shutdown has been postponed).\n>\n> When using `inet_backend = socket`, the behaviour is different. A shutdown\n> with `How :: write | read_write` will always be performed _immediately_.","ref":"gen_tcp.html#shutdown/2"},{"type":"type","title":"gen_tcp.connect_option/0","doc":"","ref":"gen_tcp.html#t:connect_option/0"},{"type":"type","title":"gen_tcp.listen_option/0","doc":"","ref":"gen_tcp.html#t:listen_option/0"},{"type":"type","title":"gen_tcp.option/0","doc":"","ref":"gen_tcp.html#t:option/0"},{"type":"type","title":"gen_tcp.option_name/0","doc":"","ref":"gen_tcp.html#t:option_name/0"},{"type":"type","title":"gen_tcp.pktoptions_value/0","doc":"Value from socket option [`pktoptions`](`t:option_name/0`).\n\nIf the platform implements the IPv4 option `IP_PKTOPTIONS`,\nor the IPv6 option `IPV6_PKTOPTIONS` or `IPV6_2292PKTOPTIONS` for the socket;\nthis value is returned from `inet:getopts/2` when called with the option name\n[`pktoptions`](`t:option_name/0`).\n\n> #### Note {: .info }\n>\n> This option appears to be VERY Linux specific, and its existence in future\n> Linux kernel versions is also worrying since the option is part of RFC 2292\n> which is since long (2003) obsoleted by RFC 3542 that _explicitly_ removes\n> this possibility to get packet information from a stream socket. For\n> comparison: it has existed in FreeBSD but is now removed, at least since\n> FreeBSD 10.","ref":"gen_tcp.html#t:pktoptions_value/0"},{"type":"type","title":"gen_tcp.socket/0","doc":"As returned by [`accept/1,2`](`accept/1`) and [`connect/3,4`](`connect/3`).","ref":"gen_tcp.html#t:socket/0"},{"type":"module","title":"gen_udp","doc":"Interface to UDP sockets.\n\nThis module provides functions for communicating over UDP\nprotocol sockets.\n\n> #### Note {: .info }\n>\n> Functions that create sockets can take an optional option;\n> `{inet_backend, Backend}` that, if specified, has to be the first option. This\n> selects the implementation backend towards the platform's socket API.\n>\n> This is a _temporary_ option that will be ignored in a future release.\n>\n> The default is `Backend = inet` that selects the traditional `inet_drv.c`\n> driver. The other choice is `Backend = socket` that selects the new `m:socket`\n> module and its NIF implementation.\n>\n> The system default can be changed when the node is started with the\n> application `kernel`'s configuration variable `inet_backend`.\n>\n> For `gen_udp` with `inet_backend = socket` we have tried to be as \"compatible\"\n> as possible which has sometimes been impossible. Here is a list of cases when\n> the behaviour of inet-backend `inet` (default) and `socket` are different:\n>\n> - The option [read_packets](`m:inet#option-read_packets`) is currently\n> _ignored_.\n> - Windows require sockets (domain = `inet | inet6`) to be bound.\n>\n> _Currently_ all sockets created on Windows with `inet_backend = socket` will\n> be bound. If the user does not provide an address, gen_udp will try to\n> 'figure out' an address itself.","ref":"gen_udp.html"},{"type":"function","title":"gen_udp.close/1","doc":"Closes a UDP socket.","ref":"gen_udp.html#close/1"},{"type":"function","title":"gen_udp.connect/2","doc":"Connect a UDP socket.\n\nConnecting a UDP socket only means storing the specified (destination) socket\naddress, as specified by `SockAddr`, so that the system knows where to send\ndata.\n\nWhen the socket is \"connected\" it is not necessary to specify\nthe destination address when sending a datagram.\nThat is; `send/2` may be used.\n\nIt also means that the socket will only receive data from\nthe connected address. Other messages are discarded on arrival\nby the OS protocol stack.","ref":"gen_udp.html#connect/2"},{"type":"function","title":"gen_udp.connect/3","doc":"Connect a UDP socket.\n\nSee `connect/2`.\n\nWith this function the destination is specified\nwith separate `Address` and `Port` arguments where `Address` may be\nan [IP address](`t:inet:socket_address/0`)\nor a [host name](`t:inet:hostname/0`).","ref":"gen_udp.html#connect/3"},{"type":"function","title":"gen_udp.controlling_process/2","doc":"Change the controlling process (owner) of a socket.\n\nAssigns a new controlling process `Pid` to `Socket`. The controlling process\nis the process that the socket sends messages to. If this function\nis called from any other process than the current controlling process,\n`{error, not_owner}` is returned.\n\nIf the process identified by `Pid` is not an existing local `t:pid/0`,\n`{error, badarg}` is returned. `{error, badarg}` may also be returned\nin some cases when `Socket` is closed during the execution of this function.\n\nIf the socket is in _active mode_, this function will transfer any messages\nfrom the socket in the mailbox of the caller to the new controlling process.\n\nIf any other process is interacting with the socket during the transfer,\nit may not work correctly and messages may remain in the caller's mailbox.\nFor instance, changing the sockets active mode during the transfer\ncould cause this.","ref":"gen_udp.html#controlling_process/2"},{"type":"function","title":"gen_udp.open/1","doc":"","ref":"gen_udp.html#open/1"},{"type":"function","title":"gen_udp.open/2","doc":"Open a UDP socket.\n\nThe created socket is bound to the UDP port number `Port`.\nIf `Port == 0`, the underlying OS assigns a free (ephemeral) UDP port;\nuse `inet:port/1` to retrieve it.\n\nThe process that calls this function becomes the `Socket`'s\ncontrolling process (socket owner).","ref":"gen_udp.html#open/2"},{"type":"function","title":"UDP socket options - gen_udp.open/2","doc":"- **`list`** - Received `Packet` is delivered as a list.\n\n- **`binary`** - Received `Packet` is delivered as a binary.\n\n- **`{ip, Address}`** - If the local host has many IP addresses,\n this option specifies which one to use.\n\n- **`{ifaddr, Address}`** - Same as `{ip, Address}`.\n\n However, if this instead is a `t:socket:sockaddr_in/0` or\n `t:socket:sockaddr_in6/0` this takes precedence over any value\n previously set with the `ip` options. If the `ip` option comes\n _after_ the `ifaddr` option, it may be used to _update_ its corresponding\n field of the `ifaddr` option (the `addr` field).\n\n- **`{fd, integer() >= 0}`** - If a socket has somehow been opened without\n using `gen_udp`, use this option to pass the file descriptor for it.\n If `Port` is not set to `0` and/or `{ip, ip_address()}` is combined\n with this option, the `fd` is bound to the specified interface\n and port after it is being opened. If these options are not specified,\n it is assumed that the `fd` is already bound appropriately.\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`inet`** - Sets up the socket for IPv4.\n\n- **`local`** - Sets up a Unix Domain Socket. See `t:inet:local_address/0`\n\n- **`{udp_module, module()}`** - Overrides which callback module is used.\n Defaults to `inet_udp` for IPv4 and `inet6_udp` for IPv6.\n\n- **`{multicast_if, Address}`** - Sets the local device for a multicast socket.\n\n- **`{multicast_loop, true | false}`** - When `true`, sent multicast packets\n are looped back to the local sockets.\n\n- **`{multicast_ttl, Integer}`** - Option `multicast_ttl` changes the\n time-to-live (TTL) for outgoing multicast datagrams to control the scope of\n the multicasts.\n\n Datagrams with a TTL of 1 are not forwarded beyond the local network.\n Defaults to `1`.\n\n- **`{add_membership, {MultiAddress, InterfaceAddress}}`** -\n Joins a multicast group.\n\n- **`{drop_membership, {MultiAddress, InterfaceAddress}}`** -\n Leaves a multicast group.\n\n- **`t:option/0`** - See `inet:setopts/2`.\n\nUDP packets are sent with this socket using [`send(Socket, ...)`](`send/3`).\nWhen UDP packets arrive to the `Socket`'s UDP port, and the socket is in\nan _active mode_, the packets are delivered as messages to the\ncontrolling process (socket owner):\n\n```erlang\n{udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data\n{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data\n```\n\n`PeerIP` and `PeerPort` are the address from which `Packet` was sent.\n`Packet` is a list of bytes (`[`[`byte/0`](`t:byte/0`)`]` if option `list`\nis active and a `t:binary/0` if option `binary`is active\n(they are mutually exclusive).\n\nThe message contains an `AncData` field only if any of the socket\n[options](`t:option/0`) [`recvtos`](`m:inet#option-recvtos`),\n[`recvtclass`](`m:inet#option-recvtclass`) or\n[`recvttl`](`m:inet#option-recvttl`) are active.\n\nWhen a socket in `{active, N}` mode (see `inet:setopts/2` for details),\ntransitions to passive (`{active, false}`) mode (`N` counts down to `0`),\nthe controlling process is notified by a message on this form:\n\n```erlang\n{udp_passive, Socket}\n```\n\nIf the OS protocol stack reports an error for the socket, the following\nmessage is sent to the controlling process:\n\n```erlang\n{udp_error, Socket, Reason}\n```\n`Reason` is mostly a [POSIX Error Code](`m:inet#posix-error-codes`).\n\nIf the socket is in _passive mode_ (not in an _active mode_), received data\ncan be retrieved with the`recv/2,3`](`recv/2`) calls. Note that incoming\nUDP packets that are longer than the receive buffer option specifies\ncan be truncated without warning.\n\nThe default value for the receive buffer option is `{recbuf, 8192}`.","ref":"gen_udp.html#open/2-udp-socket-options"},{"type":"function","title":"gen_udp.recv/2","doc":"","ref":"gen_udp.html#recv/2"},{"type":"function","title":"gen_udp.recv/3","doc":"Receive a packet from a socket in _passive mode_.\n\n`Timeout` specifies a time-out in milliseconds.\n\nIf any of the socket [options](`t:option/0`)\n[`recvtos`](`m:inet#option-recvtos`),\n[`recvtclass`](`m:inet#option-recvtclass`)\nor [`recvttl`](`m:inet#option-recvttl`) are active,\nthe `RecvData` tuple contains an `AncData` field,\notherwise it doesn't.","ref":"gen_udp.html#recv/3"},{"type":"function","title":"gen_udp.send/2","doc":"Send a packet on a connected UDP socket.\n\nTo connect a UDP socket, use `connect/2` or `connect/3`.","ref":"gen_udp.html#send/2"},{"type":"function","title":"gen_udp.send/3","doc":"Equivalent to [`send(Socket, Destination, [], Packet)`](#send-4-AncData).","ref":"gen_udp.html#send/3"},{"type":"function","title":"gen_udp.send/4","doc":"Send a UDP packet to the specified destination.","ref":"gen_udp.html#send/4"},{"type":"function","title":"With arguments `Host` and `Port` - gen_udp.send/4","doc":"Argument `Host` can be a hostname or a socket address, and `Port`\ncan be a port number or a service name atom. These are resolved to\na `Destination` and then this function is equivalent to\n[`send(Socket, Destination, [], Packet)`](#send-4-AncData)\njust below.\n\n### [](){: #send-4-AncData } With arguments `Destination` and `AncData` _(since OTP 22.1)_\n\nSends a packet to the specified `Destination` with ancillary data `AncData`.\n\n> #### Note {: .info }\n>\n> The ancillary data `AncData` contains options that for this single message\n> override the default options for the socket, an operation that may not be\n> supported on all platforms, and if so return `{error, einval}`. Using more\n> than one of an ancillary data item type may also not be supported.\n> `AncData =:= []` is always supported.","ref":"gen_udp.html#send/4-with-arguments-host-and-port"},{"type":"function","title":"With arguments `Destination` and `PortZero` _(since OTP 22.1)_ - gen_udp.send/4","doc":"Sends a packet to the specified `Destination`. Since `Destination`\nis a complete address, `PortZero` is redundant and has to be `0`.\n\nThis is a legacy clause mostly for `Destination = {local, Binary}`\nwhere `PortZero` is superfluous. Equivalent to\n[`send(Socket, Destination, [], Packet)`](#send-4-AncData), right above here.","ref":"gen_udp.html#send/4-with-arguments-destination-and-portzero-_-since-otp-22-1-_"},{"type":"function","title":"gen_udp.send/5","doc":"Send a packet to the specified destination, with ancillary data.\n\nEquvalent to [`send(Socket, Host, Port, Packet)`](`send/4`)\nregarding `Host` and `Port` and also equivalent to\n[`send(Socket, Destination, AncData, Packet)`](#send-4-AncData)\nregarding the ancillary data: `AncData`.","ref":"gen_udp.html#send/5"},{"type":"type","title":"gen_udp.ip6_membership/0","doc":"","ref":"gen_udp.html#t:ip6_membership/0"},{"type":"type","title":"gen_udp.ip6_multicast_if/0","doc":"IPv6 this multicast interface index (an integer).","ref":"gen_udp.html#t:ip6_multicast_if/0"},{"type":"type","title":"gen_udp.ip_membership/0","doc":"IP multicast membership.\n\nThe 3-tuple form _isn't_ supported on all platforms.\n'ifindex' defaults to zero (0) on platforms that supports the 3-tuple variant.","ref":"gen_udp.html#t:ip_membership/0"},{"type":"type","title":"gen_udp.ip_multicast_if/0","doc":"","ref":"gen_udp.html#t:ip_multicast_if/0"},{"type":"type","title":"gen_udp.membership/0","doc":"","ref":"gen_udp.html#t:membership/0"},{"type":"type","title":"gen_udp.multicast_if/0","doc":"","ref":"gen_udp.html#t:multicast_if/0"},{"type":"type","title":"gen_udp.open_option/0","doc":"","ref":"gen_udp.html#t:open_option/0"},{"type":"type","title":"gen_udp.option/0","doc":"","ref":"gen_udp.html#t:option/0"},{"type":"type","title":"gen_udp.option_name/0","doc":"","ref":"gen_udp.html#t:option_name/0"},{"type":"type","title":"gen_udp.socket/0","doc":"A socket as returned by [`open/1,2`](`open/1`).","ref":"gen_udp.html#t:socket/0"},{"type":"module","title":"inet","doc":"Access to Network protocols.\n\nThis module, together with `m:gen_tcp`, `m:gen_udp` and `m:gen_sctp`\nprovides access to the Network protocols TCP, SCTP and UDP over IP,\nas well as stream and datagram protocols over the local (unix)\naddress domain / protocol domain.\n\nSee also [ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`)\nor more information about how to configure an Erlang runtime system\nfor IP communication.\n\nThe following two Kernel configuration parameters affect the behavior of all\n`m:gen_tcp` sockets opened on an Erlang node:\n\n- `inet_default_connect_options` can contain a list of\n default options used for all sockets created by\n a `gen_tcp:connect/2,3,4`](`gen_tcp:connect/2`) call.\n- `inet_default_listen_options` can contain a list of default options\n used for sockets created by a `gen_tcp:listen/2` call.\n\nFor the [`gen_tcp:accept/1,2`](`gen_tcp:accept/1`) call,\nthe values of the listening socket options are inherited.\nTherefore there is no corresponding application variable for `accept`.\n\nUsing the Kernel configuration parameters above, one can set default options\nfor all TCP sockets on a node, but use this with care. Options such as\n`{delay_send,true}` can be specified in this way. The following is an example\nof starting an Erlang node with all sockets using delayed send:\n\n```text\n$ erl -sname test -kernel \\\ninet_default_connect_options '[{delay_send,true}]' \\\ninet_default_listen_options '[{delay_send,true}]'\n```\n\n**Please note** that the default option `{active, true}` cannot be changed,\nfor internal implementation reasons.\n\nAddresses as inputs to functions can be either a string or a tuple.\nFor example, the IP address 150.236.20.73 can be passed to\n`gethostbyaddr/1`, either as a string `\"150.236.20.73\"`\nor as a tuple `{150, 236, 20, 73}`.\n\n_IPv4 address examples:_\n\n```text\nAddress ip_address()\n------- ------------\n127.0.0.1 {127,0,0,1}\n192.168.42.2 {192,168,42,2}\n```\n\n_IPv6 address examples:_\n\n```erlang\nAddress ip_address()\n------- ------------\n::1 {0,0,0,0,0,0,0,1}\n::192.168.42.2 {0,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}\n::FFFF:192.168.42.2\n {0,0,0,0,0,16#FFFF,(192 bsl 8) bor 168,(42 bsl 8) bor 2}\n3ffe:b80:1f8d:2:204:acff:fe17:bf38\n {16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}\nfe80::204:acff:fe17:bf38\n {16#fe80,0,0,0,16#204,16#acff,16#fe17,16#bf38}\n```\n\nFunction `parse_address/1` can be useful:\n\n```erlang\n1> inet:parse_address(\"192.168.42.2\").\n{ok,{192,168,42,2}}\n2> inet:parse_address(\"::FFFF:192.168.42.2\").\n{ok,{0,0,0,0,0,65535,49320,10754}}\n```\n\n[](){: #posix-error-codes } POSIX Error Codes\n---------------------------------------------\n\n- `e2big` - Too long argument list\n- `eacces` - Permission denied\n- `eaddrinuse` - Address already in use\n- `eaddrnotavail` - Cannot assign requested address\n- `eadv` - Advertise error\n- `eafnosupport` - Address family not supported by protocol family\n- `eagain` - Resource temporarily unavailable\n- `ealign` - EALIGN\n- `ealready` - Operation already in progress\n- `ebade` - Bad exchange descriptor\n- `ebadf` - Bad file number\n- `ebadfd` - File descriptor in bad state\n- `ebadmsg` - Not a data message\n- `ebadr` - Bad request descriptor\n- `ebadrpc` - Bad RPC structure\n- `ebadrqc` - Bad request code\n- `ebadslt` - Invalid slot\n- `ebfont` - Bad font file format\n- `ebusy` - File busy\n- `echild` - No children\n- `echrng` - Channel number out of range\n- `ecomm` - Communication error on send\n- `econnaborted` - Software caused connection abort\n- `econnrefused` - Connection refused\n- `econnreset` - Connection reset by peer\n- `edeadlk` - Resource deadlock avoided\n- `edeadlock` - Resource deadlock avoided\n- `edestaddrreq` - Destination address required\n- `edirty` - Mounting a dirty fs without force\n- `edom` - Math argument out of range\n- `edotdot` - Cross mount point\n- `edquot` - Disk quota exceeded\n- `eduppkg` - Duplicate package name\n- `eexist` - File already exists\n- `efault` - Bad address in system call argument\n- `efbig` - File too large\n- `ehostdown` - Host is down\n- `ehostunreach` - Host is unreachable\n- `eidrm` - Identifier removed\n- `einit` - Initialization error\n- `einprogress` - Operation now in progress\n- `eintr` - Interrupted system call\n- `einval` - Invalid argument\n- `eio` - I/O error\n- `eisconn` - Socket is already connected\n- `eisdir` - Illegal operation on a directory\n- `eisnam` - Is a named file\n- `el2hlt` - Level 2 halted\n- `el2nsync` - Level 2 not synchronized\n- `el3hlt` - Level 3 halted\n- `el3rst` - Level 3 reset\n- `elbin` - ELBIN\n- `elibacc` - Cannot access a needed shared library\n- `elibbad` - Accessing a corrupted shared library\n- `elibexec` - Cannot exec a shared library directly\n- `elibmax` - Attempting to link in more shared libraries than system limit\n- `elibscn` - `.lib` section in `a.out` corrupted\n- `elnrng` - Link number out of range\n- `eloop` - Too many levels of symbolic links\n- `emfile` - Too many open files\n- `emlink` - Too many links\n- `emsgsize` - Message too long\n- `emultihop` - Multihop attempted\n- `enametoolong` - Filename too long\n- `enavail` - Unavailable\n- `enet` - ENET\n- `enetdown` - Network is down\n- `enetreset` - Network dropped connection on reset\n- `enetunreach` - Network is unreachable\n- `enfile` - File table overflow\n- `enoano` - Anode table overflow\n- `enobufs` - No buffer space available\n- `enocsi` - No CSI structure available\n- `enodata` - No data available\n- `enodev` - No such device\n- `enoent` - No such file or directory\n- `enoexec` - Exec format error\n- `enolck` - No locks available\n- `enolink` - Link has been severed\n- `enomem` - Not enough memory\n- `enomsg` - No message of desired type\n- `enonet` - Machine is not on the network\n- `enopkg` - Package not installed\n- `enoprotoopt` - Bad protocol option\n- `enospc` - No space left on device\n- `enosr` - Out of stream resources or not a stream device\n- `enosym` - Unresolved symbol name\n- `enosys` - Function not implemented\n- `enotblk` - Block device required\n- `enotconn` - Socket is not connected\n- `enotdir` - Not a directory\n- `enotempty` - Directory not empty\n- `enotnam` - Not a named file\n- `enotsock` - Socket operation on non-socket\n- `enotsup` - Operation not supported\n- `enotty` - Inappropriate device for `ioctl`\n- `enotuniq` - Name not unique on network\n- `enxio` - No such device or address\n- `eopnotsupp` - Operation not supported on socket\n- `eperm` - Not owner\n- `epfnosupport` - Protocol family not supported\n- `epipe` - Broken pipe\n- `eproclim` - Too many processes\n- `eprocunavail` - Bad procedure for program\n- `eprogmismatch` - Wrong program version\n- `eprogunavail` - RPC program unavailable\n- `eproto` - Protocol error\n- `eprotonosupport` - Protocol not supported\n- `eprototype` - Wrong protocol type for socket\n- `erange` - Math result unrepresentable\n- `erefused` - EREFUSED\n- `eremchg` - Remote address changed\n- `eremdev` - Remote device\n- `eremote` - Pathname hit remote filesystem\n- `eremoteio` - Remote I/O error\n- `eremoterelease` - EREMOTERELEASE\n- `erofs` - Read-only filesystem\n- `erpcmismatch` - Wrong RPC version\n- `erremote` - Object is remote\n- `eshutdown` - Cannot send after socket shutdown\n- `esocktnosupport` - Socket type not supported\n- `espipe` - Invalid seek\n- `esrch` - No such process\n- `esrmnt` - Srmount error\n- `estale` - Stale remote file handle\n- `esuccess` - Error 0\n- `etime` - Timer expired\n- `etimedout` - Connection timed out\n- `etoomanyrefs` - Too many references\n- `etxtbsy` - Text file or pseudo-device busy\n- `euclean` - Structure needs cleaning\n- `eunatch` - Protocol driver not attached\n- `eusers` - Too many users\n- `eversion` - Version mismatch\n- `ewouldblock` - Operation would block\n- `exdev` - Cross-device link\n- `exfull` - Message tables full\n- `nxdomain` - Hostname or domain name cannot be found","ref":"inet.html"},{"type":"function","title":"inet.cancel_monitor/1","doc":"Cancel a socket monitor.\n\nIf `MRef` is a reference that the calling process obtained by calling\n`monitor/1`, this monitor is removed. If the monitoring is already removed,\nnothing happens.\n\nThe returned value is one of the following:\n\n- **`true`** - The monitor was found and removed. In this case, no `'DOWN'`\n message corresponding to this monitor has been delivered and will not be\n delivered.\n\n- **`false`** - The monitor was not found and couldn't be removed.\n Probably because the monitor has already triggered and there is\n a corresponding `'DOWN'` message in the caller message queue.","ref":"inet.html#cancel_monitor/1"},{"type":"function","title":"inet.close/1","doc":"Close a socket of any type.","ref":"inet.html#close/1"},{"type":"function","title":"inet.format_error/1","doc":"Format an error code into a `t:string/0`.\n\nReturns a diagnostic error string. For possible POSIX values\nand corresponding strings, see section\n[POSIX Error Codes](#posix-error-codes).","ref":"inet.html#format_error/1"},{"type":"function","title":"inet.get_rc/0","doc":"Get the `inet` configuration.\n\nReturns the state of the `inet` configuration database in form of\na list of recorded configuration parameters. For more information, see\n[ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`).\n\nOnly actual parameters with other than default values are returned,\nfor example not directives that specify other sources for configuration\nparameters nor directives that clear parameters.","ref":"inet.html#get_rc/0"},{"type":"function","title":"inet.getaddr/2","doc":"Resolve a host to an address, in a specific addresss family.\n\nReturns the [IP address](`t:ip_address/0`) for `Host` as a tuple of integers.\n`Host` can be an [IP address](`t:ip_address/0`), a single `t:hostname/0`,\nor a fully qualified `t:hostname/0`.","ref":"inet.html#getaddr/2"},{"type":"function","title":"inet.getaddrs/2","doc":"Resolve a host to a list of addresses, in a specific address family.\n\nReturns a list of all IP addresses for `Host`.\n`Host` can be an [IP address](`t:ip_address/0`),\na single `t:hostname/0`, or a fully qualified `t:hostname/0`.","ref":"inet.html#getaddrs/2"},{"type":"function","title":"inet.gethostbyaddr/1","doc":"Resolve (reverse) an address to a [`#hostent{}`](`t:hostent/0`) record.\n\nReturns a [`#hostent{}`](`t:hostent/0`) record for the host\nwith the specified address.","ref":"inet.html#gethostbyaddr/1"},{"type":"function","title":"inet.gethostbyname/1","doc":"Resolve a hostname to a [`#hostent{}`](`t:hostent/0`) record.\n\nReturns a [`#hostent{}`](`t:hostent/0`) record for the host\nwith the specified `Hostname`.\n\nThis function uses the resolver, which is often the native (OS) resolver.\n\nIf resolver option `inet6` is `true`, an IPv6 address is looked up.\n\nSee [ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`) for\ninformation about the resolver configuration.\n\nA quirk of many resolvers is that an integer string is interpreted\nas an IP address. For instance, the integer string \"3232235521\"\nand the string \"192.168.0.1\" are both translated\nto the IP address `{192,168,0,1}`.","ref":"inet.html#gethostbyname/1"},{"type":"function","title":"inet.gethostbyname/2","doc":"Resolve a hostname to a [`#hostent{}`](`t:hostent/0`) record,\nin a specific address family.\n\nReturns a [`#hostent{}`](`t:hostent/0`) record for the host\nwith the specified `Hostname`, restricted to the specified address `Family`.\n\nSee also `gethostbyname/1`.","ref":"inet.html#gethostbyname/2"},{"type":"function","title":"inet.gethostname/0","doc":"Get the local hostname.\n\nReturns the local hostname. Never fails.","ref":"inet.html#gethostname/0"},{"type":"function","title":"inet.getifaddrs/0","doc":"Get interface names and addresses.\n\nReturns a list of 2-tuples containing interface names and the interfaces'\naddresses. `Ifname` is a Unicode string and `Ifopts` is a list of interface\naddress description tuples.\n\nThe interface address description tuples are documented under\nthe type of the [`Ifopts`](`t:getifaddrs_ifopts/0`) value.","ref":"inet.html#getifaddrs/0"},{"type":"function","title":"inet.getifaddrs/1","doc":"Get interface names and addresses, in a specific namespace.\n\nEquivalent to `getifaddrs/0`, but accepts an `Option`\n`{netns, Namespace}` that, on platforms that support the feature (Linux),\nsets a network namespace for the OS call.\nAlso,\nIf the option 'inet_backend' is *first* in the options list,\nthe specified backend will be used (for 'inet', inet and\nfor 'socket' the equivalent net functions will be used).\n \n\nSee the socket option [`{netns, Namespace}`](#option-netns)\nunder `setopts/2`.","ref":"inet.html#getifaddrs/1"},{"type":"function","title":"inet.getopts/2","doc":"Get one or more options for a socket.\n\nGets all options in the list `Options` from `Socket`.\nSee `setopts/2` for a list of available options. See also\nthe descriptions of protocol specific types referenced by\n[`socket_optval()` ](`t:socket_optval/0`).\n\nThe number of elements in the returned `OptionValues` list does not necessarily\ncorrespond to the number of options asked for. If the operating system fails to\nsupport an option, it is left out in the returned list. An error tuple is\nreturned only when getting options for the socket is impossible (that is, the\nsocket is closed or the buffer size in a raw request is too large). This\nbehavior is kept for backward compatibility reasons.\n\nA raw option request `RawOptReq = {raw, Protocol, OptionNum, ValueSpec}` can be\nused to get information about socket options not (explicitly) supported by the\nemulator. The use of raw socket options makes the code non-portable, but allows\nthe Erlang programmer to take advantage of unusual features present on a\nparticular platform.\n\n`RawOptReq` consists of tag `raw` followed by the protocol level, the option\nnumber, and either a binary or the size, in bytes, of the buffer in which the\noption value is to be stored. A binary is to be used when the underlying\n`getsockopt` requires _input_ in the argument field. In this case, the binary\nsize shall correspond to the required buffer size of the return value. The\nsupplied values in a `RawOptReq` correspond to the second, third, and\nfourth/fifth parameters to the `getsockopt` call in the C socket API. The value\nstored in the buffer is returned as a binary `ValueBin`, where all values are\ncoded in native endianness.\n\nAsking for and inspecting raw socket options require low-level information about\nthe current operating system and TCP stack.\n\n_Example:_\n\nConsider a Linux machine where option `TCP_INFO` can be used to collect TCP\nstatistics for a socket. Assume you are interested in field `tcpi_sacked` of\n`struct tcp_info` filled in when asking for `TCP_INFO`. To be able to access\nthis information, you need to know the following:\n\n- The numeric value of protocol level `IPPROTO_TCP`\n- The numeric value of option `TCP_INFO`\n- The size of `struct tcp_info`\n- The size and offset of the specific field\n\nBy inspecting the headers or writing a small C program, it is found that\n`IPPROTO_TCP` is 6, `TCP_INFO` is 11, the structure size is 92 (bytes), the\noffset of `tcpi_sacked` is 28 bytes, and the value is a 32-bit integer. The\nfollowing code can be used to retrieve the value:\n\n```erlang\nget_tcpi_sacked(Sock) ->\n {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),\n <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info,\n TcpiSacked.\n```\n\nPreferably, you would check the machine type, the operating system, and the\nKernel version before executing anything similar to this code.","ref":"inet.html#getopts/2"},{"type":"function","title":"inet.getstat/1","doc":"","ref":"inet.html#getstat/1"},{"type":"function","title":"inet.getstat/2","doc":"Get one or more statistics options for a socket.\n\n[`getstat(Socket)`](`getstat/1`) is equivalent to\n[`getstat(Socket, [recv_avg, recv_cnt, recv_dvi, recv_max, recv_oct, send_avg, send_cnt, send_pend, send_max, send_oct])`](`getstat/2`).\n\nThe following options are available:\n\n- **`recv_avg`** - Average size of packets, in bytes, received by the socket.\n\n- **`recv_cnt`** - Number of packets received by the socket.\n\n- **`recv_dvi`** - Average packet size deviation, in bytes, received by the\n socket.\n\n- **`recv_max`** - Size of the largest packet, in bytes, received by the socket.\n\n- **`recv_oct`** - Number of bytes received by the socket.\n\n- **`send_avg`** - Average size of packets, in bytes, sent from the socket.\n\n- **`send_cnt`** - Number of packets sent from the socket.\n\n- **`send_pend`** - Number of bytes waiting to be sent by the socket.\n\n- **`send_max`** - Size of the largest packet, in bytes, sent from the socket.\n\n- **`send_oct`** - Number of bytes sent from the socket.","ref":"inet.html#getstat/2"},{"type":"function","title":"inet.i/0","doc":"Equivalent to `i/1` for the protocols `tcp`, `udp`, and `sctp`","ref":"inet.html#i/0"},{"type":"function","title":"inet.i/1","doc":"List network sockets.\n\nWith argument `Proto` equivalent to [`i(Proto, Options)`](`i/2`)\nwhere `Options` is a list of all `t:atom/0`s in `t:i_option/0`.\n\nWith argument `Options`, equivalent to [`i(Proto, Options)](`i/2`)\nfor `Proto`: `tcp`, `udp`, and `sctp`.\n\nWith argument `show_ports` **(since OTP 27.0)** equivalent to\n[`i(Proto, Options)](`i/2`) where `Option` is a list of all\noptions in `t:i_option/0` with `ShowPorts = true`.","ref":"inet.html#i/1"},{"type":"function","title":"inet.i/2","doc":"List network sockets.\n\nLists all TCP, UDP and SCTP sockets on the terminal, those created by\nthe Erlang runtime system as well as by the application.\n\nThe following options are available:\n\n- **`port`** - An internal index of the port.\n\n- **`module`** - The callback module of the socket.\n\n- **`recv`** - Number of bytes received by the socket.\n\n- **`sent`** - Number of bytes sent from the socket.\n\n- **`owner`** - The socket owner process.\n\n- **`local_address`** - The local address of the socket.\n\n- **`foreign_address`** - The address and port of the other end of the\n connection.\n\n- **`state`** - The connection state.\n\n- **`type`** - STREAM or DGRAM or SEQPACKET.\n\nThe `Options` argument may also be **(since OTP 27.0)**:\n\n- **`show_ports`** - Do *not* translate the port numbers\n (of 'local_address' and 'foreign_address') to service name(s).","ref":"inet.html#i/2"},{"type":"function","title":"inet.info/1","doc":"Get information about a socket.\n\nReturns a term containing miscellaneous information about a socket.","ref":"inet.html#info/1"},{"type":"function","title":"inet.ipv4_mapped_ipv6_address/1","doc":"Convert between an IPv4 address and an IPv4-mapped IPv6 address.\n\nConvert an IPv4 address to an IPv4-mapped IPv6 address or the reverse.\nWhen converting from an IPv6 address all but the 2 low words are ignored\nso this function also works on some other types of IPv6 addresses\nthan IPv4-mapped.","ref":"inet.html#ipv4_mapped_ipv6_address/1"},{"type":"function","title":"inet.is_ip_address/1","doc":"Test for an IP address.\n\nTests if the argument `IPAddress` is an `t:ip_address/0`\nand if so returns `true`, otherwise `false`.","ref":"inet.html#is_ip_address/1"},{"type":"function","title":"inet.is_ipv4_address/1","doc":"Test for an IPv4 address.\n\nTests if the argument `IPv4Address` is an `t:ip4_address/0`\nand if so returns `true`, otherwise `false`.","ref":"inet.html#is_ipv4_address/1"},{"type":"function","title":"inet.is_ipv6_address/1","doc":"Test for an IPv6 address.\n\nTests if the argument `IPv6Address` is an `t:ip6_address/0`\nand if so returns `true`, otherwise `false`.","ref":"inet.html#is_ipv6_address/1"},{"type":"function","title":"inet.monitor/1","doc":"Start a socket monitor.\n\nIf the `Socket` to monitor doesn't exist or when the monitor is triggered,\na `'DOWN'` message is sent that has the following pattern:\n\n```erlang\n\t {'DOWN', MonitorRef, Type, Object, Info}\n```\n\n- **`MonitorRef`** - The return value from this function.\n\n- **`Type`** - The type of socket, can be one of the following\n `t:atom/0`s: `port` or `socket`.\n\n- **`Object`** - The monitored entity, the socket, which triggered the event.\n\n- **`Info`** - Either the termination reason of the socket or `nosock`\n (the `Socket` did not exist when this function was called).\n\nMaking several calls to `inet:monitor/1` for the same `Socket`\nis not an error; one monitor is created per call.\n\nThe monitor is triggered when the socket is closed in any way such as\nan API call, remote end close, closed by signal when owner exits, ...","ref":"inet.html#monitor/1"},{"type":"function","title":"inet.ntoa/1","doc":"Parse an `t:ip_address/0` to an IPv4 or IPv6 address string.","ref":"inet.html#ntoa/1"},{"type":"function","title":"inet.parse_address/1","doc":"Parse an IP address string to an `t:ip_address/0`.\n\nReturns an `t:ip4_address/0` or an `t:ip6_address/0` depending\non which parsing that succeeds.\n\nAccepts a short form IPv4 address string like `parse_ipv4_address/1`.","ref":"inet.html#parse_address/1"},{"type":"function","title":"inet.parse_ipv4_address/1","doc":"Parse (relaxed) an IPv4 address string to an `t:ip4_address/0`.\n\nAccepts a short form IPv4 address string (less than 4 fields)\nsuch as `\"127.1\"` or `\"0x7f000001\"`.","ref":"inet.html#parse_ipv4_address/1"},{"type":"function","title":"inet.parse_ipv4strict_address/1","doc":"Parse an IPv4 address string to an `t:ip4_address/0`.\n\nRequires an IPv4 address string containing four fields,\nthat is; _not_ a short form address string.","ref":"inet.html#parse_ipv4strict_address/1"},{"type":"function","title":"inet.parse_ipv6_address/1","doc":"Parse (relaxed) an IPv6 address string to an `t:ip6_address/0`.\n\nAlso accepts a (relaxed) IPv4 address string like `parse_ipv4_address/1`\nand returns an IPv4-mapped IPv6 address.","ref":"inet.html#parse_ipv6_address/1"},{"type":"function","title":"inet.parse_ipv6strict_address/1","doc":"Parse an IPv6 address string to an `t:ip6_address/0`.\n\n_Doesn't_ accept an IPv4 address string. An IPv6 address string, though,\nallows an IPv4 tail like this: `\"::127.0.0.1\"`\n(which is the same as `\"::7f00:0001\"`).","ref":"inet.html#parse_ipv6strict_address/1"},{"type":"function","title":"inet.parse_strict_address/1","doc":"Parse an IP address string to an `t:ip_address/0`.\n\nLike `parse_address/1` but _doesn't_ accept a short form IPv4 address string.","ref":"inet.html#parse_strict_address/1"},{"type":"function","title":"inet.peername/1","doc":"Return the address of the socket's remote end.\n\nReturns the address and port for the other end of a connection.\n\nNotice that for SCTP sockets, this function returns only one of\nthe peer addresses of the socket. Function [`peernames/1,2`](`peernames/1`)\nreturns all.","ref":"inet.html#peername/1"},{"type":"function","title":"inet.peernames/1","doc":"Equivalent to [`peernames(Socket, 0)`](`peernames/2`).\n\nNotice that the behavior of this function for an SCTP one-to-many style socket\nis not defined by the\n[SCTP Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).","ref":"inet.html#peernames/1"},{"type":"function","title":"inet.peernames/2","doc":"Return the addresses of all remote ends of a socket.\n\nReturns a list of all address/port number pairs for the remote end of an\nassociation `Assoc` of a socket.\n\nThis function can return multiple addresses for multihomed sockets,\nsuch as SCTP sockets. For other sockets it returns a one-element list.\n\nNotice that parameter `Assoc` is by the\n[SCTP Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\ndefined to be ignored for one-to-one style sockets.\nWhat the special value `0` means, is unfortunately undefined,\nand hence the behavior for one-to-many style sockets.","ref":"inet.html#peernames/2"},{"type":"function","title":"inet.port/1","doc":"Return the local port number for a socket.","ref":"inet.html#port/1"},{"type":"function","title":"inet.setopts/2","doc":"Set one or more options for a socket.\n\nSets the list of `Options` on `Socket`.\n\nThe following options are available:\n\n- **`{active, true | false | once | N}`** [](){: #option-active } -\n If the value is `true`, which is the default, everything received\n from the socket is sent as messages to the receiving process.\n\n If the value is `false` (passive mode), the process must explicitly receive\n incoming data by calling [`gen_tcp:recv/2,3`](`gen_tcp:recv/2`),\n [`gen_udp:recv/2,3`](`gen_udp:recv/2`), or\n [`gen_sctp:recv/1,2`](`gen_sctp:recv/1`) (depending on the type of socket).\n\n If the value is `once` (`{active, once}`), _one_ data message from the socket\n is sent to the process. To receive one more message,\n [`setopts/2`](`setopts/2`) must be called again with option `{active, once}`.\n\n If the value is an integer `N` in the range -32768 to 32767 (inclusive), the\n value is added to the socket's count of data messages sent to the controlling\n process. A socket's default message count is `0`. If a negative value is\n specified, and its magnitude is equal to or greater than the socket's current\n message count, the socket's message count is set to `0`. Once the socket's\n message count reaches `0`, either because of sending received data messages to\n the process or by being explicitly set, the process is then notified by a\n special message, specific to the type of socket, that the socket has entered\n passive mode. Once the socket enters passive mode, to receive more messages\n [`setopts/2`](`setopts/2`) must be called again to set the socket back into an\n active mode.\n\n When using `{active, once}` or `{active, N}`, the socket changes behavior\n automatically when data is received. This can be confusing in combination with\n connection-oriented sockets (that is, `gen_tcp`), as a socket with\n `{active, false}` behavior reports closing differently than a socket with\n `{active, true}` behavior. To simplify programming, a socket where the peer\n closed, and this is detected while in `{active, false}` mode, still generates\n message `{tcp_closed, Socket}` when set to `{active, once}`, `{active, true}`,\n or `{active, N}` mode. It is therefore safe to assume that message\n `{tcp_closed, Socket}`, possibly followed by socket port termination (depending\n on option `exit_on_close`) eventually appears when a socket changes back and\n forth between `{active, true}` and `{active, false}` mode. However, _when_\n peer closing is detected it is all up to the underlying TCP/IP stack and\n protocol.\n\n Notice that `{active, true}` mode provides no flow control; a fast sender can\n easily overflow the receiver with incoming messages. The same is true for\n `{active, N}` mode, while the message count is greater than zero.\n\n Use active mode only if your high-level protocol provides its own flow control\n (for example, acknowledging received messages) or the amount of data exchanged\n is small. Using `{active, false}` mode, `{active, once}` mode, or\n `{active, N}` mode with values of `N` appropriate for the application to\n provide flow control, ensures the other side cannot send faster than the\n receiver can read.\n\n- **`{broadcast, Boolean}` (UDP sockets)** [](){: #option-broadcast } -\n Enables/disables permission to send broadcasts.\n\n- **`{buffer, Size}`** [](){: #option-buffer } -\n The size of the user-level buffer used by the driver. Not to be confused\n with options `sndbuf` and `recbuf`, which correspond to the\n Kernel socket buffers. For TCP it is recommended to have\n `val(buffer) >= val(recbuf)` to avoid performance issues because of\n unnecessary copying. For UDP the same recommendation applies, but the max\n should not be larger than the MTU of the network path. `val(buffer)` is\n automatically set to the above maximum when `recbuf` is set. However, as the\n size set for `recbuf` usually become larger, you are encouraged to use\n `getopts/2` to analyze the behavior of your operating system.\n\n Note that this is also the maximum amount of data that can be received from a\n single recv call. If you are using higher than normal MTU consider setting\n buffer higher.\n\n- **`{delay_send, Boolean}`** - Normally, when an Erlang process sends to a\n socket, the driver tries to send the data immediately. If that fails, the\n driver uses any means available to queue up the message to be sent whenever\n the operating system says it can handle it. Setting `{delay_send, true}` makes\n _all_ messages queue up. The messages sent to the network are then larger but\n fewer. The option affects the scheduling of send requests versus Erlang\n processes instead of changing any real property of the socket. The option is\n implementation-specific. Defaults to `false`.\n\n- **`{deliver, port | term}`** - When `{active, true}`, data is delivered on the\n form `port` : `{S, {data, [H1,..Hsz | Data]}}`\n or `term` : `{tcp, S, [H1..Hsz | Data]}`.\n\n- **`{dontroute, Boolean}`** - Enables/disables routing bypass for outgoing\n messages.\n\n- **`{exit_on_close, Boolean}`** - This option is set to `true` by default.\n\n The only reason to set it to `false` is if you want to continue sending data\n to the socket after a close is detected, for example, if the peer uses\n `gen_tcp:shutdown/2` to shut down the write side.\n\n- **`{exclusiveaddruse, Boolean}`** [](){: #option-exclusiveaddruse } -\n Enables/disables exclusive address/port usage on Windows. That is, by enabling\n this option you can prevent other sockets from binding to the same\n address/port. By default this option is disabled. That is, other sockets\n may use the same address/port by setting\n [`{reuseaddr, true}`](#option-reuseaddr) in combination with\n [`{reuseport, true}`](#option-reuseport) unless\n `{exclusiveaddruse, true}` has been set on `Socket`. On non-Windows systems\n this option is silently ignored.\n\n > #### Note {: .info }\n >\n > This option is _currently_ not supported for socket created with\n > `inet_backend = socket`\n\n- **`{header, Size}`** - This option is only meaningful if option `binary` was\n specified when the socket was created. If option `header` is specified, the\n first `Size` number bytes of data received from the socket are elements of a\n list, and the remaining data is a binary specified as the tail of the same\n list. For example, if `Size == 2`, the data received matches\n `[Byte1, Byte2 | Binary]`.\n\n- **`{high_msgq_watermark, Size}`** - The socket message queue is set to a busy\n state when the amount of data on the message queue reaches this limit. Notice\n that this limit only concerns data that has not yet reached the ERTS internal\n socket implementation. Defaults to 8 kB.\n\n Senders of data to the socket are suspended if either the socket message queue\n is busy or the socket itself is busy.\n\n For more information, see options `low_msgq_watermark`, `high_watermark`, and\n `low_watermark`.\n\n Notice that distribution sockets disable the use of `high_msgq_watermark` and\n `low_msgq_watermark`. Instead use the\n [distribution buffer busy limit](`m:erlang#system_info_dist_buf_busy_limit`),\n which is a similar feature.\n\n- **`{high_watermark, Size}` (TCP/IP sockets)** - The socket is set to a busy\n state when the amount of data queued internally by the ERTS socket\n implementation reaches this limit. Defaults to 8 kB.\n\n Senders of data to the socket are suspended if either the socket message queue\n is busy or the socket itself is busy.\n\n For more information, see options `low_watermark`, `high_msgq_watermark`, and\n `low_msqg_watermark`.\n\n- **`{ipv6_v6only, Boolean}`** - Restricts the socket to use only IPv6,\n prohibiting any IPv4 connections. This is only applicable for IPv6 sockets\n (option `inet6`).\n\n On most platforms this option must be set on the socket before associating it\n to an address. It is therefore only reasonable to specify it when creating the\n socket and not to use it when calling function (`setopts/2`) containing this\n description.\n\n The behavior of a socket with this option set to `true` is the only portable\n one. The original idea when IPv6 was new of using IPv6 for all traffic is now\n not recommended by FreeBSD (you can use `{ipv6_v6only,false}` to override the\n recommended system default value), forbidden by OpenBSD (the supported GENERIC\n kernel), and impossible on Windows (which has separate IPv4 and IPv6 protocol\n stacks). Most Linux distros still have a system default value of `false`. This\n policy shift among operating systems to separate IPv6 from IPv4 traffic has\n evolved, as it gradually proved hard and complicated to get a dual stack\n implementation correct and secure.\n\n On some platforms, the only allowed value for this option is `true`, for\n example, OpenBSD and Windows. Trying to set this option to `false`, when\n creating the socket, fails in this case.\n\n Setting this option on platforms where it does not exist is ignored. Getting\n this option with `getopts/2` returns no value, that is, the returned list does\n not contain an `{ipv6_v6only,_}` tuple. On Windows, the option does not exist,\n but it is emulated as a read-only option with value `true`.\n\n Therefore, setting this option to `true` when creating a socket never fails,\n except possibly on a platform where you have customized the kernel to only\n allow `false`, which can be doable (but awkward) on, for example, OpenBSD.\n\n If you read back the option value using `getopts/2` and get no value, the\n option does not exist in the host operating system. The behavior of both an\n IPv6 and an IPv4 socket listening on the same port, and for an IPv6 socket\n getting IPv4 traffic is then no longer predictable.\n\n- **`{keepalive, Boolean}` (TCP/IP sockets)** - Enables/disables periodic\n transmission on a connected socket when no other data is exchanged. If the\n other end does not respond, the connection is considered broken and an error\n message is sent to the controlling process. Defaults to `false`.\n\n- **`{linger, {true|false, Seconds}}`** [](){: #option-linger } -\n Determines the time-out, in seconds, for flushing unsent data\n in the [`close/1`](`close/1`) socket call.\n\n The first component is if linger is enabled, the second component is the\n flushing time-out, in seconds. There are 3 alternatives:\n\n - **`{false, _}`** - close/1 or shutdown/2 returns immediately, not waiting\n for data to be flushed, with closing happening in the background.\n\n - **`{true, 0}`** - Aborts the connection when it is closed. Discards any data\n still remaining in the send buffers and sends RST to the peer.\n\n This avoids TCP's TIME_WAIT state, but leaves open the possibility that\n another \"incarnation\" of this connection being created.\n\n - **`{true, Time} when Time > 0`** - close/1 or shutdown/2 will not return\n until all queued messages for the socket have been successfully sent or the\n linger timeout (Time) has been reached.\n\n- **`{low_msgq_watermark, Size}`** - If the socket message queue is in a busy\n state, the socket message queue is set in a not busy state when the amount of\n data queued in the message queue falls below this limit. Notice that this\n limit only concerns data that has not yet reached the ERTS internal socket\n implementation. Defaults to 4 kB.\n\n Senders that are suspended because of either a busy message queue or a busy\n socket are resumed when the socket message queue and the socket are not busy.\n\n For more information, see options `high_msgq_watermark`, `high_watermark`, and\n `low_watermark`.\n\n Notice that distribution sockets disable the use of `high_msgq_watermark` and\n `low_msgq_watermark`. Instead they use the\n [distribution buffer busy limit](`m:erlang#system_info_dist_buf_busy_limit`),\n which is a similar feature.\n\n- **`{low_watermark, Size}` (TCP/IP sockets)** - If the socket is in a busy\n state, the socket is set in a not busy state when the amount of data queued\n internally by the ERTS socket implementation falls below this limit. Defaults\n to 4 kB.\n\n Senders that are suspended because of a busy message queue or a busy socket\n are resumed when the socket message queue and the socket are not busy.\n\n For more information, see options `high_watermark`, `high_msgq_watermark`, and\n `low_msgq_watermark`.\n\n- **`{mode, Mode :: binary | list}`** - Received `Packet` is delivered as\n defined by `Mode`.\n\n- **`{netns, Namespace :: file:filename_all()}`{: #option-netns }** - Sets a\n network namespace for the socket. Parameter `Namespace` is a filename defining\n the namespace, for example, `\"/var/run/netns/example\"`, typically created by\n command `ip netns add example`. This option must be used in a function call\n that creates a socket, that is, [`gen_tcp:connect/3,4`](`gen_tcp:connect/3`),\n `gen_tcp:listen/2`, [`gen_udp:open/1,2`](`gen_udp:open/1`) or\n [`gen_sctp:open/0,1,2`](`gen_sctp:open/0`), and also `getifaddrs/1`.\n\n This option uses the Linux-specific syscall `setns()`, such as in Linux kernel\n 3.0 or later, and therefore only exists when the runtime system is compiled\n for such an operating system.\n\n The virtual machine also needs elevated privileges, either running as\n superuser or (for Linux) having capability `CAP_SYS_ADMIN` according to the\n documentation for `setns(2)`. However, during testing also `CAP_SYS_PTRACE`\n and `CAP_DAC_READ_SEARCH` have proven to be necessary.\n\n _Example:_\n\n ```text\n setcap cap_sys_admin,cap_sys_ptrace,cap_dac_read_search+epi beam.smp\n ```\n\n Notice that the filesystem containing the virtual machine executable\n (`beam.smp` in the example) must be local, mounted without flag `nosetuid`,\n support extended attributes, and the kernel must support file capabilities.\n All this runs out of the box on at least Ubuntu 12.04 LTS, except that SCTP\n sockets appear to not support network namespaces.\n\n `Namespace` is a filename and is encoded and decoded as discussed in module\n `m:file`, with the following exceptions:\n\n - Emulator flag `+fnu` is ignored.\n - `getopts/2` for this option returns a binary for the filename if the stored\n filename cannot be decoded. This is only to occur if you set the option\n using a binary that cannot be decoded with the emulator's filename encoding:\n `file:native_name_encoding/0`.\n\n- **`{bind_to_device, Ifname :: binary()}`** - Binds a socket to a specific\n network interface. This option must be used in a function call that creates a\n socket, that is, [`gen_tcp:connect/3,4`](`gen_tcp:connect/3`),\n `gen_tcp:listen/2`, [`gen_udp:open/1,2`](`gen_udp:open/1`), or\n [`gen_sctp:open/0,1,2`](`gen_sctp:open/0`).\n\n Unlike `getifaddrs/0`, Ifname is encoded a binary. In the unlikely case that a\n system is using non-7-bit-ASCII characters in network device names, special\n care has to be taken when encoding this argument.\n\n This option uses the Linux-specific socket option `SO_BINDTODEVICE`, such as\n in Linux kernel 2.0.30 or later, and therefore only exists when the runtime\n system is compiled for such an operating system.\n\n Before Linux 3.8, this socket option could be set, but could not retrieved\n with `getopts/2`. Since Linux 3.8, it is readable.\n\n The virtual machine also needs elevated privileges, either running as\n superuser or (for Linux) having capability `CAP_NET_RAW`.\n\n The primary use case for this option is to bind sockets into\n [Linux VRF instances](http://www.kernel.org/doc/Documentation/networking/vrf.txt).\n\n- **`list`** - Received `Packet` is delivered as a list.\n\n- **`binary`** - Received `Packet` is delivered as a binary.\n\n- **`{nodelay, Boolean}` (TCP/IP sockets)** [](){: #option-nodelay } -\n If `Boolean == true`, option `TCP_NODELAY` is turned on for the socket,\n which means that also small amounts of data are sent immediately.\n\n This option is _not_ supported for `domain = local`, but if\n `inet_backend =/= socket` this error will be _ignored_.\n\n- **`{nopush, Boolean}` (TCP/IP sockets)** - This translates to `TCP_NOPUSH` on\n BSD and to `TCP_CORK` on Linux.\n\n If `Boolean == true`, the corresponding option is turned on for the socket,\n which means that small amounts of data are accumulated until a full MSS-worth\n of data is available or this option is turned off.\n\n Note that while `TCP_NOPUSH` socket option is available on OSX, its semantics\n is very different (e.g., unsetting it does not cause immediate send of\n accumulated data). Hence, `nopush` option is intentionally ignored on OSX.\n\n- **`{packet, PacketType}` (TCP/IP sockets)** [](){: #option-packet } -\n Defines the type of packets to use for a socket. Possible values:\n\n - **`raw | 0`** - No packaging is done.\n\n - **`1 | 2 | 4`** - Packets consist of a header specifying the number of bytes\n in the packet, followed by that number of bytes. The header length can be\n one, two, or four bytes, and containing an unsigned integer in big-endian\n byte order. Each send operation generates the header, and the header is\n stripped off on each receive operation.\n\n The 4-byte header is limited to 2Gb.\n\n - **`asn1 | cdr | sunrm | fcgi | tpkt | line`** - These packet types only have\n effect on receiving. When sending a packet, it is the responsibility of the\n application to supply a correct header. On receiving, however, one message\n is sent to the controlling process for each complete packet received, and,\n similarly, each call to `gen_tcp:recv/2,3` returns one complete packet. The\n header is _not_ stripped off.\n\n The meanings of the packet types are as follows:\n\n - `asn1` - ASN.1 BER\n - `sunrm` - Sun's RPC encoding\n - `cdr` - CORBA (GIOP 1.1)\n - `fcgi` - Fast CGI\n - `tpkt` - TPKT format \\[RFC1006]\n - `line` - Line mode, a packet is a line-terminated with newline, lines\n longer than the receive buffer are truncated\n\n - **`http | http_bin`** - The Hypertext Transfer Protocol. The packets are\n returned with the format according to `HttpPacket` described in\n `erlang:decode_packet/3` in ERTS. A socket in passive mode returns\n `{ok, HttpPacket}` from `gen_tcp:recv` while an active socket sends messages\n like `{http, Socket, HttpPacket}`.\n\n - **`httph | httph_bin`** - These two types are often not needed, as the\n socket automatically switches from `http`/`http_bin` to `httph`/`httph_bin`\n internally after the first line is read. However, there can be occasions\n when they are useful, such as parsing trailers from chunked encoding.\n\n- **`{packet_size, Integer}`(TCP/IP sockets)** - Sets the maximum allowed length\n of the packet body. If the packet header indicates that the length of the\n packet is longer than the maximum allowed length, the packet is considered\n invalid. The same occurs if the packet header is too large for the socket\n receive buffer.\n\n For line-oriented protocols (`line`, `http*`), option `packet_size` also\n guarantees that lines up to the indicated length are accepted and not\n considered invalid because of internal buffer limitations.\n\n- **`{line_delimiter, Char}` (TCP/IP sockets)**\n [](){: #option-line_delimiter } -\n Sets the line delimiting character for line-oriented protocols (`line`).\n Defaults to `$\\n`.\n\n- **`{raw, Protocol, OptionNum, ValueBin}`** - See below.\n\n- **`{read_ahead, Boolean}`** [](){: #option-read_ahead } -\n If set to `false` avoids reading ahead from the OS socket layer.\n The default for this option is `true` which speeds up packet header parsing.\n Setting `false` has a performance penalty because the packet header\n has to be read first, to know exactly how many bytes to read for the body,\n which roughly doubles the number of read operations.\n\n The use of this option is essential for example before switching to kTLS\n which activates OS socket layer encryption and decryption by setting\n special (raw) socket options. So if the Erlang socket layer has read ahead,\n it has read bytes that was for the OS socket layer to decrypt,\n which makes packet decryption derail for the connection.\n\n > #### Warning {: .warning }\n >\n > For packet modes that doesn't have the packet length at a fixed location\n > in a packet header, such as `line` or `asn1`, not reading ahead\n > can become very inefficient since sometimes the only way to accomplish\n > this is to read one byte at the time until the length\n > or packet end is found.\n\n- **`{read_packets, Integer}` (UDP sockets)** [](){: #option-read_packets } -\n Sets the maximum number of UDP packets to read without intervention\n from the socket when data is available. When this many packets\n have been read and delivered to the destination process,\n new packets are not read until a new notification of available data\n has arrived. Defaults to `5`. If this parameter is set too high, the system\n can become unresponsive because of UDP packet flooding.\n\n- **`{recbuf, Size}`** [](){: #option-recbuf } -\n The minimum size of the receive buffer to use for the socket.\n You are encouraged to use `getopts/2` to retrieve the size\n set by your operating system.\n\n- **`{recvtclass, Boolean}`** [](){: #option-recvtclass } -\n If set to `true` activates returning the received `TCLASS` value\n on platforms that implements the protocol `IPPROTO_IPV6` option\n `IPV6_RECVTCLASS` or `IPV6_2292RECVTCLASS` for the socket.\n The value is returned as a `{tclass,TCLASS}` tuple regardless of if\n the platform returns an `IPV6_TCLASS` or an `IPV6_RECVTCLASS` CMSG value.\n\n For packet oriented sockets that supports receiving ancillary data with the\n payload data (`gen_udp` and `gen_sctp`), the `TCLASS` value is returned in an\n extended return tuple contained in an\n [ancillary data](`t:ancillary_data/0`) list. For stream oriented sockets\n (`gen_tcp`) the only way to get the `TCLASS` value is if the platform supports\n the [`pktoptions`](`t:gen_tcp:pktoptions_value/0`) option.\n\n- **`{recvtos, Boolean}`** [](){: #option-recvtos } -\n If set to `true` activates returning the received `TOS` value\n on platforms that implements the protocol `IPPROTO_IP` option\n `IP_RECVTOS` for the socket. The value is returned as a `{tos,TOS}` tuple\n regardless of if the platform returns an `IP_TOS` or an `IP_RECVTOS` CMSG\n value.\n\n For packet oriented sockets that supports receiving ancillary data with the\n payload data (`gen_udp` and `gen_sctp`), the `TOS` value is returned in an\n extended return tuple contained in an\n [ancillary data](`t:ancillary_data/0`) list. For stream oriented sockets\n (`gen_tcp`) the only way to get the `TOS` value is if the platform supports\n the [`pktoptions`](`t:gen_tcp:pktoptions_value/0`) option.\n\n- **`{recvttl, Boolean}`** [](){: #option-recvttl } -\n If set to `true` activates returning the received `TTL` value\n on platforms that implements the protocol `IPPROTO_IP` option `IP_RECVTTL`\n for the socket. The value is returned as a `{ttl,TTL}` tuple\n regardless of if the platform returns an `IP_TTL` or an `IP_RECVTTL` CMSG\n value.\n\n For packet oriented sockets that supports receiving ancillary data with the\n payload data (`gen_udp` and `gen_sctp`), the `TTL` value is returned in an\n extended return tuple contained in an\n [ancillary data](`t:ancillary_data/0`) list. For stream oriented sockets\n (`gen_tcp`) the only way to get the `TTL` value is if the platform supports\n the [`pktoptions`](`t:gen_tcp:pktoptions_value/0`) option.\n\n- **`{reuseaddr, Boolean}`[](){: #option-reuseaddr }** -\n Allows or disallows reuse of local address. By default, reuse is disallowed.\n\n > #### Note {: .info }\n >\n > On windows `{reuseaddr, true}` will have no effect unless also\n > [`{reuseport, true}`](#option-reuseport) is set. If both are set,\n > the `SO_REUSEADDR` Windows socket option will be enabled. This since setting\n > `SO_REUSEADDR` on Windows more or less has the same behavior as setting both\n > `SO_REUSEADDR` and `SO_REUSEPORT` on BSD. This behavior was introduced as of\n > OTP 26.0.\n >\n > > #### Change {: .info }\n > >\n > > Previous behavior on Windows:\n > >\n > > - Prior to OTP 25.0, the `{reuseaddr, true}` option was silently ignored.\n > > - Between OTP 25.0 and up to the predecessor of OTP 25.2, the underlying\n > > `SO_REUSEADDR` socket option was set if `{reuseaddr, true}` was set.\n > > - Between OTP 25.2 and up to the predecessor of OTP 26.0, the underlying\n > > `SO_REUSEADDR` socket option was only set on UDP sockets if\n > > `{reuseaddr, true}` was set, and silently ignored on other sockets.\n >\n > See also the [`exclusiveaddruse`](#option-exclusiveaddruse) option.\n\n- **`{reuseport, Boolean}`[](){: #option-reuseport }** -\n Allows or disallows reuse of local port which _may or may not_\n have load balancing depending on the underlying OS. By default,\n reuse is disallowed. See also [`reuseport_lb`](#option-reuseport_lb).\n\n > #### Note {: .info }\n >\n > On windows `{reuseport, true}` will have no effect unless also\n > [`{reuseaddr, true}`](#option-reuseaddr) is set. If both are set,\n > the `SO_REUSEADDR` Windows socket option will be enabled. This since setting\n > `SO_REUSEADDR` on Windows more or less has the same behavior as setting both\n > `SO_REUSEADDR` and `SO_REUSEPORT` on BSD. The `reuseport` option was\n > introduced as of OTP 26.0.\n >\n > See also the [`exclusiveaddruse`](#option-exclusiveaddruse) option.\n\n > #### Note {: .info }\n >\n > `reuseport` _may or may not_ be the same underlying option as\n > [`reuseport_lb`](#option-reuseport_lb) depending on the underlying\n > OS. They, for example, are on Linux. When they are the same underlying\n > option, operating on both may cause them to interact in surprising ways. For\n > example, by enabling `reuseport` and then disabling `reuseport_lb` both will\n > end up being disabled.\n\n > #### Note {: .info }\n >\n > This option is _currently_ not supported for socket created with\n > `inet_backend = socket`\n\n- **`{reuseport_lb, Boolean}`[](){: #option-reuseport_lb }** -\n Allows or disallows reuse of local port _with_ load balancing.\n By default, reuse is disallowed. See also [`reuseport`](#option-reuseport).\n\n > #### Note {: .info }\n >\n > `reuseport_lb` _may or may not_ be the same underlying option as\n > [`reuseport`](#option-reuseport) depending on the underlying OS.\n > On Linux, for example, they are. And when they are the same\n > underlying option, operating on both may cause them to interact\n > in surprising ways. For example, by enabling `reuseport_lb`,\n > and then disabling `reuseport`, both will end up being disabled.\n\n > #### Note {: .info }\n >\n > This option is _currently_ not supported for socket created with\n > `inet_backend = socket`\n\n- **`{send_timeout, Integer}`** - Only allowed for connection-oriented sockets.\n\n Specifies a longest time to wait for a send operation to be accepted by the\n underlying TCP stack. When the limit is exceeded, the send operation returns\n `{error, timeout}`. How much of a packet that got sent is unknown; the socket\n is therefore to be closed whenever a time-out has occurred (see\n `send_timeout_close` below). Defaults to `infinity`.\n\n- **`{send_timeout_close, Boolean}`** - Only allowed for connection-oriented\n sockets.\n\n Used together with `send_timeout` to specify whether the socket is to be\n automatically closed when the send operation returns `{error, timeout}`. The\n recommended setting is `true`, which automatically closes the socket. Defaults\n to `false` because of backward compatibility.\n\n- **`{show_econnreset, Boolean}` (TCP/IP sockets)**\n [](){: #option-show_econnreset } -\n When this option is set to `false`, which is default, an RST\n received from the TCP peer is treated as a normal close\n (as though an FIN was sent). A caller to `gen_tcp:recv/2` gets\n `{error, closed}`. In active mode, the controlling process receives a\n `{tcp_closed, Socket}` message, indicating that the peer has closed the\n connection.\n\n Setting this option to `true` allows you to distinguish between a connection\n that was closed normally, and one that was aborted (intentionally or\n unintentionally) by the TCP peer. A call to `gen_tcp:recv/2` returns\n `{error, econnreset}`. In active mode, the controlling process receives a\n `{tcp_error, Socket, econnreset}` message before the usual\n `{tcp_closed, Socket}`, as is the case for any other socket error. Calls to\n `gen_tcp:send/2` also returns `{error, econnreset}` when it is detected that a\n TCP peer has sent an RST.\n\n A connected socket returned from `gen_tcp:accept/1` inherits the\n `show_econnreset` setting from the listening socket.\n\n- **`{sndbuf, Size}`** [](){: #option-sndbuf } -\n The minimum size of the send buffer to use for the socket.\n You are encouraged to use `getopts/2`, to retrieve the size\n set by your operating system.\n\n- **`{priority, Integer}`** - Sets the `SO_PRIORITY` socket level option on\n platforms where this is implemented. The behavior and allowed range varies\n between different systems. The option is ignored on platforms where it is not\n implemented. Use with caution.\n\n- **`{tos, Integer}`** - Sets `IP_TOS IP` level options on platforms where this\n is implemented. The behavior and allowed range varies between different\n systems. The option is ignored on platforms where it is not implemented. Use\n with caution.\n\n- **`{tclass, Integer}`** - Sets `IPV6_TCLASS IP` level options on platforms\n where this is implemented. The behavior and allowed range varies between\n different systems. The option is ignored on platforms where it is not\n implemented. Use with caution.\n\nIn addition to these options, _raw_ option specifications can be used. The raw\noptions are specified as a tuple of arity four, beginning with tag `raw`,\nfollowed by the protocol level, the option number, and the option value\nspecified as a binary. This corresponds to the second, third, and fourth\narguments to the `setsockopt` call in the C socket API. The option value must be\ncoded in the native endianness of the platform and, if a structure is required,\nmust follow the structure alignment conventions on the specific platform.\n\nUsing raw socket options requires detailed knowledge about the current operating\nsystem and TCP stack.\n\n_Example:_\n\nThis example concerns the use of raw options. Consider a Linux system where you\nwant to set option `TCP_LINGER2` on protocol level `IPPROTO_TCP` in the stack.\nYou know that on this particular system it defaults to 60 (seconds), but you\nwant to lower it to 30 for a particular socket. Option `TCP_LINGER2` is not\nexplicitly supported by `inet`, but you know that the protocol level translates\nto number 6, the option number to number 8, and the value is to be specified as\na 32-bit integer. You can use this code line to set the option for the socket\nnamed `Sock`:\n\n```text\ninet:setopts(Sock, [{raw,6,8,<<30:32/native>>}]),\n```\n\nAs many options are silently discarded by the stack if they are specified out of\nrange; it can be a good idea to check that a raw option is accepted. The\nfollowing code places the value in variable `TcpLinger2:`\n\n```text\n{ok,[{raw,6,8,< >}]}=inet:getopts(Sock,[{raw,6,8,4}]),\n```\n\nCode such as these examples is inherently non-portable, even different versions\nof the same OS on the same platform can respond differently to this kind of\noption manipulation. Use with care.\n\nNotice that the default options for TCP/IP sockets can be changed with the\nKernel configuration parameters mentioned in the beginning of this manual page.","ref":"inet.html#setopts/2"},{"type":"function","title":"inet.sockname/1","doc":"Return the local address and port number for a socket.\n\nNotice that for SCTP sockets this function returns only one of the socket\naddresses. Function [`socknames/1,2`](`socknames/1`) returns all.","ref":"inet.html#sockname/1"},{"type":"function","title":"inet.socknames/1","doc":"Equivalent to [`socknames(Socket, 0)`](`socknames/2`).","ref":"inet.html#socknames/1"},{"type":"function","title":"inet.socknames/2","doc":"Return all localaddresses for a socket.\n\nReturns a list of all local address/port number pairs for a socket,\nfor the specified association `Assoc`.\n\nThis function can return multiple addresses for multihomed sockets,\nsuch as SCTP sockets. For other sockets it returns a one-element list.\n\nNotice that parameter `Assoc` is by the\n[SCTP Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\ndefined to be ignored for one-to-one style sockets. For one-to-many style\nsockets, the special value `0` is defined to mean that the returned addresses\nmust be without any particular association. How different SCTP implementations\ninterpret this varies somewhat.","ref":"inet.html#socknames/2"},{"type":"type","title":"inet.address_family/0","doc":"","ref":"inet.html#t:address_family/0"},{"type":"type","title":"inet.ancillary_data/0","doc":"Ancillary data / control messages.\n\nAncillary data received with a data packet, read with the socket option\n[`pktoptions`](`t:gen_tcp:pktoptions_value/0`) from a TCP socket,\nor to set in a call to [`gen_udp:send/4`](`m:gen_udp#send-4-AncData`)\nor `gen_udp:send/5`.\n\nThe value(s) correspond to the currently active socket\n[options](`t:socket_setopt/0`) [`recvtos`](#option-recvtos),\n[`recvtclass`](#option-recvtclass) and [`recvttl`](#option-recvttl),\nor for a single send operation the option(s) to override\nthe currently active socket option(s).","ref":"inet.html#t:ancillary_data/0"},{"type":"type","title":"inet.ether_address/0","doc":"","ref":"inet.html#t:ether_address/0"},{"type":"type","title":"inet.family_address/0","doc":"A general network address.\n\nA general network address format on the form `{Family, Destination}`\nwhere `Family` is an atom such as `local` and the format of `Destination`\ndepends on `Family`. `Destination` is a complete address (for example\nan IP address with port number).","ref":"inet.html#t:family_address/0"},{"type":"type","title":"inet.getifaddrs_ifopts/0","doc":"Interface address description list.\n\nA list returned from [`getifaddrs/0,1`](`getifaddrs/0`)\nfor a named interface, translated from the\nreturned data of the POSIX API function `getaddrinfo()`.\n\n`Hwaddr` is hardware dependent, for example, on Ethernet interfaces it is the\n6-byte Ethernet address (MAC address (EUI-48 address)).\n\nThe tuples `{addr,Addr}`, `{netmask,Netmask}`, and possibly\n`{broadaddr,Broadaddr}` or `{dstaddr,Dstaddr}` are repeated in the list\nif the interface has got multiple addresses. An interface may have multiple\n`{flag,_}` tuples for example if it has different flags for different\naddress families.\n\nMultiple `{hwaddr,Hwaddr}` tuples is hard to say anything definite about,\nthough. The tuple `{flag,Flags}` is mandatory, all others are optional.\n\nDo not rely too much on the order of `Flags` atoms or the `Ifopt` tuples.\nThere are however some rules:\n\n- A `{flag,_}` tuple applies to all other tuples that follow.\n- Immediately after `{addr,_}` follows `{netmask,_}`.\n- Immediately thereafter may `{broadaddr,_}` follow if `broadcast`\n is member of `Flags`, or `{dstaddr,_}` if `pointtopoint`\n is member of `Flags`. Both `{dstaddr,_}` and `{broadaddr,_}` doesn't\n occur for the same `{addr,_}`.\n- Any `{netmask,_}`, `{broadaddr,_}`, or `{dstaddr,_}` tuples that follow an\n `{addr,Addr}` tuple concerns the address `Addr`.\n\nThe tuple `{hwaddr,_}` is not returned on Solaris, as the hardware address\nhistorically belongs to the link layer and it is not returned\nby the Solaris API function `getaddrinfo()`.\n\n> #### Warning {: .warning }\n>\n> On Windows, the data is fetched from different OS API functions, so the\n> `Netmask` and `Broadaddr` values may be calculated, just as some `Flags`\n> values.","ref":"inet.html#t:getifaddrs_ifopts/0"},{"type":"type","title":"inet.hostent/0","doc":"A record describing a host; name and address.\n\nCorresponds to the `C`: `struct hostent` as returned by for example\n`gethostbyname(3)`.\n\nThe record is defined in the Kernel include file `\"inet.hrl\"`.\n\nAdd the following directive to the module:\n\n```erlang\n-include_lib(\"kernel/include/inet.hrl\").\n```","ref":"inet.html#t:hostent/0"},{"type":"type","title":"inet.hostname/0","doc":"","ref":"inet.html#t:hostname/0"},{"type":"type","title":"inet.i_option/0","doc":"Options for selecting statistics items.\n\nRegarding `ShowPorts`, see `show_ports` as described in the `i/2` function,\ndefaults to `false`.","ref":"inet.html#t:i_option/0"},{"type":"type","title":"inet.inet6_address/0","doc":"A network address for the `inet6` family (`AF_INET6`, IPv6)\n> #### Warning {: .warning }\n>\n> This address format is currently experimental and for completeness\n> to make all address families have a `{Family, Destination}` representation.","ref":"inet.html#t:inet6_address/0"},{"type":"type","title":"inet.inet_address/0","doc":"A network address for the `inet` family (`AF_INET`, IPv4)\n> #### Warning {: .warning }\n>\n> This address format is currently experimental and for completeness\n> to make all address families have a `{Family, Destination}` representation.","ref":"inet.html#t:inet_address/0"},{"type":"type","title":"inet.inet_backend/0","doc":"Implementation backend selector for `t:socket/0`.\n\nSelects the implementation backend for [sockets](`t:socket/0`).\nThe current default is `inet` which uses `inet_drv.c` to call\nthe platform's socket API. The value `socket` instead uses\nthe `m:socket` module and its NIF implementation.\n\nThis is a _temporary_ option that will be ignored in a future release.","ref":"inet.html#t:inet_backend/0"},{"type":"type","title":"inet.ip4_address/0","doc":"","ref":"inet.html#t:ip4_address/0"},{"type":"type","title":"inet.ip6_address/0","doc":"","ref":"inet.html#t:ip6_address/0"},{"type":"type","title":"inet.ip_address/0","doc":"","ref":"inet.html#t:ip_address/0"},{"type":"type","title":"inet.local_address/0","doc":"A network address for the `local` family (`AF_LOCAL | AF_UNIX`)\n\nThis address family, also known as \"Unix domain sockets\" only works\non Unix-like systems.\n\n`File` is normally a file pathname in a local filesystem. It is limited in\nlength by the operating system, traditionally to 108 bytes.\n\nA `t:binary/0` is passed as is to the operating system,\nbut a `t:string/0` is encoded according to the\n[system filename encoding mode.](`file:native_name_encoding/0`)\n\nOther addresses are possible, for example Linux implements\n\"Abstract Addresses\". See the documentation for Unix Domain Sockets\non your system, normally `unix` in manual section 7.\n\nIn most API functions where you can use this address family\nthe port number must be `0`.","ref":"inet.html#t:local_address/0"},{"type":"type","title":"inet.module_socket/0","doc":"","ref":"inet.html#t:module_socket/0"},{"type":"type","title":"inet.port_number/0","doc":"","ref":"inet.html#t:port_number/0"},{"type":"type","title":"inet.posix/0","doc":"POSIX Error Code `t:atom/0`.\n\nAn atom that is named from the POSIX error codes used in Unix,\nand in the runtime libraries of most C compilers.\nSee section [POSIX Error Codes](#posix-error-codes).","ref":"inet.html#t:posix/0"},{"type":"type","title":"inet.returned_non_ip_address/0","doc":"a non-IP network address.\n\nAddresses besides `t:ip_address/0` ones that are returned from\nsocket API functions. See in particular `t:local_address/0`.\nThe `unspec` family corresponds to `AF_UNSPEC` and can occur\nif the other side has no socket address. The `undefined`\nfamily can only occur in the unlikely event of an address family\nthat the VM doesn't recognize.","ref":"inet.html#t:returned_non_ip_address/0"},{"type":"type","title":"inet.socket/0","doc":"A socket recognized by this module and its siblings.\n\nSee `t:gen_tcp:socket/0` and `t:gen_udp:socket/0`.","ref":"inet.html#t:socket/0"},{"type":"type","title":"inet.socket_address/0","doc":"","ref":"inet.html#t:socket_address/0"},{"type":"type","title":"inet.socket_getopt/0","doc":"","ref":"inet.html#t:socket_getopt/0"},{"type":"type","title":"inet.socket_optval/0","doc":"","ref":"inet.html#t:socket_optval/0"},{"type":"type","title":"inet.socket_protocol/0","doc":"","ref":"inet.html#t:socket_protocol/0"},{"type":"type","title":"inet.socket_setopt/0","doc":"","ref":"inet.html#t:socket_setopt/0"},{"type":"type","title":"inet.stat_option/0","doc":"","ref":"inet.html#t:stat_option/0"},{"type":"module","title":"inet_res","doc":"A rudimentary DNS client.\n\nThis module performs DNS name resolving towards recursive name servers.\n\nSee also [ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`)\nor more information about how to configure an Erlang runtime system for IP\ncommunication, and how to enable this DNS client by defining `'dns'`\nas a lookup method. The DNS client then acts as a backend for\nthe resolving functions in `m:inet`.\n\nThis DNS client can resolve DNS records even if it is not used\nfor normal name resolving in the node.\n\nThis is not a full-fledged resolver, only a DNS client that relies on asking\ntrusted recursive name servers.","ref":"inet_res.html"},{"type":"module","title":"Name Resolving - inet_res","doc":"UDP queries are used unless resolver option `usevc` is `true`,\nwhich forces TCP queries. If the query is too large for UDP,\nTCP is used instead. For regular DNS queries, 512 bytes is the size limit.\n\nWhen EDNS is enabled (resolver option `edns` is set to the EDNS version\n(that is; `0` instead of `false`), resolver option `udp_payload_size`\nsets the payload size limit. If a name server replies with the TC bit set\n(truncation), indicating that the answer is incomplete, the query is retried\ntowards the same name server using TCP. Resolver option `udp_payload_size`\nalso sets the advertised size for the maximum allowed reply size,\nif EDNS is enabled, otherwise the name server uses the limit 512 bytes.\nIf the reply is larger, it gets truncated, forcing a TCP requery.\n\nFor UDP queries, resolver options `timeout` and `retry` control\nretransmission. Each name server in the `nameservers` list is tried\nwith a time-out of `timeout`/`retry`. Then all name servers are tried again,\ndoubling the time-out, for a total of `retry` times.\n\n[](){: #servfail_retry_timeout }\n\nBut before all name servers are tried again, there is a (user configurable)\ntime-out, `servfail_retry_timeout`. The point of this is to prevent\nthe new query to be handled by a server's servfail cache (a client\nthat is too eager will actually only get what is in the servfail cache).\nIf there is too little time left of the resolver call's time-out\nto do a retry, the resolver call may return before the call's time-out\nhas expired.\n\nFor queries not using the `search` list, if the query to all `nameservers`\nresults in `{error,nxdomain}` or an empty answer, the same query is tried for\n`alt_nameservers`.","ref":"inet_res.html#module-name-resolving"},{"type":"module","title":"Resolver Types - inet_res","doc":"The following data types concern the resolver:","ref":"inet_res.html#module-resolver-types"},{"type":"module","title":"DNS Types - inet_res","doc":"The following data types concern the DNS client:","ref":"inet_res.html#module-dns-types"},{"type":"module","title":"Example - inet_res","doc":"This access functions example shows how `lookup/3` can be implemented using\n`resolve/3` from outside the module:\n\n```erlang\nexample_lookup(Name, Class, Type) ->\n case inet_res:resolve(Name, Class, Type) of\n {ok,Msg} ->\n [inet_dns:rr(RR, data)\n || RR <- inet_dns:msg(Msg, anlist),\n inet_dns:rr(RR, type) =:= Type,\n inet_dns:rr(RR, class) =:= Class];\n {error,_} ->\n []\n end.\n```","ref":"inet_res.html#module-example"},{"type":"function","title":"inet_res.getbyname/2","doc":"","ref":"inet_res.html#getbyname/2"},{"type":"function","title":"inet_res.getbyname/3","doc":"Resolve a DNS query.\n\nResolves a DNS query of the specified `Type` for the specified host,\nof class`in`. Returns, on success, when resolving a `Type = a|aaaa`\nDNS record, a `#hostent{}` record with `#hostent.h_addrtype = inet|inet6`,\nrespectively; see `t:inet:hostent/0`.\n\nWhen resolving other `Type = dns_rr_type()`:s (of class `in`), also returns\na `#hostent{}` record but with `t:dns_rr_type/0` in `#hostent.h_addrtype`,\nand the resolved `t:dns_data/0` in `#hostent.h_addr_list`; see `t:hostent/0`.\n\nThis function uses resolver option `search` that is a list of domain names.\nIf the name to resolve contains no dots, it is prepended to each domain\nname in the search list, and they are tried in order. If the name\ncontains dots, it is first tried as an absolute name and if that fails,\nthe search list is used. If the name has a trailing dot, it is supposed\nto be an absolute name and the search list is not used.","ref":"inet_res.html#getbyname/3"},{"type":"function","title":"inet_res.gethostbyaddr/1","doc":"","ref":"inet_res.html#gethostbyaddr/1"},{"type":"function","title":"inet_res.gethostbyaddr/2","doc":"Backend function used by `inet:gethostbyaddr/1`.","ref":"inet_res.html#gethostbyaddr/2"},{"type":"function","title":"inet_res.gethostbyname/1","doc":"Backend functions used by [`inet:gethostbyname/1,2`](`inet:gethostbyname/1`).\n\nIf resolver option `inet6` is `true`, equivalent to\n[`gethostbyname(Name, inet6, infinity)`](`gethostbyname/3`),\notherwise [`gethostbyname(Name, inet, infinity)`](`gethostbyname/3`).","ref":"inet_res.html#gethostbyname/1"},{"type":"function","title":"inet_res.gethostbyname/2","doc":"","ref":"inet_res.html#gethostbyname/2"},{"type":"function","title":"inet_res.gethostbyname/3","doc":"Backend functions used by [`inet:gethostbyname/1,2`](`inet:gethostbyname/1`).\n\nThis function uses resolver option `search` just like\n[`getbyname/2,3`](`getbyname/2`).","ref":"inet_res.html#gethostbyname/3"},{"type":"function","title":"inet_res.lookup/3","doc":"","ref":"inet_res.html#lookup/3"},{"type":"function","title":"inet_res.lookup/4","doc":"","ref":"inet_res.html#lookup/4"},{"type":"function","title":"inet_res.lookup/5","doc":"Look up DNS data.\n\nResolves the DNS data for the record `Name` of the specified\n`Type` and `Class`. On success, filters out the answer records\nwith the correct `Class` and `Type`, and returns a list of their data fields.\nSo, a lookup for type `any` gives an empty answer, as the answer records\nhave specific types that are not `any`. An empty answer or a failed lookup\nreturns an empty list.\n\nCalls [`resolve/*`](`resolve/3`) with the same arguments and filters the result,\nso `Opts` is described for those functions.","ref":"inet_res.html#lookup/5"},{"type":"function","title":"inet_res.nnslookup/4","doc":"","ref":"inet_res.html#nnslookup/4"},{"type":"function","title":"inet_res.nnslookup/5","doc":"Resolve a DNS query.\n\nLike `nslookup/4` but calls `resolve/5` with both the arguments\n`Opts = [{nameservers, Nameservers}]` and `Timeout`.","ref":"inet_res.html#nnslookup/5"},{"type":"function","title":"inet_res.nslookup/3","doc":"","ref":"inet_res.html#nslookup/3"},{"type":"function","title":"inet_res.nslookup/4","doc":"Resolve a DNS query.\n\nThis function is a legacy wrapper to `resolve/5` that simplifies\nerrors matching `{error, {Reason, _}}` into `{error, Reason}`\nor `{error, einval}`.\n\nWith argument `Timeout` calls `resolve/5` with `Opts = []`.\n\nWith argument `Nameservers` calls `resolve/5` with\n`Opts = [{nameservers, Nameservers}]` and `Timeout = infinity`.","ref":"inet_res.html#nslookup/4"},{"type":"function","title":"inet_res.resolve/3","doc":"","ref":"inet_res.html#resolve/3"},{"type":"function","title":"inet_res.resolve/4","doc":"","ref":"inet_res.html#resolve/4"},{"type":"function","title":"inet_res.resolve/5","doc":"Resolve a DNS query.\n\nResolves a DNS query for the specified `Type`, `Class`, and `Name`,\ninto a DNS message possibly containing Resource Records.\nThe returned `t:dns_msg/0` can be examined using access functions\nin `inet_db`, as described in section in [DNS Types](#module-dns-types).\n\nIf `Name` is an `ip_address()`, the domain name to query about is generated\nas the standard reverse `\".IN-ADDR.ARPA.\"` name for an IPv4 address, or the\n`\".IP6.ARPA.\"` name for an IPv6 address. In this case, you most probably\nwant to use `Class = in` and `Type = ptr`, but it is not done automatically.\n\n`Opts` overrides the corresponding resolver options. If option `nameservers`\nis specified, it is assumed that it is the complete list of name serves,\nso resolver option `alt_nameserves` is ignored. However, if option\n`alt_nameserves` is also specified to this function, it is used.\n\nOption `verbose` (or rather `{verbose,true}`) causes diagnostics printout\nthrough [`io:format/2`](`io:format/3`) of queries, replies, retransmissions,\nand so on, similar to utilities such as `dig` and `nslookup`.\n\nOption `nxdomain_reply` (or rather `{nxdomain_reply, true}`) causes NXDOMAIN\nerrors from DNS servers to be returned as `{error, {nxdomain, dns_msg()}}`.\n`t:dns_msg/0` contains the additional sections that where included by the\nanswering server. This is mainly useful to inspect the SOA record\nto get the TTL for negative caching.\n\nIf `Opt` is any atom, it is interpreted as `{Opt,true}` unless\nthe atom string starts with `\"no\"`, making the interpretation `{Opt,false}`.\nFor example, `usevc` is an alias for `{usevc, true}` and `nousevc`\nis an alias for `{usevc, false}`.\n\nOption `inet6` has no effect on this function. You probably want to use\n`Type = a | aaaa` instead.","ref":"inet_res.html#resolve/5"},{"type":"type","title":"inet_res.dns_class/0","doc":"","ref":"inet_res.html#t:dns_class/0"},{"type":"type","title":"inet_res.dns_data/0","doc":"DNS record data (content)\n\nThe basic type of each data element is specified in this type.\n\n`Regexp` is a UTF-8 `t:string/0`. The other `t:string/0`s\nare actually Latin-1 strings.","ref":"inet_res.html#t:dns_data/0"},{"type":"type","title":"inet_res.dns_msg/0","doc":"A DNS message.\n\nThis is the start of a hierarchy of opaque data structures that can be\nexamined with access functions in `inet_dns`, which return lists of\n`{Field,Value}` tuples. The arity 2 functions return the value\nfor a specified field.\n\n```erlang\ndns_msg() = DnsMsg\n inet_dns:msg(DnsMsg) ->\n [ {header, dns_header()}\n | {qdlist, dns_query()}\n | {anlist, dns_rr()}\n | {nslist, dns_rr()}\n | {arlist, dns_rr()} ]\n inet_dns:msg(DnsMsg, header) -> dns_header() % for example\n inet_dns:msg(DnsMsg, Field) -> Value\n\ndns_header() = DnsHeader\n inet_dns:header(DnsHeader) ->\n [ {id, integer()}\n | {qr, boolean()}\n | {opcode, query | iquery | status | integer()}\n | {aa, boolean()}\n | {tc, boolean()}\n | {rd, boolean()}\n | {ra, boolean()}\n | {pr, boolean()}\n | {rcode, integer(0..16)} ]\n inet_dns:header(DnsHeader, Field) -> Value\n\nquery_type() = axfr | mailb | maila | any | dns_rr_type()\n\ndns_query() = DnsQuery\n inet_dns:dns_query(DnsQuery) ->\n [ {domain, dns_name()}\n | {type, query_type()}\n | {class, dns_class()} ]\n inet_dns:dns_query(DnsQuery, Field) -> Value\n\ndns_rr() = DnsRr\n inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields\n DnsRrFields = [ {domain, dns_name()}\n | {type, dns_rr_type()}\n | {class, dns_class()}\n | {ttl, integer()}\n | {data, dns_data()} ]\n DnsRrOptFields = [ {domain, dns_name()}\n | {type, opt}\n | {udp_payload_size, integer()}\n | {ext_rcode, integer()}\n | {version, integer()}\n | {z, integer()}\n | {data, dns_data()} ]\n inet_dns:rr(DnsRr, Field) -> Value\n```\n\nThere is an information function for the types above:\n\n```erlang\ninet_dns:record_type(dns_msg()) -> msg;\ninet_dns:record_type(dns_header()) -> header;\ninet_dns:record_type(dns_query()) -> dns_query;\ninet_dns:record_type(dns_rr()) -> rr;\ninet_dns:record_type(_) -> undefined.\n```\n\nSo, `inet_dns:(inet_dns:record_type(X))(X)` converts any of these data\nstructures into a `{Field,Value}` list.","ref":"inet_res.html#t:dns_msg/0"},{"type":"type","title":"inet_res.dns_name/0","doc":"A string with no adjacent dots.","ref":"inet_res.html#t:dns_name/0"},{"type":"type","title":"inet_res.dns_rr_type/0","doc":"","ref":"inet_res.html#t:dns_rr_type/0"},{"type":"type","title":"inet_res.hostent/0","doc":"Extended variant of `t:inet:hostent/0`.\n\nAllows `t:dns_rr_type/0` for the\n[`#hostent{}.h_addrtype`](`t:inet:hostent/0`) field, and\n`[`[`dns_data/0`](`t:dns_data/0`)`]` for the\n[`#hostent{}.h_addr_list`](`t:inet:hostent/0`) field.","ref":"inet_res.html#t:hostent/0"},{"type":"type","title":"inet_res.nameserver/0","doc":"","ref":"inet_res.html#t:nameserver/0"},{"type":"type","title":"inet_res.res_error/0","doc":"","ref":"inet_res.html#t:res_error/0"},{"type":"type","title":"inet_res.res_option/0","doc":"","ref":"inet_res.html#t:res_option/0"},{"type":"module","title":"net","doc":"Network interface.\n\nThis module provides an API for the network interface.","ref":"net.html"},{"type":"function","title":"net.getaddrinfo/1","doc":"","ref":"net.html#getaddrinfo/1"},{"type":"function","title":"net.getaddrinfo/2","doc":"Network address and service translation.\n\nThis function is the inverse of [`getnameinfo`](`getnameinfo/1`). It converts\nhost and service to a corresponding socket address.\n\nOne of the `Host` and `Service` may be `undefined` but _not_ both.","ref":"net.html#getaddrinfo/2"},{"type":"function","title":"net.gethostname/0","doc":"Return the name of the current host.","ref":"net.html#gethostname/0"},{"type":"function","title":"net.getifaddrs/0","doc":"","ref":"net.html#getifaddrs/0"},{"type":"function","title":"net.getifaddrs/1","doc":"Get interface addresses.\n\nWith argument 'Filter: get the machines interface addresses,\nfiltered according to `Filter`.\n\nWith argument `Namespace`: equivalent to\n[`getifaddrs(default, Namespace)`](`getifaddrs/2`).","ref":"net.html#getifaddrs/1"},{"type":"function","title":"net.getifaddrs/2","doc":"Get interface addresses in a namespace.\n\nThe same as [`getifaddrs(Filter)`](`getifaddrs/1`) but\nin the specified `Namespace`.","ref":"net.html#getifaddrs/2"},{"type":"function","title":"net.getnameinfo/1","doc":"","ref":"net.html#getnameinfo/1"},{"type":"function","title":"net.getnameinfo/2","doc":"Address-to-name translation in a protocol-independant manner.\n\nThis function is the inverse of [`getaddrinfo`](`getaddrinfo/1`). It converts a\nsocket address to a corresponding host and service.","ref":"net.html#getnameinfo/2"},{"type":"function","title":"net.getservbyname/1","doc":"","ref":"net.html#getservbyname/1"},{"type":"function","title":"net.getservbyname/2","doc":"Get service by name.\n\nThis function is used to get the port number of the specified protocol\nfor the named service.","ref":"net.html#getservbyname/2"},{"type":"function","title":"net.getservbyport/1","doc":"","ref":"net.html#getservbyport/1"},{"type":"function","title":"net.getservbyport/2","doc":"Get service by name.\n\nThis function is used to get the service name of the specified protocol\nfor the given port number.","ref":"net.html#getservbyport/2"},{"type":"function","title":"net.if_index2name/1","doc":"Mappings between network interface index and names.","ref":"net.html#if_index2name/1"},{"type":"function","title":"net.if_name2index/1","doc":"Mappings between network interface names and indexes.","ref":"net.html#if_name2index/1"},{"type":"function","title":"net.if_names/0","doc":"Get network interface names and indexes.","ref":"net.html#if_names/0"},{"type":"type","title":"net.address_info/0","doc":"","ref":"net.html#t:address_info/0"},{"type":"type","title":"net.ifaddrs/0","doc":"Interface addresses and flags.\n\nThis type defines addresses and flags for an interface.\n\n> #### Note {: .info }\n>\n> Not all fields of this map has to be present. The flags field can be used to\n> test for some of the fields. For example `broadaddr` will only be present if\n> the `broadcast` flag is present in flags.","ref":"net.html#t:ifaddrs/0"},{"type":"type","title":"net.ifaddrs_filter/0","doc":"Interface address filtering selector.\n\n- **all** - All interfaces\n\n- **default** - Interfaces with address family `inet` _or_ `inet6`\n\n- **inet | inet6 | packet | link** - Interfaces with _only_ the specified\n address family\n- **hwaddr** - Interfaces with address family `packet` _or_ `link`","ref":"net.html#t:ifaddrs_filter/0"},{"type":"type","title":"net.ifaddrs_filter_fun/0","doc":"Interface address filtering selector `t:function/0`.\n\nFor each `ifaddrs` entry, return either `true` to keep the entry\nor `false` to discard the entry.\n\nFor example, to get an interface list which only contains\nnon-`loopback` `inet` interfaces:\n\n```erlang\nnet:getifaddrs(\n fun (#{ addr := #{family := inet},\n flags := Flags}) ->\n not lists:member(loopback, Flags);\n (_) ->\n false\n end).\n```","ref":"net.html#t:ifaddrs_filter_fun/0"},{"type":"type","title":"net.ifaddrs_filter_map/0","doc":"Interface address filtering selector map.\n\nThe `family` field can only have the (above) specified values\n(and not all the values of socket:domain()).\nIt can also be a list of values, to cover the situation when\nany of the specified families are accepted.\nFor example, family can be set to `[inet,inet6]` if either `inet` or `inet6`\nis accepted.\n\nThe use of the `flags` field is that any flag provided must exist for the\ninterface.\n\nFor example, if `family` is set to `inet` and `flags` to\n`[broadcast, multicast]` only interfaces with address family `inet`\nand the flags `broadcast` and `multicast` will be listed.","ref":"net.html#t:ifaddrs_filter_map/0"},{"type":"type","title":"net.ifaddrs_flag/0","doc":"","ref":"net.html#t:ifaddrs_flag/0"},{"type":"type","title":"net.ifaddrs_flags/0","doc":"","ref":"net.html#t:ifaddrs_flags/0"},{"type":"type","title":"net.name_info/0","doc":"","ref":"net.html#t:name_info/0"},{"type":"type","title":"net.name_info_flag/0","doc":"","ref":"net.html#t:name_info_flag/0"},{"type":"type","title":"net.name_info_flag_ext/0","doc":"","ref":"net.html#t:name_info_flag_ext/0"},{"type":"type","title":"net.name_info_flags/0","doc":"","ref":"net.html#t:name_info_flags/0"},{"type":"type","title":"net.network_interface_index/0","doc":"","ref":"net.html#t:network_interface_index/0"},{"type":"type","title":"net.network_interface_name/0","doc":"","ref":"net.html#t:network_interface_name/0"},{"type":"module","title":"socket","doc":"Socket interface.\n\nThis module provides an API for network sockets. Functions are provided to\ncreate, delete and manipulate the sockets as well as sending and receiving data\non them.\n\nThe intent is that it shall be as \"close as possible\" to the OS level socket\ninterface. The only significant addition is that some of the functions, e.g.\n`recv/3`, have a time-out argument.\n\n[](){: #asynchronous-calls }\n\n> #### Note {: .info }\n>\n> #### Asynchronous Calls\n>\n> Some functions feature _asynchronous calls_. This is achieved by setting\n> the `Timeout` argument to `nowait` or to a `Handle ::` `t:reference/0`.\n> See the respective function's type specification.\n>\n> This module has two different implementations of asynchronous calls.\n> One on the _Unix_ family of operating systems:\n> `select` - based on the standard socket interface's\n> `select(3)`/`poll(3)` calls, and one on _Windows_: `completion` -\n> based on asynchronous I/O Completion Ports.\n> The difference shows in the return values and message formats\n> because they have slightly different semantics.\n>\n> #### The `completion` and `select` Return Values\n>\n> For instance, if calling `recv/3` like this;\n> [`recv(Socket, 0, nowait)`](#recv-nowait), when there is\n> no data available for reading, it will return one of:\n>\n> - `{completion, `[`CompletionInfo`](`t:completion_info/0`)`}`\n> - `{select, `[`SelectInfo`](`t:select_info/0`)`}`\n>\n> `CompletionInfo` contains a [CompletionHandle](`t:completion_handle/0`) and\n> `SelectInfo` contains a [SelectHandle](`t:select_handle/0`).\n> Both are types are aliases to `t:reference/0`.\n> When the operation can continue, a `completion` message containing\n> the `CompletionHandle` or a `select` message containing\n> the `SelectHandle` is sent to the calling process.\n>\n> On `select` systems some functions may also return:\n>\n> - `{select, {`[`SelectInfo`](`t:select_info/0`)`, _}`\n>\n> This may happen for sockets of type [`stream`](`t:type/0`) where\n> the stream handling can split the data stream at any point.\n> See the respective function's type specification's return type.\n>\n> #### The `completion` and `select` Messages\n>\n> The `completion` message has the format:\n>\n> - `{'$socket', `[`Socket`](`t:socket/0`)`, completion,\n> {`[`CompletionHandle`](`t:completion_handle/0`)`, CompletionStatus}}`\n>\n> The `select` message has the format:\n>\n> - `{'$socket', `[`Socket`](`t:socket/0`)`, select,\n> `[`SelectHandle`](`t:select_handle/0`)`}`\n>\n> When a `completion` message is received (which contains the _result_\n> of the operation), it means that the operation has been _completed_ with\n> `CompletionStatus :: ok | {error, Reason}`.\n> See the respective function's documentation for possible values\n> of `Reason`, which are the same `{error, Reason}` values\n> that can be returned by the function itself.\n>\n> When a `select` message is received, it only means that the operation\n> _may now continue_, by retrying the operation (which may return\n> a new `{select, _}` value). Some operations are retried by repeating\n> the same function call, and some have a dedicated function variant\n> to be used for the retry. See the respective function's documentation.\n>\n> #### Operation Queuing on `select` Systems\n>\n> On `select` systems, all other processes are _locked out_ until the\n> current process has completed the operation as in a continuation\n> call has returned a value indicating success or failure\n> (not a `select` return). Other processes are queued and get\n> a `select` return which makes them wait for their turn.\n>\n> #### Canceling an operation\n>\n> An operation that is in progress (not completed) may be canceled\n> using `cancel/2` both on `completion` and `select` systems.\n>\n> Canceling an operation ensures that there is no `completion`,\n> `select`, nor `abort` message in the inbox after the `cancel/2` call.\n>\n> #### Using a `Handle`\n>\n> If creating a `t:reference/0` with [`make_ref()`](`erlang:make_ref/0`)\n> and using that as the `Timeout | Handle` argument, the same `Handle`\n> will then be the [`SelectHandle`](`t:select_handle/0`) in the returned\n> `t:select_info/0` and the received `select` message, or be\n> the [`CompletionHandle`](`t:completion_handle/0`) in the returned\n> `t:completion_info/0` and the received `completion` message.\n>\n> The compiler may then optimize a following `receive` statement\n> to only scan the messages that arrive after the `t:reference/0`\n> is created. If the message queue is large this is a big optimization.\n>\n> The `t:reference/0` has to be unique for the call.\n>\n> #### Repeating an Operation on a `select` Systems\n>\n> On`select` systems, if a call would be repeated _before_ the `select`\n> message has been received it replaces the call in progress:\n>\n> ```erlang\n> {select, {select_info, Handle}} = socket:accept(LSock, nowait),\n> {error, timeout} = socket:accept(LSock, 500),\n> :\n> ```\n> Above, `Handle` is _no longer_ valid once the second `accept/2`, call\n> has been made (the first call is automatically canceled).\n> After the second `accept/2` call returns `{error, timeout}`,\n> the accept operation has completed.\n>\n> Note that there is a race here; there is no way to know if the call\n> is repeated _before_ the `select` message is sent since it _may_\n> have been sent just before the repeated call. So now there\n> might be a `select` message containing `Handle` in the inbox.\n>\n> #### The `abort` Message\n>\n> Another message the user must be prepared for\n> (when using `nowait | Handle`) is the `abort` message:\n>\n> - `{'$socket', `[`Socket`](`t:socket/0`)`, abort, Info}`\n>\n> This message indicates that the operation in progress has been aborted.\n> For instance, if the socket has been closed by another process;\n> `Info` will be `{Handle, closed}`.\n\n> #### Note {: .info }\n>\n> Support for IPv6 has been implemented but not _fully_ tested.\n>\n> SCTP has only been partly implemented (and not tested).\n\nThis module was introduced in OTP 22.0, as experimental code.\n* In OTP 22.1, the `nowait` argument was added for many functions,\n and the `cancel/2` and `info/1` functions were also added.\n* In OTP 22.3, the `number_of/0` function was added.\n* In OTP 23.0, the functions [`is_supported/1,2`](`is_supported/1`)\n and the [`open/1,2`](`open/1`) functions with an `FD` argument were added.\n* In OTP 23.1, the `use_registry/1` function was added.\n* In OTP 24.0, the `t:select_handle/0` argument was added for many functions,\n the `cancel/1`, `cancel_monitor/1`, `getopt/3` with tuple options,\n `getopt_native/3`, `info/0`, `monitor/1`, `open/3` with an option list,\n many variants of the [`recv/*`](`recv/2`),\n [`recvfrom/*`](`recvfrom/1`), [`recvmsg/*`](`recvmsg/1`),\n [`send/*`](`send/2`), [`sendmsg/*`](`sendmsg/2`),\n the [`sendto/*`](`sendto/3`) functions,\n the [`sendfile/*`](`sendfile/5`) functions,\n and the `setopt/3`, `setopt_native/3` functions, were added.\n* In OTP 24.1, the [`i/*`](`i/0`) functions were added.\n* In OTP 24.2, the [`ioctl/*`](`ioctl/2`) functions were added.\n* In OTP 26.0, the `t:completion_handle/0` argument was added for\n many functions, and the `cancel/2` function with `t:completion_info/0`\n argument was added. That is: support for Windows asynchronous\n I/O Completion Ports was added. The Unix-ish flavored\n ([select handle](`t:select_handle/0`)) API features could be considered\n no longer experimental.\n* In OTP 27.0, the Windows flavored\n ([completion handle](`t:completion_handle/0`))\n API features could be considered no longer experimental.","ref":"socket.html"},{"type":"module","title":"Examples - socket","doc":"```erlang\nclient(SAddr, SPort) ->\n {ok, Sock} = socket:open(inet, stream, tcp),\n ok = socket:connect(Sock, #{family => inet,\n addr => SAddr,\n port => SPort}),\n Msg = <<\"hello\">>,\n ok = socket:send(Sock, Msg),\n ok = socket:shutdown(Sock, write),\n {ok, Msg} = socket:recv(Sock),\n ok = socket:close(Sock).\n\nserver(Addr, Port) ->\n {ok, LSock} = socket:open(inet, stream, tcp),\n ok = socket:bind(LSock, #{family => inet,\n port => Port,\n addr => Addr}),\n ok = socket:listen(LSock),\n {ok, Sock} = socket:accept(LSock),\n {ok, Msg} = socket:recv(Sock),\n ok = socket:send(Sock, Msg),\n ok = socket:close(Sock),\n ok = socket:close(LSock).\n```","ref":"socket.html#module-examples"},{"type":"function","title":"socket.accept/1","doc":"Equivalent to [`accept(ListenSocket, infinity)`](`accept/2`).","ref":"socket.html#accept/1"},{"type":"function","title":"socket.accept/2","doc":"Accept a connection on a listening socket.\n\n`ListenSocket` has to be of a connection oriented type\n(types `stream` or `seqpacket`, see `open/1`), and set to listen\n(see `listen/1`).\n\n[](){: #accept-infinity }\n\nIf the `Timeout` argument is `infinity`; accepts the first pending\nincoming connection for the listen socket or wait for one to arrive,\nand return the new connection socket.\n\n[](){: #accept-timeout }\n\nIf the `Timeout` argument is a time-out value (`t:non_neg_integer/0`);\nreturns `{error, timeout}` if no connection has arrived\nafter `Timeout` milliseconds.\n\n[](){: #accept-nowait }\n\nIf the `Handle` argument `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.","ref":"socket.html#accept/2"},{"type":"function","title":"socket.bind/2","doc":"Bind a name to a socket.\n\nWhen a socket is created (with [`open`](`open/2`)), it has no address assigned\nto it. `bind` assigns the address specified by the `Addr` argument.\n\nThe rules used for name binding vary between domains.\n\nIf you bind a socket to an address in for example the `inet` or `inet6`\naddress families, with an ephemeral port number (`0`), and want to know\nwhich port that was chosen, you can find out using something like:\n`{ok, #{port := Port}} =`[`socket:sockname(Socket)`](`sockname/1`)","ref":"socket.html#bind/2"},{"type":"function","title":"socket.cancel/2","doc":"Cancel an asynchronous call in progress.\n\nCall this function to cancel an [asynchronous call](#asynchronous-calls)\nin progress, that is; it returned a value containing\na `t:completion_info/0` or `t:select_info/0`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nIf another process tries an operation of the same basic type\n(`accept/1` | `send/2` | `recv/2`) it will be enqueued and notified\nthrough a `select` or `completion` message when the current operation\nand all enqueued before it has been completed. If the current operation\nis canceled by this function it is treated as a completed operation;\nthe process first in queue is notified.\n\nIf [`SelectInfo`](`t:select_info/0`) `|`\n[`CompletionInfo`](`t:completion_info/0`) does not match\nan operation in progress for the calling process, this function returns\n`{error, {invalid, SelectInfo | CompletionInfo}}`.","ref":"socket.html#cancel/2"},{"type":"function","title":"socket.cancel_monitor/1","doc":"Cancel a socket monitor.\n\nIf `MRef` is a reference that the calling process obtained by calling\n`monitor/1`, this monitor is removed. If there is no such monitor\nfor the calling process (or MRef doesn't correspond to a monitor),\nnothing happens.\n\nThe returned value is one of the following:\n\n- **`true`** - The monitor was found and removed. In this case, no `'DOWN'`\n message corresponding to this monitor has been delivered and will not be\n delivered.\n\n- **`false`** - The monitor was not found so it couldn't be removed. This\n might be because the monitor has already triggered and there is\n a `'DOWN'` message from this monitor in the caller message queue.","ref":"socket.html#cancel_monitor/1"},{"type":"function","title":"socket.close/1","doc":"Close a socket.\n\n> #### Note {: .info }\n>\n> Note that for `Protocol = tcp` (see `open/3`), although\n> TCP guarantees that when the other side sees the stream close\n> all data that we sent before closing has been delivered,\n> there is no way for us to know that the other side got all data\n> and the stream close. All kinds of network and OS issues\n> may obliterate that.\n>\n> To get such a guarantee we need to implement an in-band acknowledge\n> protocol on the connection, or we can use the [`shutdown`](`shutdown/2`)\n> function to signal that no more data will be sent and then wait\n> for the other end to close the socket. Then we will see our read side\n> getting a socket close. In this way we implement a small\n> acknowledge protocol using `shutdown/2`. The other side cannot\n> know that we ever saw the socket close, but in a client/server\n> scenario that is often not relevant.","ref":"socket.html#close/1"},{"type":"function","title":"socket.connect/1","doc":"Finalize a [`connect/3`](#connect-nowait) operation.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nOn `select` systems this function finalizes a connection setup\non a socket, after receiving a `select` message\n`{'$socket',` [`Socket`](`t:socket/0`)`, select,\n`[`SelectHandle`](`t:select_handle/0`)`}`,\nand returns whether the connection setup was successful or not.\n\nInstead of calling this function, for backwards compatibility,\nit is allowed to call [`connect/2,3`](`connect/2`) again,\nbut that incurs more overhead since the connect address and\ntime-out argument are processed in vain.\n\nThe call that completes the connect operation, the second call,\ncannot return a `select` return value.","ref":"socket.html#connect/1"},{"type":"function","title":"socket.connect/2","doc":"Equivalent to\n[`connect(Socket, SockAddr, infinity)`](#connect-infinity).","ref":"socket.html#connect/2"},{"type":"function","title":"socket.connect/3","doc":"Connect the socket to the given address.\n\nThis function connects the socket to the address specified\nby the `SockAddr` argument.\n\nIf a connection attempt is already in progress (by another process),\n`{error, already}` is returned.\n\n> #### Note {: .info }\n>\n> On _Windows_ the socket has to be [_bound_](`bind/2`).\n\n[](){: #connect-infinity }\n\nIf the time-out argument (argument 3) is `infinity` it is\nup to the OS implementation to decide when the connection\nattempt failed and then what to return; probably `{error, etimedout}`.\nThe OS time-out may be very long.\n\n[](){: #connect-timeout }\n\nIf the time-out argument (argument 3) is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif the connection hasn't been established within `Timeout` milliseconds.\n\n> #### Note {: .info }\n>\n> Note that when this call has returned `{error, timeout}`\n> the connection state of the socket is uncertain since the platform's\n> network stack may complete the connection at any time,\n> up to some platform specific time-out.\n>\n> Repeating a connection attempt towards the same address would be ok, but\n> towards a different address could end up with a connection to either address.\n>\n> The safe play is to close the socket and start over.\n>\n> Also note that this applies to canceling a `nowait` connect call\n> described below.\n\n[](){: #connect-nowait }\n\nIf the time-out argument (argument 2) is `nowait` *(since OTP 22.1)*,\nstart an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the time-out argument (argument 2) is a `Handle ::` `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`Handle ::` `t:completion_handle/0` *(since OTP 26.0)*,\nstart an [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call `connect/1`\nto complete the operation.\n\nIf canceling the operation with `cancel/2` see the note above\nabout [connection time-out](#connect-timeout).","ref":"socket.html#connect/3"},{"type":"function","title":"socket.getopt/2","doc":"Get the value of a socket option.\n\nGets the value of an OS protocol level socket option, or from\nthe `otp` pseudo protocol level, which is this module's\nimplementation level above the OS protocol levels.\n\nSee the type [otp_socket_option() ](`t:otp_socket_option/0`)\nfor a description of the `otp` protocol level.\n\nSee the type `t:socket_option/0` for which OS protocol level options\nthat this implementation knows about, how they are related to OS option names,\nand if there are known peculiarities with any of them.\n\nWhat options that are valid depends on the OS, and on the kind of socket\n(`t:domain/0`,`t:type/0` and `t:protocol/0`). See the type\n`t:socket_option()` and the\n[socket options ](socket_usage.md#socket_options) chapter\nin the User's Guide for more info.\n\n> #### Note {: .info }\n>\n> Not all options are valid, nor possible to get, on all platforms. That is,\n> even if this `socket` implementation support an option; it doesn't mean\n> that the underlying OS does.","ref":"socket.html#getopt/2"},{"type":"function","title":"socket.getopt/3","doc":"Get a socket option _(backwards compatibility function)_.\n\nEquivalent to [`getopt(Socket, {Level, Opt})`](`getopt/2`),\nor as a special case if\n`Opt = {NativeOpt :: `[`integer/0`](`t:integer/0`)`, ValueSpec}`\nequivalent to\n[`getopt_native(Socket, {Level, NativeOpt}, ValueSpec)`](`getopt_native/3`).\n\nUse `getopt/2` or `getopt_native/3` instead to handle\nthe option level and name as a single term, and to make the\ndifference between known options and native options clear.","ref":"socket.html#getopt/3"},{"type":"function","title":"socket.getopt_native/3","doc":"Get a \"native\" socket option.\n\nGets a socket option that may be unknown to our implementation, or that has a\ntype not compatible with our implementation, that is; in \"native mode\".\n\nThe socket option may be specified with an ordinary\n[`socket_option()` ](`t:socket_option/0`) tuple, with a known\n[`Level = level()` ](`t:level/0`) and an integer `NativeOpt`,\nor with both an integer `NativeLevel` and `NativeOpt`.\n\nHow to decode the option value has to be specified either with `ValueType`,\nby specifying the `ValueSize` for a `t:binary/0` that will contain the fetched\noption value, or by specifying a `t:binary/0` `ValueSpec` that will be copied\nto a buffer for the `getsockopt()` call to write the value in which will be\nreturned as a new `t:binary/0`.\n\nIf `ValueType` is `integer` a `C` type `(int)` will be fetched, if it is\n`boolean` a `C` type `(int)` will be fetched and converted into a `t:boolean/0`\naccording to the `C` implementation's notion about true and false.\n\nIf an option is valid depends both on the platform and on\nwhat kind of socket it is (`t:domain/0`, `t:type/0` and `t:protocol/0`).\n\nThe integer values for `NativeLevel` and `NativeOpt` as well as the `Value`\nencoding has to be deduced from the header files for the running system.","ref":"socket.html#getopt_native/3"},{"type":"function","title":"socket.i/0","doc":"Print information to the erlang shell in table format\nfor all sockets.\n\nThe information printed for each socket is specified by the default set\nof `t:info_keys/0` (all keys).\n\nThe sockets that are printed are all sockets created by this\n`socket` module's implementation.","ref":"socket.html#i/0"},{"type":"function","title":"socket.i/1","doc":"Print information to the erlang shell in table format\nfor all sockets.\n\nIf the argument is a list of `t:info_keys/0`, print the specified\ninformation for all sockets. See `i/0`.\n\nOtherwise the same as `i/2` with the same first argument\nand the default information (see `i/0`).","ref":"socket.html#i/1"},{"type":"function","title":"socket.i/2","doc":"Print information to the erlang shell in table format\nfor a selection of sockets.\n\nThe argument [`InfoKeys`](`t:info_keys/0`) specifies which information\nis printed for each socket.\n\nIf the first argument is `Domain` print information for\nall sockets of that specific `t:domain/0`.\n\nIf the first argument is `Proto` print information for\nall sockets of that specific `t:protocol/0`.\n\nIf the first argument is `Type` print information for\nall sockets of that specific `t:type/0`.","ref":"socket.html#i/2"},{"type":"function","title":"socket.info/0","doc":"Get miscellaneous information about this `socket` library.\n\nThe function returns a map with each information item as a key-value pair.\n\n> #### Note {: .info }\n>\n> In order to ensure data integrity, mutexes are taken when needed.\n> So, don't call this function often.","ref":"socket.html#info/0"},{"type":"function","title":"socket.info/1","doc":"Get miscellaneous info about a socket.\n\nThe function returns a map with each information item as a key-value pair\nreflecting the \"current\" state of the socket.\n\n> #### Note {: .info }\n>\n> In order to ensure data integrity, mutexes are taken when needed.\n> So, don't call this function often.","ref":"socket.html#info/1"},{"type":"function","title":"socket.ioctl/2","doc":"Set socket (device) parameters.\n\nThis function retrieves a specific parameter, according to\nthe `GetRequest` argument.\n\n- **`gifconf`** - Get a list of interface (transport layer) addresses.\n\n Result; a list of `t:map/0`s, one for each interface,\n with its name and address.\n\n- **`nread`** - Get the number of bytes immediately available for reading\n *(since OTP 26.1)*.\n\n Result; the number of bytes, `t:integer/0`.\n\n- **`nwrite`** - Get the number of bytes in the send queue\n *(since OTP 26.1)*.\n\n Result; the number of bytes, `t:integer/0`.\n\n- **`nspace`** - Get the free space in the send queue\n *(since OTP 26.1)*.\n\n Result; the number of bytes, `t:integer/0`.\n\n- **`atmark`** - Test if there is OOB (out-of-bound) data waiting to be read\n *(since OTP 26.1)*.\n\n Result; a `t:boolean/0`.\n\n- **`tcp_info`** - Get miscellaneous TCP related information for a\n _connected_ socket *(since OTP 26.1)*.\n\n Result; a `t:map/0` with information items as key-value pairs.\n\n> #### Note {: .info }\n>\n> Not all requests are supported by all platforms.\n> To see if a ioctl request is supported on the current platform:\n>\n> ```erlang\n> \t Request = nread,\n> \t true = socket:is_supported(ioctl_requests, Request),\n> \t :\n> ```","ref":"socket.html#ioctl/2"},{"type":"function","title":"socket.ioctl/3","doc":"Get or set socket (device) parameters.\n\n[](){: #ioctl-get }\n\nThis function retrieves a specific parameter, according to\none of the following `GetRequest` arguments. The third argument is\nthe (lookup) \"key\", identifying the interface, for most requests\nthe name of the interface as a `t:string/0`.\nAlso, see the note above.\n\n- **`gifname`** - Get the name of the interface with the specified index\n (`t:integer/0`).\n\n Result; the name of the interface, `t:string/0`.\n\n- **`gifindex`** - Get the index of the interface with the specified name.\n\n Result; the interface index, `t:integer/0`.\n\n- **`gifaddr`** - Get the address of the interface with the specified name.\n\n Result; the address of the interface, `t:sockaddr/0`.\n\n- **`gifdstaddr`** - Get the destination address of the point-to-point\n interface with the specified name.\n\n Result; the destination address of the interface, `t:sockaddr/0`.\n\n- **`gifbrdaddr`** - Get the broadcast address of the interface with the\n specified name.\n\n Result; broadcast address of the interface, `t:sockaddr/0`.\n\n- **`gifnetmask`** - Get the network mask of the interface with\n the specified name.\n\n Result; the network mask of the interface, `t:sockaddr/0`.\n\n- **`gifhwaddr` | `genaddr`** - Get the hardware address for the interface with the\n specified name.\n\n Result; the hardware address of the interface, `t:sockaddr/0` | `t:binary/0`.\n The family field contains the 'ARPHRD' device type (or an integer).\n\n- **`gifmtu`** - Get the MTU (Maximum Transfer Unit) for the interface with the\n specified name.\n\n Result; MTU of the interface, `t:integer/0`.\n\n- **`giftxqlen`** - Get the transmit queue length of the interface with the\n specified name.\n\n Result; transmit queue length of the interface, `t:integer/0`.\n\n- **`gifflags`** - Get the active flag word of the interface\n with the specified name.\n\n Result; the active flag word of the interface, is a list of\n `t:ioctl_device_flag/0` `|` `t:integer( )`.\n\n[](){: #ioctl-set }\n\nWith the following `SetRequest` argument this function sets\nthe `Value` for the request parameter *(since OTP 26.1)*.\n\n- **`rcvall`** - Enables (or disables) a socket to receive all IPv4 or IPv6\n packages passing through a network interface.\n\n The `Socket` has to be one of:\n\n - **An IPv4 socket** - Created with the address\n [domain `inet`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `ip`](`t:protocol/0`).\n\n - **An IPv6 socket** - Created with the address\n [domain `inet6`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `ipv6`](`t:protocol/0`).\n\n The socket must also be bound to an (explicit) local IPv4 or IPv6 interface\n (`any` isn't allowed).\n\n Setting this IOCTL requires elevated privileges.\n\nWith the following `SetRequest` arguments this function sets\nthe `Value` for the request parameter *(since OTP 26.1)*.\n\n- **`rcvall_igmpmcall`** - Enables (or disables) a socket to receive IGMP\n multicast IP traffic, _without_ receiving any other IP traffic.\n\n The socket has to be created with the address\n [domain `inet`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `igmp`](`t:protocol/0`).\n\n The socket must also be bound to an (explicit) local interface\n (`any` isn't allowed).\n\n The receive buffer must be sufficiently large.\n\n Setting this IOCTL requires elevated privileges.\n\n- **`rcvall_mcall`** - Enables (or disables) a socket to receive all multicast\n IP traffic (as in; all IP packets destined for IP addresses in the range\n 224.0.0.0 to 239.255.255.255).\n\n The socket has to be created with the address\n [domain `inet`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `udp`](`t:protocol/0`).\n\n The socket must also be bound to an (explicit) local interface\n (`any` isn't allowed), And bound to port `0`.\n\n The receive buffer must be sufficiently large.\n\n Setting this IOCTL requires elevated privileges.","ref":"socket.html#ioctl/3"},{"type":"function","title":"socket.ioctl/4","doc":"Set socket (device) parameters.\n\nThis function sets a specific parameter, according to the `SetRequest`\nargument. The `Name` argument is the name of the interface,\nand the `Value` argument is the value to set.\n\nThese operations require elevated privileges.\n\n- **`sifflags`** - Set the the active flag word, `#{Flag => boolean()}`, of the\n interface with the specified name.\n\n Each flag to be changed should be added to the value `t:map/0`,\n with the value `true` if the `Flag` should be set and `false`\n if the flag should be cleared.\n\n- **`sifaddr`** - Set the address, `t:sockaddr/0`, of the interface with the\n specified name.\n\n- **`sifdstaddr`** - Set the destination address, `t:sockaddr/0`, of a\n point-to-point interface with the specified name.\n\n- **`sifbrdaddr`** - Set the broadcast address, `t:sockaddr/0`,\nof the interface with the specified name.\n\n- **`sifnetmask`** - Set the network mask, `t:sockaddr/0`, of the interface\n with the specified name.\n\n- **`sifhwaddr`** - Set the hardware address, `t:sockaddr/0`,\nof the interface with the specified name.\n\n- **`sifmtu`** - Set the MTU (Maximum Transfer Unit), `t:integer/0`,\n for the interface with the specified name.\n\n- **`siftxqlen`** - Set the transmit queue length, `t:integer/0`,\n of the interface with the specified name.","ref":"socket.html#ioctl/4"},{"type":"function","title":"socket.is_supported/1","doc":"Check if a socket feature is supported.\n\nReturns `true` if `supports/0` has a `{Key1, true}` tuple\nor a `{Key1, list()}` tuple in its returned list,\notherwise `false` (also for unknown keys).\n\nExample:\n``` erlang\ntrue = socket:is_supported(local),\n```","ref":"socket.html#is_supported/1"},{"type":"function","title":"socket.is_supported/2","doc":"Check if a socket feature is supported.\n\nReturns `true` if [`supports(Key1)`](`supports/1`) has a `{Key2, true}` tuple\nin its returned list, otherwise `false` (also for unknown keys).\n\nExample:\n``` erlang\ntrue = socket:is_supported(msg_flags, errqueue),\n```","ref":"socket.html#is_supported/2"},{"type":"function","title":"socket.listen/1","doc":"Make a socket listen for connections.\n\nEquivalent to [`listen(Socket, Backlog)`](`listen/2`) with a default\nvalue for `Backlog` (currently `5`).","ref":"socket.html#listen/1"},{"type":"function","title":"socket.listen/2","doc":"Make a socket listen for connections.\n\nThe `Backlog` argument states the length of the queue for\nincoming not yet accepted connections.\nExactly how that number is interpreted is up to the OS'\nprotocol stack, but the resulting effective queue length\nwill most probably be perceived as at least that long.\n\n> #### Note {: .info }\n>\n> On _Windows_ the socket has to be _bound_.","ref":"socket.html#listen/2"},{"type":"function","title":"socket.monitor/1","doc":"Start a socket monitor.\n\nIf the `Socket` doesn't exist or when later the monitor is triggered,\na `'DOWN'` message is sent to the process that called `monitor/1`\nwith the following pattern:\n\n``` erlang\n\t {'DOWN', MonitorRef, socket, Socket, Info}\n```\n`Info` is the termination reason of the socket or `nosock` if\n`Socket` did not exist when the monitor was started.\n\nMaking several calls to `socket:monitor/1` for the same `Socket` is not an\nerror; each call creates an independent monitor instance.","ref":"socket.html#monitor/1"},{"type":"function","title":"socket.number_of/0","doc":"Return the number of active sockets.","ref":"socket.html#number_of/0"},{"type":"function","title":"socket.open/1","doc":"Equivalent to [`open(FD, #{})`](`open/2`).","ref":"socket.html#open/1"},{"type":"function","title":"socket.open/2","doc":"Create a socket.\n\n#### With arguments `Domain` and `Type`\n\nEquivalent to [`open(Domain, Type, default, #{})`](`open/4`).\n\n#### With arguments `FD` and `Opts` *(since OTP 23.0)*\n\nCreates an endpoint for communication (socket) based on\nan already existing file descriptor that must be a socket.\nThis function attempts to retrieve the file descriptor's\n`domain`, `type` and `protocol` from the system.\nThis is however not possible on all platforms;\nin that case they should be specified in `Opts`.\n\nThe `Opts` argument can provide extra information:\n\n- **`domain`** - The file descriptor's communication domain. See also\n\n [`open/2,3,4`](`open/3`).\n\n- **`type`** - The file descriptor's socket type.\n\n See also [`open/2,3,4`](`open/3`).\n\n- **`protocol`** - The file descriptor's protocol. The atom `default` is\n equivalent to the integer protocol number `0` which means the default\n protocol for a given domain and type.\n\n If the protocol can not be retrieved from the platform for the socket, and\n `protocol` is not specified, the default protocol is used, which may\n or may not be correct.\n\n See also [`open/2,3,4`](`open/3`).\n\n- **`dup`** - If `false` don't duplicate the provided file descriptor.\n\n Defaults to `true`; do duplicate the file descriptor.\n\n- **`debug`** - If `true` enable socket debug logging.\n\n Defaults to `false`; don't enable socket debug logging.\n\n- **`use_registry`** - Enable or disable use of the socket registry\n for this socket. This overrides the global setting.\n\n Defaults to the global setting, see `use_registry/1`.\n\n> #### Note {: .info }\n>\n> This function should be used with care\\!\n>\n> On some platforms it is _necessary_ to provide `domain`, `type` and `protocol`\n> since they cannot be retrieved from the platform.\n>\n> On some platforms it is not easy to get hold of a file descriptor\n> to use in this function.","ref":"socket.html#open/2"},{"type":"function","title":"socket.open/3","doc":"Create a socket.\n\n#### With arguments `Domain`, `Type` and `Protocol`\n\nEquivalent to [`open(Domain, Type, Protocol, #{})`](`open/4`).\n\n#### With arguments `Domain`, `Type` and `Opts` *(since OTP 24.0)*\n\nEquivalent to [`open(Domain, Type, default, #{})`](`open/4`).","ref":"socket.html#open/3"},{"type":"function","title":"socket.open/4","doc":"Create a socket.\n\nCreates an endpoint for communication (socket).\n\n`Domain` and `Type` may be `t:integer/0`s, as defined in the platform's\nheader files. The same goes for `Protocol` as defined in the platform's\n`services(5)` database. See also the OS man page for the library call\n`socket(2)`.\n\n> #### Note {: .info }\n>\n> For some combinations of `Domain` and `Type` the platform has got\n> a default protocol that can be selected with `Protocol = default`,\n> and the platform may allow or require selecting the default protocol,\n> or a specific protocol.\n>\n> Examples:\n>\n> - **`socket:open(inet, stream, tcp)`** - It is common that for\n> protocol domain and type `inet,stream` it is allowed to select\n> the `tcp` protocol although that mostly is the default.\n> - **`socket:open(local, dgram)`** - It is common that for\n> the protocol domain `local` it is mandatory to not select a protocol,\n> that is; to select the default protocol.\n\nThe `Opts` argument is intended for \"other\" options.\nThe supported option(s) are described below:\n\n- **`netns: string()`** - Used to set the network namespace during the open\n call. Only supported on Linux.\n\n- **`debug: boolean()`** - Enable or disable debug logging.\n\n Defaults to `false`.\n\n- **`use_registry: boolean()`** - Enable or disable use of the socket registry\n for this socket. This overrides the global value.\n\n Defaults to the global value, see `use_registry/1`.","ref":"socket.html#open/4"},{"type":"function","title":"socket.peername/1","doc":"Return the remote address of a socket.\n\nReturns the address of the connected peer, that is,\nthe remote end of the socket.","ref":"socket.html#peername/1"},{"type":"function","title":"socket.recv/1","doc":"Equivalent to [`recv(Socket, 0, [], infinity)`](`recv/4`).","ref":"socket.html#recv/1"},{"type":"function","title":"socket.recv/2","doc":"Receive data on a connected socket.\n\nWith argument `Length`; equivalent to\n[`recv(Socket, Length, [], infinity)`](`recv/4`).\n\nWith argument `Flags`; equivalent to\n[`recv(Socket, 0, Flags, infinity)`](`recv/4`) *(since OTP 24.0)*.","ref":"socket.html#recv/2"},{"type":"function","title":"socket.recv/3","doc":"Receive data on a connected socket.\n\nWith arguments `Length` and `Flags`; equivalent to\n[`recv(Socket, Length, Flags, infinity)`](`recv/4`).\n\nWith arguments `Length` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, Length, [], TimeoutOrHandle)`](`recv/4`).\n`TimeoutOrHandle :: nowait` has been allowed *since OTP 22.1*.\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.\n\nWith arguments `Flags` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, 0, Flags, TimeoutOrHandle)`](`recv/4`)\n*(since OTP 24.0)*.","ref":"socket.html#recv/3"},{"type":"function","title":"socket.recv/4","doc":"Receive data on a connected socket.\n\nThe argument `Length` specifies how many bytes to receive,\nwith the special case `0` meaning \"all available\".\n\nWhen `Length` is `0`, a default buffer size is used, which can be set by\n[`socket:setopt(Socket, {otp,recvbuf}, BufSz)`](`setopt/3`).\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\nWhen there is a socket error this function returns `{error, Reason}`,\nor if some data arrived before the error; `{error, {Reason, Data}}`\n(can only happen for a socket of [type `stream`](`t:type/0`)).\n\n[](){: #recv-infinity }\n\nIf the `Timeout` argument is `infinity`; waits for the data to arrive.\nFor a socket of [type `stream`](`t:type/0`) this call\nwon't return until _all_ requested data can be delivered,\nor if \"all available\" was requested when the first data chunk arrives,\nor if the OS reports an error for the operation.\n\n[](){: #recv-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has arrived after `Timeout` milliseconds,\nor `{error, {timeout, Data}}` if some but not enough data\nhas been received on a socket of [type `stream`](`t:type/0`).\n\n`Timeout = 0` only polls the OS receive call and doesn't\nengage the Asynchronous Calls mechanisms. If no data\nis immediately available `{error, timeout} is returned.\n`On a socket of type [`stream`](`t:type/0`), `{error, {timeout, Data}}`\nis returned if there is an insufficient amount of data immediately available.\n\n[](){: #recv-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nOn `select` systems, for a socket of type [`stream`](`t:type/0`),\nif `Length > 0` and there isn't enough data available, this function\nwill return [`{select, {SelectInfo, Data}}`](`t:select_info/0`)\nwith partial `Data`. A repeated call to complete the operation\nwill probably need an updated `Length` argument.","ref":"socket.html#recv/4"},{"type":"function","title":"socket.recvfrom/1","doc":"Equivalent to [`recvfrom(Socket, 0, [], infinity)`](`recvfrom/4`).","ref":"socket.html#recvfrom/1"},{"type":"function","title":"socket.recvfrom/2","doc":"Receive a message on a socket.\n\nWith argument `BufSz`; equivalent to\n[`recvfrom(Socket, BufSz, [], infinity)`](`recvfrom/4`).\n\nWith argument `Flags`; equivalent to\n[`recvfrom(Socket, 0, Flags, infinity)`](`recvfrom/4`) *(since OTP 24.0)*.","ref":"socket.html#recvfrom/2"},{"type":"function","title":"socket.recvfrom/3","doc":"Receive a message on a socket.\n\nWith arguments `BufSz` and `Flags`; equivalent to\n[`recvfrom(Socket, BufSz, Flags, infinity)`](`recvfrom/4`).\n\nWith arguments `BufSz` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, BufSz, [], TimeoutOrHandle)`](`recvfrom/4`).\n\nWith arguments `Flags` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, 0, Flags, TimeoutOrHandle)`](`recvfrom/4`)\n\n`TimeoutOrHandle :: 'nowait'` has been allowed *since OTP 22.1*.\n\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.","ref":"socket.html#recvfrom/3"},{"type":"function","title":"socket.recvfrom/4","doc":"Receive a message on a socket.\n\nThis function is intended for sockets that are not connection\noriented such as type [`dgram`](`t:type/0`) or [`seqpacket`](`t:type/0`)\nwhere it may arrive messages from different source addresses.\n\nArgument `BufSz` specifies the number of bytes for the receive buffer.\nIf the buffer size is too small, the message will be truncated.\n\nIf `BufSz` is `0`, a default buffer size is used, which can be set by\n[`socket:setopt(Socket, {otp,recvbuf}, BufSz)`](`setopt/3`).\n\nIf there is no known appropriate buffer size, it may be possible\nto use the receive [message flag](`t:msg_flag/0`) `peek`.\nWhen this flag is used, the message is _not_ \"consumed\" from\nthe underlying buffers, so another `recvfrom/1,2,3,4` call\nis needed, possibly with an adjusted buffer size.\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s, as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\n[](){: #recvfrom-infinity }\n\nIf the `Timeout` argument is `infinity`; waits for a message\nto arrive, or for a socket error.\n\n[](){: #recvfrom-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); returns `{error, timeout}`\nif no message has arrived after `Timeout` milliseconds.\n\n`Timeout = 0` only polls the OS receive call and doesn't\nengage the Asynchronous Calls mechanisms. If no message\nis immediately available `{error, timeout}` is returned.\n\n[](){: #recvfrom-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the 'Handle' argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*,\nstarts an [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.","ref":"socket.html#recvfrom/4"},{"type":"function","title":"socket.recvmsg/1","doc":"Equivalent to [`recvmsg(Socket, 0, 0, [], infinity)`](`recvmsg/5`).","ref":"socket.html#recvmsg/1"},{"type":"function","title":"socket.recvmsg/2","doc":"Receive a message on a socket.\n\nWith argument `Flags`; equivalent to\n[`recvmsg(Socket, 0, 0, Flags, infinity)`](`recvmsg/5`).\n\nWith argument `TimeoutOrHandle`; equivalent to\n[`recvmsg(Socket, 0, 0, [], TimeoutOrHandle)`](`recvmsg/5`).\n\n`TimeoutOrHandle :: nowait` has been allowed *since OTP 22.1*.\n\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.","ref":"socket.html#recvmsg/2"},{"type":"function","title":"socket.recvmsg/3","doc":"Receive a message on a socket.\n\nWith arguments `Flags`; equivalent to\n[`recvmsg(Socket, 0, 0, Flags, infinity)`](`recvmsg/5`).\n\nWith argument `TimeoutOrHandle`; equivalent to\n[`recvmsg(Socket, 0, 0, [], TimeoutOrHandle)`](`recvmsg/5`).\n\n`TimeoutOrHandle :: nowait` has been allowed *since OTP 22.1*.\n\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.","ref":"socket.html#recvmsg/3"},{"type":"function","title":"socket.recvmsg/4","doc":"Equivalent to\n[`recvmsg(Socket, BufSz, CtrlSz, [], TimeoutOrHandle)`](`recvmsg/5`).","ref":"socket.html#recvmsg/4"},{"type":"function","title":"socket.recvmsg/5","doc":"Receive a message on a socket.\n\nThis function receives both data and control messages.\n\nArguments `BufSz` and `CtrlSz` specifies the number of bytes for the\nreceive buffer and the control message buffer. If the buffer size(s)\nis(are) too small, the message and/or control message list will be truncated.\n\nIf `BufSz` is `0`, a default buffer size is used, which can be set by\n[`socket:setopt(Socket, {otp,recvbuf}, BufSz)`](`setopt/3`).\nThe same applies to `CtrlSz` and\n[`socket:setopt(Socket, {otp,recvctrlbuf}, CtrlSz)`](`setopt/3`).\n\nIf there is no known appropriate buffer size, it may be possible\nto use the receive [message flag](`t:msg_flag/0`) `peek`.\nWhen this flag is used, the message is _not_ \"consumed\" from\nthe underlying buffers, so another `recvfrom/1,2,3,4` call\nis needed, possibly with an adjusted buffer size.\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s, as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\n[](){: #recvmsg-infinity }\n\nIf the `Timeout` argument is `infinity`; waits for the message\nto arrive, or for a socket error.\n\n[](){: #recvmsg-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no message has arrived after `Timeout` milliseconds.\n\n`Timeout = 0` only polls the OS receive call and doesn't\nengage the Asynchronous Calls mechanisms. If no message\nis immediately available `{error, timeout}` is returned.\n\n[](){: #recvmsg-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the 'Handle' argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*,\nstarts an [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.","ref":"socket.html#recvmsg/5"},{"type":"function","title":"socket.send/2","doc":"Equivalent to [`send(Socket, Data, [], infinity)`](`send/4`).","ref":"socket.html#send/2"},{"type":"function","title":"socket.send/3","doc":"Send data on a connected socket.\n\nWith argument `Timeout`; equivalent to\n[`send(Socket, Data, [], Timeout)`](`send/4`).\n\nWith argument `Flags`; equivalent to\n[`send(Socket, Data, Flags, infinity)`](`send/4`).\n\nWith argument `Cont`; equivalent to\n[`send(Socket, Data, Cont, infinity)`](`send/4`) *(since OTP 24.0)*.","ref":"socket.html#send/3"},{"type":"function","title":"socket.send/4","doc":"Send data on a connected socket.\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\nThe `Data`, if it is not a `t:binary/0`, is copied into one before\ncalling the platform network API, because a single buffer is required.\nA returned `RestData` is a sub binary of it.\n\nThe return value indicates the result from the platform's network layer:\n\n- **`ok`** - All data was accepted by the OS for delivery\n\n- **`{ok, RestData}`** - Some but not all data was accepted,\n but no error was reported (partially successful send). `RestData`\n is the tail of `Data` that wasn't accepted.\n\n This cannot happen for a socket of [type `stream`](`t:type/0`) where\n such a partially successful send is retried until the data is either\n accepted for delivery or there is an error.\n\n For a socket of [type `dgram`](`t:type/0`) this should probably\n also not happen since a message that cannot be passed atomically\n should render an error.\n\n It is nevertheless possible for the platform's network layer\n to return this, surely more possible for a socket of\n [type `seqpacket`](`t:type/0`).\n\n- **`{error, Reason}`** - An error has been reported and no data\n was accepted for delivery. [`Reason :: posix/0`](`t:posix/0`)\n is what the platform's network layer reported. `closed` means\n that this socket library was informed that the socket was closed,\n and `t:invalid/0` means that this socket library found\n an argument to be invalid.\n\n- **`{error, {Reason, RestData}}`** - An error was reported but before that\n some data was accepted for delivery. `RestData` is the tail of `Data`\n that wasn't accepted. See `{error, Reason}` above.\n\n This can only happen for a socket of [type `stream`](`t:type/0`)\n when a partially successful send is retried until there is an error.\n\n[](){: #send-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #send-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestData}}` if some data was sent\n(accepted by the OS for delivery). `RestData` is the tail of the data\nthat hasn't been sent.\n\n[](){: #send-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\n[](){: #send-cont }\n\nIf the function is called with a `Cont` argument, that is;\nthe [`SelectInfo`](`t:select_info/0`) from the previous\n[`send/3,4`](`send/3`) call; the send is continued with\npreprocessed send parameters in the `SelectInfo`.\nUsing this argument variant avoids for example having to validate\nand encode message flags in every call but the first.","ref":"socket.html#send/4"},{"type":"function","title":"socket.sendfile/2","doc":"Send a file on a socket.\n\nEquivalent to\n[`sendfile(Socket, FileHandle_or_Continuation, 0, 0, infinity)`](`sendfile/5`).","ref":"socket.html#sendfile/2"},{"type":"function","title":"socket.sendfile/3","doc":"Send a file on a socket.\n\nEquivalent to\n[`sendfile(Socket, FileHandle_or_Continuation, 0, 0, Timeout_or_Handle)`](`sendfile/5`).","ref":"socket.html#sendfile/3"},{"type":"function","title":"socket.sendfile/4","doc":"Send a file on a socket.\n\nEquivalent to\n[`sendfile(Socket, FileHandle_or_Continuation, Offset, Count, infinity)`](`sendfile/5`).","ref":"socket.html#sendfile/4"},{"type":"function","title":"socket.sendfile/5","doc":"Send a file on a socket.\n\n> #### Note {: .info }\n> This function unsupported on Windows.\n\nThe `FileHandle` argument must refer to an open raw file\nas described in `file:open/2`.\n\nThe `Offset` argument is the file offset to start reading from.\nThe default offset is `0`.\n\nThe `Count` argument is the number of bytes to transfer\nfrom `FileHandle` to `Socket`. If `Count = 0` (the default)\nthe transfer stops at the end of file.\n\nThe return value indicates the result from the platform's network layer:\n\n- **`{ok, BytesSent}`** - The transfer completed successfully after `BytesSent`\n bytes of data.\n\n- **`{error, Reason}`** - An error has been reported and no data\n was transferred. [`Reason :: posix/0`](`t:posix/0`)\n is what the platform's network layer reported. `closed` means\n that this socket library was informed that the socket was closed,\n and `t:invalid/0` means that this socket library found\n an argument to be invalid.\n\n- **`{error, {Reason, BytesSent}}`** - An error has been reported\n but before that some data was transferred. See `{error, Reason}`\n and `{ok, BytesSent}` above.\n\n[](){: #sendfile-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendfile-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, BytesSent}}` if some but not all data was sent\n(accepted by the OS for delivery).\n\n[](){: #sendfile-nowait }\n\nIf the `Handle` argument is `nowait`,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call [`sendfile/2,3,4,5`](`sendfile/2`)\nwith `SelectInfo` as the `Continuation` argument, to complete the operation.\n\n[](){: #sendfile-cont }\n\nIf the function is called with a `Continuation` argument, that is;\nthe [`SelectInfo`](`t:select_info/0`) from the previous\n`sendfile/5` call; the transfer is continued with\npreprocessed parameters in the `SelectInfo`.\n\nThe `Offset` and maybe `Count` arguments will probably\nneed to be updated between continuation calls.","ref":"socket.html#sendfile/5"},{"type":"function","title":"socket.sendmsg/2","doc":"Equivalent to [`sendmsg(Socket, Msg, [], infinity)`](`sendmsg/4`).","ref":"socket.html#sendmsg/2"},{"type":"function","title":"socket.sendmsg/3","doc":"Send data and control messages on a socket.\n\nWith arguments `Msg` and `Timeout`; equivalent to\n[`sendmsg(Socket, Msg, [], Timeout)`](`sendmsg/4`).\n\nWith arguments `Msg` and `Flags`; equivalent to\n[`sendmsg(Socket, Msg, Flags, infinity)`](`sendmsg/4`).\n\nWith arguments `Data` and `Cont`; equivalent to\n[`sendmsg(Socket, Data, Cont, infinity)`](`sendmsg/4`) *since OTP 24.0*.","ref":"socket.html#sendmsg/3"},{"type":"function","title":"socket.sendmsg/4","doc":"Send data and control messages on a socket.\n\nThe argument `Msg` is a map that contains the data to be sent\nunder the key `iov` as an`t:erlang:iovec/0` (list of `t:binary/0`).\nIt may also contain the destination address under the key `addr`,\nwhich is mandatory if the socket isn't connected. If the socket\n_is_ connected it is best to not have an `addr` key since\nthe platform may regard that as an error (or ignore it).\nUnder the key `ctrl` there may be a list of protocol and platform dependent\ncontrol messages (a.k.a ancillary data, a.k.a control information)\nto send.\n\n[](){: #sendmsg-iov }\n\nThe message data is given to the platform's network layer as an\nI/O vector without copying the content. If the number of elements\nin the I/O vector is larger than allowed on the platform (reported\nin the [`iov_max`](`t:info/0`) field from `info/0`), on a socket of\n[type `stream`](`t:type/0`) the send is iterated over all elements,\nbut for other socket types the call fails.\n\nSee `send/4` for a description of the `Flags` argument\nand the return values.\n\n> #### Note {: .info }\n>\n> On Windows, this function can only be used with datagram and raw sockets.\n\n[](){: #sendmsg-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendmsg-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestData}}` if some data was sent\n(accepted by the OS for delivery). `RestData` is the tail of the data\nthat hasn't been sent.\n\n[](){: #sendmsg-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call [`sendmsg/3,4`](`sendmsg/3`)\nwith `SelectInfo` as the `Cont` argument, to complete the operation.\n\n[](){: #sendmsg-cont }\n\nWith the arguments `Data` and [`Cont`](`t:select_info/0`),\ncontinues the send operation. `Cont` should be\nthe [`SelectInfo`](`t:select_info/0`) returned from the previous\n[`sendmsg/2,3,4`](`sendmsg/2`) call.\n\n`Data` can be a [`Msg`](`t:msg_send/0`) `t:map/0`\nwhere only the key `iov` is used, or an `t:erlang:iovec/0`.","ref":"socket.html#sendmsg/4"},{"type":"function","title":"socket.sendto/3","doc":"Send data on a socket.\n\nWith argument `Dest`; equivalent to\n[`sendto(Socket, Data, Dest, [], infinity)`](`sendto/5`).\n\nWith argument `Cont`; equivalent to\n[`sendto(Socket, Data, Cont, infinity)`](`sendto/4`) *since OTP 24.0*.","ref":"socket.html#sendto/3"},{"type":"function","title":"socket.sendto/4","doc":"Send data on a socket.\n\nWith arguments `Dest` and `TimeoutOrHandle`; equivalent to\n[`sendto(Socket, Data, Dest, [], TimeoutOrHandle)`](`sendto/5`).\n\nWith arguments `Dest` and `Flags`; equivalent to\n[`sendto(Socket, Data, Dest, Flags, infinity)`](`sendto/5`).\n\nWith arguments `Cont` and `TimeoutOrHandle`; `Cont` must be\nthe [`SelectInfo`](`t:select_info/0`) from the previous\n[`sendto/3,4,5`](`sendto/3`) call and the send is continued with\npreprocessed send parameters in the `SelectInfo`.\nUsing this argument variant avoids for example having o validate\nand encode message flags in every call but the first.\n*(Since OTP 24.0)*\n\nSee the last argument (argument 5) of `sendto/5` for\nan explanation of `TimeoutOrHandle`.","ref":"socket.html#sendto/4"},{"type":"function","title":"socket.sendto/5","doc":"Send data on a socket.\n\nThe `To` argument is the destination address where to send the data.\nFor a connected socket this argument is still passed to the OS call\nthat may ignore the address or return an error.\n\nSee `send/4` for a description of the `Flags` and `Data` arguments,\nand the return values.\n\n[](){: #sendto-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendto-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestData}}` if some data was sent\n(accepted by the OS for delivery). `RestData` is the tail of the data\nthat hasn't been sent.\n\n[](){: #sendto-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call [`sendto/3,4`](`sendto/3`)\nwith `SelectInfo` as the `Cont` argument, to complete the operation.","ref":"socket.html#sendto/5"},{"type":"function","title":"socket.sendv/2","doc":"","ref":"socket.html#sendv/2"},{"type":"function","title":"socket.sendv/3","doc":"Send `t:erlang:iovec/0` data on a connected socket.\n\nSee [`sendmsg/4`](#sendmsg-iov) about how the [`IOV`](`t:erlang:iovec/0`)\ndata is handled towards the platform's network layer.\n\nThe return value indicates the result from the platform's network layer:\n\n- **`ok`** - All data has been accepted by the OS for delivery.\n\n- **`{ok, RestIOV}`** - Some but not all data was accepted,\n but no error was reported (partially successful send). `RestIOV`\n is the tail of `IOV` that wasn't accepted.\n\n- **`{error, Reason}`** - An error has been reported and no data\n was accepted for delivery. [`Reason :: posix/0`](`t:posix/0`)\n is what the platform's network layer reported. `closed` means\n that this socket library was informed that the socket was closed,\n and `t:invalid/0` means that this socket library found\n an argument to be invalid.\n\n- **`{error, {Reason, RestIOV}}`** - - An error was reported but before that\n some data was accepted for delivery. `RestIOV` is the tail of `IOV`\n that wasn't accepted. See `{error, Reason}` above.\n\n[](){: #sendv-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendv-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestIOV}}` if some data was sent\n(accepted by the OS for delivery). `RestIOV` is the tail of the data\nthat hasn't been sent.\n\n[](){: #sendv-nowait }\n\nIf the `Handle` argument is `nowait`,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\nor on _Windows_, the equivalent `t:completion_handle/0`, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\n[](){: #sendv-cont }\n\nWith the argument [`Cont`](`t:select_info/0`), equivalent to\n[`sendv(Socket, IOV, Cont, infinity)`](`sendv/4`).","ref":"socket.html#sendv/3"},{"type":"function","title":"socket.sendv/4","doc":"Send data on a connected socket, continuation.\n\nContinues sending data on a connected socket.\n`Cont` is the [`SelectInfo`](`t:select_info/0`) returned from\nthe previous [`sendv/2,3`](`sendv/2`) call.\n`IOV` should be the rest data that wasn't sent.\n\nSee [asynchronous calls](#asynchronous-calls) about continuing\nunfinished calls.\n\nSee `sendv/3` about the return values.","ref":"socket.html#sendv/4"},{"type":"function","title":"socket.setopt/3","doc":"Set a socket option.\n\nSet an OS protocol level option, or an `otp` pseudo protocol level option.\nThe latter level is this module's implementation level above\nthe OS protocol levels.\n\nSee the type [otp_socket_option() ](`t:otp_socket_option/0`)\nfor a description of the `otp` protocol level.\n\nSee the type `t:socket_option/0` for which OS protocol level options\nthat this implementation knows about, how they are related to OS option names,\nand if there are known peculiarities with any of them.\n\nWhat options that are valid depends on the OS, and on the kind of socket\n(`t:domain/0`,`t:type/0` and `t:protocol/0`). See the type\n`t:socket_option()` and the\n[socket options ](socket_usage.md#socket_options) chapter\nin the User's Guide for more info.\n\n> #### Note {: .info }\n>\n> Not all options are valid, nor possible to set, on all platforms. That is,\n> even if this `socket` implementation support an option; it doesn't mean\n> that the underlying OS does.","ref":"socket.html#setopt/3"},{"type":"function","title":"socket.setopt/4","doc":"Set a socket option _(backwards compatibility function)_.\n\nEquivalent to [`setopt(Socket, {Level, Opt}, Value)`](`setopt/3`),\nor as a special case if `Opt = NativeOpt ::` `t:integer/0`\nand `Value =` `t:binary/0` equivalent to\n[`setopt_native(Socket, {Level, NativeOpt}, ValueSpec)`](`setopt_native/3`).\n\nUse `setopt/3` or `setopt_native/3` instead to handle\nthe option level and name as a single term, and to make the\ndifference between known options and native options clear.","ref":"socket.html#setopt/4"},{"type":"function","title":"socket.setopt_native/3","doc":"Set a \"native\" socket option.\n\nSets a socket option that may be unknown to our implementation, or that has a\ntype not compatible with our implementation, that is; in \"native mode\".\n\nIf `Value` is an `t:integer/0` it will be used as a `C` type `(int)`,\nif it is a `t:boolean/0` it will be used as a `C` type `(int)`\nwith the `C` implementations values for `false` or `true`,\nand if it is a `t:binary/0` its content and size will be used\nas the option value.\n\nThe socket option may be specified with an ordinary\n`t:socket_option/0` tuple, with a symbolic `Level` as\n`{`[`Level :: level/0`](`t:level/0`)`, `[`NativeOpt :: integer/0`](`t:integer/0`)`}`,\nor with integers for both `NativeLevel` and `NativeOpt` as\n`{`[`NativeLevel :: integer/0`](`t:integer/0`)`, `[`NativeOpt :: integer/0`](`t:integer/0`)`}`.\n\nIf an option is valid depends both on the platform and on\nwhat kind of socket it is (`t:domain/0`, `t:type/0` and `t:protocol/0`).\n\nThe integer values for `NativeLevel` and `NativeOpt` as well as the `Value`\nencoding has to be deduced from the header files for the running system.","ref":"socket.html#setopt_native/3"},{"type":"function","title":"socket.shutdown/2","doc":"Shut down all or part of a full-duplex connection.","ref":"socket.html#shutdown/2"},{"type":"function","title":"socket.sockname/1","doc":"Get the socket's address.\n\nReturns the address to which the socket is currently bound.\nIf the bind address had the wildcard port `0`,\nthe address returned by this function contains the ephemeral port\nselected by the OS.","ref":"socket.html#sockname/1"},{"type":"function","title":"socket.supports/0","doc":"Retrieve information about what socket features\nthe module and the platform supports.\n\nReturns a list of, in no particular order,\n`{Key1, `[`supports(Key1)`](`supports/1`)`}` tuples\nfor every `Key1` described in `supports/1`,\nand `{Key, boolean()}` tuples for each of the following keys:\n\n- **`sctp`** - SCTP support\n\n- **`ipv6`** - IPv6 support\n\n- **`local`** - Unix Domain sockets support (`AF_UNIX | AF_LOCAL`)\n\n- **`netns`** - Network Namespaces support (Linux, `setns(2)`)\n\n- **`sendfile`** - Sendfile support (`sendfile(2)`)","ref":"socket.html#supports/0"},{"type":"function","title":"socket.supports/1","doc":"Retrieve information about what socket features\nthe module and the platform supports.\n\nIf `Key1 = msg_flags` returns a list of `{Flag, boolean()}`\ntuples for every `Flag` in `t:msg_flag/0` with the `t:boolean/0`\nindicating if the flag is supported on this platform.\n\nIf `Key1 = protocols` returns a list of `{Name, boolean()}`\ntuples for every `Name` in`t:protocol/0` with the `t:boolean/0`\nindicating if the protocol is supported on this platform.\n\nIf `Key1 = options` returns a list of `{SocketOption, boolean()}`\ntuples for every `SocketOption` in `t:socket_option/0` with the `t:boolean/0`\nindicating if the socket option is supported on this platform.\n\nThere is no particular order of any of the returned lists.\n\nFor other values of `Key1` returns `[]`.\nNote that in future versions of this module or on different platforms,\nthere might be more supported keys.","ref":"socket.html#supports/1"},{"type":"function","title":"socket.supports/2","doc":"Retrieve information about what socket features\nthe module and the platform supports.\n\nIf `Key1 = options`, for a `Key2` in `t:level/0` returns\na list of `{Opt, boolean()}` tuples for all known socket options\n[`Opt` on that `Level = Key2`](`t:socket_option/0`) with the `t:boolean/0`\nindicating if the socket option is supported on this platform.\nSee `setopt/3` and `getopt/2`.\n\nThere is no particular order of any of the returned lists.\n\nFor other values of `Key1` or `Key2` returns `[]`.\nNote that in future versions of this module or on different platforms,\nthere might be more supported keys.","ref":"socket.html#supports/2"},{"type":"function","title":"socket.use_registry/1","doc":"Set the global [`use_registry`](`t:otp_socket_option/0`)\noption default value.\n\nGlobally change if the socket registry is to be used or not.\nNote that its still possible to override this explicitly\nwhen creating an individual sockets, see [`open/2,3,4`](`open/2`)\nfor more info (the [`Opts :: map/0`](`t:map/0`)).","ref":"socket.html#use_registry/1"},{"type":"function","title":"socket.which_sockets/0","doc":"Return a list of all known sockets.\n\nEquivalent to [`which_sockets(fun (_) -> true end)`](`which_sockets/1`).","ref":"socket.html#which_sockets/0"},{"type":"function","title":"socket.which_sockets/1","doc":"Return a filtered list of known sockets.\n\nThere are several predefined `FilterRule`s and one general:\n\n- **`inet | inet6`** - Only the sockets with matching `t:domain/0`\n are returned.\n\n- **`stream | dgram | seqpacket`** - Only the sockets with\n matching `t:type/0` are returned.\n\n- **`sctp | tcp | udp`** - Only the sockets with\n matching `t:protocol/0` are returned.\n\n- **`t:pid/0`** - Only the sockets with matching Controlling Process\n are returned. See the OTP socket option\n [`controlling_process`](`t:otp_socket_option/0`).\n\n- **`fun((socket_info()) -> boolean())`** - The general filter rule.\n A fun that takes the socket info and returns a `t:boolean/0`\n indicating if the socket should be returned or not.","ref":"socket.html#which_sockets/1"},{"type":"type","title":"socket.cmsg/0","doc":"Control messages (ancillary messages).","ref":"socket.html#t:cmsg/0"},{"type":"type","title":"socket.cmsg_recv/0","doc":"Control messages (ancillary messages) returned by\n[`recvmsg/1,2,3,5`](`recvmsg/1`).\n\nA control message has got a `data` field with a native (`binary`) value for the\nmessage data, and may also have a decoded `value` field if this socket library\nsuccessfully decoded the data.","ref":"socket.html#t:cmsg_recv/0"},{"type":"type","title":"socket.cmsg_send/0","doc":"Control messages (ancillary messages) accepted by\n[`sendmsg/2,3,4`](`sendmsg/2`).\n\nA control message may for some message types have a `value` field with a\nsymbolic value, or a `data` field with a native value, that has to be binary\ncompatible what is defined in the platform's header files.","ref":"socket.html#t:cmsg_send/0"},{"type":"type","title":"socket.completion_handle/0","doc":"[Completion operation](#asynchronous-calls) handle.\n\nA `t:reference/0` that uniquely identifies the (completion) operation,\ncontained in the returned `t:completion_info/0`.","ref":"socket.html#t:completion_handle/0"},{"type":"type","title":"socket.completion_info/0","doc":"[Completion operation](#asynchronous-calls) info.\n\nReturned by an operation that requires the caller to wait for a\n[completion message](`m:socket#asynchronous-calls`) containing the\n[`CompletionHandle`](`t:completion_handle/0`) _and_ the result of the operation;\nthe `CompletionStatus`.","ref":"socket.html#t:completion_info/0"},{"type":"type","title":"socket.completion_tag/0","doc":"[Completion operation](#asynchronous-calls) tag.\n\n\nA tag that describes the ongoing (completion) operation (= function name),\ncontained in the returned `t:completion_info/0`.","ref":"socket.html#t:completion_tag/0"},{"type":"type","title":"socket.domain/0","doc":"Protocol _domain_ a.k.a address _family_.\n\nA lowercase `t:atom/0` representing a protocol _domain_\non the platform named `AF_*` (or `PF_*`). For example\n`inet` corresponds to `AF_INET`.\n\n[`is_supported(ipv6)` ](`is_supported/1`) tells if the IPv6 protocol,\nprotocol domain `inet6`, is supported.\n\n[`is_supported(local)` ](`is_supported/1`) tells if the\nprotocol domain `local` is supported.\n\n`supports/0` reports both values, but also many more, with a single call.","ref":"socket.html#t:domain/0"},{"type":"type","title":"socket.ee_origin/0","doc":"","ref":"socket.html#t:ee_origin/0"},{"type":"type","title":"socket.eei/0","doc":"Extended Error Information.\n\nA term containing additional (error) information\n_if_ the socket NIF has been configured to produce it.","ref":"socket.html#t:eei/0"},{"type":"type","title":"socket.extended_err/0","doc":"","ref":"socket.html#t:extended_err/0"},{"type":"type","title":"socket.hatype/0","doc":"","ref":"socket.html#t:hatype/0"},{"type":"type","title":"socket.icmp_dest_unreach/0","doc":"","ref":"socket.html#t:icmp_dest_unreach/0"},{"type":"type","title":"socket.icmpv6_dest_unreach/0","doc":"","ref":"socket.html#t:icmpv6_dest_unreach/0"},{"type":"type","title":"socket.in6_addr/0","doc":"","ref":"socket.html#t:in6_addr/0"},{"type":"type","title":"socket.in6_flow_info/0","doc":"","ref":"socket.html#t:in6_flow_info/0"},{"type":"type","title":"socket.in6_scope_id/0","doc":"","ref":"socket.html#t:in6_scope_id/0"},{"type":"type","title":"socket.in_addr/0","doc":"","ref":"socket.html#t:in_addr/0"},{"type":"type","title":"socket.info/0","doc":"Platform dependent information items.\n\nThe value of `iov_max` is the value of the `IOV_MAX` constant\nin the system headers, which is the largest allowed I/O vector.\nSee also `sendmsg/4` regarding the `iov` key of `t:msg_send/0`.\nThe smallest allowed `IOV_MAX` value according to POSIX is `16`,\nbut check your platform documentation to be sure.\n\nAbout the `use_registry` key, see `use_registry/1`\nand the `t:otp_socket_option/0` with the same name.","ref":"socket.html#t:info/0"},{"type":"type","title":"socket.info_keys/0","doc":"Information element designators for the `i/1` and `i/2` functions.","ref":"socket.html#t:info_keys/0"},{"type":"type","title":"socket.interface_type/0","doc":"The interface type (of the datalink). We only translate a few values to atoms,\nthe rest are left as (unsigned) integer values.","ref":"socket.html#t:interface_type/0"},{"type":"type","title":"socket.invalid/0","doc":"","ref":"socket.html#t:invalid/0"},{"type":"type","title":"socket.ioctl_device_flag/0","doc":"","ref":"socket.html#t:ioctl_device_flag/0"},{"type":"type","title":"socket.ioctl_device_map/0","doc":"","ref":"socket.html#t:ioctl_device_map/0"},{"type":"type","title":"socket.ip_mreq/0","doc":"C: `struct ip_mreq`\n\nCorresponds to the C `struct ip_mreq` for managing multicast groups.","ref":"socket.html#t:ip_mreq/0"},{"type":"type","title":"socket.ip_mreq_source/0","doc":"C: `struct ip_mreq_source`\n\nCorresponds to the C `struct ip_mreq_source` for managing multicast groups.","ref":"socket.html#t:ip_mreq_source/0"},{"type":"type","title":"socket.ip_msfilter/0","doc":"C: `struct ip_msfilter`\n\nCorresponds to the C `struct ip_msfilter` for managing\nmulticast source filtering (RFC 3376).","ref":"socket.html#t:ip_msfilter/0"},{"type":"type","title":"socket.ip_pktinfo/0","doc":"C: `struct ip_pktinfo`","ref":"socket.html#t:ip_pktinfo/0"},{"type":"type","title":"socket.ip_pmtudisc/0","doc":"C: `IP_PMTUDISC_*` values.\n\nLowercase `t:atom/0` values corresponding to the C library constants\n`IP_PMTUDISC_*`. Some constant(s) may be unsupported by the platform.","ref":"socket.html#t:ip_pmtudisc/0"},{"type":"type","title":"socket.ip_tos/0","doc":"C: `IPTOS_*` values.\n\nLowercase `t:atom/0` values corresponding to the C library constants `IPTOS_*`.\nSome constant(s) may be unsupported by the platform.","ref":"socket.html#t:ip_tos/0"},{"type":"type","title":"socket.ipv6_hops/0","doc":"IPv6 hop limit value.\n\nThe value `default` is only valid to _set_ and is translated to the C value\n`-1`, meaning the route default.","ref":"socket.html#t:ipv6_hops/0"},{"type":"type","title":"socket.ipv6_mreq/0","doc":"C: `struct ipv6_mreq`\n\nCorresponds to the C `struct ipv6_mreq` for managing multicast groups. See also\nRFC 2553.","ref":"socket.html#t:ipv6_mreq/0"},{"type":"type","title":"socket.ipv6_pktinfo/0","doc":"C: `struct in6_pktinfo`","ref":"socket.html#t:ipv6_pktinfo/0"},{"type":"type","title":"socket.ipv6_pmtudisc/0","doc":"C: `IPV6_PMTUDISC_*` values\n\nLowercase `t:atom/0` values corresponding to the C library constants\n`IPV6_PMTUDISC_*`. Some constant(s) may be unsupported by the platform.","ref":"socket.html#t:ipv6_pmtudisc/0"},{"type":"type","title":"socket.level/0","doc":"Protocol level.\n\nA lowercase `t:atom/0` OS protocol level, that is:\n`socket` or a `t:protocol/0` name.\n\n`socket` is the `SOL_SOCKET` protocol level in the OS header files,\nwith options named `SO_`\\* .","ref":"socket.html#t:level/0"},{"type":"type","title":"socket.linger/0","doc":"C: `struct linger`\n\nCorresponds to the C `struct linger` for managing the\n[socket option](`t:socket_option/0`) `{socket, linger}`.","ref":"socket.html#t:linger/0"},{"type":"type","title":"socket.msg/0","doc":"C: `struct msghdr`","ref":"socket.html#t:msg/0"},{"type":"type","title":"socket.msg_flag/0","doc":"Platform dependent message flags.\n\nTranslates to/from message flag constants on the platform.\nThese flags are lowercase while the constants are uppercase\nwith prefix `MSG_`; for example `oob` translates to `MSG_OOB`.\n\nSome flags are only used for sending, some only for receiving, some in received\ncontrol messages, and some for several of these. Not all flags are supported on\nall platforms. See the platform's documentation,\n[`supports(msg_flags)`](`supports/1`), and\n[`is_supported(msg_flags, MsgFlag)`](`is_supported/2`).","ref":"socket.html#t:msg_flag/0"},{"type":"type","title":"socket.msg_recv/0","doc":"Message returned by [`recvmsg/1,2,3,5`](`recvmsg/1`).\n\nCorresponds to a C `struct msghdr`, see your platform documentation for\n[`recvmsg(2)`](`recvmsg/1`).\n\n- **`addr`** - Optional peer address, used on unconnected sockets. Corresponds\n to `msg_name` and `msg_namelen` fields of a `struct msghdr`. If `NULL` the map\n key is not present.\n\n- **`iov`** - Data as a list of binaries. The `msg_iov` and `msg_iovlen` fields\n of a `struct msghdr`.\n\n- **`ctrl`** - A possibly empty list of control messages (CMSG). Corresponds to\n the `msg_control` and `msg_controllen` fields of a `struct msghdr`.\n\n- **`flags`** - Message flags. Corresponds to the `msg_flags` field of a\n `struct msghdr`. Unknown flags, if any, are returned in one `t:integer/0`,\n last in the containing list.","ref":"socket.html#t:msg_recv/0"},{"type":"type","title":"socket.msg_send/0","doc":"Message sent by [`sendmsg/2,3,4`](`sendmsg/2`).\n\nCorresponds to a C `struct msghdr`, see your platform documentation for\n`sendmsg(2)`.\n\n- **`addr`** - Optional peer address, used on unconnected sockets. Corresponds\n to `msg_name` and `msg_namelen` fields of a `struct msghdr`. If not used they\n are set to `NULL`, `0`.\n\n- **`iov`** - Mandatory data as a list of binaries. The `msg_iov` and\n `msg_iovlen` fields of a `struct msghdr`.\n\n- **`ctrl`** - Optional list of control messages (CMSG). Corresponds to the\n `msg_control` and `msg_controllen` fields of a `struct msghdr`. If not used\n they are set to `NULL`, `0`.\n\nThe `msg_flags` field of the `struct msghdr` is set to `0`.","ref":"socket.html#t:msg_send/0"},{"type":"type","title":"socket.native_value/0","doc":"","ref":"socket.html#t:native_value/0"},{"type":"type","title":"socket.otp_socket_option/0","doc":"Protocol level `otp` socket option.\n\nSocket options for the `otp` pseudo protocol level,\nthat is: `{otp, Name}` options.\n\nThis protocol level is the Erlang/OTP's socket implementation layer,\nhence above all OS protocol levels.\n\n- **`debug`** - `t:boolean/0` \\- Activate debug logging.\n\n- **`iow`** - `t:boolean/0` \\- Inform On Wrap of statistics counters.\n\n- **`controlling_process`** - `t:pid/0` \\- The socket \"owner\". Only the current\n controlling process can set this option.\n\n- **`rcvbuf`** -\n `BufSize :: (default | integer()>0) | {N :: integer()>0, BufSize :: (default | integer()>0)} `\\-\n Receive buffer size.\n\n The value `default` is only valid to _set_.\n\n `N` specifies the number of read attempts to do in a tight loop before\n assuming no more data is pending.\n\n This is the allocation size for the receive buffer used when calling the OS\n protocol stack's receive API, when no specific size (size 0) is requested.\n When the receive function returns the receive buffer is reallocated to the\n actually received size. If the data is copied or shrunk in place is up to\n the allocator, and can to some extent be configured in the Erlang VM.\n\n The similar socket option; `{socket,rcvbuf}` is a related option for the OS'\n protocol stack that on Unix corresponds to `SOL_SOCKET,SO_RCVBUF`.\n\n- **`rcvctrlbuf`** - `BufSize :: (default | integer()>0) `\\- Allocation size for\n the ancillary data buffer used when calling the OS protocol stack's receive\n API.\n\n The value `default` is only valid to _set_.\n\n- **`sndctrlbuf`** - `BufSize :: (default | integer()>0) `\\- Allocation size for\n the ancillary data buffer used when calling the OS protocol stack's\n [sendmsg](`sendmsg/2`) API.\n\n The value `default` is only valid to _set_.\n\n It is the user's responsibility to set a buffer size that has room for the\n encoded ancillary data in the message to send.\n\n See [sendmsg](`sendmsg/2`) and also the `ctrl` field of the `t:msg_send/0`\n type.\n\n- **`fd`** - `t:integer/0` \\- Only valid to _get_. The OS protocol levels'\n socket descriptor. Functions [`open/1,2`](`open/1`) can be used to create a\n socket according to this module from an existing OS socket descriptor.\n\n- **`use_registry`** - `t:boolean/0` \\- Only valid to _get_. The value is set\n when the socket is created with `open/2` or `open/4`.\n\nOptions not described here are intentionally undocumented and for Erlang/OTP\ninternal use only.","ref":"socket.html#t:otp_socket_option/0"},{"type":"type","title":"socket.packet_type/0","doc":"","ref":"socket.html#t:packet_type/0"},{"type":"type","title":"socket.port_number/0","doc":"","ref":"socket.html#t:port_number/0"},{"type":"type","title":"socket.posix/0","doc":"Posix error codes.\n\nLocal alias for `t:inet:posix/0`, a set of `t:atom/0`s.","ref":"socket.html#t:posix/0"},{"type":"type","title":"socket.protocol/0","doc":"Protocol name.\n\nA lowercase `t:atom/0` representing an OS protocol name.\nTo be used for example in `t:socket_option/0`\nin [control messages](`t:cmsg/0`).\n\nThey have the following names in the OS header files:\n\n- **`ip`** - `IPPROTO_IP` a.k.a `SOL_IP` with options named `IP_`\\*.\n\n- **`ipv6`** - `IPPROTO_IPV6` a.k.a `SOL_IPV6` with options named `IPV6_`\\*.\n\n- **`tcp`** - `IPPROTO_TCP` with options named `TCP_`\\*.\n\n- **`udp`** - `IPPROTO_UDP` with options named `UDP_`\\*.\n\n- **`sctp`** - `IPPROTO_SCTP` with options named `SCTP_`\\*.\n\nThere are many other possible protocols, but the ones above are those for which\nthis socket library implements socket options and/or control messages.\n\nAll protocols known to the OS are enumerated when the Erlang VM is started,\nthrough the `C` library call `getprotoent()`. See the OS man page for\nprotocols(5). Those in the list above are valid if supported by the platform,\neven if they aren't enumerated.\n\nThe calls [`is_supported(ipv6)` ](`is_supported/1`)\nand [`is_supported(sctp)` ](`is_supported/1`) can be used to find out\nif the protocols `ipv6` and `sctp` are supported on the platform\nas in appropriate header file and library exists.\n\nThe call [`is_supported(protocols, Protocol)` ](`is_supported/2`)\ncan only be used to find out if the platform knows the protocol number\nfor a named `Protocol`.\n\nSee [`open/2,3,4`](`open/3`)","ref":"socket.html#t:protocol/0"},{"type":"type","title":"socket.sctp_assocparams/0","doc":"C: `struct sctp_assocparams`","ref":"socket.html#t:sctp_assocparams/0"},{"type":"type","title":"socket.sctp_event_subscribe/0","doc":"C: `struct sctp_event_subscribe`.\n\nNot all fields are implemented on all platforms; unimplemented fields are\nignored, but implemented fields are mandatory. Note that the '\\_event' suffixes\nhave been stripped from the C struct field names, for convenience.","ref":"socket.html#t:sctp_event_subscribe/0"},{"type":"type","title":"socket.sctp_initmsg/0","doc":"C: `struct sctp_initmsg`.","ref":"socket.html#t:sctp_initmsg/0"},{"type":"type","title":"socket.sctp_rtoinfo/0","doc":"C: `struct sctp_rtoinfo`.","ref":"socket.html#t:sctp_rtoinfo/0"},{"type":"type","title":"socket.select_handle/0","doc":"[Select operation](#asynchronous-calls) handle.\n\nA `t:reference/0` that uniquely identifies the (select) operation,\ncontained in the returned `t:select_info/0`.","ref":"socket.html#t:select_handle/0"},{"type":"type","title":"socket.select_info/0","doc":"[Select operation](#asynchronous-calls) info.\n\nReturned by an operation that requires the caller to wait for a\n[select message](`m:socket#asynchronous-calls`) containing the\n[`SelectHandle`](`t:select_handle/0`).","ref":"socket.html#t:select_info/0"},{"type":"type","title":"socket.select_tag/0","doc":"[Select operation](#asynchronous-calls) tag.\n\nA tag that describes the (select) operation (= function name),\ncontained in the returned `t:select_info/0`.","ref":"socket.html#t:select_tag/0"},{"type":"type","title":"socket.sockaddr/0","doc":"","ref":"socket.html#t:sockaddr/0"},{"type":"type","title":"socket.sockaddr_dl/0","doc":"C: `struct sockaddr_dl`\n\nLink level address (PF_LINK) on BSD:s.","ref":"socket.html#t:sockaddr_dl/0"},{"type":"type","title":"socket.sockaddr_in6/0","doc":"C: `struct sockaddr_in6`\n\n[Domain `inet6`](`t:domain/0`) (IPv6) address.","ref":"socket.html#t:sockaddr_in6/0"},{"type":"type","title":"socket.sockaddr_in/0","doc":"C: `struct sockaddr_in`\n\n[Domain `inet`](`t:domain/0`) (IPv4) address.","ref":"socket.html#t:sockaddr_in/0"},{"type":"type","title":"socket.sockaddr_ll/0","doc":"C: `struct sockaddr_ll`\n\n[Domain `packet`](`t:domain/0`), [type `raw`](`t:type/0`)\n(link level) address.","ref":"socket.html#t:sockaddr_ll/0"},{"type":"type","title":"socket.sockaddr_native/0","doc":"C: `struct sockaddr`\n\nIn C, a `struct sockaddr` with the integer value of `sa_family`\nin the `t:map/0` key `family`,\nand the content of `sa_data` in the `t:map/0` key `addr`.","ref":"socket.html#t:sockaddr_native/0"},{"type":"type","title":"socket.sockaddr_recv/0","doc":"","ref":"socket.html#t:sockaddr_recv/0"},{"type":"type","title":"socket.sockaddr_un/0","doc":"C: `struct sockaddr_un`.\n\nA Unix Domain socket address, a.k.a local address (`AF_LOCAL`).\n\nThe `path` element will always be a `binary` when returned from this module.\nWhen supplied to an API function in this module it may be a `t:string/0`, which\nwill be encoded into a binary according to the\n[native file name encoding ](`file:native_name_encoding/0`)on the platform.\n\nA terminating zero character will be appended before the address path is given\nto the OS, and the terminating zero will be stripped before giving the address\npath to the caller.\n\nLinux's non-portable abstract socket address extension is handled by not doing\nany terminating zero processing in either direction, if the first byte of the\naddress is zero.","ref":"socket.html#t:sockaddr_un/0"},{"type":"type","title":"socket.sockaddr_unspec/0","doc":"C: `struct sockaddr` of `AF_UNSPEC`\n\nIn C, a `struct sockaddr` with `sa_family = AF_UNSPEC`\nand the content of `sa_data` in the `t:map/0` key `addr`.","ref":"socket.html#t:sockaddr_unspec/0"},{"type":"type","title":"socket.socket/0","doc":"A socket, according to this module.\n\nCreated and returned by [`open/1,2,3,4`](`open/1`)\nand [`accept/1,2`](`accept/1`).","ref":"socket.html#t:socket/0"},{"type":"type","title":"socket.socket_counters/0","doc":"A `t:map/0` of `Name := Counter` associations.","ref":"socket.html#t:socket_counters/0"},{"type":"opaque","title":"socket.socket_handle/0","doc":"Opaque socket handle unique for the socket.","ref":"socket.html#t:socket_handle/0"},{"type":"type","title":"socket.socket_info/0","doc":"","ref":"socket.html#t:socket_info/0"},{"type":"type","title":"socket.socket_option/0","doc":"Socket option.\n\nSocket options on the form `{Level, Opt}` where the OS protocol `Level` =\n`t:level/0` and `Opt` is a socket option on that protocol level.\n\nThe OS name for an options is, except where otherwise noted, the `Opt` atom, in\ncapitals, with prefix according to `t:level/0`.\n\n> #### Note {: .info }\n>\n> The `IPv6` option `pktoptions` is a special (barf) case. It is intended for\n> backward compatibility usage only.\n>\n> Do _not_ use this option.\n\n> #### Note {: .info }\n>\n> See the OS documentation for every socket option.\n\nAn option below that has the value type `t:boolean/0` will translate the value\n`false` to a C `int` with value `0`, and the value `true` to `!!0` (not (not\nfalse)).\n\nAn option with value type `t:integer/0` will be translated to a C `int` that may\nhave a restricted range, for example byte: `0..255`. See the OS documentation.\n\nThe calls [`supports(options)`](`supports/1`),\n[`supports(options, Level)`](`supports/1`) and\n[`is_supported(options, {Level, Opt})` ](`is_supported/2`)can be used to find\nout which socket options that are supported by the platform.\n\n_Options for protocol level_ [_`socket`_:](`t:level/0`)\n\n- **`{socket, acceptconn}`** - `Value = boolean()`\n\n- **`{socket, bindtodevice}`** - `Value = string()`\n\n- **`{socket, broadcast}`** - `Value = boolean()`\n\n- **`{socket, debug}`** - `Value = integer()`\n\n- **`{socket, domain}`** - `Value =` `t:domain/0`\n\n Only valid to _get_.\n\n The socket's protocol domain. Does _not_ work on for instance FreeBSD.\n\n- **`{socket, dontroute}`** - `Value = boolean()`\n\n- **`{socket, keepalive}`** - `Value = boolean()`\n\n- **`{socket, linger}`** - `Value = abort |` `t:linger/0`\n\n The value `abort` is shorthand for `#{onoff => true, linger => 0}`, and only\n valid to _set_.\n\n- **`{socket, oobinline}`** - `Value = boolean()`\n\n- **`{socket, passcred}`** - `Value = boolean()`\n\n- **`{socket, peek_off}`** - `Value = integer()`\n\n Currently disabled due to a possible infinite loop when calling\n [`recv/1-4`](`recv/1`) with [`peek`](`t:msg_flag/0`) in `Flags`.\n\n- **`{socket, priority}`** - `Value = integer()`\n\n- **`{socket, protocol}`** - `Value =` `t:protocol/0`\n\n Only valid to _get_.\n\n The socket's protocol. Does _not_ work on for instance Darwin.\n\n- **`{socket, rcvbuf}`** - `Value = integer()`\n\n- **`{socket, rcvlowat}`** - `Value = integer()`\n\n- **`{socket, rcvtimeo}`** - `Value =` `t:timeval/0`\n\n This option is unsupported per default; OTP has to be explicitly built with\n the `--enable-esock-rcvsndtimeo` configure option for this to be available.\n\n Since our implementation uses non-blocking sockets, it is unknown if and how\n this option works, or even if it may cause malfunction. Therefore, we do not\n recommend setting this option.\n\n Instead, use the `Timeout` argument to, for instance, the `recv/3` function.\n\n- **`{socket, reuseaddr}`** - `Value = boolean()`\n\n- **`{socket, reuseport}`** - `Value = boolean()`\n\n- **`{socket, sndbuf}`** - `Value = integer()`\n\n- **`{socket, sndlowat}`** - `Value = integer()`\n\n- **`{socket, sndtimeo}`** - `Value =` `t:timeval/0`\n\n This option is unsupported per default; OTP has to be explicitly built with\n the `--enable-esock-rcvsndtimeo` configure option for this to be available.\n\n Since our implementation uses non-blocking sockets, it is unknown if and how\n this option works, or even if it may cause malfunction. Therefore, we do not\n recommend setting this option.\n\n Instead, use the `Timeout` argument to, for instance, the `send/3` function.\n\n- **`{socket, timestamp}`** - `Value = boolean()`\n\n- **`{socket, type}`** - `Value =` `t:type/0`\n\n Only valid to _get_.\n\n The socket's type.\n\n_Options for protocol level_ [_`ip`_:](`t:level/0`)\n\n- **`{ip, add_membership}`** - `Value =` `t:ip_mreq/0`\n\n Only valid to _set_.\n\n- **`{ip, add_source_membership}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n- **`{ip, block_source}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n- **`{ip, drop_membership}`** - `Value =` `t:ip_mreq/0`\n\n Only valid to _set_.\n\n- **`{ip, drop_source_membership}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n- **`{ip, freebind}`** - `Value = boolean()`\n\n- **`{ip, hdrincl}`** - `Value = boolean()`\n\n- **`{ip, minttl}`** - `Value = integer()`\n\n- **`{ip, msfilter}`** - `Value =` `null |` `t:ip_msfilter/0`\n\n Only valid to _set_.\n\n The value `null` passes a `NULL` pointer and size `0` to the C library call.\n\n- **`{ip, mtu}`** - `Value = integer()`\n\n Only valid to _get_.\n\n- **`{ip, mtu_discover}`** - `Value =`\n [`ip_pmtudisc()` ](`t:ip_pmtudisc/0`)`| integer()`\n\n An `t:integer/0` value according to the platform's header files.\n\n- **`{ip, multicast_all}`** - `Value = boolean()`\n\n- **`{ip, multicast_if}`** - `Value =` `any |` `t:in_addr/0`\n\n- **`{ip, multicast_loop}`** - `Value = boolean()`\n\n- **`{ip, multicast_ttl}`** - `Value = integer()`\n\n- **`{ip, nodefrag}`** - `Value = boolean()`\n\n- **`{ip, pktinfo}`** - `Value = boolean()`\n\n- **`{ip, recvdstaddr}`** - `Value = boolean()`\n\n- **`{ip, recverr}`** - `Value = boolean()`\n\n Enable extended reliable error message passing.\n\n _Warning\\!_ When this option is enabled, error messages may arrive on the\n socket's error queue, which should be read using the message flag\n [`errqueue`](`t:msg_flag/0`), and using [`recvmsg/1,2,3,4,5`](`recvmsg/1`) to\n get all error information in the [message's](`t:msg_recv/0`) `ctrl` field as a\n [control message](`t:cmsg_recv/0`) `#{level := ip, type := recverr}`.\n\n A working strategy should be to first poll the error queue using\n [`recvmsg/2,3,4` ](`m:socket#recvmsg-timeout`)with `Timeout =:= 0` and `Flags`\n containing `errqueue` (ignore the return value `{error, timeout}`) before\n reading the actual data to ensure that the error queue gets cleared. And read\n the data using one of the `nowait |`\n [`select_handle()` ](`t:select_handle/0`)recv functions:\n [`recv/3,4`](`m:socket#recv-nowait`),\n [`recvfrom/3,4`](`m:socket#recvfrom-nowait`) or\n [`recvmsg/3,4,5`](`m:socket#recvmsg-nowait`). Otherwise you might accidentally\n cause a busy loop in and out of 'select' for the socket.\n\n- **`{ip, recvif}`** - `Value = boolean()`\n\n- **`{ip, recvopts}`** - `Value = boolean()`\n\n- **`{ip, recvorigdstaddr}`** - `Value = boolean()`\n\n- **`{ip, recvtos}`** - `Value = boolean()`\n\n- **`{ip, recvttl}`** - `Value = boolean()`\n\n- **`{ip, retopts}`** - `Value = boolean()`\n\n- **`{ip, router_alert}`** - `Value = integer()`\n\n- **`{ip, sendsrcaddr}`** - `Value = boolean()`\n\n- **`{ip, tos}`** - `Value =` [`ip_tos()` ](`t:ip_tos/0`)`| integer()`\n\n An `t:integer/0` value is according to the platform's header files.\n\n- **`{ip, transparent}`** - `Value = boolean()`\n\n- **`{ip, ttl}`** - `Value = integer()`\n\n- **`{ip, unblock_source}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n_Options for protocol level_ [_`ipv6`_:](`t:level/0`)\n\n- **`{ipv6, addrform}`** - `Value =` `t:domain/0`\n\n As far as we know the only valid value is `inet` and it is only allowed for an\n IPv6 socket that is connected and bound to an IPv4-mapped IPv6 address.\n\n- **`{ipv6, add_membership}`** - `Value =` `t:ipv6_mreq/0`\n\n Only valid to _set_.\n\n- **`{ipv6, authhdr}`** - `Value = boolean()`\n\n- **`{ipv6, drop_membership}`** - `Value =` `t:ipv6_mreq/0`\n\n Only valid to _set_.\n\n- **`{ipv6, dstopts}`** - `Value = boolean()`\n\n- **`{ipv6, flowinfo}`** - `Value = boolean()`\n\n- **`{ipv6, hoplimit}`** - `Value = boolean()`\n\n- **`{ipv6, hopopts}`** - `Value = boolean()`\n\n- **`{ipv6, mtu}`** - `Value = integer()`\n\n- **`{ipv6, mtu_discover}`** - `Value =`\n [`ipv6_pmtudisc()` ](`t:ipv6_pmtudisc/0`)`| integer()`\n\n An `t:integer/0` value is according to the platform's header files.\n\n- **`{ipv6, multicast_hops}`** - `Value =` `t:ipv6_hops/0`\n\n- **`{ipv6, multicast_if}`** - `Value = integer()`\n\n- **`{ipv6, multicast_loop}`** - `Value = boolean()`\n\n- **`{ipv6, recverr}`** - `Value = boolean()`\n\n _Warning\\!_ See the socket option `{ip, recverr}` regarding the socket's error\n queue. The same warning applies for this option.\n\n- **`{ipv6, recvhoplimit}`** - `Value = boolean()`\n\n- **`{ipv6, recvpktinfo}`** - `Value = boolean()`\n\n- **`{ipv6, recvtclass}`** - `Value = boolean()`\n\n- **`{ipv6, router_alert}`** - `Value = integer()`\n\n- **`{ipv6, rthdr}`** - `Value = boolean()`\n\n- **`{ipv6, tclass}`** - `Value = boolean()`\n\n- **`{ipv6, unicast_hops}`** - `Value =` `t:ipv6_hops/0`\n\n- **`{ipv6, v6only}`** - `Value = boolean()`\n\n_Options for protocol level_ [_`sctp`_](`t:level/0`). See also RFC 6458.\n\n- **`{sctp, associnfo}`** - `Value =` `t:sctp_assocparams/0`\n\n- **`{sctp, autoclose}`** - `Value = integer()`\n\n- **`{sctp, disable_fragments}`** - `Value = boolean()`\n\n- **`{sctp, events}`** - `Value =` `t:sctp_event_subscribe/0`\n\n Only valid to _set_.\n\n- **`{sctp, initmsg}`** - `Value =` `t:sctp_initmsg/0`\n\n- **`{sctp, maxseg}`** - `Value = integer()`\n\n- **`{sctp, nodelay}`** - `Value = boolean()`\n\n- **`{sctp, rtoinfo}`** - `Value =` `t:sctp_rtoinfo/0`\n\n_Options for protocol level_ [_`tcp`:_](`t:level/0`)\n\n- **`{tcp, congestion}`** - `Value = string()`\n\n- **`{tcp, cork}`** - `Value = boolean()`\n\n- **`{tcp, maxseg}`** - `Value = integer()`\n\n- **`{tcp, nodelay}`** - `Value = boolean()`\n\n_Options for protocol level_ [_`udp`:_](`t:level/0`)\n\n- **`{udp, cork}`** - `Value = boolean()`","ref":"socket.html#t:socket_option/0"},{"type":"type","title":"socket.timeval/0","doc":"C: `struct timeval`\n\nCorresponds to the C `struct timeval`. The field `sec` holds seconds, and `usec`\nmicroseconds.","ref":"socket.html#t:timeval/0"},{"type":"type","title":"socket.type/0","doc":"Protocol type.\n\nA lowercase `t:atom/0` representing a protocol _type_\non the platform named `SOCK_*`. For example\n`stream` corresponds to `SOCK_STREAM`.","ref":"socket.html#t:type/0"},{"type":"module","title":"disk_log","doc":"`disk_log` is a disk-based term logger that enables efficient logging of items\non files.\n\nThree types of logs are supported:\n\n- **halt logs** - Appends items to a single file, which size can be limited by\n the `disk_log` module.\n\n- **wrap logs** - Uses a sequence of wrap log files of limited size. As a wrap\n log file is filled up, further items are logged on to the next file in the\n sequence, starting all over with the first file when the last file is filled\n up.\n\n- **rotate logs** - Uses a sequence of rotate log files of limited size. As a\n log file is filled up, it is rotated and then compressed. There is one active\n log file and upto the configured number of compressed log files. Only\n externally formatted logs are supported. It follows the same naming convention\n as the handler logger_std_h for Logger. For more details about the naming\n convention check the file parameter for `open/1`.\n\n It follows the same naming convention as that for the compressed files for\n Linux's logrotate and BSD's newsyslog.\n\nFor efficiency reasons, items are always written to files as binaries.\n\nTwo formats of the log files are supported:\n\n- **internal format** - Supports automatic repair of log files that are not\n properly closed and enables efficient reading of logged items in _chunks_\n using a set of functions defined in this module. This is the only way to read\n internally formatted logs. An item logged to an internally formatted log must\n not occupy more than 4 GB of disk space (the size must fit in 4 bytes).\n\n- **external format** - Leaves it up to the user to read and interpret the\n logged data. The `disk_log` module cannot repair externally formatted logs.\n\nFor each open disk log, one process handles requests made to the disk log. This\nprocess is created when `open/1` is called, provided there exists no process\nhandling the disk log. A process that opens a disk log can be an _owner_ or an\nanonymous _user_ of the disk log. Each owner is linked to the disk log process,\nand an owner can close the disk log either explicitly (by calling\n[`close/1`](`close/1`)) or by terminating.\n\nOwners can subscribe to _notifications_, messages of the form\n`{disk_log, Node, Log, Info}`, which are sent from the disk log process when\ncertain events occur, see the functions and in particular the\n[`open/1`](`open/1`) option [`notify`](`m:disk_log#notify`). A log can have many\nowners, but a process cannot own a log more than once. However, the same process\ncan open the log as a user more than once.\n\nFor a disk log process to close its file properly and terminate, it must be\nclosed by its owners and once by some non-owner process for each time the log\nwas used anonymously. The users are counted and there must not be any users left\nwhen the disk log process terminates.\n\nItems can be logged _synchronously_ by using functions `log/2`, `blog/2`,\n`log_terms/2`, and `blog_terms/2`. For each of these functions, the caller is\nput on hold until the items are logged (but not necessarily written, use\n[`sync/1`](`sync/1`) to ensure that). By adding an `a` to each of the mentioned\nfunction names, we get functions that log items _asynchronously_. Asynchronous\nfunctions do not wait for the disk log process to write the items to the file,\nbut return the control to the caller more or less immediately.\n\nWhen using the internal format for logs, use functions `log/2`, `log_terms/2`,\n`alog/2`, and `alog_terms/2`. These functions log one or more Erlang terms. By\nprefixing each of the functions with a `b` (for \"binary\"), we get the\ncorresponding `blog()` functions for the external format. These functions log\none or more chunks of bytes. For example, to log the string `\"hello\"` in ASCII\nformat, you can use [`disk_log:blog(Log, \"hello\")`](`blog/2`), or\n[`disk_log:blog(Log, list_to_binary(\"hello\"))`](`blog/2`). The two alternatives\nare equally efficient.\n\nThe `blog()` functions can also be used for internally formatted logs, but in\nthis case they must be called with binaries constructed with calls to\n[`term_to_binary/1`](`erlang:term_to_binary/1`). There is no check to ensure\nthis, it is entirely the responsibility of the caller. If these functions are\ncalled with binaries that do not correspond to Erlang terms, the\n[`chunk/2,3`](`chunk/3`) and automatic repair functions fail. The corresponding\nterms (not the binaries) are returned when [`chunk/2,3`](`chunk/3`) is called.\n\nAn open disk log is only accessible from the node where the disk log process\nruns. All processes on the node where the disk log process runs can log items or\notherwise change, inspect, or close the log.\n\nErrors are reported differently for asynchronous log attempts and other uses of\nthe `m:disk_log` module. When used synchronously, this module replies with an\nerror message, but when called asynchronously, this module does not know where\nto send the error message. Instead, owners subscribing to notifications receive\nan `error_status` message.\n\nThe `m:disk_log` module does not report errors to the `m:error_logger` module. It\nis up to the caller to decide whether to employ the error logger. Function\n`format_error/1` can be used to produce readable messages from error replies.\nHowever, information events are sent to the error logger in two situations,\nnamely when a log is repaired, or when a file is missing while reading chunks.\n\nError message `no_such_log` means that the specified disk log is not open.\nNothing is said about whether the disk log files exist or not.\n\n> #### Note {: .info }\n>\n> If an attempt to reopen or truncate a log fails (see\n> [`reopen/2,3`](`reopen/3`) and [`truncate/1,2`](`truncate/2`)) the disk log\n> process terminates immediately. Before the process terminates, links to owners\n> and blocking processes (see [`block/1,2`](`block/2`)) are removed. The effect\n> is that the links work in one direction only. Any process using a disk log\n> must check for error message `no_such_log` if some other process truncates or\n> reopens the log simultaneously.","ref":"disk_log.html"},{"type":"module","title":"See Also - disk_log","doc":"`m:file`, `m:wrap_log_reader`","ref":"disk_log.html#module-see-also"},{"type":"function","title":"disk_log.all/0","doc":"Returns the names of the disk logs accessible on the current node.","ref":"disk_log.html#all/0"},{"type":"function","title":"disk_log.alog/2","doc":"Asynchronously version of `log/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the item cannot be written on the log, and possibly one\nof the messages `wrap`, `full`, or `error_status` if an item is written on the\nlog. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","ref":"disk_log.html#alog/2"},{"type":"function","title":"disk_log.alog_terms/2","doc":"Asynchronously version of `log_terms/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the items cannot be written on the log, and possibly one\nor more of the messages `wrap`, `full`, and `error_status` if items are written\non the log. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","ref":"disk_log.html#alog_terms/2"},{"type":"function","title":"disk_log.balog/2","doc":"Asynchronously version of `blog/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the item cannot be written on the log, and possibly one\nof the messages `wrap`, `full`, or `error_status` if an item is written on the\nlog. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","ref":"disk_log.html#balog/2"},{"type":"function","title":"disk_log.balog_terms/2","doc":"Asynchronously version of `blog_terms/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the items cannot be written on the log, and possibly one\nor more of the messages `wrap`, `full`, and `error_status` if items are written\non the log. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","ref":"disk_log.html#balog_terms/2"},{"type":"function","title":"disk_log.bchunk/2","doc":"","ref":"disk_log.html#bchunk/2"},{"type":"function","title":"disk_log.bchunk/3","doc":"Equivalent to [`chunk(Log, Continuation, N)`](`chunk/3`) except that\nit returns the binaries read from the file, that is it does not call\n`binary_to_term/1`.","ref":"disk_log.html#bchunk/3"},{"type":"function","title":"disk_log.block/1","doc":"","ref":"disk_log.html#block/1"},{"type":"function","title":"disk_log.block/2","doc":"With a call to `block/2` a process can block a log.\n\nIf the blocking process is not an owner of the log, a temporary link is created\nbetween the disk log process and the blocking process. The link ensures that the disk log is\nunblocked if the blocking process terminates without first closing or unblocking\nthe log.\n\nAny process can probe a blocked log with [`info/1`](`info/1`) or close it with\n[`close/1`](`close/1`). The blocking process can also use functions [`chunk/2,3`](`chunk/3`),\n[`bchunk/2,3`](`chunk/3`), [`chunk_step/3`](`chunk_step/3`), and [`unblock/1`](`unblock/1`)\nwithout being affected by the block. Any other attempt than those mentioned so\nfar to update or read a blocked log suspends the calling process until the log\nis unblocked or returns error message `{blocked_log, Log}`, depending on whether\nthe value of `QueueLogRecords` is `true` or `false`.","ref":"disk_log.html#block/2"},{"type":"function","title":"disk_log.blog/2","doc":"Equivalent to `log/2` except that it is used for externally formatted logs.\n\n`blog/2` can also be used for internally formatted logs\nif the binaries are constructed with calls to `term_to_binary/1`.","ref":"disk_log.html#blog/2"},{"type":"function","title":"disk_log.blog_terms/2","doc":"Equivalent to `log_terms/2` except that it is used for externally formatted logs.\n\n`blog_terms/2` can also be used for internally formatted logs\nif the binaries are constructed with calls to `term_to_binary/1`.","ref":"disk_log.html#blog_terms/2"},{"type":"function","title":"disk_log.breopen/3","doc":"Equivalent to `reopen` except that it is used for externally formatted logs.","ref":"disk_log.html#breopen/3"},{"type":"function","title":"disk_log.btruncate/2","doc":"Equivalent to `truncate/2` for externally formatted logs.","ref":"disk_log.html#btruncate/2"},{"type":"function","title":"disk_log.change_header/2","doc":"Changes the value of option `head` or `head_func` for an owner of a disk log.","ref":"disk_log.html#change_header/2"},{"type":"function","title":"disk_log.change_notify/3","doc":"Changes the value of option `notify` for an owner of a disk log.","ref":"disk_log.html#change_notify/3"},{"type":"function","title":"disk_log.change_size/2","doc":"Changes the size of an open log. For a halt log, the size can always be\nincreased, but it cannot be decreased to something less than the current file\nsize.\n\nFor a wrap or rotate log, both the size and the number of files can always be\nincreased, as long as the number of files does not exceed 65000. For wrap logs,\nif the maximum number of files is decreased, the change is not valid until the\ncurrent file is full and the log wraps to the next file. The redundant files are\nremoved the next time the log wraps around, that is, starts to log to file\nnumber 1.\n\nAs an example, assume that the old maximum number of files is 10 and that the\nnew maximum number of files is 6. If the current file number is not greater than\nthe new maximum number of files, files 7-10 are removed when file 6 is full and\nthe log starts to write to file number 1 again. Otherwise, the files greater\nthan the current file are removed when the current file is full (for example, if\nthe current file is 8, files 9 and 10 are removed). The files between the new\nmaximum number of files and the current file (that is, files 7 and 8) are\nremoved the next time file 6 is full.\n\nFor rotate logs, if the maximum number of files is decreased, the redundant\nfiles are deleted instantly.\n\nIf the size of the files is decreased, the change immediately affects the\ncurrent log. It does not change the size of log files already full until the\nnext time they are used.\n\nIf the log size is decreased, for example, to save space, function\n`next_file/1`, can be used to force the log to wrap.","ref":"disk_log.html#change_size/2"},{"type":"function","title":"disk_log.chunk/2","doc":"","ref":"disk_log.html#chunk/2"},{"type":"function","title":"disk_log.chunk/3","doc":"Efficiently reads the terms that are appended to an internally formatted log.\n\nIt minimizes disk I/O by reading 64 kilobyte chunks from the file.\n\nThe first time `chunk()` is called, an initial continuation, the\natom `start`, must be provided.\n\nWhen [`chunk/3`](`chunk/3`) is called, `N` controls the maximum number of terms\nthat are read from the log in each chunk. `infinity` means\nthat all the terms contained in the 64 kilobyte chunk are read. If less than `N`\nterms are returned, this does not necessarily mean that the end of the file is\nreached.\n\n`chunk/3` returns a tuple `{Continuation2, Terms}`, where `Terms` is a list of\nterms found in the log. `Continuation2` is yet another continuation, which must\nbe passed on to any subsequent calls to `chunk()`. With a series of calls to\n`chunk()`, all terms from a log can be extracted.\n\n`chunk/3` returns a tuple `{Continuation2, Terms, Badbytes}` if the log is\nopened in read-only mode and the read chunk is corrupt. `Badbytes` is the number\nof bytes in the file found not to be Erlang terms in the chunk. Notice that the\nlog is not repaired. When trying to read chunks from a log opened in read-write\nmode, tuple `{corrupt_log_file, FileName}` is returned if the read chunk is\ncorrupt.\n\n`chunk/3` returns `eof` when the end of the log is reached, or `{error, Reason}`\nif an error occurs. If a wrap log file is missing, a message is output on the\nerror log.\n\nWhen [`chunk/2,3`](`chunk/3`) is used with wrap logs, the returned continuation might not be\nvalid in the next call to `chunk/3`. This is because the log can wrap and delete\nthe file into which the continuation points. To prevent this, the log can be\nblocked during the search.","ref":"disk_log.html#chunk/3"},{"type":"function","title":"disk_log.chunk_info/1","doc":"Returns the pair `{node, Node}`, describing the chunk continuation returned by\n`chunk/2,3`, [`bchunk/2,3`](`bchunk/3`), or [`chunk_step/3`](`chunk_step/3`).\n\nTerms are read from the disk log running on `Node`.","ref":"disk_log.html#chunk_info/1"},{"type":"function","title":"disk_log.chunk_step/3","doc":"Can be used with [`chunk/2,3`](`chunk/3`) and [`bchunk/2,3`](`chunk/3`) to\nsearch through an internally formatted wrap log.\n\nIt takes as argument a continuation as returned by [`chunk/2,3`](`chunk/3`),\n[`bchunk/2,3`](`bchunk/3`), or [`chunk_step/3`](`chunk_step/3`), and steps\nforward (or backward) `Step` files in the wrap log. The continuation returned,\npoints to the first log item in the new current file.\n\nIf atom `start` is specified as continuation, the first file of the wrap log is\nchosen as the new current file.\n\nIf the wrap log is not full because all files are not yet used,\n`{error, end_of_log}` is returned if trying to step outside the log.","ref":"disk_log.html#chunk_step/3"},{"type":"function","title":"disk_log.close/1","doc":"Closes a disk log properly.\n\nAn internally formatted log must be closed before the Erlang system is stopped.\nOtherwise, the log is regarded as unclosed and the automatic repair procedure is\nactivated next time the log is opened.\n\nThe disk log process is not terminated as long as there are owners or users of\nthe log. All owners must close the log, possibly by terminating. Also, any other\nprocess, not only the processes that have opened the log anonymously, can\ndecrement the `users` counter by closing the log. Attempts to close a log by a\nprocess that is not an owner are ignored if there are no users.\n\nIf the log is blocked by the closing process, the log is also unblocked.","ref":"disk_log.html#close/1"},{"type":"function","title":"disk_log.format_error/1","doc":"Given the error returned by any function in this module, this function returns a\ndescriptive string of the error in English.\n\nFor file errors, function [`format_error/1`](`format_error/1`) in module\n[`file`](`file:format_error/1`) is called.","ref":"disk_log.html#format_error/1"},{"type":"function","title":"disk_log.inc_wrap_file/1","doc":"Forces the internally formatted disk log to start logging to the next log file.\nIt can be used, for example, with [`change_size/2`](`change_size/2`) to reduce\nthe amount of disk space allocated by the disk log.\n\nOwners subscribing to notifications normally receive a `wrap` message, but if an\nerror occurs with a reason tag of `invalid_header` or `file_error`, an\n`error_status` message is sent.","ref":"disk_log.html#inc_wrap_file/1"},{"type":"function","title":"disk_log.info/1","doc":"Returns a list of `{Tag, Value}` pairs describing a log running on the node.\n\nThe following pairs are returned for all logs:\n\n- **`{name, Log}`** - `Log` is the log name as specified by the\n [`open/1`](`open/1`) option `name`.\n\n- **`{file, File}`** - For halt logs `File` is the filename, and for wrap logs\n `File` is the base name.\n\n- **`{type, Type}`** - `Type` is the log type as specified by the\n [`open/1`](`open/1`) option `type`.\n\n- **`{format, Format}`** - `Format` is the log format as specified by the\n [`open/1`](`open/1`) option `format`.\n\n- **`{size, Size}`** - `Size` is the log size as specified by the\n [`open/1`](`open/1`) option `size`, or the size set by\n [`change_size/2`](`change_size/2`). The value set by\n [`change_size/2`](`change_size/2`) is reflected immediately.\n\n- **`{mode, Mode}`** - `Mode` is the log mode as specified by the\n [`open/1`](`open/1`) option `mode`.\n\n- **`{owners, [{pid(), Notify}]}`** - `Notify` is the value set by the\n [`open/1`](`open/1`) option `notify` or function\n [`change_notify/3`](`change_notify/3`) for the owners of the log.\n\n- **`{users, Users}`** - `Users` is the number of anonymous users of the log,\n see the [`open/1`](`open/1`) option [`linkto`](`m:disk_log#linkto`).\n\n- **`{status, Status}`** - `Status` is `ok` or `{blocked, QueueLogRecords}` as\n set by functions `block/1,2` and [`unblock/1`](`unblock/1`).\n\n- **`{node, Node}`** - The information returned by the current invocation of\n function [`info/1`](`info/1`) is gathered from the disk log process running on\n `Node`.\n\nThe following pairs are returned for all logs opened in `read_write` mode:\n\n- **`{head, Head}`** - Depending on the value of the [`open/1`](`open/1`)\n options `head` and `head_func`, or set by function\n [`change_header/2`](`change_header/2`), the value of `Head` is `none`\n (default), `{head, H}` (`head` option), or `{M,F,A}` (`head_func` option).\n\n- **`{no_written_items, NoWrittenItems}`** - `NoWrittenItems` is the number of\n items written to the log since the disk log process was created.\n\nThe following pair is returned for halt logs opened in `read_write` mode:\n\n- **`{full, Full}`** - `Full` is `true` or `false` depending on whether the halt\n log is full or not.\n\nThe following pairs are returned for wrap logs opened in `read_write` mode:\n\n- **`{no_current_bytes, integer() >= 0}`** - The number of bytes written to the\n current wrap log file.\n\n- **`{no_current_items, integer() >= 0}`** - The number of items written to the\n current wrap log file, header inclusive.\n\n- **`{no_items, integer() >= 0}`** - The total number of items in all wrap log\n files.\n\n- **`{current_file, integer()}`** - The ordinal for the current wrap log file in\n the range `1..MaxNoFiles`, where `MaxNoFiles` is specified by the\n [`open/1`](`open/1`) option `size` or set by\n [`change_size/2`](`change_size/2`).\n\n- **`{no_overflows, {SinceLogWasOpened, SinceLastInfo}}`** - `SinceLogWasOpened`\n (`SinceLastInfo`) is the number of times a wrap log file has been filled up\n and a new one is opened or [`inc_wrap_file/1`](`inc_wrap_file/1`) has been\n called since the disk log was last opened ([`info/1`](`info/1`) was last\n called). The first time `info/2` is called after a log was (re)opened or\n truncated, the two values are equal.\n\nNotice that functions [`chunk/2,3`](`chunk/3`), [`bchunk/2,3`](`bchunk/3`), and\n[`chunk_step/3`](`chunk_step/3`) do not affect any value returned by\n[`info/1`](`info/1`).","ref":"disk_log.html#info/1"},{"type":"function","title":"disk_log.log/2","doc":"Synchronously appends a term to a internally formatted disk log. Returns `ok`\nor `{error, Reason}` when the term is written to disk.\n\nTerms are written by the ordinary `write()` function of the operating system.\nHence, it is not guaranteed that the term is written to disk, it can linger in\nthe operating system kernel for a while. To ensure that the item is written to disk,\nfunction `sync/1` must be called.\n\nOwners subscribing to notifications are notified of an error with an\n`error_status` message if the error reason tag is `invalid_header` or\n`file_error`.","ref":"disk_log.html#log/2"},{"type":"function","title":"disk_log.log_terms/2","doc":"Synchronously appends a list of items to an internally formatted log.\n\nIt is more efficient to use this functions instead of [`log/2`](`log/2`). The specified\nlist is split into as large sublists as possible (limited by the size of wrap log files),\nand each sublist is logged as one single item, which reduces the overhead.\n\nOwners subscribing to notifications are notified of an error with an\n`error_status` message if the error reason tag is `invalid_header` or\n`file_error`.","ref":"disk_log.html#log_terms/2"},{"type":"function","title":"disk_log.next_file/1","doc":"For wrap logs, it forces the disk log to start logging to the next log file. It\ncan be used, for example, with [`change_size/2`](`change_size/2`) to reduce the\namount of disk space allocated by the disk log.\n\nOwners subscribing to notifications normally receive a `wrap` message, but if an\nerror occurs with a reason tag of `invalid_header` or `file_error`, an\n`error_status` message is sent.\n\nFor rotate logs, it forces rotation of the currently active log file, compresses\nit and opens a new active file for logging.","ref":"disk_log.html#next_file/1"},{"type":"function","title":"disk_log.open/1","doc":"Open a new disk_log file for reading or writing.\n\nParameter `ArgL` is a list of the following options:\n\n- **`{name, Log}`** - Specifies the log name. This name must be passed on as a\n parameter in all subsequent logging operations. A name must always be\n supplied.\n\n- **`{file, FileName}`** - Specifies the name of the file to be used for logged\n terms. If this value is omitted and the log name is an atom or a string, the\n filename defaults to `lists:concat([Log, \".LOG\"])` for halt logs.\n\n For wrap logs, this is the base name of the files. Each file in a wrap log is\n called ` .N`, where `N` is an integer. Each wrap log also has two\n files called ` .idx` and ` .siz`.\n\n For rotate logs, this is the name of the active log file. The compressed files\n are named as ` .N.gz`, where `N` is an integer and ` .0.gz`\n is the latest compressed log file. All the compressed files are renamed at\n each rotation so that the latest files have the smallest index. The maximum\n value for N is the value of `MaxNoFiles` minus 1.\n\n- **`{linkto, LinkTo}`[](){: #linkto } ** \n If `LinkTo` is a pid, it becomes an owner of the log. If `LinkTo` is `none`, the\n log records that it is used anonymously by some process by incrementing the `users`\n counter. By default, the process that calls [`open/1`](`open/1`) owns the log.\n\n- **`{repair, Repair}`** - If `Repair` is `true`, the current log file is\n repaired, if needed. As the restoration is initiated, a message is output on\n the error log. If `false` is specified, no automatic repair is attempted.\n Instead, the tuple `{error, {need_repair, Log}}` is returned if an attempt is\n made to open a corrupt log file. If `truncate` is specified, the log file\n becomes truncated, creating an empty log, regardless of previous content.\n Defaults to `true`, which has no effect on logs opened in read-only mode.\n\n- **`{type, Type}`** - The log type. Defaults to `halt`.\n\n- **`{format, Format}`** - Disk log format. Defaults to `internal`.\n\n- **`{size, Size}`** - Log size.\n\n When a halt log has reached its maximum size, all attempts to log more items\n are rejected. Defaults to `infinity`, which for halt implies that there is no\n maximum size.\n\n For wrap and rotate logs, parameter `Size` can be a pair\n `{MaxNoBytes, MaxNoFiles}`. For wrap logs it can also be `infinity`. In the\n latter case, if the files of an existing wrap log with the same name can be\n found, the size is read from the existing wrap log, otherwise an error is\n returned.\n\n Wrap logs write at most `MaxNoBytes` bytes on each file and use `MaxNoFiles`\n files before starting all over with the first wrap log file. Regardless of\n `MaxNoBytes`, at least the header (if there is one) and one item are written\n on each wrap log file before wrapping to the next file.\n\n The first time an existing wrap log is opened, that is, when the disk log\n process is created, the value of the option `size` is allowed to differ from\n the current log size, and the size of the disk log is changed as per\n `change_size/2`.\n\n When opening an existing wrap log, it is not necessary to supply a value for\n option `size`, but if the log is already open, that is, the disk log process\n exists, the supplied value must equal the current log size, otherwise the\n tuple `{error, {size_mismatch, CurrentSize, NewSize}}` is returned.\n\n > #### Note {: .info }\n >\n > Before Erlang/OTP 24.0, the supplied value of option `size` was to be equal\n > to the current log size when opening an existing wrap log for the first\n > time, that is, when creating the disk log process.\n\n Rotate logs write at most `MaxNoBytes` bytes on the active log file and keep\n the latest `MaxNoFiles` compressed files. Regardless of `MaxNoBytes`, at least\n the header (if there is one) and one item are written on each rotate log file\n before rotation.\n\n When opening an already open halt log, option `size` is ignored.\n\n- **`{notify, boolean()}`**{: #notify } - If `true`, the log owners are notified\n when certain log events occur. Defaults to `false`. The owners are sent one of the\n following messages when an event occurs:\n\n - **`{disk_log, Node, Log, {wrap, NoLostItems}}`** - Sent when a wrap log has\n filled up one of its files and a new file is opened. `NoLostItems` is the\n number of previously logged items that were lost when truncating existing\n files.\n\n - **`{disk_log, Node, Log, {truncated, NoLostItems}}`** - Sent when a log is\n truncated or reopened. For halt logs `NoLostItems` is the number of items\n written on the log since the disk log process was created. For wrap logs\n `NoLostItems` is the number of items on all wrap log files.\n\n - **`{disk_log, Node, Log, {read_only, Items}}`** - Sent when an asynchronous\n log attempt is made to a log file opened in read-only mode. `Items` is the\n items from the log attempt.\n\n - **`{disk_log, Node, Log, {blocked_log, Items}}`** - Sent when an\n asynchronous log attempt is made to a blocked log that does not queue log\n attempts. `Items` is the items from the log attempt.\n\n - **`{disk_log, Node, Log, {format_external, Items}}`** - Sent when function\n [`alog/2`](`alog/2`) or [`alog_terms/2`](`alog_terms/2`) is used for\n internally formatted logs. `Items` is the items from the log attempt.\n\n - **`{disk_log, Node, Log, full}`** - Sent when an attempt to log items to a\n wrap log would write more bytes than the limit set by option `size`.\n\n - **`{disk_log, Node, Log, {error_status, Status}}`** - Sent when the error\n status changes. The error status is defined by the outcome of the last\n attempt to log items to the log, or to truncate the log, or the last use of\n function [`sync/1`](`sync/1`), [`inc_wrap_file/1`](`inc_wrap_file/1`), or\n [`change_size/2`](`change_size/2`). `Status` is either `ok` or\n `{error, Error}`, the former is the initial value.\n\n- **`{head, Head}`** - Specifies a header to be written first on the log file.\n If the log is a wrap or rotate log, the item `Head` is written first in each\n new file. `Head` is to be a term if the format is `internal`, otherwise an\n `t:iodata/0`. Defaults to `none`, which means that no header is written first\n on the file.\n\n- **`{head_func, {M,F,A}}`** - Specifies a function to be called each time a new\n log file is opened. The call `M:F(A)` is assumed to return `{ok, Head}`. The\n item `Head` is written first in each file. `Head` is to be a term if the\n format is `internal`, otherwise an `t:iodata/0`.\n\n- **`{mode, Mode}`** - Specifies if the log is to be opened in read-only or\n read-write mode. Defaults to `read_write`.\n\n- **`{quiet, Boolean}`** - Specifies if messages will be sent to `error_logger`\n on recoverable errors with the log files. Defaults to `false`.\n\n[`open/1`](`open/1`) returns `{ok, Log}` if the log file is successfully opened.\nIf the file is successfully repaired, the tuple\n`{repaired, Log, {recovered, Rec}, {badbytes, Bad}}` is returned, where `Rec` is\nthe number of whole Erlang terms found in the file and `Bad` is the number of\nbytes in the file that are non-Erlang terms.\n\nWhen a disk log is opened in read-write mode, any existing log file is checked\nfor. If there is none, a new empty log is created, otherwise the existing file\nis opened at the position after the last logged item, and the logging of items\nstarts from there. If the format is `internal` and the existing file is not\nrecognized as an internally formatted log, a tuple\n`{error, {not_a_log_file, FileName}}` is returned.\n\n[`open/1`](`open/1`) cannot be used for changing the values of options of an\nopen log. When there are prior owners or users of a log, all option values\nexcept `name`, `linkto`, and `notify` are only checked against the values\nsupplied before as option values to function [`open/1`](`open/1`),\n[`change_header/2`](`change_header/2`), [`change_notify/3`](`change_notify/3`),\nor [`change_size/2`](`change_size/2`). Thus, none of the options except `name`\nis mandatory. If some specified value differs from the current value, a tuple\n`{error, {arg_mismatch, OptionName, CurrentValue, Value}}` is returned.\n\n> #### Note {: .info }\n>\n> If an owner attempts to open a log as owner once again, it is acknowledged\n> with the return value `{ok, Log}`, but the state of the disk log is not\n> affected.\n\nA log file can be opened more than once by giving different values to option\n`name` or by using the same file when opening a log on different nodes. It is up\nto the user of module `disk_log` to ensure that not more than one disk log\nprocess has write access to any file, otherwise the file can be corrupted.\n\nIf an attempt to open a log file for the first time fails, the disk log process\nterminates with the EXIT message `{{failed,Reason},[{disk_log,open,1}]}`. The\nfunction returns `{error, Reason}` for all other errors.","ref":"disk_log.html#open/1"},{"type":"function","title":"disk_log.pid2name/1","doc":"Returns the log name given the pid of a disk log process on the current node, or\n`undefined` if the specified pid is not a disk log process.\n\nThis function is meant to be used for debugging only.","ref":"disk_log.html#pid2name/1"},{"type":"function","title":"disk_log.reopen/2","doc":"Equivalent to [`reopen(Log, File, Head)`](`reopen/3`) where `Head` is\nthe `Head` specified in `open/1`.","ref":"disk_log.html#reopen/2"},{"type":"function","title":"disk_log.reopen/3","doc":"Renames an internally formatted log file to `File` and then recreates a new log file. If a\nwrap/rotate log exists, `File` is used as the base name of the renamed files.\n\nWrites the value of `Head` first in the newly opened log file. The header argument\nis used only once. Next time a wrap/rotate log file is opened, the header given to\n[`open/1`](`open/1`) is used.\n\nOwners subscribing to notifications receive a `truncate` message.\n\nUpon failure to reopen the log, the disk log process terminates with the EXIT\nmessage `{{failed,Error},[{disk_log,Fun,Arity}]}`. Other processes having\nrequests queued receive the message\n`{disk_log, Node, {error, disk_log_stopped}}`.","ref":"disk_log.html#reopen/3"},{"type":"function","title":"disk_log.sync/1","doc":"Ensures that the contents of the log are written to the disk. This is usually a\nrather expensive operation.","ref":"disk_log.html#sync/1"},{"type":"function","title":"disk_log.truncate/1","doc":"Equivalent to [`truncate(Log, Head)`](`truncate/2`) where `Head` is\nthe `Head` specified in `open/1`.\n\nThis function can be used for both internally and externally\nformatted logs.","ref":"disk_log.html#truncate/1"},{"type":"function","title":"disk_log.truncate/2","doc":"Removes all items from an internally formatted disk log. The argument `Head` or\nis written first in the newly truncated log.\n\nThe header argument is used only once. Next time a wrap/rotate log file is opened,\nthe header given to [`open/1`](`open/1`) is used.\n\nOwners subscribing to notifications receive a `truncate` message.\n\nIf the attempt to truncate the log fails, the disk log process terminates with\nthe EXIT message `{{failed,Reason},[{disk_log,Fun,Arity}]}`. Other processes\nhaving requests queued receive the message\n`{disk_log, Node, {error, disk_log_stopped}}`.","ref":"disk_log.html#truncate/2"},{"type":"function","title":"disk_log.unblock/1","doc":"Unblocks a log. A log can only be unblocked by the blocking process.","ref":"disk_log.html#unblock/1"},{"type":"type","title":"disk_log.bchunk_ret/0","doc":"","ref":"disk_log.html#t:bchunk_ret/0"},{"type":"type","title":"disk_log.block_error_rsn/0","doc":"","ref":"disk_log.html#t:block_error_rsn/0"},{"type":"type","title":"disk_log.chunk_error_rsn/0","doc":"","ref":"disk_log.html#t:chunk_error_rsn/0"},{"type":"type","title":"disk_log.chunk_ret/0","doc":"","ref":"disk_log.html#t:chunk_ret/0"},{"type":"type","title":"disk_log.close_error_rsn/0","doc":"","ref":"disk_log.html#t:close_error_rsn/0"},{"type":"opaque","title":"disk_log.continuation/0","doc":"Chunk continuation returned by [`chunk/2,3`](`chunk/3`),\n[`bchunk/2,3`](`bchunk/3`), or [`chunk_step/3`](`chunk_step/3`).","ref":"disk_log.html#t:continuation/0"},{"type":"type","title":"disk_log.dlog_format/0","doc":"","ref":"disk_log.html#t:dlog_format/0"},{"type":"type","title":"disk_log.dlog_head_opt/0","doc":"","ref":"disk_log.html#t:dlog_head_opt/0"},{"type":"type","title":"disk_log.dlog_info/0","doc":"","ref":"disk_log.html#t:dlog_info/0"},{"type":"type","title":"disk_log.dlog_mode/0","doc":"","ref":"disk_log.html#t:dlog_mode/0"},{"type":"type","title":"disk_log.dlog_optattr/0","doc":"","ref":"disk_log.html#t:dlog_optattr/0"},{"type":"type","title":"disk_log.dlog_option/0","doc":"","ref":"disk_log.html#t:dlog_option/0"},{"type":"type","title":"disk_log.dlog_options/0","doc":"","ref":"disk_log.html#t:dlog_options/0"},{"type":"type","title":"disk_log.dlog_size/0","doc":"","ref":"disk_log.html#t:dlog_size/0"},{"type":"type","title":"disk_log.dlog_type/0","doc":"","ref":"disk_log.html#t:dlog_type/0"},{"type":"type","title":"disk_log.file_error/0","doc":"","ref":"disk_log.html#t:file_error/0"},{"type":"type","title":"disk_log.inc_wrap_error_rsn/0","doc":"","ref":"disk_log.html#t:inc_wrap_error_rsn/0"},{"type":"type","title":"disk_log.invalid_header/0","doc":"","ref":"disk_log.html#t:invalid_header/0"},{"type":"type","title":"disk_log.log/0","doc":"","ref":"disk_log.html#t:log/0"},{"type":"type","title":"disk_log.log_error_rsn/0","doc":"","ref":"disk_log.html#t:log_error_rsn/0"},{"type":"type","title":"disk_log.next_file_error_rsn/0","doc":"","ref":"disk_log.html#t:next_file_error_rsn/0"},{"type":"type","title":"disk_log.notify_ret/0","doc":"","ref":"disk_log.html#t:notify_ret/0"},{"type":"type","title":"disk_log.open_error_rsn/0","doc":"","ref":"disk_log.html#t:open_error_rsn/0"},{"type":"type","title":"disk_log.open_ret/0","doc":"","ref":"disk_log.html#t:open_ret/0"},{"type":"type","title":"disk_log.reopen_error_rsn/0","doc":"","ref":"disk_log.html#t:reopen_error_rsn/0"},{"type":"type","title":"disk_log.sync_error_rsn/0","doc":"","ref":"disk_log.html#t:sync_error_rsn/0"},{"type":"type","title":"disk_log.trunc_error_rsn/0","doc":"","ref":"disk_log.html#t:trunc_error_rsn/0"},{"type":"type","title":"disk_log.unblock_error_rsn/0","doc":"","ref":"disk_log.html#t:unblock_error_rsn/0"},{"type":"module","title":"error_logger","doc":"Erlang error logger.\n\n> #### Note {: .info }\n>\n> In Erlang/OTP 21.0, a new API for logging was added. The old `m:error_logger`\n> module can still be used by legacy code, but log events are redirected to the\n> new Logger API. New code should use the Logger API directly.\n>\n> `m:error_logger` is no longer started by default, but is automatically started\n> when an event handler is added with [`error_logger:add_report_handler/1,2`](`error_logger:add_report_handler/2`). The\n> `m:error_logger` module is then also added as a handler to the new logger.\n>\n> See `m:logger` and the [Logging](logger_chapter.md) chapter in the User's\n> Guide for more information.\n\nThe Erlang _error logger_ is an event manager (see\n[OTP Design Principles](`e:system:design_principles.md`) and `m:gen_event`),\nregistered as `m:error_logger`.\n\nError logger is no longer started by default, but is automatically started when\nan event handler is added with\n[`add_report_handler/1,2`](`add_report_handler/1`). The `m:error_logger` module is\nthen also added as a handler to the new logger, causing log events to be\nforwarded from logger to error logger, and consequently to all installed error\nlogger event handlers.\n\nUser-defined event handlers can be added to handle application-specific events.\n\nExisting event handlers provided by STDLIB and SASL are still available, but are\nno longer used by OTP.\n\nWarning events were introduced in Erlang/OTP R9C and are enabled by default as\nfrom Erlang/OTP 18.0. To retain backwards compatibility with existing\nuser-defined event handlers, the warning events can be tagged as `errors` or\n`info` using command-line flag `+W `, thus showing up as\n`ERROR REPORT` or `INFO REPORT` in the logs.\n\n[](){: #events }","ref":"error_logger.html"},{"type":"module","title":"Events - error_logger","doc":"All event handlers added to the error logger must handle the following events.\n`Gleader` is the group leader pid of the process that sent the event, and `Pid`\nis the process that sent the event.\n\n- **`{error, Gleader, {Pid, Format, Data}}`** -\n Generated when [`error_msg/1,2`](`error_msg/2`) or `format/2` is called.\n\n- **`{error_report, Gleader, {Pid, std_error, Report}}`** -\n Generated when [`error_report/1`](`error_report/1`) is called.\n\n- **`{error_report, Gleader, {Pid, Type, Report}}`** -\n Generated when [`error_report/2`](`error_report/2`) is called.\n\n- **`{warning_msg, Gleader, {Pid, Format, Data}}`** -\n Generated when [`warning_msg/1,2`](`warning_msg/2`) is called if warnings are set to\n be tagged as warnings.\n\n- **`{warning_report, Gleader, {Pid, std_warning, Report}}`** -\n Generated when [`warning_report/1`](`warning_report/1`) is called if warnings are\n set to be tagged as warnings.\n\n- **`{warning_report, Gleader, {Pid, Type, Report}}`** - Generated when\n [`warning_report/2`](`warning_report/2`) is called if warnings are set to be\n tagged as warnings.\n\n- **`{info_msg, Gleader, {Pid, Format, Data}}`** -\n Generated when [`info_msg/1,2`](`info_msg/2`) is called.\n\n- **`{info_report, Gleader, {Pid, std_info, Report}}`** -\n Generated when [`info_report/1`](`info_report/1`) is called.\n\n- **`{info_report, Gleader, {Pid, Type, Report}}`** -\n Generated when [`info_report/2`](`info_report/2`) is called.\n\nNotice that some system-internal events can also be received. Therefore a\ncatch-all clause last in the definition of the event handler callback function\n`c:gen_event:handle_event/2` is necessary. This also applies for\n`c:gen_event:handle_info/2`, as the event handler must also take care of some\nsystem-internal messages.","ref":"error_logger.html#module-events"},{"type":"module","title":"See Also - error_logger","doc":"`m:gen_event`, `m:logger`, `m:log_mf_h`, [`kernel`](kernel_app.md),\n[`sasl`](`e:sasl:sasl_app.md`)","ref":"error_logger.html#module-see-also"},{"type":"function","title":"error_logger.add_report_handler/1","doc":"","ref":"error_logger.html#add_report_handler/1"},{"type":"function","title":"error_logger.add_report_handler/2","doc":"Adds a new event handler to the error logger. The event handler must be\nimplemented as a `m:gen_event` callback module.\n\n`Handler` is typically the name of the callback module and `Args` is an optional\nterm (defaults to []) passed to the initialization callback function\n`c:gen_event:init/1`. The function returns `ok` if successful.\n\nThe event handler must be able to handle the events in this module, see section\n[Events](`m:error_logger#module-events`).\n\nThe first time this function is called, `m:error_logger` is added as a Logger\nhandler, and the `m:error_logger` process is started.","ref":"error_logger.html#add_report_handler/2"},{"type":"function","title":"error_logger.delete_report_handler/1","doc":"Deletes an event handler from the error logger by calling\n[`gen_event:delete_handler(error_logger, Handler, [])`](`gen_event:delete_handler/3`).\n\nIf no more event handlers exist after the deletion, `m:error_logger` is removed as\na Logger handler, and the `m:error_logger` process is stopped.","ref":"error_logger.html#delete_report_handler/1"},{"type":"function","title":"error_logger.error_msg/1","doc":"","ref":"error_logger.html#error_msg/1"},{"type":"function","title":"error_logger.error_msg/2","doc":"Log a standard error event. The `Format` and `Data` arguments are the same as\nthe arguments of `io:format/2` in STDLIB.\n\nError logger forwards the event to Logger, including metadata that allows\nbackwards compatibility with legacy error logger event handlers.\n\nThe event is handled by the default Logger handler.\n\nThis function is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_ERROR`](`m:logger#module-macros`) macro or\n[`logger:error/1,2,3`](`logger:error/1`) instead.\n\n_Example:_\n\n```text\n1> error_logger:error_msg(\"An error occurred in ~p\", [a_module]).\n=ERROR REPORT==== 22-May-2018::11:18:43.376917 ===\nAn error occurred in a_module\nok\n```\n\n> #### Warning {: .warning }\n>\n> If the Unicode translation modifier (`t`) is used in the format string, all\n> event handlers must ensure that the formatted output is correctly encoded for\n> the I/O device.","ref":"error_logger.html#error_msg/2"},{"type":"function","title":"error_logger.error_report/1","doc":"Log a standard error event. Error logger forwards the event to Logger, including\nmetadata that allows backwards compatibility with legacy error logger event\nhandlers.\n\nThe event is handled by the default Logger handler.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_ERROR`](`m:logger#module-macros`) macro or\n[`logger:error/1,2,3`](`logger:error/1`) instead.\n\n_Example:_\n\n```text\n2> error_logger:error_report([{tag1,data1},a_term,{tag2,data}]).\n=ERROR REPORT==== 22-May-2018::11:24:23.699306 ===\n tag1: data1\n a_term\n tag2: data\nok\n3> error_logger:error_report(\"Serious error in my module\").\n=ERROR REPORT==== 22-May-2018::11:24:45.972445 ===\nSerious error in my module\nok\n```","ref":"error_logger.html#error_report/1"},{"type":"function","title":"error_logger.error_report/2","doc":"Log a user-defined error event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nError logger also adds a `domain` field with value `[Type]` to this event's\nmetadata, causing the filters of the default Logger handler to discard the\nevent. A different Logger handler, or an error logger event handler, must be\nadded to handle this event.\n\nIt is recommended that `Report` follows the same structure as for\n`error_report/1`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_ERROR`](`m:logger#module-macros`) macro or\n[`logger:error/1,2,3`](`logger:error/1`) instead.","ref":"error_logger.html#error_report/2"},{"type":"function","title":"error_logger.format/2","doc":"","ref":"error_logger.html#format/2"},{"type":"function","title":"error_logger.get_format_depth/0","doc":"Returns [`max(10, Depth)`](`max/2`), where `Depth` is the value of\n[`error_logger_format_depth`](kernel_app.md#error_logger_format_depth) in the\nKernel application, if Depth is an integer. Otherwise, `unlimited` is returned.\n\n> #### Note {: .info }\n>\n> The [`error_logger_format_depth`](kernel_app.md#error_logger_format_depth) variable is\n> [deprecated](kernel_app.md#deprecated-configuration-parameters) since the\n> [Logger API](`m:logger`) was introduced in Erlang/OTP 21.0. The variable, and\n> this function, are kept for backwards compatibility since they still might be\n> used by legacy report handlers.","ref":"error_logger.html#get_format_depth/0"},{"type":"function","title":"error_logger.info_msg/1","doc":"","ref":"error_logger.html#info_msg/1"},{"type":"function","title":"error_logger.info_msg/2","doc":"Log a standard information event. The `Format` and `Data` arguments are the same\nas the arguments of `io:format/2` in STDLIB.\n\nError logger forwards the event to Logger, including metadata that allows\nbackwards compatibility with legacy error logger event handlers.\n\nThe event is handled by the default Logger handler.\n\nThese functions are kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_INFO`](`m:logger#module-macros`) macro or\n[`logger:info/1,2,3`](`logger:info/1`) instead.\n\n_Example:_\n\n```text\n1> error_logger:info_msg(\"Something happened in ~p\", [a_module]).\n=INFO REPORT==== 22-May-2018::12:03:32.612462 ===\nSomething happened in a_module\nok\n```\n\n> #### Warning {: .warning }\n>\n> If the Unicode translation modifier (`t`) is used in the format string, all\n> event handlers must ensure that the formatted output is correctly encoded for\n> the I/O device.","ref":"error_logger.html#info_msg/2"},{"type":"function","title":"error_logger.info_report/1","doc":"Log a standard information event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nThe event is handled by the default Logger handler.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_INFO`](`m:logger#module-macros`) macro or\n[`logger:info/1,2,3`](`logger:info/1`) instead.\n\n_Example:_\n\n```text\n2> error_logger:info_report([{tag1,data1},a_term,{tag2,data}]).\n=INFO REPORT==== 22-May-2018::12:06:35.994440 ===\n tag1: data1\n a_term\n tag2: data\nok\n3> error_logger:info_report(\"Something strange happened\").\n=INFO REPORT==== 22-May-2018::12:06:49.066872 ===\nSomething strange happened\nok\n```","ref":"error_logger.html#info_report/1"},{"type":"function","title":"error_logger.info_report/2","doc":"Log a user-defined information event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nError logger also adds a `domain` field with value `[Type]` to this event's\nmetadata, causing the filters of the default Logger handler to discard the\nevent. A different Logger handler, or an error logger event handler, must be\nadded to handle this event.\n\nIt is recommended that `Report` follows the same structure as for\n`info_report/1`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_INFO`](`m:logger#module-macros`) macro or\n[`logger:info/1,2,3`](`logger:info/1`) instead.","ref":"error_logger.html#info_report/2"},{"type":"function","title":"error_logger.logfile/1","doc":"Enables or disables printout of standard events to a file.\n\nThis is done by adding or deleting the `error_logger_file_h` event handler, and\nthus indirectly adding `m:error_logger` as a Logger handler.\n\nNotice that this function does not manipulate the Logger configuration directly,\nmeaning that if the default Logger handler is already logging to a file, this\nfunction can potentially cause logging to a second file.\n\nThis function is useful as a shortcut during development and testing, but must\nnot be used in a production system. See section [Logging](logger_chapter.md) in\nthe Kernel User's Guide, and the `m:logger` manual page for information about\nhow to configure Logger for live systems.\n\n`Request` is one of the following:\n\n- **`{open, Filename}`** - Opens log file `Filename`. Returns `ok` if\n successful, or `{error, allready_have_logfile}` if logging to file is already\n enabled, or an error tuple if another error occurred (for example, if\n `Filename` cannot be opened). The file is opened with encoding UTF-8.\n\n- **`close`** - Closes the current log file. Returns `ok`, or\n `{error, module_not_found}`.\n\n- **`filename`** - Returns the name of the log file `Filename`, or\n `{error, no_log_file}` if logging to file is not enabled.","ref":"error_logger.html#logfile/1"},{"type":"function","title":"error_logger.tty/1","doc":"Enables (`Flag == true`) or disables (`Flag == false`) printout of standard\nevents to the terminal.\n\nThis is done by manipulating the Logger configuration. The function is useful as\na shortcut during development and testing, but must not be used in a production\nsystem. See section [Logging](logger_chapter.md) in the Kernel User's Guide, and\nthe `m:logger` manual page for information about how to configure Logger for\nlive systems.","ref":"error_logger.html#tty/1"},{"type":"function","title":"error_logger.warning_map/0","doc":"Returns the current mapping for warning events.\n\nEvents sent using [`warning_msg/1,2`](`warning_msg/2`) or\n[`warning_report/1,2`](`warning_report/2`) are tagged as errors, warnings\n(default), or info, depending on the value of command-line flag `+W`.\n\n_Example:_\n\n```text\nos$ erl\nErlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]\n\nEshell V5.4.8 (abort with ^G)\n1> error_logger:warning_map().\nwarning\n2> error_logger:warning_msg(\"Warnings tagged as: ~p~n\", [warning]).\n\n=WARNING REPORT==== 11-Aug-2005::15:31:55 ===\nWarnings tagged as: warning\nok\n3>\nUser switch command\n --> q\nos$ erl +W e\nErlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]\n\nEshell V5.4.8 (abort with ^G)\n1> error_logger:warning_map().\nerror\n2> error_logger:warning_msg(\"Warnings tagged as: ~p~n\", [error]).\n\n=ERROR REPORT==== 11-Aug-2005::15:31:23 ===\nWarnings tagged as: error\nok\n```","ref":"error_logger.html#warning_map/0"},{"type":"function","title":"error_logger.warning_msg/1","doc":"","ref":"error_logger.html#warning_msg/1"},{"type":"function","title":"error_logger.warning_msg/2","doc":"Log a standard warning event. The `Format` and `Data` arguments are the same as\nthe arguments of `io:format/2` in STDLIB.\n\nError logger forwards the event to Logger, including metadata that allows\nbackwards compatibility with legacy error logger event handlers.\n\nThe event is handled by the default Logger handler. The log level can be changed\nto error or info, see `warning_map/0`.\n\nThese functions are kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_WARNING`](`m:logger#module-macros`) macro or\n[`logger:warning/1,2,3`](`logger:warning/1`) instead.\n\n> #### Warning {: .warning }\n>\n> If the Unicode translation modifier (`t`) is used in the format string, all\n> event handlers must ensure that the formatted output is correctly encoded for\n> the I/O device.","ref":"error_logger.html#warning_msg/2"},{"type":"function","title":"error_logger.warning_report/1","doc":"Log a standard warning event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nThe event is handled by the default Logger handler. The log level can be changed\nto error or info, see `warning_map/0`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_WARNING`](`m:logger#module-macros`) macro or\n[`logger:warning/1,2,3`](`logger:warning/1`) instead.","ref":"error_logger.html#warning_report/1"},{"type":"function","title":"error_logger.warning_report/2","doc":"Log a user-defined warning event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nError logger also adds a `domain` field with value `[Type]` to this event's\nmetadata, causing the filters of the default Logger handler to discard the\nevent. A different Logger handler, or an error logger event handler, must be\nadded to handle this event.\n\nThe log level can be changed to error or info, see `warning_map/0`.\n\nIt is recommended that `Report` follows the same structure as for\n`warning_report/1`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_WARNING`](`m:logger#module-macros`) macro or\n[`logger:warning/1,2,3`](`logger:warning/1`) instead.","ref":"error_logger.html#warning_report/2"},{"type":"type","title":"error_logger.open_error/0","doc":"","ref":"error_logger.html#t:open_error/0"},{"type":"type","title":"error_logger.report/0","doc":"","ref":"error_logger.html#t:report/0"},{"type":"module","title":"logger","doc":"API module for Logger, the standard logging facility in Erlang/OTP.\n\nThis module implements the main API for logging in Erlang/OTP. To create a log\nevent, use the [API functions](#logging-api-functions) or the log\n[macros](#module-macros), for example:\n\n```erlang\n?LOG_ERROR(\"error happened because: ~p\", [Reason]). % With macro\nlogger:error(\"error happened because: ~p\", [Reason]). % Without macro\n```\n\nTo configure the Logger backend, use\n[Kernel configuration parameters](kernel_app.md#logger) or\n[configuration functions](#configuration-api-functions) in the Logger API.\n\nBy default, the Kernel application installs one log handler at system start.\nThis handler is named `default`. It receives and processes standard log events\nproduced by the Erlang runtime system, standard behaviours and different\nErlang/OTP applications. The log events are by default printed to the terminal.\n\nIf you want your systems logs to be printed to a file instead, you must\nconfigure the default handler to do so. The simplest way is to include the\nfollowing in your [`sys.config`](config.md):\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{config => #{file => \"path/to/file.log\"}}}]}]}].\n```\n\nFor more information about:\n\n- the Logger facility in general, see the [User's Guide](logger_chapter.md).\n- how to configure Logger, see the\n [Configuration](logger_chapter.md#configuration) section in the User's Guide.\n- the built-in handlers, see `m:logger_std_h` and `m:logger_disk_log_h`.\n- the built-in formatter, see `m:logger_formatter`.\n- built-in filters, see `m:logger_filters`.","ref":"logger.html"},{"type":"module","title":"Macros - logger","doc":"The following macros are defined in `logger.hrl`, which is included in a module\nwith the directive\n\n```erlang\n -include_lib(\"kernel/include/logger.hrl\").\n```\n\n- `?LOG_EMERGENCY(StringOrReport[,Metadata])`\n- `?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])`\n- `?LOG_ALERT(StringOrReport[,Metadata])`\n- `?LOG_ALERT(FunOrFormat,Args[,Metadata])`\n- `?LOG_CRITICAL(StringOrReport[,Metadata])`\n- `?LOG_CRITICAL(FunOrFormat,Args[,Metadata])`\n- `?LOG_ERROR(StringOrReport[,Metadata])`\n- `?LOG_ERROR(FunOrFormat,Args[,Metadata])`\n- `?LOG_WARNING(StringOrReport[,Metadata])`\n- `?LOG_WARNING(FunOrFormat,Args[,Metadata])`\n- `?LOG_NOTICE(StringOrReport[,Metadata])`\n- `?LOG_NOTICE(FunOrFormat,Args[,Metadata])`\n- `?LOG_INFO(StringOrReport[,Metadata])`\n- `?LOG_INFO(FunOrFormat,Args[,Metadata])`\n- `?LOG_DEBUG(StringOrReport[,Metadata])`\n- `?LOG_DEBUG(FunOrFormat,Args[,Metadata])`\n- `?LOG(Level,StringOrReport[,Metadata])`\n- `?LOG(Level,FunOrFormat,Args[,Metadata])`\n\nAll macros expand to a call to Logger, where `Level` is taken from the macro\nname, or from the first argument in the case of the `?LOG` macro. Location data\nis added to the metadata as described under the `t:metadata/0` type definition.\n\nThe call is wrapped in a case statement and will be evaluated only if `Level` is\nequal to or below the configured log level.","ref":"logger.html#module-macros"},{"type":"module","title":"See Also - logger","doc":"[`config`](config.md), `m:erlang`, `m:io`, `m:logger_disk_log_h`,\n`m:logger_filters`, `m:logger_handler`, `m:logger_formatter`, `m:logger_std_h`,\n`m:unicode`","ref":"logger.html#module-see-also"},{"type":"function","title":"logger.add_handler/3","doc":"Add a handler with the given configuration.\n\n`HandlerId` is a unique identifier which must be used in all subsequent calls\nreferring to this handler.","ref":"logger.html#add_handler/3"},{"type":"function","title":"logger.add_handler_filter/3","doc":"Add a filter to the specified handler.\n\nThe filter fun is called with the log event as the first parameter, and the\nspecified `filter_args()` as the second parameter.\n\nThe return value of the fun specifies if a log event is to be discarded or\nforwarded to the handler callback:\n\n- **`t:log_event/0`** - The filter _passed_. The next handler filter, if any, is\n applied. If no more filters exist for this handler, the log event is forwarded\n to the handler callback.\n\n- **`stop`** - The filter _did not pass_, and the log event is immediately\n discarded.\n\n- **`ignore`** - The filter has no knowledge of the log event. The next handler\n filter, if any, is applied. If no more filters exist for this handler, the\n value of the `filter_default` configuration parameter for the handler\n specifies if the log event shall be discarded or forwarded to the handler\n callback.\n\nSee section [Filters](logger_chapter.md#filters) in the User's Guide for more\ninformation about filters.\n\nSome built-in filters exist. These are defined in `m:logger_filters`.","ref":"logger.html#add_handler_filter/3"},{"type":"function","title":"logger.add_handlers/1","doc":"Reads the application configuration parameter `logger` and calls\n[`add_handlers/1`](`add_handlers/1`) with its contents.\n\nThis function should be used by custom Logger handlers to make configuration\nconsistent no matter which handler the system uses. Normal usage is to add a\ncall to `logger:add_handlers/1` just after the processes that the handler needs\nare started, and pass the application's `logger` configuration as the argument.\nFor example:\n\n```erlang\n-behaviour(application).\nstart(_, []) ->\n case supervisor:start_link({local, my_sup}, my_sup, []) of\n {ok, Pid} ->\n ok = logger:add_handlers(my_app),\n {ok, Pid, []};\n Error -> Error\n end.\n```\n\nThis reads the `logger` configuration parameter from the `my_app` application\nand starts the configured handlers. The contents of the configuration use the\nsame rules as the\n[logger handler configuration](logger_chapter.md#handler-configuration).\n\nIf the handler is meant to replace the default handler, the Kernel's default\nhandler have to be disabled before the new handler is added. A `sys.config` file\nthat disables the Kernel handler and adds a custom handler could look like this:\n\n```erlang\n[{kernel,\n [{logger,\n %% Disable the default Kernel handler\n [{handler, default, undefined}]}]},\n {my_app,\n [{logger,\n %% Enable this handler as the default\n [{handler, default, my_handler, #{}}]}]}].\n```","ref":"logger.html#add_handlers/1"},{"type":"function","title":"logger.add_primary_filter/2","doc":"Add a primary filter to Logger.\n\nThe filter fun is called with the log event as the first parameter, and the\nspecified `filter_args()` as the second parameter.\n\nThe return value of the fun specifies if a log event is to be discarded or\nforwarded to the handlers:\n\n- **`t:log_event/0`** - The filter _passed_. The next primary filter, if any, is\n applied. If no more primary filters exist, the log event is forwarded to the\n handler part of Logger, where handler filters are applied.\n\n- **`stop`** - The filter _did not pass_, and the log event is immediately\n discarded.\n\n- **`ignore`** - The filter has no knowledge of the log event. The next primary\n filter, if any, is applied. If no more primary filters exist, the value of the\n primary `filter_default` configuration parameter specifies if the log event\n shall be discarded or forwarded to the handler part.\n\nSee section [Filters](logger_chapter.md#filters) in the User's Guide for more\ninformation about filters.\n\nSome built-in filters exist. These are defined in `m:logger_filters`.","ref":"logger.html#add_primary_filter/2"},{"type":"function","title":"logger.alert/1","doc":"","ref":"logger.html#alert/1"},{"type":"function","title":"logger.alert/2","doc":"Create a alert log event.\n\nEquivalent to [`log(alert, StringOrReport, Metadata)`](`log/3`) if called\nas [`alert(StringOrReport, Metadata)`](`alert/2`).\n\nEquivalent to [`alert(FormatOrFun, Args, #{})`](`alert/3`) if called as\n[`alert(FormatOrFun, Args)`](`alert/2`).","ref":"logger.html#alert/2"},{"type":"function","title":"logger.alert/3","doc":"","ref":"logger.html#alert/3"},{"type":"function","title":"logger.compare_levels/2","doc":"Compare the severity of two log levels. Returns `gt` if `Level1` is more severe\nthan `Level2`, `lt` if `Level1` is less severe, and `eq` if the levels are\nequal.","ref":"logger.html#compare_levels/2"},{"type":"function","title":"logger.critical/1","doc":"","ref":"logger.html#critical/1"},{"type":"function","title":"logger.critical/2","doc":"Create a critical log event.\n\nEquivalent to [`log(critical, StringOrReport, Metadata)`](`log/3`) if called\nas [`critical(StringOrReport, Metadata)`](`critical/2`).\n\nEquivalent to [`critical(FormatOrFun, Args, #{})`](`critical/3`) if called as\n[`critical(FormatOrFun, Args)`](`critical/2`).","ref":"logger.html#critical/2"},{"type":"function","title":"logger.critical/3","doc":"","ref":"logger.html#critical/3"},{"type":"function","title":"logger.debug/1","doc":"","ref":"logger.html#debug/1"},{"type":"function","title":"logger.debug/2","doc":"Create a debug log event.\n\nEquivalent to [`log(debug, StringOrReport, Metadata)`](`log/3`) if called\nas [`debug(StringOrReport, Metadata)`](`debug/2`).\n\nEquivalent to [`debug(FormatOrFun, Args, #{})`](`debug/3`) if called as\n[`debug(FormatOrFun, Args)`](`debug/2`).","ref":"logger.html#debug/2"},{"type":"function","title":"logger.debug/3","doc":"","ref":"logger.html#debug/3"},{"type":"function","title":"logger.emergency/1","doc":"","ref":"logger.html#emergency/1"},{"type":"function","title":"logger.emergency/2","doc":"Create a emergency log event.\n\nEquivalent to [`log(emergency, StringOrReport, Metadata)`](`log/3`) if called\nas [`emergency(StringOrReport, Metadata)`](`emergency/2`).\n\nEquivalent to [`emergency(FormatOrFun, Args, #{})`](`emergency/3`) if called as\n[`emergency(FormatOrFun, Args)`](`emergency/2`).","ref":"logger.html#emergency/2"},{"type":"function","title":"logger.emergency/3","doc":"","ref":"logger.html#emergency/3"},{"type":"function","title":"logger.error/1","doc":"","ref":"logger.html#error/1"},{"type":"function","title":"logger.error/2","doc":"Create a error log event.\n\nEquivalent to [`log(error, StringOrReport, Metadata)`](`log/3`) if called\nas [`error(StringOrReport, Metadata)`](`error/2`).\n\nEquivalent to [`error(FormatOrFun, Args, #{})`](`error/3`) if called as\n[`error(FormatOrFun, Args)`](`error/2`).","ref":"logger.html#error/2"},{"type":"function","title":"logger.error/3","doc":"","ref":"logger.html#error/3"},{"type":"function","title":"logger.format_report/1","doc":"Convert a log message on report form to `{Format, Args}`. This is the default\nreport callback used by `m:logger_formatter` when no custom report callback is\nfound. See section [Log Message](logger_chapter.md#log-message) in the Kernel\nUser's Guide for information about report callbacks and valid forms of log\nmessages.\n\nThe function produces lines of `Key: Value` from key-value lists. Strings are\nprinted with `~ts` and other terms with `~tp`.\n\nIf `Report` is a map, it is converted to a key-value list before formatting as\nsuch.","ref":"logger.html#format_report/1"},{"type":"function","title":"logger.get_config/0","doc":"Look up all current Logger configuration, including primary, handler, and proxy\nconfiguration, and module level settings.","ref":"logger.html#get_config/0"},{"type":"function","title":"logger.get_handler_config/0","doc":"Look up the current configuration for all handlers.","ref":"logger.html#get_handler_config/0"},{"type":"function","title":"logger.get_handler_config/1","doc":"Look up the current configuration for the given handler.","ref":"logger.html#get_handler_config/1"},{"type":"function","title":"logger.get_handler_ids/0","doc":"Look up the identities for all installed handlers.","ref":"logger.html#get_handler_ids/0"},{"type":"function","title":"logger.get_module_level/0","doc":"Look up all current module levels. Returns a list containing one\n`{Module,Level}` element for each module for which the module level was\npreviously set with `set_module_level/2`.","ref":"logger.html#get_module_level/0"},{"type":"function","title":"logger.get_module_level/1","doc":"Look up the current level for the given modules. Returns a list containing one\n`{Module,Level}` element for each of the given modules for which the module\nlevel was previously set with `set_module_level/2`.","ref":"logger.html#get_module_level/1"},{"type":"function","title":"logger.get_primary_config/0","doc":"Look up the current primary configuration for Logger.","ref":"logger.html#get_primary_config/0"},{"type":"function","title":"logger.get_process_metadata/0","doc":"Retrieve data set with `set_process_metadata/1` or `update_process_metadata/1`.","ref":"logger.html#get_process_metadata/0"},{"type":"function","title":"logger.get_proxy_config/0","doc":"Look up the current configuration for the Logger proxy.\n\nFor more information about the proxy, see section\n[Logger Proxy](logger_chapter.md#logger-proxy) in the Kernel User's Guide.","ref":"logger.html#get_proxy_config/0"},{"type":"function","title":"logger.i/0","doc":"Pretty print all Logger configuration.","ref":"logger.html#i/0"},{"type":"function","title":"logger.i/1","doc":"Pretty print the Logger configuration.","ref":"logger.html#i/1"},{"type":"function","title":"logger.info/1","doc":"","ref":"logger.html#info/1"},{"type":"function","title":"logger.info/2","doc":"Create a info log event.\n\nEquivalent to [`log(info, StringOrReport, Metadata)`](`log/3`) if called\nas [`info(StringOrReport, Metadata)`](`info/2`).\n\nEquivalent to [`info(FormatOrFun, Args, #{})`](`info/3`) if called as\n[`info(FormatOrFun, Args)`](`info/2`).","ref":"logger.html#info/2"},{"type":"function","title":"logger.info/3","doc":"","ref":"logger.html#info/3"},{"type":"function","title":"logger.log/2","doc":"","ref":"logger.html#log/2"},{"type":"function","title":"logger.log/3","doc":"Create a log event at the given [log level](logger_chapter.md#log-level), with\nthe given [message](logger_chapter.md#log-message) to be logged and\n[_metadata_](logger_chapter.md#metadata).\n\n*Example*:\n\n```erlang\n%% A plain string\n1> logger:log(info, \"Hello World\").\n%% A plain string with metadata\n2> logger:log(debug, \"Hello World\", #{ meta => data }).\n%% A format string with arguments\n3> logger:log(warning, \"The roof is on ~ts\",[Cause]).\n%% A report\n4> logger:log(warning, #{ what => roof, cause => Cause }).\n```\n\nEquivalent to [`log(Level, FormatOrFun, Args, #{})`](`log/4`) if called as\n`log(Level, FormatOrFun, Args)`.","ref":"logger.html#log/3"},{"type":"function","title":"logger.log/4","doc":"Create a log event at the given [log level](logger_chapter.md#log-level), with\nthe given [message](logger_chapter.md#log-message) to be logged and\n[_metadata_](logger_chapter.md#metadata).\n\nThe message and metadata can either be given directly in the arguments, or\nreturned from a fun. Passing a fun instead of the message/metadata directly is\nuseful in scenarios when the message/metadata is very expensive to compute. This\nis because the fun is only evaluated when the message/metadata is actually\nneeded, which may be not at all if the log event is not to be logged. Examples:\n\n```erlang\n%% A plain string with expensive metadata\n1> logger:info(fun([]) -> {\"Hello World\", #{ meta => expensive() }} end,[]).\n%% An expensive report\n2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).\n%% A plain string with expensive metadata and normal metadata\n3> logger:debug(fun([]) -> {\"Hello World\", #{ meta => expensive() }} end,[],\n #{ meta => data }).\n```\n\nWhen metadata is given both as an argument and returned from the fun they are\nmerged. If equal keys exists the values are taken from the metadata returned by\nthe fun.","ref":"logger.html#log/4"},{"type":"function","title":"logger.notice/1","doc":"","ref":"logger.html#notice/1"},{"type":"function","title":"logger.notice/2","doc":"Create a notice log event.\n\nEquivalent to [`log(notice, StringOrReport, Metadata)`](`log/3`) if called\nas [`notice(StringOrReport, Metadata)`](`notice/2`).\n\nEquivalent to [`notice(FormatOrFun, Args, #{})`](`notice/3`) if called as\n[`notice(FormatOrFun, Args)`](`notice/2`).","ref":"logger.html#notice/2"},{"type":"function","title":"logger.notice/3","doc":"","ref":"logger.html#notice/3"},{"type":"function","title":"logger.reconfigure/0","doc":"Reconfigure Logger using updated `kernel` configuration that was set after\n`kernel` application was loaded.\n\nBeware, that this is meant to be run only by the build tools, not manually\nduring application lifetime, as this may cause missing log entries.","ref":"logger.html#reconfigure/0"},{"type":"function","title":"logger.remove_handler/1","doc":"Remove the handler identified by `HandlerId`.","ref":"logger.html#remove_handler/1"},{"type":"function","title":"logger.remove_handler_filter/2","doc":"Remove the filter identified by `FilterId` from the handler identified by\n`HandlerId`.","ref":"logger.html#remove_handler_filter/2"},{"type":"function","title":"logger.remove_primary_filter/1","doc":"Remove the primary filter identified by `FilterId` from Logger.","ref":"logger.html#remove_primary_filter/1"},{"type":"function","title":"logger.set_application_level/2","doc":"Set the log level for all the modules of the specified application.\n\nThis function is a convenience function that calls\n[logger:set_module_level/2](`set_module_level/2`) for each module associated\nwith an application.","ref":"logger.html#set_application_level/2"},{"type":"function","title":"logger.set_handler_config/2","doc":"Set configuration data for the specified handler. This overwrites the current\nhandler configuration.\n\nTo modify the existing configuration, use `update_handler_config/2`, or, if a\nmore complex merge is needed, read the current configuration with\n[`get_handler_config/1` ](`get_handler_config/1`), then do the merge before\nwriting the new configuration back with this function.\n\nIf a key is removed compared to the current configuration, and the key is known\nby Logger, the default value is used. If it is a custom key, then it is up to\nthe handler implementation if the value is removed or a default value is\ninserted.","ref":"logger.html#set_handler_config/2"},{"type":"function","title":"logger.set_handler_config/3","doc":"Add or update configuration data for the specified handler. If the given `Key`\nalready exists, its associated value will be changed to the given value. If it\ndoes not exist, it will be added.\n\nIf the value is incomplete, which for example can be the case for the `config`\nkey, it is up to the handler implementation how the unspecified parts are set.\nFor all handlers in the Kernel application, unspecified data for the `config`\nkey is set to default values. To update only specified data, and keep the\nexisting configuration for the rest, use `update_handler_config/3`.\n\nSee the definition of the `t:logger_handler:config/0` type for more information\nabout the different parameters.","ref":"logger.html#set_handler_config/3"},{"type":"function","title":"logger.set_module_level/2","doc":"Set the log level for the specified modules.\n\nThe log level for a module overrides the primary log level of Logger for log\nevents originating from the module in question. Notice, however, that it does\nnot override the level configuration for any handler.\n\nFor example: Assume that the primary log level for Logger is `info`, and there\nis one handler, `h1`, with level `info` and one handler, `h2`, with level\n`debug`.\n\nWith this configuration, no debug messages will be logged, since they are all\nstopped by the primary log level.\n\nIf the level for `mymodule` is now set to `debug`, then debug events from this\nmodule will be logged by the handler `h2`, but not by handler `h1`.\n\nDebug events from other modules are still not logged.\n\nTo change the primary log level for Logger, use\n[`set_primary_config(level, Level)`](`set_primary_config/2`).\n\nTo change the log level for a handler, use\n[`set_handler_config(HandlerId, level, Level)` ](`set_handler_config/3`).\n\n> #### Note {: .info }\n>\n> The originating module for a log event is only detected if the key `mfa`\n> exists in the metadata, and is associated with `{Module, Function, Arity}`.\n> When log macros are used, this association is automatically added to all log\n> events. If an API function is called directly, without using a macro, the\n> logging client must explicitly add this information if module levels shall\n> have any effect.","ref":"logger.html#set_module_level/2"},{"type":"function","title":"logger.set_primary_config/1","doc":"Set primary configuration data for Logger. This overwrites the current\nconfiguration.\n\nTo modify the existing configuration, use `update_primary_config/1`, or, if a\nmore complex merge is needed, read the current configuration with\n[`get_primary_config/0` ](`get_primary_config/0`), then do the merge before\nwriting the new configuration back with this function.\n\nIf a key is removed compared to the current configuration, the default value is\nused.","ref":"logger.html#set_primary_config/1"},{"type":"function","title":"logger.set_primary_config/2","doc":"Add or update primary configuration data for Logger. If the given `Key` already\nexists, its associated value will be changed to the given value. If it does not\nexist, it will be added.\n\nThe `metadata` key was added in OTP 24.0.","ref":"logger.html#set_primary_config/2"},{"type":"function","title":"logger.set_process_metadata/1","doc":"Set metadata which Logger shall automatically insert in all log events produced\non the current process.\n\nLocation data produced by the log macros, and/or metadata given as argument to\nthe log call (API function or macro), are merged with the process metadata. If\nthe same keys occur, values from the metadata argument to the log call overwrite\nvalues from the process metadata, which in turn overwrite values from the\nlocation data.\n\nSubsequent calls to this function overwrites previous data set. To update\nexisting data instead of overwriting it, see `update_process_metadata/1`.","ref":"logger.html#set_process_metadata/1"},{"type":"function","title":"logger.set_proxy_config/1","doc":"Set configuration data for the Logger proxy. This overwrites the current proxy\nconfiguration. Keys that are not specified in the `Config` map gets default\nvalues.\n\nTo modify the existing configuration, use `update_proxy_config/1`, or, if a more\ncomplex merge is needed, read the current configuration with\n[`get_proxy_config/0` ](`get_proxy_config/0`), then do the merge before writing\nthe new configuration back with this function.\n\nFor more information about the proxy, see section\n[Logger Proxy](logger_chapter.md#logger-proxy) in the Kernel User's Guide.","ref":"logger.html#set_proxy_config/1"},{"type":"function","title":"logger.timestamp/0","doc":"Return a timestamp that can be inserted as the `time` field in the meta data for\na log event. It is produced with\n[`os:system_time(microsecond)`](`os:system_time/1`).\n\nNotice that Logger automatically inserts a timestamp in the meta data unless it\nalready exists. This function is exported for the rare case when the timestamp\nmust be taken at a different point in time than when the log event is issued.","ref":"logger.html#timestamp/0"},{"type":"function","title":"logger.unset_application_level/1","doc":"Unset the log level for all the modules of the specified application.\n\nThis function is a utility function that calls\n[logger:unset_module_level/2](`unset_module_level/1`) for each module associated\nwith an application.","ref":"logger.html#unset_application_level/1"},{"type":"function","title":"logger.unset_module_level/0","doc":"Remove module specific log settings. After this, the primary log level is used\nfor all modules.","ref":"logger.html#unset_module_level/0"},{"type":"function","title":"logger.unset_module_level/1","doc":"Remove module specific log settings. After this, the primary log level is used\nfor the specified modules.","ref":"logger.html#unset_module_level/1"},{"type":"function","title":"logger.unset_process_metadata/0","doc":"Delete data set with `set_process_metadata/1` or `update_process_metadata/1`.","ref":"logger.html#unset_process_metadata/0"},{"type":"function","title":"logger.update_formatter_config/2","doc":"Update the formatter configuration for the specified handler.\n\nThe new configuration is merged with the existing formatter configuration.\n\nTo overwrite the existing configuration without any merge, use\n\n```erlang\nset_handler_config(HandlerId, formatter,\n\t {FormatterModule, FormatterConfig}).\n```","ref":"logger.html#update_formatter_config/2"},{"type":"function","title":"logger.update_formatter_config/3","doc":"","ref":"logger.html#update_formatter_config/3"},{"type":"function","title":"logger.update_handler_config/2","doc":"Update configuration data for the specified handler. This function behaves as if\nit was implemented as follows:\n\n```erlang\n{ok, {_, Old}} = logger:get_handler_config(HandlerId),\nlogger:set_handler_config(HandlerId, maps:merge(Old, Config)).\n```\n\nTo overwrite the existing configuration without any merge, use\n[`set_handler_config/2` ](`set_handler_config/2`).","ref":"logger.html#update_handler_config/2"},{"type":"function","title":"logger.update_handler_config/3","doc":"Add or update configuration data for the specified handler. If the given `Key`\nalready exists, its associated value will be changed to the given value. If it\ndoes not exist, it will be added.\n\nIf the value is incomplete, which for example can be the case for the `config`\nkey, it is up to the handler implementation how the unspecified parts are set.\nFor all handlers in the Kernel application, unspecified data for the `config`\nkey is not changed. To reset unspecified data to default values, use\n`set_handler_config/3`.\n\nSee the definition of the `t:logger_handler:config/0` type for more information\nabout the different parameters.","ref":"logger.html#update_handler_config/3"},{"type":"function","title":"logger.update_primary_config/1","doc":"Update primary configuration data for Logger. This function behaves as if it was\nimplemented as follows:\n\n```erlang\nOld = logger:get_primary_config(),\nlogger:set_primary_config(maps:merge(Old, Config)).\n```\n\nTo overwrite the existing configuration without any merge, use\n[`set_primary_config/1` ](`set_primary_config/1`).","ref":"logger.html#update_primary_config/1"},{"type":"function","title":"logger.update_process_metadata/1","doc":"Set or update metadata to use when logging from current process\n\nIf process metadata exists for the current process, this function behaves as if\nit was implemented as follows:\n\n```erlang\nlogger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).\n```\n\nIf no process metadata exists, the function behaves as\n[`set_process_metadata/1` ](`set_process_metadata/1`).","ref":"logger.html#update_process_metadata/1"},{"type":"function","title":"logger.update_proxy_config/1","doc":"Update configuration data for the Logger proxy. This function behaves as if it\nwas implemented as follows:\n\n```erlang\nOld = logger:get_proxy_config(),\nlogger:set_proxy_config(maps:merge(Old, Config)).\n```\n\nTo overwrite the existing configuration without any merge, use\n[`set_proxy_config/1` ](`set_proxy_config/1`).\n\nFor more information about the proxy, see section\n[Logger Proxy](logger_chapter.md#logger-proxy) in the Kernel User's Guide.","ref":"logger.html#update_proxy_config/1"},{"type":"function","title":"logger.warning/1","doc":"","ref":"logger.html#warning/1"},{"type":"function","title":"logger.warning/2","doc":"Create a warning log event.\n\nEquivalent to [`log(warning, StringOrReport, Metadata)`](`log/3`) if called\nas [`warning(StringOrReport, Metadata)`](`warning/2`).\n\nEquivalent to [`warning(FormatOrFun, Args, #{})`](`warning/3`) if called as\n[`warning(FormatOrFun, Args)`](`warning/2`).","ref":"logger.html#warning/2"},{"type":"function","title":"logger.warning/3","doc":"","ref":"logger.html#warning/3"},{"type":"type","title":"logger.config_handler/0","doc":"Configuration used when adding or updating a handler.","ref":"logger.html#t:config_handler/0"},{"type":"type","title":"logger.filter/0","doc":"A filter which can be installed as a handler filter, or as a primary filter in\nLogger.","ref":"logger.html#t:filter/0"},{"type":"type","title":"logger.filter_arg/0","doc":"The second argument to the filter fun.","ref":"logger.html#t:filter_arg/0"},{"type":"type","title":"logger.filter_id/0","doc":"A unique identifier for a filter.","ref":"logger.html#t:filter_id/0"},{"type":"type","title":"logger.filter_return/0","doc":"The return value from the filter fun.","ref":"logger.html#t:filter_return/0"},{"type":"type","title":"logger.formatter_config/0","doc":"Configuration data for the formatter. See `m:logger_formatter` for an example of\na formatter implementation.","ref":"logger.html#t:formatter_config/0"},{"type":"type","title":"logger.handler_config/0","doc":"Handler configuration data for Logger.\n\n> #### Note {: .info }\n>\n> DEPRECATED: Use `t:logger_handler:config/0` instead.","ref":"logger.html#t:handler_config/0"},{"type":"type","title":"logger.handler_id/0","doc":"A unique identifier for a handler instance.\n\n> #### Note {: .info }\n>\n> DEPRECATED: Use `t:logger_handler:id/0` instead.","ref":"logger.html#t:handler_id/0"},{"type":"type","title":"logger.level/0","doc":"The severity level for the message to be logged.","ref":"logger.html#t:level/0"},{"type":"type","title":"logger.log_event/0","doc":"A log event passed to filters and handlers","ref":"logger.html#t:log_event/0"},{"type":"type","title":"logger.metadata/0","doc":"Metadata for the log event.\n\nLogger adds the following metadata to each log event:\n\n- `pid => self()`\n- `gl => group_leader()`\n- `time => logger:timestamp()`\n\nWhen a log macro is used, Logger also inserts location information:\n\n- `mfa => {?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY}`\n- `file => ?FILE`\n- `line => ?LINE`\n\nYou can add custom metadata, either by:\n\n- specifying a map as the last parameter to any of the log macros or the logger\n API functions.\n- setting process metadata with `set_process_metadata/1` or\n `update_process_metadata/1`.\n- setting primary metadata with `set_primary_config/1` or through the kernel\n configuration parameter [logger_metadata](kernel_app.md#logger_metadata)\n\n> #### Note {: .info }\n>\n> When adding custom metadata, make sure not to use any of the keys mentioned\n> above as that may cause a lot of confusion about the log events.\n\nLogger merges all the metadata maps before forwarding the log event to the\nhandlers. If the same keys occur, values from the log call overwrite process\nmetadata, which overwrites the primary metadata, which in turn overwrite values\nset by Logger.\n\nThe following custom metadata keys have special meaning:\n\n- **`domain`** - The value associated with this key is used by filters for\n grouping log events originating from, for example, specific functional areas.\n See `logger_filters:domain/2` for a description of how this field can be used.\n\n- **`report_cb`** - If the log message is specified as a `t:report/0`, the\n `report_cb` key can be associated with a fun (report callback) that converts\n the report to a format string and arguments, or directly to a string. See the\n type definition of `t:report_cb/0`, and section\n [Log Message](logger_chapter.md#log-message) in the User's Guide for more\n information about report callbacks.","ref":"logger.html#t:metadata/0"},{"type":"type","title":"logger.msg_fun/0","doc":"","ref":"logger.html#t:msg_fun/0"},{"type":"type","title":"logger.msg_fun_return/0","doc":"","ref":"logger.html#t:msg_fun_return/0"},{"type":"type","title":"logger.olp_config/0","doc":"Overload protection configuration.\n\n> #### Note {: .info }\n>\n> DEPRECATED: Use `t:logger_handler:olp_config/0` instead.","ref":"logger.html#t:olp_config/0"},{"type":"type","title":"logger.primary_config/0","doc":"Primary configuration data for Logger. The following default values apply:\n\n- `level => info`\n- `filter_default => log`\n- `filters => []`","ref":"logger.html#t:primary_config/0"},{"type":"type","title":"logger.report/0","doc":"A log report.","ref":"logger.html#t:report/0"},{"type":"type","title":"logger.report_cb/0","doc":"A fun which converts a [`report()`](`t:report/0`) to a format string and\narguments, or directly to a string.\n\nSee section [Log Message](logger_chapter.md#log-message) in the User's Guide\nfor more information.","ref":"logger.html#t:report_cb/0"},{"type":"type","title":"logger.report_cb_config/0","doc":"","ref":"logger.html#t:report_cb_config/0"},{"type":"type","title":"logger.timestamp/0","doc":"A timestamp produced with [`logger:timestamp()`](`timestamp/0`).","ref":"logger.html#t:timestamp/0"},{"type":"module","title":"logger_disk_log_h","doc":"A disk_log based handler for Logger\n\nThis is a handler for Logger that offers circular (wrapped) logs by using\n`m:disk_log`. Multiple instances of this handler can be added to Logger, and\neach instance prints to its own disk log file, created with the name and\nsettings specified in the handler configuration.\n\nThe default standard handler, `m:logger_std_h`, can be replaced by a disk_log\nhandler at startup of the Kernel application. See an example of this below.\n\nThe handler has an overload protection mechanism that keeps the handler process\nand the Kernel application alive during high loads of log events. How overload\nprotection works, and how to configure it, is described in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nTo add a new instance of the disk_log handler, use\n[`logger:add_handler/3`](`logger:add_handler/3`). The handler configuration\nargument is a map which can contain general configuration parameters, as\ndocumented in the [`User's Guide`](logger_chapter.md#handler-configuration),\nand handler specific parameters. The specific data is stored in a sub map with\nthe key `config`, and can contain the following parameters:\n\n- **`file`** - This is the full name of the disk log file. The option\n corresponds to the `name` property in the [`dlog_option()`](`disk_log:open/1`)\n datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to the same name as the handler identity, in the current directory.\n\n- **`type`** - This is the disk log type, `wrap` or `halt`. The option\n corresponds to the `type` property in the [`dlog_option()`](`disk_log:open/1`)\n datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `wrap`.\n\n- **`max_no_files`** - This is the maximum number of files that disk_log uses\n for its circular logging. The option corresponds to the `MaxNoFiles` element\n in the `size` property in the [`dlog_option()`](`disk_log:open/1`) datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `10`.\n\n The setting has no effect on a halt log.\n\n- **`max_no_bytes`** - This is the maximum number of bytes that is written to a\n log file before disk_log proceeds with the next file in order, or generates an\n error in case of a full halt log. The option corresponds to the `MaxNoBytes`\n element in the `size` property in the [`dlog_option()`](`disk_log:open/1`)\n datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `1048576` bytes for a wrap log, and `infinity` for a halt log.\n\n- **`filesync_repeat_interval`** - This value, in milliseconds, specifies how\n often the handler does a disk_log sync operation to write buffered data to\n disk. The handler attempts the operation repeatedly, but only performs a new\n sync if something has actually been logged.\n\n Defaults to `5000` milliseconds.\n\n If `no_repeat` is set as value, the repeated sync operation is disabled. The\n user can also call the [`filesync/1`](`filesync/1`) function to perform a\n disk_log sync.\n\nOther configuration parameters exist, to be used for customizing the overload\nprotection behaviour. The same parameters are used both in the standard handler\nand the disk_log handler, and are documented in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nNotice that when changing the configuration of the handler in runtime, the\ndisk_log options (`file`, `type`, `max_no_files`, `max_no_bytes`) must not be\nmodified.\n\nExample of adding a disk_log handler:\n\n```erlang\nlogger:add_handler(my_disk_log_h, logger_disk_log_h,\n #{config => #{file => \"./my_disk_log\",\n type => wrap,\n max_no_files => 4,\n max_no_bytes => 10000,\n filesync_repeat_interval => 1000}}).\n```\n\nTo use the disk_log handler instead of the default standard handler when\nstarting an Erlang node, change the Kernel default logger to use\n`logger_disk_log_h`. Example:\n\n```text\nerl -kernel logger '[{handler,default,logger_disk_log_h,\n #{config => #{file => \"./system_disk_log\"}}}]'\n```","ref":"logger_disk_log_h.html"},{"type":"module","title":"See Also - logger_disk_log_h","doc":"`m:logger`, `m:logger_std_h`, `m:disk_log`","ref":"logger_disk_log_h.html#module-see-also"},{"type":"function","title":"logger_disk_log_h.filesync/1","doc":"Write buffered data to disk.","ref":"logger_disk_log_h.html#filesync/1"},{"type":"module","title":"logger_filters","doc":"Filters to use with Logger.\n\nAll functions exported from this module can be used as primary or handler\nfilters. See `logger:add_primary_filter/2` and `logger:add_handler_filter/3` for\nmore information about how filters are added.\n\nFilters are removed with `logger:remove_primary_filter/1` and\n`logger:remove_handler_filter/2`.","ref":"logger_filters.html"},{"type":"module","title":"See Also - logger_filters","doc":"`m:logger`","ref":"logger_filters.html#module-see-also"},{"type":"function","title":"logger_filters.domain/2","doc":"This filter provides a way of filtering log events based on a `domain` field in\n`Metadata`. This field is optional, and the purpose of using it is to group log\nevents from, for example, a specific functional area. This allows filtering or\nother specialized treatment in a Logger handler.\n\nA domain field must be a list of atoms, creating smaller and more specialized\ndomains as the list grows longer. The greatest domain is `[]`, which comprises\nall possible domains.\n\nFor example, consider the following domains:\n\n```erlang\nD1 = [otp]\nD2 = [otp, sasl]\n```\n\n`D1` is the greatest of the two, and is said to be a super-domain of `D2`. `D2`\nis a sub-domain `D1`. Both `D1` and `D2` are sub-domains of `[]`.\n\nThe above domains are used for logs originating from Erlang/OTP. D1 specifies\nthat the log event comes from Erlang/OTP in general, and D2 indicates that the\nlog event is a so called [SASL report](logger_chapter.md#sasl_reports).\n\nThe `Extra` parameter to the [`domain/2`](`domain/2`) function is specified when\nadding the filter via `logger:add_primary_filter/2` or\n`logger:add_handler_filter/3`.\n\nThe filter compares the value of the `domain` field in the log event's metadata\n(`Domain`) against `MatchDomain`. The filter matches if the value of `Compare`\nis:\n\n- **`sub`** - and `Domain` is equal to or a sub-domain of `MatchDomain`, that\n is, if `MatchDomain` is a prefix of `Domain`.\n\n- **`super`** - and `Domain` is equal to or a super-domain of `MatchDomain`,\n that is, if `Domain` is a prefix of `MatchDomain`.\n\n- **`equal`** - and `Domain` is equal to `MatchDomain`.\n\n- **`not_equal`** - and `Domain` differs from `MatchDomain`, or if there is no\n domain field in metadata.\n\n- **`undefined`** - and there is no domain field in metadata. In this case\n `MatchDomain` must be set to `[]`.\n\nIf the filter matches and `Action` is `log`, the log event is allowed. If the\nfilter matches and `Action` is `stop`, the log event is stopped.\n\nIf the filter does not match, it returns `ignore`, meaning that other filters,\nor the value of the configuration parameter `filter_default`, decide if the\nevent is allowed or not.\n\nLog events that do not contain any domain field, match only when `Compare` is\nequal to `undefined` or `not_equal`.\n\nExample: stop all events with domain `[otp, sasl | _]`\n\n```erlang\n1> logger:set_handler_config(h1, filter_default, log). % this is the default\nok\n2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.\n...\n3> logger:add_handler_filter(h1, no_sasl, Filter).\nok\n```","ref":"logger_filters.html#domain/2"},{"type":"function","title":"logger_filters.level/2","doc":"This filter provides a way of filtering log events based on the log level. It\nmatches log events by comparing the log level with a specified `MatchLevel`\n\nThe `Extra` parameter is specified when adding the filter via\n`logger:add_primary_filter/2` or `logger:add_handler_filter/3`.\n\nThe filter compares the value of the event's log level (`Level`) to `MatchLevel`\nby calling\n[`logger:compare_levels(Level, MatchLevel)`](`logger:compare_levels/2`). The\nfilter matches if the value of `Operator` is:\n\n- **`neq`** - and the compare function returns `lt` or `gt`.\n\n- **`eq`** - and the compare function returns `eq`.\n\n- **`lt`** - and the compare function returns `lt`.\n\n- **`gt`** - and the compare function returns `gt`.\n\n- **`lteq`** - and the compare function returns `lt` or `eq`.\n\n- **`gteq`** - and the compare function returns `gt` or `eq`.\n\nIf the filter matches and `Action` is `log`, the log event is allowed. If the\nfilter matches and `Action` is `stop`, the log event is stopped.\n\nIf the filter does not match, it returns `ignore`, meaning that other filters,\nor the value of the configuration parameter `filter_default`, will decide if the\nevent is allowed or not.\n\nExample: only allow debug level log events\n\n```erlang\nlogger:set_handler_config(h1, filter_default, stop).\nFilter = {fun logger_filters:level/2, {log, eq, debug}}.\nlogger:add_handler_filter(h1, debug_only, Filter).\nok\n```","ref":"logger_filters.html#level/2"},{"type":"function","title":"logger_filters.progress/2","doc":"This filter matches all progress reports from `m:supervisor` and\n[`application_controller`](`m:application`).\n\nIf `Extra` is `log`, the progress reports are allowed. If `Extra` is `stop`, the\nprogress reports are stopped.\n\nThe filter returns `ignore` for all other log events.","ref":"logger_filters.html#progress/2"},{"type":"function","title":"logger_filters.remote_gl/2","doc":"This filter matches all events originating from a process that has its group\nleader on a remote node.\n\nIf `Extra` is `log`, the matching events are allowed. If `Extra` is `stop`, the\nmatching events are stopped.\n\nThe filter returns `ignore` for all other log events.","ref":"logger_filters.html#remote_gl/2"},{"type":"behaviour","title":"logger_formatter","doc":"Default formatter for Logger.\n\nEach Logger handler has a configured formatter specified as a module and a\nconfiguration term. The purpose of the formatter is to translate the log events\nto a final printable string ([`unicode:chardata()`](`t:unicode:chardata/0`))\nwhich can be written to the output device of the handler. See sections\n[Handlers](logger_chapter.md#handlers) and\n[Formatters](logger_chapter.md#formatters) in the Kernel User's Guide for more\ninformation.\n\n`m:logger_formatter` is the default formatter used by Logger.","ref":"logger_formatter.html"},{"type":"behaviour","title":"See Also - logger_formatter","doc":"`m:calendar`, `m:error_logger`, `m:io`, `m:io_lib`, `m:logger`, `m:maps`,\n[`sasl(6)`](`e:sasl:sasl_app.md`), `m:unicode`","ref":"logger_formatter.html#module-see-also"},{"type":"function","title":"logger_formatter.check_config/1","doc":"The function is called by Logger when the formatter configuration for a handler\nis set or modified. It returns `ok` if the configuration is valid, and\n`{error,term()}` if it is faulty.\n\nThe following Logger API functions can trigger this callback:\n\n- `logger:add_handler/3`\n- [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`)\n- `logger:update_handler_config/2`\n- `logger:update_formatter_config/2`","ref":"logger_formatter.html#check_config/1"},{"type":"callback","title":"logger_formatter.check_config/1","doc":"The function is called by a Logger when formatter configuration is set or\nmodified. The formatter must validate the given configuration and return `ok` if\nit is correct, and `{error,Reason}` if it is faulty.\n\nThe following Logger API functions can trigger this callback:\n\n- `logger:add_handler/3`\n- [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`)\n- [`logger:update_handler_config/2,3`](`logger:update_handler_config/2`)\n- `logger:update_formatter_config/2`\n\nSee `m:logger_formatter` for an example implementation. `m:logger_formatter` is\nthe default formatter used by Logger.","ref":"logger_formatter.html#c:check_config/1"},{"type":"function","title":"logger_formatter.format/2","doc":"This the formatter callback function to be called from handlers.\n\nThe log event is processed as follows:\n\n- If the message is on report form, it is converted to `{Format,Args}` by\n calling the report callback. See section\n [Log Message](logger_chapter.md#log-message) in the Kernel User's Guide for\n more information about report callbacks and valid forms of log messages.\n- The message size is limited according to the values of configuration\n parameters [`chars_limit`](`m:logger_formatter#chars_limit`) and\n [`depth`](`m:logger_formatter#depth`).\n- The full log entry is composed according to the\n [`template`](`m:logger_formatter#template`).\n- If the final string is too long, it is truncated according to the value of\n configuration parameter [`max_size`](`m:logger_formatter#max_size`).","ref":"logger_formatter.html#format/2"},{"type":"callback","title":"logger_formatter.format/2","doc":"The function can be called by a log handler to convert a log event term to a\nprintable string. The returned value can, for example, be printed as a log entry\nto the console or a file using [`io:put_chars/1,2`](`io:put_chars/1`).\n\nSee `m:logger_formatter` for an example implementation. `m:logger_formatter` is\nthe default formatter used by Logger.","ref":"logger_formatter.html#c:format/2"},{"type":"type","title":"logger_formatter.config/0","doc":"The configuration term for `logger_formatter` is a [map](`m:maps`), and the\nfollowing keys can be set as configuration parameters:\n\n- **`chars_limit = integer() > 0 | unlimited`{: #chars_limit }** - A positive\n integer representing the value of the option with the same name to be used\n when calling `io_lib:format/3`. This value limits the total number of\n characters printed for each log event. Notice that this is a soft limit. For a\n hard truncation limit, see option `max_size`.\n\n Defaults to `unlimited`.\n\n- **`depth = integer() > 0 | unlimited`{: #depth }** - A positive integer\n representing the maximum depth to which terms shall be printed by this\n formatter. Format strings passed to this formatter are rewritten. The format\n controls ~p and ~w are replaced with ~P and ~W, respectively, and the value is\n used as the depth parameter. For details, see [`io:format/2,3`](`io:format/2`)\n in STDLIB.\n\n Defaults to `unlimited`.\n\n- **`legacy_header = boolean()`** - If set to `true` a header field is added to\n logger_formatter's part of `Metadata`. The value of this field is a string\n similar to the header created by the old `m:error_logger` event handlers. It\n can be included in the log event by adding the list\n `[logger_formatter,header]` to the template. See the description of the\n `t:template/0` type for more information.\n\n Defaults to `false`.\n\n- **`max_size = integer() > 0 | unlimited`{: #max_size }** - A positive integer\n representing the absolute maximum size a string returned from this formatter\n can have. If the formatted string is longer, after possibly being limited by\n `chars_limit` or `depth`, it is truncated.\n\n Defaults to `unlimited`.\n\n- **`report_cb = ` `t:logger:report_cb/0`** - A report callback is used by the\n formatter to transform log messages on report form to a format string and\n arguments. The report callback can be specified in the metadata for the log\n event. If no report callback exists in metadata, `logger_formatter` will use\n `logger:format_report/1` as default callback.\n\n If this configuration parameter is set, it replaces both the default report\n callback, and any report callback found in metadata. That is, all reports are\n converted by this configured function.\n\n- **`single_line = boolean()`** - If set to `true`, each log event is printed as\n a single line. To achieve this, `logger_formatter` sets the field width to `0`\n for all `~p` and `~P` control sequences in the format a string (see\n `io:format/2`), and replaces all newlines in the message with `\", \"`. White\n spaces following directly after newlines are removed. Notice that newlines\n added by the `template` parameter are not replaced.\n\n Defaults to `true`.\n\n- **`template = `{: #template }`t:template/0`** - The template describes how the\n formatted string is composed by combining different data values from the log\n event. See the description of the `t:template/0` type for more information\n about this.\n\n- **`time_designator = byte()`** - Timestamps are formatted according to\n RFC3339, and the time designator is the character used as date and time\n separator.\n\n Defaults to `$T`.\n\n The value of this parameter is used as the `time_designator` option to\n `calendar:system_time_to_rfc3339/2`.\n\n- **`time_offset = integer() | [byte()]`** - The time offset, either a string or\n an integer, to be used when formatting the timestamp.\n\n An empty string is interpreted as local time. The values `\"Z\"`, `\"z\"` or `0`\n are interpreted as Universal Coordinated Time (UTC).\n\n Strings, other than `\"Z\"`, `\"z\"`, or `\"\"`, must be on the form `±[hh]:[mm]`,\n for example `\"-02:00\"` or `\"+00:00\"`.\n\n Integers must be in microseconds, meaning that the offset `7200000000` is\n equivalent to `\"+02:00\"`.\n\n Defaults to an empty string, meaning that timestamps are displayed in local\n time. However, for backwards compatibility, if the SASL configuration\n parameter [`utc_log`](`e:sasl:sasl_app.md#utc_log`)`=true`, the default is\n changed to `\"Z\"`, meaning that timestamps are displayed in UTC.\n\n The value of this parameter is used as the `offset` option to\n `calendar:system_time_to_rfc3339/2`.","ref":"logger_formatter.html#t:config/0"},{"type":"type","title":"logger_formatter.metakey/0","doc":"","ref":"logger_formatter.html#t:metakey/0"},{"type":"type","title":"logger_formatter.template/0","doc":"The template to be used by a logger formatter.\n\nThe template is a list of atoms, atom lists, tuples and strings. The atoms\n`level` or `msg`, are treated as placeholders for the severity level and the log\nmessage, respectively. Other atoms or atom lists are interpreted as placeholders\nfor metadata, where atoms are expected to match top level keys, and atom lists\nrepresent paths to sub keys when the metadata is a nested map. For example the\nlist `[key1,key2]` is replaced by the value of the `key2` field in the nested\nmap below. The atom `key1` on its own is replaced by the complete value of the\n`key1` field. The values are converted to strings.\n\n```text\n#{key1 => #{key2 => my_value,\n ...}\n ...}\n```\n\nTuples in the template express if-exist tests for metadata keys. For example,\nthe following tuple says that if `key1` exists in the metadata map, print\n`\"key1=Value\"`, where `Value` is the value that `key1` is associated with in the\nmetadata map. If `key1` does not exist, print nothing.\n\n```text\n{key1, [\"key1=\",key1], []}\n```\n\nStrings in the template are printed literally.\n\nThe default value for the `template` configuration parameter depends on the\nvalue of the `single_line` and `legacy_header` configuration parameters as\nfollows.\n\nThe log event used in the examples is:\n\n```text\n?LOG_ERROR(\"name: ~p~nexit_reason: ~p\", [my_name, \"It crashed\"])\n```\n\n- **`legacy_header = true, single_line = false`** - Default template:\n `[[logger_formatter,header],\"\\n\",msg,\"\\n\"]`\n\n Example log entry:\n\n ```text\n =ERROR REPORT==== 17-May-2018::18:30:19.453447 ===\n name: my_name\n exit_reason: \"It crashed\"\n ```\n\n Notice that all eight levels can occur in the heading, not only `ERROR`,\n `WARNING` or `INFO` as `m:error_logger` produces. And microseconds are added\n at the end of the timestamp.\n\n- **`legacy_header = true, single_line = true`** - Default template:\n `[[logger_formatter,header],\"\\n\",msg,\"\\n\"]`\n\n Notice that the template is here the same as for `single_line=false`, but the\n resulting log entry differs in that there is only one line after the heading:\n\n ```text\n =ERROR REPORT==== 17-May-2018::18:31:06.952665 ===\n name: my_name, exit_reason: \"It crashed\"\n ```\n\n- **`legacy_header = false, single_line = true`** - Default template:\n `[time,\" \",level,\": \",msg,\"\\n\"]`\n\n Example log entry:\n\n ```text\n 2018-05-17T18:31:31.152864+02:00 error: name: my_name, exit_reason: \"It crashed\"\n ```\n\n- **`legacy_header = false, single_line = false`** - Default template:\n `[time,\" \",level,\":\\n\",msg,\"\\n\"]`\n\n Example log entry:\n\n ```text\n 2018-05-17T18:32:20.105422+02:00 error:\n name: my_name\n exit_reason: \"It crashed\"\n ```","ref":"logger_formatter.html#t:template/0"},{"type":"behaviour","title":"logger_handler","doc":"logger_handler behavior module.\n\nThe behaviour module for logger handlers. A logger handler is a callback module\nthat is called when a log event has passed all filters and is ready to be logged\nsomewhere. For more information see [Handlers](logger_chapter.md#handlers) in\nthe Users Guide.","ref":"logger_handler.html"},{"type":"behaviour","title":"See Also - logger_handler","doc":"`m:logger_filters`, `m:logger_formatter`, `m:logger`","ref":"logger_handler.html#module-see-also"},{"type":"callback","title":"logger_handler.adding_handler/1","doc":"The function is called on a temporary process when a new handler is about to be\nadded. The purpose is to verify the configuration and initiate all resources\nneeded by the handler.\n\nThe handler identity is associated with the `id` key in `Config1`.\n\nIf everything succeeds, the callback function can add possible default values or\ninternal state values to the configuration, and return the adjusted map in\n`{ok,Config2}`.\n\nIf the configuration is faulty, or if the initiation fails, the callback\nfunction must return `{error,Reason}`.","ref":"logger_handler.html#c:adding_handler/1"},{"type":"callback","title":"logger_handler.changing_config/3","doc":"The function is called on a temporary process when the configuration for a\nhandler is about to change. The purpose is to verify and act on the new\nconfiguration.\n\n`OldConfig` is the existing configuration and `NewConfig` is the new\nconfiguration.\n\nThe handler identity is associated with the `id` key in `OldConfig`.\n\n`SetOrUpdate` has the value `set` if the configuration change originates from a\ncall to [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`), and\n`update` if it originates from\n[`logger:update_handler_config/2,3`](`logger:update_handler_config/2`). The\nhandler can use this parameter to decide how to update the value of the `config`\nfield, that is, the handler specific configuration data. Typically, if\n`SetOrUpdate` equals `set`, values that are not specified must be given their\ndefault values. If `SetOrUpdate` equals `update`, the values found in\n`OldConfig` must be used instead.\n\nIf everything succeeds, the callback function must return a possibly adjusted\nconfiguration in `{ok,Config}`.\n\nIf the configuration is faulty, the callback function must return\n`{error,Reason}`.","ref":"logger_handler.html#c:changing_config/3"},{"type":"callback","title":"logger_handler.filter_config/1","doc":"The function is called when one of the Logger API functions for fetching the\nhandler configuration is called, for example `logger:get_handler_config/1`.\n\nIt allows the handler to remove internal data fields from its configuration data\nbefore it is returned to the caller.","ref":"logger_handler.html#c:filter_config/1"},{"type":"callback","title":"logger_handler.log/2","doc":"The function is called when all primary filters and all handler filters for the\nhandler in question have passed for the given log event. It is called on the\nclient process, that is, the process that issued the log event.\n\nThe handler identity is associated with the `id` key in `Config`.\n\nThe handler must log the event.\n\nThe return value from this function is ignored by Logger.","ref":"logger_handler.html#c:log/2"},{"type":"callback","title":"logger_handler.removing_handler/1","doc":"The function is called on a temporary process when a handler is about to be\nremoved. The purpose is to release all resources used by the handler.\n\nThe handler identity is associated with the `id` key in `Config`.\n\nThe return value is ignored by Logger.","ref":"logger_handler.html#c:removing_handler/1"},{"type":"type","title":"logger_handler.config/0","doc":"Handler configuration data for Logger. The following default values apply:\n\n- `level => all`\n- `filter_default => log`\n- `filters => []`\n- `formatter => {logger_formatter, DefaultFormatterConfig`\\}\n\nIn addition to these, the following fields are automatically inserted by Logger,\nvalues taken from the two first parameters to `logger:add_handler/3`:\n\n- `id => HandlerId`\n- `module => Module`\n\nThese are read-only and cannot be changed in runtime.\n\nHandler specific configuration data is inserted by the handler callback itself,\nin a sub structure associated with the field named `config`. See the\n`m:logger_std_h` and `m:logger_disk_log_h` manual pages for information about\nthe specific configuration for these handlers.\n\nSee the [`logger_formatter`](`t:logger_formatter:config/0`) manual page for\ninformation about the default configuration for this formatter.","ref":"logger_handler.html#t:config/0"},{"type":"type","title":"logger_handler.id/0","doc":"A unique identifier for a handler instance.","ref":"logger_handler.html#t:id/0"},{"type":"type","title":"logger_handler.olp_config/0","doc":"Overload protection configuration.\n\nSee [Protecting the Handler from Overload](logger_chapter.md#protecting-the-handler-from-overload)\nfor more details.","ref":"logger_handler.html#t:olp_config/0"},{"type":"module","title":"logger_std_h","doc":"Standard handler for Logger.\n\nThis is the standard handler for Logger. Multiple instances of this handler can\nbe added to Logger, and each instance prints logs to\n[`standard_io`](`t:io:standard_io/0`),\n[`standard_error`](`t:io:standard_error/0`), or to file.\n\nThe handler has an overload protection mechanism that keeps the handler process\nand the Kernel application alive during high loads of log events. How overload\nprotection works, and how to configure it, is described in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nTo add a new instance of the standard handler, use\n[`logger:add_handler/3`](`logger:add_handler/3`). The handler configuration\nargument is a map which can contain general configuration parameters, as\ndocumented in the [`User's Guide`](logger_chapter.md#handler-configuration),\nand handler specific parameters. The specific data is stored in a sub map with\nthe key `config`, and can contain the following parameters:\n\n- **`type = ` `t:io:standard_io/0` ` | ` `t:io:standard_error/0` ` | file | {device, ` `t:io:device/0` `}`**{: #type } -\n Specifies the log destination.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to [`standard_io`](`t:io:standard_io/0`), unless parameter\n [`file`](`m:logger_std_h#file`) is given, in which case it defaults to `file`.\n\n- **`file = ` `t:file:filename/0`**{: #file } - This specifies the name of the\n log file when the handler is of type `file`.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to the same name as the handler identity, in the current directory.\n\n- **`modes = [` `t:file:mode/0` `]`**{: #modes } - This specifies the file modes\n to use when opening the log file, see `file:open/2`. If `modes` are not\n specified, the default list used is `[raw,append,delayed_write]`. If `modes`\n are specified, the list replaces the default modes list with the following\n adjustments:\n\n - If `raw` is not found in the list, it is added.\n - If none of `write`, `append` or `exclusive` is found in the list, `append`\n is added.\n - If none of `delayed_write` or `{delayed_write,Size,Delay}` is found in the\n list, `delayed_write` is added.\n\n Log files are always UTF-8 encoded. The encoding cannot be changed by setting\n the mode `{encoding,Encoding}`.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `[raw,append,delayed_write]`.\n\n- **`max_no_bytes = ` `t:pos_integer/0` ` | infinity`{: #max_no_bytes }** - This\n parameter specifies if the log file should be rotated or not. The value\n `infinity` means the log file will grow indefinitely, while an integer value\n specifies at which file size (bytes) the file is rotated.\n\n Defaults to `infinity`.\n\n- **`max_no_files = ` `t:non_neg_integer/0`**{: #max_no_files } - This parameter\n specifies the number of rotated log file archives to keep. This has meaning\n only if [`max_no_bytes`](`m:logger_std_h#max_no_bytes`) is set to an integer\n value.\n\n The log archives are named `FileName.0`, `FileName.1`, ... `FileName.N`, where\n `FileName` is the name of the current log file. `FileName.0` is the newest of\n the archives. The maximum value for `N` is the value of `max_no_files`\n minus 1.\n\n Notice that setting this value to `0` does not turn off rotation. It only\n specifies that no archives are kept.\n\n Defaults to `0`.\n\n- **`compress_on_rotate = ` `t:boolean/0`**{: #compress_on_rotate } - This parameter\n specifies if the rotated log file archives shall be compressed or not. If set\n to `true`, all archives are compressed with `gzip`, and renamed to\n `FileName.N.gz`\n\n `compress_on_rotate` has no meaning if\n [`max_no_bytes`](`m:logger_std_h#max_no_bytes`) has the value `infinity`.\n\n Defaults to `false`.\n\n- **`file_check = ` `t:non_neg_integer/0`**{: #file_check } - When `logger_std_h`\n logs to a file, it reads the file information of the log file prior to each\n write operation. This is to make sure the file still exists and has the same\n inode as when it was opened. This implies some performance loss, but ensures\n that no log events are lost in the case when the file has been removed or\n renamed by an external actor.\n\n In order to allow minimizing the performance loss, the `file_check` parameter\n can be set to a positive integer value, `N`. The handler will then skip\n reading the file information prior to writing, as long as no more than `N`\n milliseconds have passed since it was last read.\n\n Notice that the risk of losing log events grows when the `file_check` value\n grows.\n\n Defaults to 0.\n\n- **`filesync_repeat_interval = ` `t:pos_integer/0` ` | no_repeat`** - This value, in\n milliseconds, specifies how often the handler does a file sync operation to\n write buffered data to disk. The handler attempts the operation repeatedly,\n but only performs a new sync if something has actually been logged.\n\n If `no_repeat` is set as value, the repeated file sync operation is disabled,\n and it is the operating system settings that determine how quickly or slowly\n data is written to disk. The user can also call the `filesync/1` function to\n perform a file sync.\n\n Defaults to `5000` milliseconds.\n\nOther configuration parameters exist, to be used for customizing the overload\nprotection behaviour. The same parameters are used both in the standard handler\nand the disk_log handler, and are documented in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nNotice that if changing the configuration of the handler in runtime, the `type`,\n`file`, or `modes` parameters must not be modified.\n\nExample of adding a standard handler:\n\n```erlang\nlogger:add_handler(my_standard_h, logger_std_h,\n #{config => #{file => \"./system_info.log\",\n filesync_repeat_interval => 1000}}).\n```\n\nTo set the default handler, that starts initially with the Kernel application,\nto log to file instead of [`standard_io`](`t:io:standard_io/0`), change the\nKernel default logger configuration. Example:\n\n```text\nerl -kernel logger '[{handler,default,logger_std_h,\n #{config => #{file => \"./log.log\"}}}]'\n```\n\nAn example of how to replace the standard handler with a disk_log handler at\nstartup is found in the `m:logger_disk_log_h` manual.","ref":"logger_std_h.html"},{"type":"module","title":"See Also - logger_std_h","doc":"`m:logger`, `m:logger_disk_log_h`","ref":"logger_std_h.html#module-see-also"},{"type":"function","title":"logger_std_h.filesync/1","doc":"Write buffered data to disk.","ref":"logger_std_h.html#filesync/1"},{"type":"module","title":"wrap_log_reader","doc":"A service to read internally formatted wrap disk logs.\n\nThis module makes it possible to read internally formatted wrap disk logs, see\n`m:disk_log`. `m:wrap_log_reader` does not interfere with `m:disk_log` activities;\nthere is however a bug in this version of the `m:wrap_log_reader`, see section\n[Known Limitations](`m:wrap_log_reader#module-known-limitations`).\n\nA wrap disk log file consists of many files, called index files. A log file can\nbe opened and closed. Also, a single index file can be opened separately. If a\nnon-existent or non-internally formatted file is opened, an error message is\nreturned. If the file is corrupt, no attempt is made to repair it, but an error\nmessage is returned.\n\nIf a log is configured to be distributed, it is possible that all items are not\nlogged on all nodes. `m:wrap_log_reader` only reads the log on the called node; it\nis up to the user to be sure that all items are read.","ref":"wrap_log_reader.html"},{"type":"module","title":"Known Limitations - wrap_log_reader","doc":"This version of `m:wrap_log_reader` does not detect if `m:disk_log` wraps to a new\nindex file between a call to `wrap_log_reader:open/1` and the first call to\n`wrap_log_reader:chunk/1`. If this occurs, the call to `chunk/1` reads the last\nlogged items in the log file, as the opened index file was truncated by\n`m:disk_log`.","ref":"wrap_log_reader.html#module-known-limitations"},{"type":"function","title":"wrap_log_reader.chunk/1","doc":"","ref":"wrap_log_reader.html#chunk/1"},{"type":"function","title":"wrap_log_reader.chunk/2","doc":"Enables to efficiently read the terms that are appended to a log. Minimises disk\nI/O by reading 64 kilobyte chunks from the file.\n\nThe first time `chunk/2` is called, an initial continuation returned from\n[`open/1`](`open/1`) or [`open/2`](`open/2`) must be provided.\n\nWhen `chunk/2` is called, `N` controls the maximum number of terms that are read\nfrom the log in each chunk. `infinity` means that all the\nterms contained in the 8K chunk are read. If less than `N` terms are returned,\nthis does not necessarily mean that end of file is reached.\n\nReturns a tuple `{Continuation2, Terms}`, where `Terms` is a list of terms found\nin the log. `Continuation2` is yet another continuation that must be passed on\nto any subsequent calls to `chunk()`. With a series of calls to `chunk()`, it is\nthen possible to extract all terms from a log.\n\nReturns a tuple `{Continuation2, Terms, Badbytes}` if the log is opened in read\nonly mode and the read chunk is corrupt. `Badbytes` indicates the number of\nnon-Erlang terms found in the chunk. Notice that the log is not repaired.\n\nReturns `{Continuation2, eof}` when the end of the log is reached, and\n`{error, Reason}` if an error occurs.\n\nThe returned continuation either is or is not valid in the next call to this\nfunction. This is because the log can wrap and delete the file into which the\ncontinuation points. To ensure this does not occur, the log can be blocked\nduring the search.","ref":"wrap_log_reader.html#chunk/2"},{"type":"function","title":"wrap_log_reader.close/1","doc":"Closes a log file properly.","ref":"wrap_log_reader.html#close/1"},{"type":"function","title":"wrap_log_reader.open/1","doc":"Equivalent to [`open(Filename, ...)`](`open/2`) except that the whole\nwrap log file is read.","ref":"wrap_log_reader.html#open/1"},{"type":"function","title":"wrap_log_reader.open/2","doc":"`Filename` specifies the name of the file to be read.\n\n`N` specifies the index of the file to be read. Use `open/1` to read the entire\nwrap log.\n\nReturns `{ok, Continuation}` if the log/index file is opened successfully.\n`Continuation` is to be used when chunking or closing the file.\n\nReturns `{error, Reason}` for all errors.","ref":"wrap_log_reader.html#open/2"},{"type":"type","title":"wrap_log_reader.chunk_ret/0","doc":"","ref":"wrap_log_reader.html#t:chunk_ret/0"},{"type":"opaque","title":"wrap_log_reader.continuation/0","doc":"Continuation returned by `open/1,2` or `chunk/1,2`.","ref":"wrap_log_reader.html#t:continuation/0"},{"type":"type","title":"wrap_log_reader.open_ret/0","doc":"","ref":"wrap_log_reader.html#t:open_ret/0"},{"type":"module","title":"seq_trace","doc":"Sequential tracing of information transfers.\n\nSequential tracing makes it possible to trace information flows between\nprocesses resulting from one initial transfer of information. Sequential tracing\nis independent of the ordinary tracing in Erlang, which is controlled by the\n`erlang:trace/3` BIF. For more information about what sequential tracing is and\nhow it can be used, see section [Sequential Tracing](`m:seq_trace#whatis`).\n\n`seq_trace` provides functions that control all aspects of sequential tracing.\nThere are functions for activation, deactivation, inspection, and for collection\nof the trace output.","ref":"seq_trace.html"},{"type":"module","title":"Trace Messages Sent to the System Tracer - seq_trace","doc":"The format of the messages is one of the following, depending on if flag\n`timestamp` of the trace token is set to `true` or `false`:\n\n```text\n{seq_trace, Label, SeqTraceInfo, TimeStamp}\n```\n\nor\n\n```text\n{seq_trace, Label, SeqTraceInfo}\n```\n\nWhere:\n\n```erlang\nLabel = int()\nTimeStamp = {Seconds, Milliseconds, Microseconds}\n Seconds = Milliseconds = Microseconds = int()\n```\n\n`SeqTraceInfo` can have the following formats:\n\n- **`{send, Serial, From, To, Message}`** - Used when a process `From` with its\n trace token flag `send` set to `true` has sent information. `To` may be a\n process identifier, a registered name on a node represented as\n `{NameAtom, NodeAtom}`, or a node name represented as an atom. `From` may be a\n process identifier or a node name represented as an atom. `Message` contains\n the information passed along in this information transfer. If the transfer is\n done via message passing, it is the actual message.\n\n- **`{'receive', Serial, From, To, Message}`** - Used when a process `To`\n receives information with a trace token that has flag `'receive'` set to\n `true`. `To` may be a process identifier, or a node name represented as an\n atom. `From` may be a process identifier or a node name represented as an\n atom. `Message` contains the information passed along in this information\n transfer. If the transfer is done via message passing, it is the actual\n message.\n\n- **`{print, Serial, From, _, Info}`** - Used when a process `From` has called\n `seq_trace:print(Label, TraceInfo)` and has a trace token with flag `print`\n set to `true`, and `label` set to `Label`.\n\n`Serial` is a tuple `{PreviousSerial, ThisSerial}`, where:\n\n- Integer `PreviousSerial` denotes the serial counter passed in the last\n received information that carried a trace token. If the process is the first\n in a new sequential trace, `PreviousSerial` is set to the value of the process\n internal \"trace clock\".\n- Integer `ThisSerial` is the serial counter that a process sets on outgoing\n messages. It is based on the process internal \"trace clock\", which is\n incremented by one before it is attached to the trace token in the message.\n\n[](){: #whatis }","ref":"seq_trace.html#module-trace-messages-sent-to-the-system-tracer"},{"type":"module","title":"Sequential Tracing - seq_trace","doc":"Sequential tracing is a way to trace a sequence of information transfers between\ndifferent local or remote processes, where the sequence is initiated by a single\ntransfer. The typical information transfer is an ordinary Erlang message passed\nbetween two processes, but information is transferred also in other ways. In\nshort, it works as follows:\n\nEach process has a _trace token_, which can be empty or not empty. When not\nempty, the trace token can be seen as the tuple `{Label, Flags, Serial, From}`.\nThe trace token is passed invisibly when information is passed between\nprocesses. In most cases the information is passed in ordinary messages between\nprocesses, but information is also passed between processes by other means. For\nexample, by spawning a new process. An information transfer between two\nprocesses is represented by a send event and a receive event regardless of how\nit is passed.\n\nTo start a sequential trace, the user must explicitly set the trace token in the\nprocess that will send the first information in a sequence.\n\nThe trace token of a process is set each time the process receives information.\nThis is typically when the process matches a message in a receive statement,\naccording to the trace token carried by the received message, empty or not.\n\nOn each Erlang node, a process can be set as the _system tracer_. This process\nwill receive trace messages each time information with a trace token is sent or\nreceived (if the trace token flag `send` or `'receive'` is set). The system\ntracer can then print each trace event, write it to a file, or whatever\nsuitable.\n\n> #### Note {: .info }\n>\n> The system tracer only receives those trace events that occur locally within\n> the Erlang node. To get the whole picture of a sequential trace, involving\n> processes on many Erlang nodes, the output from the system tracer on each\n> involved node must be merged (offline).\n\nThe following sections describe sequential tracing and its most fundamental\nconcepts.","ref":"seq_trace.html#module-sequential-tracing"},{"type":"module","title":"Different Information Transfers - seq_trace","doc":"Information flows between processes in a lot of different ways. Not all flows of\ninformation will be covered by sequential tracing. One example is information\npassed via ETS tables. Below is a list of information paths that are covered by\nsequential tracing:\n\n- **Message Passing** - All ordinary messages passed between Erlang processes.\n\n- **Exit signals** - An exit signal is represented as an `{'EXIT', Pid, Reason}`\n tuple.\n\n- **Process Spawn** - A process spawn is represented as multiple information\n transfers. At least one spawn request and one spawn reply. The actual amount\n of information transfers depends on what type of spawn it is and may also\n change in future implementations. Note that this is more or less an internal\n protocol that you are peeking at. The spawn request will be represented as a\n tuple with the first element containing the atom `spawn_request`, but this is\n more or less all that you can depend on.\n\n> #### Note {: .info }\n>\n> If you do ordinary `send` or `receive` trace on the system, you will only see\n> ordinary message passing, not the other information transfers listed above.\n\n> #### Note {: .info }\n>\n> When a send event and corresponding receive event do not both correspond to\n> ordinary Erlang messages, the `Message` part of the trace messages may not be\n> identical. This since all information not necessarily are available when\n> generating the trace messages.","ref":"seq_trace.html#module-different-information-transfers"},{"type":"module","title":"Trace Token - seq_trace","doc":"Each process has a current trace token which is \"invisibly\" passed from the\nparent process on creation of the process.\n\nThe current token of a process is set in one of the following two ways:\n\n- Explicitly by the process itself, through a call to `seq_trace:set_token/1,2`\n- When information is received. This is typically when a received message is\n matched out in a receive expression, but also when information is received in\n other ways.\n\nIn both cases, the current token is set. In particular, if the token of a\nreceived message is empty, the current token of the process is set to empty.\n\nA trace token contains a label and a set of flags. Both the label and the flags\nare set in both alternatives above.","ref":"seq_trace.html#module-trace-token"},{"type":"module","title":"Serial - seq_trace","doc":"The trace token contains a component called `serial`. It consists of two\nintegers, `Previous` and `Current`. The purpose is to uniquely identify each\ntraced event within a trace sequence, as well as to order the messages\nchronologically and in the different branches, if any.\n\nThe algorithm for updating `Serial` can be described as follows:\n\nLet each process have two counters, `prev_cnt` and `curr_cnt`, both are set to\n`0` when a process is created outside of a trace sequence. The counters are\nupdated at the following occasions:\n\n- _When the process is about to pass along information to another process and\n the trace token is not empty._ This typically occurs when sending a message,\n but also, for example, when spawning another process.\n\n Let the serial of the trace token be `tprev` and `tcurr`.\n\n ```text\n curr_cnt := curr_cnt + 1\n tprev := prev_cnt\n tcurr := curr_cnt\n ```\n\n The trace token with `tprev` and `tcurr` is then passed along with the\n information passed to the other process.\n\n- _When the process calls_ `seq_trace:print(Label, Info)`, `Label` _matches the\n label part of the trace token and the trace token print flag is `true`._\n\n The algorithm is the same as for send above.\n\n- _When information is received that also contains a non-empty trace token. For\n example, when a message is matched out in a receive expression, or when a new\n process is spawned._\n\n The process trace token is set to the trace token from the message.\n\n Let the serial of the trace token be `tprev` and `tcurr`.\n\n ```text\n if (curr_cnt < tcurr )\n curr_cnt := tcurr\n prev_cnt := tcurr\n ```\n\n`curr_cnt` of a process is incremented each time the process is involved in a\nsequential trace. The counter can reach its limit (27 bits) if a process is very\nlong-lived and is involved in much sequential tracing. If the counter overflows,\nthe serial for ordering of the trace events cannot be used. To prevent the\ncounter from overflowing in the middle of a sequential trace, function\n`seq_trace:reset_trace/0` can be called to reset `prev_cnt` and `curr_cnt` of\nall processes in the Erlang node. This function also sets all trace tokens in\nprocesses and their message queues to empty, and thus stops all ongoing\nsequential tracing.","ref":"seq_trace.html#module-serial"},{"type":"module","title":"Performance Considerations - seq_trace","doc":"The performance degradation for a system that is enabled for sequential tracing\nis negligible as long as no tracing is activated. When tracing is activated,\nthere is an extra cost for each traced message, but all other messages are\nunaffected.","ref":"seq_trace.html#module-performance-considerations"},{"type":"module","title":"Ports - seq_trace","doc":"Sequential tracing is not performed across ports.\n\nIf the user for some reason wants to pass the trace token to a port, this must\nbe done manually in the code of the port controlling process. The port\ncontrolling processes have to check the appropriate sequential trace settings\n(as obtained from `seq_trace:get_token/1`) and include trace information in the\nmessage data sent to their respective ports.\n\nSimilarly, for messages received from a port, a port controller has to retrieve\ntrace-specific information, and set appropriate sequential trace flags through\ncalls to `seq_trace:set_token/2`.","ref":"seq_trace.html#module-ports"},{"type":"module","title":"Distribution - seq_trace","doc":"Sequential tracing between nodes is performed transparently. This applies to\nC-nodes built with `Erl_Interface` too. A C-node built with `Erl_Interface` only\nmaintains one trace token, which means that the C-node appears as one process\nfrom the sequential tracing point of view.","ref":"seq_trace.html#module-distribution"},{"type":"module","title":"Example of Use - seq_trace","doc":"This example gives a rough idea of how the new primitives can be used and what\nkind of output it produces.\n\nAssume that you have an initiating process with `Pid == <0.30.0>` like this:\n\n```erlang\n-module(seqex).\n-compile(export_all).\n\nloop(Port) ->\n receive\n {Port,Message} ->\n seq_trace:set_token(label,17),\n seq_trace:set_token('receive',true),\n seq_trace:set_token(print,true),\n seq_trace:print(17,\"**** Trace Started ****\"),\n call_server ! {self(),the_message};\n {ack,Ack} ->\n ok\n end,\n loop(Port).\n```\n\nAnd a registered process `call_server` with `Pid == <0.31.0>` like this:\n\n```erlang\nloop() ->\n receive\n {PortController,Message} ->\n Ack = {received, Message},\n seq_trace:print(17,\"We are here now\"),\n PortController ! {ack,Ack}\n end,\n loop().\n```\n\nA possible output from the system's `sequential_tracer` can be like this:\n\n```erlang\n17:<0.30.0> Info {0,1} WITH\n\"**** Trace Started ****\"\n17:<0.31.0> Received {0,2} FROM <0.30.0> WITH\n{<0.30.0>,the_message}\n17:<0.31.0> Info {2,3} WITH\n\"We are here now\"\n17:<0.30.0> Received {2,4} FROM <0.31.0> WITH\n{ack,{received,the_message}}\n```\n\nThe implementation of a system tracer process that produces this printout can\nlook like this:\n\n```erlang\ntracer() ->\n receive\n {seq_trace,Label,TraceInfo} ->\n print_trace(Label,TraceInfo,false);\n {seq_trace,Label,TraceInfo,Ts} ->\n print_trace(Label,TraceInfo,Ts);\n _Other -> ignore\n end,\n tracer().\n\nprint_trace(Label,TraceInfo,false) ->\n io:format(\"~p:\",[Label]),\n print_trace(TraceInfo);\nprint_trace(Label,TraceInfo,Ts) ->\n io:format(\"~p ~p:\",[Label,Ts]),\n print_trace(TraceInfo).\n\nprint_trace({print,Serial,From,_,Info}) ->\n io:format(\"~p Info ~p WITH~n~p~n\", [From,Serial,Info]);\nprint_trace({'receive',Serial,From,To,Message}) ->\n io:format(\"~p Received ~p FROM ~p WITH~n~p~n\",\n [To,Serial,From,Message]);\nprint_trace({send,Serial,From,To,Message}) ->\n io:format(\"~p Sent ~p TO ~p WITH~n~p~n\",\n [From,Serial,To,Message]).\n```\n\nThe code that creates a process that runs this tracer function and sets that\nprocess as the system tracer can look like this:\n\n```erlang\nstart() ->\n Pid = spawn(?MODULE,tracer,[]),\n seq_trace:set_system_tracer(Pid), % set Pid as the system tracer\n ok.\n```\n\nWith a function like `test/0`, the whole example can be started:\n\n```erlang\ntest() ->\n P = spawn(?MODULE, loop, [port]),\n register(call_server, spawn(?MODULE, loop, [])),\n start(),\n P ! {port,message}.\n```","ref":"seq_trace.html#module-example-of-use"},{"type":"function","title":"seq_trace.get_system_tracer/0","doc":"Returns the pid, port identifier or tracer module of the current system tracer\nor `false` if no system tracer is activated.","ref":"seq_trace.html#get_system_tracer/0"},{"type":"function","title":"seq_trace.get_token/0","doc":"Returns the value of the trace token for the calling process. If `[]` is\nreturned, it means that tracing is not active. Any other value returned is the\nvalue of an active trace token. The value returned can be used as input to the\n[`set_token/1`](`set_token/1`) function.","ref":"seq_trace.html#get_token/0"},{"type":"function","title":"seq_trace.get_token/1","doc":"Returns the value of the trace token component `Component`. See `set_token/2`\nfor possible values of `Component` and `Val`.","ref":"seq_trace.html#get_token/1"},{"type":"function","title":"seq_trace.print/1","doc":"Puts the Erlang term `TraceInfo` into the sequential trace output if the calling\nprocess currently is executing within a sequential trace and the `print` flag of\nthe trace token is set.","ref":"seq_trace.html#print/1"},{"type":"function","title":"seq_trace.print/2","doc":"Same as [`print/1`](`print/1`) with the additional condition that `TraceInfo` is\noutput only if `Label` is equal to the label component of the trace token.","ref":"seq_trace.html#print/2"},{"type":"function","title":"seq_trace.reset_trace/0","doc":"Sets the trace token to empty for all processes on the local node. The process\ninternal counters used to create the serial of the trace token is set to 0. The\ntrace token is set to empty for all messages in message queues. Together this\nwill effectively stop all ongoing sequential tracing in the local node.","ref":"seq_trace.html#reset_trace/0"},{"type":"function","title":"seq_trace.set_system_tracer/1","doc":"Sets the system tracer. The system tracer can be either a process, port or\n[tracer module](`m:erl_tracer`) denoted by `Tracer`. Returns the previous value\n(which can be `false` if no system tracer is active).\n\nFailure: `{badarg, Info}}` if `Pid` is not an existing local pid.","ref":"seq_trace.html#set_system_tracer/1"},{"type":"function","title":"seq_trace.set_token/1","doc":"Sets the trace token for the calling process to `Token`. If `Token == []` then\ntracing is disabled, otherwise `Token` should be an Erlang term returned from\n`get_token/0` or [`set_token/1`](`set_token/1`). [`set_token/1`](`set_token/1`)\ncan be used to temporarily exclude message passing from the trace by setting the\ntrace token to empty like this:\n\n```erlang\nOldToken = seq_trace:set_token([]), % set to empty and save\n % old value\n% do something that should not be part of the trace\nio:format(\"Exclude the signalling caused by this~n\"),\nseq_trace:set_token(OldToken), % activate the trace token again\n...\n```\n\nReturns the previous value of the trace token.","ref":"seq_trace.html#set_token/1"},{"type":"function","title":"seq_trace.set_token/2","doc":"Sets the individual `Component` of the trace token to `Val`. Returns the\nprevious value of the component.\n\n- **[`set_token(label, Label)`](`set_token/2`)** - The `label` component is a\n term which identifies all events belonging to the same sequential trace. If\n several sequential traces can be active simultaneously, `label` is used to\n identify the separate traces. Default is 0.\n\n > #### Warning {: .warning }\n >\n > Labels were restricted to small signed integers (28 bits) prior to OTP 21.\n > The trace token will be silently dropped if it crosses over to a node that\n > does not support the label.\n\n- **[`set_token(serial, SerialValue)`](`set_token/2`)** -\n `SerialValue = {Previous, Current}`. The `serial` component contains counters\n which enables the traced messages to be sorted, should never be set explicitly\n by the user as these counters are updated automatically. Default is `{0, 0}`.\n\n- **[`set_token(send, Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables tracing on information sending.\n Default is `false`.\n\n- **[`set_token('receive', Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables tracing on information reception.\n Default is `false`.\n\n- **[`set_token(print, Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables tracing on explicit calls to\n `seq_trace:print/1`. Default is `false`.\n\n- **[`set_token(timestamp, Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables a timestamp to be generated for each\n traced event. Default is `false`.\n\n- **[`set_token(strict_monotonic_timestamp, Bool)`](`set_token/2`)** - A trace\n token flag (`true | false`) which enables/disables a strict monotonic\n timestamp to be generated for each traced event. Default is `false`.\n Timestamps will consist of\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`) and\n a monotonically increasing integer. The time-stamp has the same format and\n value as produced by\n `{erlang:monotonic_time(nanosecond), erlang:unique_integer([monotonic])}`.\n\n- **[`set_token(monotonic_timestamp, Bool)`](`set_token/2`)** - A trace token\n flag (`true | false`) which enables/disables a strict monotonic timestamp to\n be generated for each traced event. Default is `false`. Timestamps will use\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`).\n The time-stamp has the same format and value as produced by\n `erlang:monotonic_time(nanosecond)`.\n\nIf multiple timestamp flags are passed, `timestamp` has precedence over\n`strict_monotonic_timestamp` which in turn has precedence over\n`monotonic_timestamp`. All timestamp flags are remembered, so if two are passed\nand the one with highest precedence later is disabled the other one will become\nactive.","ref":"seq_trace.html#set_token/2"},{"type":"type","title":"seq_trace.component/0","doc":"","ref":"seq_trace.html#t:component/0"},{"type":"type","title":"seq_trace.flag/0","doc":"","ref":"seq_trace.html#t:flag/0"},{"type":"type","title":"seq_trace.token/0","doc":"An opaque term (a tuple) representing a trace token.","ref":"seq_trace.html#t:token/0"},{"type":"type","title":"seq_trace.tracer/0","doc":"","ref":"seq_trace.html#t:tracer/0"},{"type":"type","title":"seq_trace.value/0","doc":"","ref":"seq_trace.html#t:value/0"},{"type":"module","title":"trace","doc":"The Erlang trace interface.\n\nThe Erlang run-time system exposes several trace points that allow users\nto be notified when they are triggered. Trace points are things such as\nfunction calls, message sending and receiving, garbage collection, and\nprocess scheduling.\n\nThe functions in this module can be used directly, but can also be\nused as building blocks to build more sophisticated debugging or\nprofiling tools. For debugging Erlang code it is recommended to use\n`m:dbg` and for profiling to use `m:tprof`.","ref":"trace.html"},{"type":"module","title":"Trace Sessions - trace","doc":"All tracing is done within a trace session. Trace sessions can be\n[created](`session_create/3`) and [destroyed](`session_destroy/1`)\ndynamically. Each session has its own tracer that will receive all trace\nmessages. Several sessions can exist at the same time without interfering with\neach other. When a trace session is destroyed, all its trace settings are\nautomatically cleaned up.\n\n*Example*:\n\n```erlang\n%% Create a tracer process that will receive the trace events\n1> Tracer = spawn(fun F() -> receive M -> io:format(\"~p~n\",[M]), F() end end).\n<0.91.0>\n%% Create a session using the Tracer\n2> Session = trace:session_create(my_session, Tracer, []).\n{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}\n%% Setup call tracing on self()\n3> trace:process(Session, self(), true, [call]).\n1\n%% Setup call tracing on lists:seq/2\n4> trace:function(Session, {lists,seq,2}, [], []).\n1\n%% Call the traced function\n5> lists:seq(1, 10).\n{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message\n[1,2,3,4,5,6,7,8,9,10] % The return value\n%% Cleanup the trace session\n6> trace:session_destroy(Session).\nok\n```","ref":"trace.html#module-trace-sessions"},{"type":"module","title":"Node Local Tracing Only - trace","doc":"The functions in this module only operates on the local node. That is, both the\ntraced processes/ports as well as the tracer process/port/module must all reside\non the same local node as the call is made. To trace remote nodes use `m:dbg` or\n`m:ttb`.\n\n> #### Change {: .info }\n>\n> This `trace` module was introduced in OTP 27.0. The interface and semantics are\n> similar to the older functions `erlang:trace/3`, `erlang:trace_pattern/3`,\n> and `erlang:trace_info/2`.\n>\n> The main difference is the old functions operate on a single static\n> trace session per node. That could impose the problem that different\n> users and tools would interfere with each other's trace settings. The new trace\n> functions in this module all operate on dynamically created trace sesssions\n> isolated from each other. Also, this makes it easier to safely disable all trace\n> settings when done by a single call to `session_destroy/1`.\n>\n> To change an existing tool to use the interface the following table can be\n> useful:\n>\n> | Old function call | corresponds to |\n> | ------------------------------------------- | ------------------------------------------------------------------ |\n> | [`erlang:trace(Pid, ...)`][1] | [`process(S, Pid, ...)`][p] |\n> | [`erlang:trace(processes, ...)`][1] | [`process(S, all, ...)`][p] |\n> | [`erlang:trace(existing_processes, ...)`][1] | [`process(S, existing, ...)`][p] |\n> | [`erlang:trace(new_processes, ...)`][1] | [`process(S, new, ...)`][p] |\n> | [`erlang:trace(Port, ...)`][1] | [`port(S, Port, ...)`][o] |\n> | [`erlang:trace(ports, ...)`][1] | [`port(S, all, ...)`][o] |\n> | [`erlang:trace(existing_ports, ...)`][1] | [`port(S, existing, ...)`][o] |\n> | [`erlang:trace(new_ports, ...)`][1] | [`port(S, new, ...)`][o] |\n> | [`erlang:trace(all, ...)`][1] | [`process(S, all, ...)`][p] and [`port(S, all, ...)`][o] |\n> | [`erlang:trace(existing, ...)`][1] | [`process(S, existing, ...)`][p] and [`port(S, existing, ...)`][o] |\n> | [`erlang:trace(new, ...)`][1] | [`process(S, new, ...)`][p] and [`port(S, new, ...)`][o] |\n> | [`erlang:trace_pattern(MFA, ...)`][2] | [`function(S, MFA, ...)`][f] |\n> | [`erlang:trace_pattern(send, ...)`][2] | [`send(S, ...)`][s] |\n> | [`erlang:trace_pattern('receive', ...)`][2] | [`recv(S, ...)`][r] |\n> | [`erlang:trace_info(...)`][3] | [`info(S, ...)`][i] |\n>\n> Argument `S` is the trace session that must first be created with\n> `session_create/3`. The other arguments (implied by `...`) are mostly the\n> same. The only other difference is that the tracer is always the tracer\n> specified when the session was created. Options `{tracer,T}`, `{tracer,M,S}`,\n> `{meta,T}`, and `{meta,M,S}` are therefore not allowed, and the default tracer is\n> never the calling process.\n\n[1]: `erlang:trace/3`\n[2]: `erlang:trace_pattern/3`\n[3]: `erlang:trace_info/2`\n[p]: `process/4`\n[o]: `port/4`\n[f]: `function/4`\n[s]: `send/3`\n[r]: `recv/3`\n[i]: `info/3`","ref":"trace.html#module-node-local-tracing-only"},{"type":"function","title":"trace.delivered/2","doc":"Equivalent to [`erlang:trace_delivered(Tracee)`](`erlang:trace_delivered/1`)\nexcept that it is run within the given `t:session/0`.","ref":"trace.html#delivered/2"},{"type":"function","title":"trace.function/4","doc":"Enable or disable _call tracing_ for one or more functions.\n\nMust be combined with `process/4` to set the `call` trace flag for one or more\nprocesses.\n\nConceptually, call tracing works as follows. In each trace session, a\nset of processes and a set of functions haven been marked for\ntracing. If a traced process calls a traced function, the trace action\nis taken. Otherwise, nothing happens.\n\nTo add or remove one or more processes to the set of traced processes, use\n`process/4`.\n\nUse this function to add or remove functions to the set of traced functions\nin a trace session.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nArgument **`MFA`** is to be a tuple, such as `{Module, Function, Arity}`, or the\natom `on_load` (described below). The `MFA` tuple specifies the module,\nfunction, and arity for the functions to be traced. The atom `'_'` can be used\nas a wildcard in any of the following ways:\n\n- **`{Module,Function,'_'}`** - All functions of any arity named `Function` in\n module `Module`.\n\n- **`{Module,'_','_'}`** - All functions in module `Module`.\n\n- **`{'_','_','_'}`** - All functions in all loaded modules.\n\nOther combinations, such as `{Module,'_',Arity}`, are not allowed.\n\nIf argument `MFA` is the atom `on_load`, the match specification and flag list\nare used on all functions in all modules that are newly loaded.\n\nArgument **`MatchSpec`** can take the following forms:\n\n- **`true`** - Enable tracing for the matching functions. Any match\n specification is removed.\n\n- **`false`** - Disable tracing for the matching functions. Any match\n specification is removed.\n\n- **`MatchExpression`** - A match specification. An empty list is equivalent to\n `true`. For a description of match specifications, see section\n [Match Specifications in Erlang](`e:erts:match_spec.md`) in the User's Guide\n for the ERTS application.\n\n- **`restart`** - For the `FlagList` options `call_count`, `call_time` and\n `call_memory`: restarts the existing counters. The behavior is undefined for\n other `FlagList` options.\n\n- **`pause`** - For the `FlagList` options `call_count`, `call_time` and\n `call_memory`: pauses the existing counters. The behavior is undefined for\n other `FlagList` options.\n\nArgument **`FlagList`** is a list of options. The following are the valid options:\n\n- **`global`** - Turn on or off call tracing for global function calls (that\n is, calls specifying the module explicitly). Only exported functions match and\n only global calls generate trace messages. **This is the default if `FlagList`\n is empty**.\n\n- **`local`** - Turn on or off call tracing for all types of function calls.\n Trace messages are sent whenever any of the specified functions are called,\n regardless of how they are called. If flag `return_to` is set for the process,\n a `return_to` message is also sent when this function returns to its caller.\n\n- **`meta`** - Turn on or off meta-tracing for all types of function\n calls. Trace messages are sent to the tracer whenever any of the specified\n functions are called.\n\n Meta-tracing traces all processes and does not care about the process trace\n flags set by `process/4`, the trace flags are instead fixed to\n `[call, timestamp]`.\n\n The match specification function `{return_trace}` works with meta-trace.\n\n- **`call_count`**{: #call_count } - Start (`MatchSpec == true`) or stop\n (`MatchSpec == false`) call count tracing for all types of function calls. For\n every function, a counter is incremented when the function is called, in any\n process. No process trace flags need to be activated.\n\n If call count tracing is started while already running, the count is restarted\n from zero. To pause running counters, use `MatchSpec == pause`. Paused and\n running counters can be restarted from zero with `MatchSpec == restart`.\n\n To read the counter value for a function, call\n [`trace:info(_, MFA, call_count)`](`info/3`).\n\n- **`call_time`**{: #call_time } - Start (`MatchSpec` is `true`) or stops (`MatchSpec` is `false`)\n call time tracing for all types of function calls. For every function, a\n counter is incremented when the function is called and the time spent in the\n function is measured and accumulated in another counter. The counters are\n stored for each call traced process.\n\n If call time tracing is started while already running, the count and time\n restart from zero. To pause running counters, use `MatchSpec == pause`. Paused\n and running counters can be restarted from zero with `MatchSpec == restart`.\n\n To read the counter values, use `info/3`.\n\n- **`call_memory`**{: #call_memory } - Start (`MatchSpec == true`) or stop\n (`MatchSpec == false`) call memory tracing for all types of function calls.\n\n If call memory tracing is started while already running, counters and\n allocations restart from zero. To pause running counters, use\n `MatchSpec == pause`. Paused and running counters can be restarted from zero\n with `MatchSpec == restart`.\n\n To read the counter value, use `info/3`.\n\nOption `global` cannot be combined with any of the other options, which all\nperform some kind of local tracing. If global tracing is specified for\na set of functions, then `local`, `meta`, `call_count`, `call_time`,\nand `call_memory` tracing for the matching set of functions are\ndisabled, and vice versa.\n\nWhen disabling trace, the option must match the type of trace set on the\nfunction. That is, local tracing must be disabled with option `local` and global\ntracing with option `global` (or no option), and so on.\n\nPart of a match specification cannot be changed directly. If a function has\na match specification, it can be replaced with a new one. Function `info/3` can\nbe used to retrieve the existing match specification.\n\nReturns the number of functions matching argument `MFA`. Zero is returned if\nnone matched or if `on_load` was specified.\n\nFails by raising an error exception with an error reason of:\n\n- **`badarg`** - If an argument is invalid.\n\n- **`system_limit`** - If a match specification passed as argument has excessive\n nesting which causes scheduler stack exhaustion for the scheduler that the\n calling process is executing on.\n [Scheduler stack size](`e:erts:erl_cmd.md#sched_thread_stack_size`) can be configured\n when starting the runtime system.","ref":"trace.html#function/4"},{"type":"function","title":"trace.info/3","doc":"Return trace information about a port, process, function, or event.\n\nArgument `Session` is the trace session to inspect as returned by\n`session_create/3` or `session_info/1`.\n\n**To get information about a port or process**, `PidPortFuncEvent` is to be a\nprocess identifier (pid), port identifier, or one of the atoms `new`,\n`new_processes`, or `new_ports`. The atom `new` or `new_processes` means that\nthe default trace state for processes to be created is returned. The atom\n`new_ports` means that the default trace state for ports to be created is\nreturned.\n\nValid `Item` values for ports and processes:\n\n- **`flags`** - Returns a list of atoms indicating what kind of traces is\n enabled for the process. The list is empty if no traces are enabled, and one\n or more of [`trace_info_flag()`](`t:trace_info_flag/0`) if traces are enabled.\n The order is arbitrary.\n\n- **`tracer`** - Returns the identifier for process, port, or a tuple containing\n the tracer module and tracer state tracing this process. If this process is\n not traced, the return value is `[]`.\n\n**To get information about a function**, `PidPortFuncEvent` is to be the\nthree-element tuple `{Module, Function, Arity}` or the atom `on_load`. No\nwildcards are allowed. Returns `undefined` if the function does not exist or\n`false` if the function is not traced. If `PidPortFuncEvent` is `on_load`, the\ninformation returned refers to the default value for code that will be loaded.\n\nValid `Item` values for functions:\n\n- **`traced`** - Returns `global` if this function is traced on global function\n calls, `local` if this function is traced on local function calls (that is,\n local and global function calls), and `false` if local or global function\n calls are not traced.\n\n- **`match_spec`** - Returns the match specification for this function, if it\n has one. If the function is locally or globally traced but has no match\n specification defined, the returned value is `[]`.\n\n- **`meta`** - Returns the meta-trace tracer process, port, or trace module for\n this function, if it has one. If the function is not meta-traced, the returned\n value is `false`. If the function is meta-traced but has once detected that\n the tracer process is invalid, the returned value is `[]`.\n\n- **`meta_match_spec`** - Returns the meta-trace match specification for this\n function, if it has one. If the function is meta-traced but has no match\n specification defined, the returned value is `[]`.\n\n- **`call_count`** - Returns the call count value for this function or `true`\n for the pseudo function `on_load` if call count tracing is active. Otherwise\n `false` is returned.\n\n See also `function/4`.\n\n- **`call_time`** - Returns the call time values for this function or `true` for\n the pseudo function `on_load` if call time tracing is active. Otherwise\n `false` is returned. The call time values returned, `[{Pid, Count, S, Us}]`,\n is a list of each process that executed the function and its specific\n counters. `Count` is the call count. `S` and `Us` are the accumulated call\n time expressed in seconds and microseconds.\n\n See also `function/4`.\n\n- **`call_memory`** - Returns the accumulated number of words allocated by this\n function. Accumulation stops at the next memory traced function: if there are\n `outer`, `middle` and `inner` functions each allocating 3 words, but only\n `outer` is traced, it will report 9 allocated words. If `outer` and `inner`\n are traced, 6 words are reported for `outer` and 3 for `inner`. When function\n is not traced, `false` is returned. Returned tuple is `[{Pid, Count, Words}]`,\n for each process that executed the function.\n\n See also `function/4`.\n\n- **`all`** - Returns a list containing the `{Item, Value}` tuples for all other\n items, or returns `false` if no tracing is active for this function.\n\n**To get information about an event**, `PidPortFuncEvent` is to be one of the\natoms `send` or `'receive'`.\n\nOne valid `Item` for events exists:\n\n- **`match_spec`** - Returns the match specification for this event, if it has\n one, or `true` if no match specification has been set.\n\nThe return value is `{Item, Value}`, where `Value` is the requested information\nas described earlier. If a pid for a dead process was specified, or the name of\na non-existing function, `Value` is `undefined`.","ref":"trace.html#info/3"},{"type":"function","title":"trace.port/4","doc":"Turn on or off trace flags for one or more ports.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\n`Ports` is either a port identifier for a local port or one of the following atoms:\n\n- **`all`** - All currently existing ports and all that will be\n created in the future.\n\n- **`existing`** - All currently existing ports.\n\n- **`new`** - All ports that will be created in the future.\n\n`FlagList` can contain any number of the following flags (the \"message tags\"\nrefers to the list of [`trace messages`](#port_trace_messages)):\n\n- **`all`** - Sets all trace flags except `cpu_timestamp`, which are in its\n nature different than the others.\n\n- **`send`** - Traces sending of messages.\n\n Message tags: [`send`](#port_trace_messages_send) and\n [`send_to_non_existing_process`](#port_trace_messages_send_to_non_existing_process).\n\n- **`'receive'`** - Traces receiving of messages.\n\n Message tags: [`'receive'`](#port_trace_messages_receive).\n\n- **`ports`** - Traces port-related events.\n\n Message tags: [`open`](#port_trace_messages_open),\n [`closed`](#port_trace_messages_closed),\n [`register`](#port_trace_messages_register),\n [`unregister`](#port_trace_messages_unregister),\n [`getting_linked`](#port_trace_messages_getting_linked), and\n [`getting_unlinked`](#port_trace_messages_getting_unlinked).\n\n- **`running_ports`** - Traces scheduling of ports.\n\n Message tags: [`in`](#port_trace_messages_in_port) and\n [`out`](#port_trace_messages_out_port).\n\n- **`timestamp`**, **`cpu_timestamp`**, **`monotonic_timestamp`**,\n **`strict_monotonic_timestamp`** - Same as for timestamps in\n [`process/4`](#timestamp).\n\nThe tracing process receives the _trace messages_ described in the following\nlist. `Port` is the port identifier of the traced port in which the traced\nevent has occurred. The third tuple element is the message tag.\n\nIf flag `timestamp`, `strict_monotonic_timestamp`, or `monotonic_timestamp` is\nspecified, the first tuple element is `trace_ts` instead, and the time stamp is\nadded as an extra element last in the message tuple. If multiple time stamp\nflags are passed, `timestamp` has precedence over `strict_monotonic_timestamp`,\nwhich in turn has precedence over `monotonic_timestamp`. All time stamp flags\nare remembered, so if two are passed and the one with highest precedence later\nis disabled, the other one becomes active.\n\nIf a match specification (applicable only for `send` and `'receive'`\ntracing) contains a `{message}` action function with a non-boolean value, that\nvalue is added as an extra element to the message tuple either in the last\nposition or before the timestamp (if it is present).\n\nTrace messages:\n\n[](){: #port_trace_messages }\n\n- **`{trace, Port, send, Msg, To}`{: #port_trace_messages_send }** - When\n `Port` sends message `Msg` to process `To`.\n\n- **`{trace, Port, send_to_non_existing_process, Msg, To}`{:\n #port_trace_messages_send_to_non_existing_process }** - When `Port`\n sends message `Msg` to the non-existing process `To`.\n\n- **`{trace, Port, 'receive', Msg}`{: #port_trace_messages_receive }** -\n When `Port` receives message `Msg`. If `Msg` is set to time-out, a receive\n statement can have timed out, or the process received a message with the\n payload `timeout`.\n\n- **`{trace, Port, register, RegName}`{: #port_trace_messages_register\n }** - When `Port` gets the name `RegName` registered.\n\n- **`{trace, Port, unregister, RegName}`{: #port_trace_messages_unregister\n }** - When `Port` gets the name `RegName` unregistered. This is done\n automatically when a registered process or port exits.\n\n- **`{trace, Port, getting_linked, Pid2}`{:\n #port_trace_messages_getting_linked }** - When `Port` gets linked to a\n process `Pid2`.\n\n- **`{trace, Port, getting_unlinked, Pid2}`{:\n #port_trace_messages_getting_unlinked }** - When `Port` gets unlinked\n from a process `Pid2`.\n\n- **`{trace, Port, open, Pid, Driver}`{: #port_trace_messages_open }** - When\n `Pid` opens a new port `Port` with the running `Driver`.\n\n `Driver` is the name of the driver as an atom.\n\n- **`{trace, Port, closed, Reason}`{: #port_trace_messages_closed }** - When\n `Port` closes with `Reason`.\n\n- **`{trace, Port, in, Command | 0}`{: #port_trace_messages_in_port }** -\n When `Port` is scheduled to run. `Command` is the first thing the port will\n execute, it can however run several commands before being scheduled out. On\n some rare occasions, the current function cannot be determined, then the last\n element is `0`.\n\n The possible commands are `call`, `close`, `command`, `connect`, `control`,\n `flush`, `info`, `link`, `open`, and `unlink`.\n\n- **`{trace, Port, out, Command | 0}`{: #port_trace_messages_out_port }** -\n When `Port` is scheduled out. The last command run was `Command`. On some rare\n occasions, the current function cannot be determined, then the last element is\n `0`. `Command` can contain the same commands as `in`\n\nIf the tracing process/port dies or the tracer module returns `remove`, the\nflags are silently removed.\n\nReturns a number indicating the number of ports that matched `Ports`.\nIf `Ports` is a port identifier, the return value is `1`. If\n`Ports` is `all` or `existing`, the return value is the number of\nexisting ports. If `Ports` is `new`, the return value is `0`.\n\nFailure: `badarg` if the specified arguments are not supported. For example,\n`cpu_timestamp` is not supported on all platforms.","ref":"trace.html#port/4"},{"type":"function","title":"trace.process/4","doc":"Turn on or off trace flags for one or more processes.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nArgument `Procs` is either a process identifier (pid) for a local process or\none of the following atoms:\n\n- **`all`** - All currently existing processes and all that will be\n created in the future.\n\n- **`existing`** - All currently existing processes.\n\n- **`new`** - All processes that will be created in the future.\n\nArgument `How` is either `true` to turn on trace flags or `false` to turn them off.\n\nArgument `FlagList` can contain any number of the following flags (the \"message\ntags\" refers to the list of [`trace messages`](#process_trace_messages)):\n\n- **`all`** - Sets all trace flags except `cpu_timestamp`, which\n is in its nature different than the others.\n\n- **`send`** - Traces sending of messages. Limit which sent messages to trace by\n calling `send/3`.\n\n Message tags: [`send`](#process_trace_messages_send) and\n [`send_to_non_existing_process`](#process_trace_messages_send_to_non_existing_process).\n\n- **`'receive'`** - Traces receiving of messages. Limit which received messages\n to trace by calling `recv/3`.\n\n Message tags: [`'receive'`](#process_trace_messages_receive).\n\n- **`call`** - Traces certain function calls. Specify which function calls to\n trace by calling `function/4`.\n\n Message tags: [`call`](#process_trace_messages_call) and\n [`return_from`](#process_trace_messages_return_from).\n\n- **`silent`** - Used with the `call` trace flag. The `call`, `return_from`, and\n `return_to` trace messages are inhibited if this flag is set, but they are\n executed as normal if there are match specifications.\n\n Silent mode is inhibited by executing `trace:process(_, _, false, [silent|_])`, or\n by a match specification executing the function `{silent, false}`.\n\n The `silent` trace flag facilitates setting up a trace on many or even all\n processes in the system. The trace can then be activated and deactivated using\n the match specification function `{silent,Bool}`, giving a high degree of\n control of which functions with which arguments that trigger the trace.\n\n Message tags: [`call`](#process_trace_messages_call),\n [`return_from`](#process_trace_messages_return_from), and\n [`return_to`](#process_trace_messages_return_to). Or rather, the\n absence of.\n\n- **`return_to`** - Used with the `call` trace flag. Traces the exit from\n call traced functions back to where the execution resumes. Only works for\n functions traced with option `local` to `function/4`.\n\n The semantics is that a `return_to` trace message is sent when a call traced\n function returns or throws and exception that is caught. For tail calls, only\n one trace message is sent per chain of tail calls, so the properties of tail\n recursiveness for function calls are kept while tracing with this\n flag. Similar for exceptions, only one `return_to` trace message is sent, even\n if the exception passed more than one call traced function before it was\n caught.\n\n Using `call` and `return_to` trace together makes it possible to know exactly\n in which function a process executes at any time.\n\n To get trace messages containing return values from functions, use the\n `{return_trace}` match specification action instead.\n\n Message tags: [`return_to`](#process_trace_messages_return_to).\n\n- **`procs`** - Traces process-related events.\n\n Message tags: [`spawn`](#process_trace_messages_spawn),\n [`spawned`](#process_trace_messages_spawned),\n [`exit`](#process_trace_messages_exit),\n [`register`](#process_trace_messages_register),\n [`unregister`](#process_trace_messages_unregister),\n [`link`](#process_trace_messages_link),\n [`unlink`](#process_trace_messages_unlink),\n [`getting_linked`](#process_trace_messages_getting_linked), and\n [`getting_unlinked`](#process_trace_messages_getting_unlinked).\n\n- **`running`** - Traces scheduling of processes.\n\n Message tags: [`in`](#process_trace_messages_in_proc) and\n [`out`](#process_trace_messages_out_proc).\n\n- **`exiting`** - Traces scheduling of exiting processes.\n\n Message tags:\n [`in_exiting`](#process_trace_messages_in_exiting_proc),\n [`out_exiting`](#process_trace_messages_out_exiting_proc), and\n [`out_exited`](#process_trace_messages_out_exited_proc).\n\n- **`running_procs`** - Traces scheduling of processes just like `running`.\n However, this option also includes schedule events when the process executes\n within the context of a port without being scheduled out itself.\n\n Message tags: [`in`](#process_trace_messages_in_proc) and\n [`out`](#process_trace_messages_out_proc).\n\n- **`garbage_collection`** - Traces garbage collections of processes.\n\n Message tags:\n [`gc_minor_start`](#process_trace_messages_gc_minor_start),\n [`gc_max_heap_size`](#process_trace_messages_gc_max_heap_size), and\n [`gc_minor_end`](#process_trace_messages_gc_minor_end).\n\n- **`timestamp`{: #timestamp }** - Includes a time stamp in all trace\n messages. The time stamp (Ts) has the same form as returned by\n `erlang:now/0`.\n\n- **`cpu_timestamp`** - A global trace flag for the Erlang node that makes all\n trace time stamps using flag `timestamp` to be in CPU time, not wall clock\n time. That is, `cpu_timestamp` is not be used if `monotonic_timestamp` or\n `strict_monotonic_timestamp` is enabled. Only allowed with `Procs==all`.\n If the host machine OS does not support high-resolution CPU time measurements,\n `process/4` exits with `badarg`. Notice that most OS do not\n synchronize this value across cores, so be prepared that time can seem to go\n backwards when using this option.\n\n- **`monotonic_timestamp`** - Includes an\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`) time stamp\n in all trace messages. The time stamp (Ts) has the same format and value as\n produced by [`erlang:monotonic_time(nanosecond)`](`erlang:monotonic_time/1`). This\n flag overrides flag `cpu_timestamp`.\n\n- **`strict_monotonic_timestamp`** - Includes an time stamp consisting of\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`) and a\n monotonically increasing integer in all trace messages. The time stamp (Ts)\n has the same format and value as produced by `{`\n [`erlang:monotonic_time(nanosecond)`](`erlang:monotonic_time/1`)`,`\n [`erlang:unique_integer([monotonic])`](`erlang:unique_integer/1`)`}`. This flag\n overrides flag `cpu_timestamp`.\n\n If multiple time stamp flags are passed, `timestamp` has precedence over\n `strict_monotonic_timestamp`, which in turn has precedence over\n `monotonic_timestamp`. All time stamp flags are remembered, so if two are\n passed and the one with highest precedence later is disabled, the other one\n becomes active.\n\n- **`arity`** - Used with the `call` trace flag. `{M, F, Arity}` is specified\n instead of `{M, F, Args}` in call trace messages.\n\n- **`set_on_spawn`** - Makes any process created by a traced process inherit all\n its trace flags, including flag `set_on_spawn` itself.\n\n- **`set_on_first_spawn`** - Makes the first process created by a traced process\n inherit all its trace flags, excluding flag `set_on_first_spawn` itself. That\n is, after the first spawn is done, `set_on_first_spawn` will be cleared in\n both the spawned process and the spawning process.\n\n If both are set, `set_on_first_spawn` will supersede `set_on_spawn`.\n\n- **`set_on_link`** - Makes any process linked by a traced process inherit all\n its trace flags, including flag `set_on_link` itself.\n\n- **`set_on_first_link`** - Makes the first process linked to by a traced\n process inherit all its trace flags, excluding flag `set_on_first_link`\n itself. That is, after the first link is done, `set_on_first_link` will be\n cleared in both the linked process and the linking process.\n\n If both are set, `set_on_first_link` will supersede `set_on_link`.\n\nThe tracing process receives the _trace messages_ described in the following\nlist. `Pid` is the process identifier of the traced process in which the traced\nevent has occurred. The third tuple element is the message tag.\n\nIf flag `timestamp`, `strict_monotonic_timestamp`, or `monotonic_timestamp` is\nspecified, the first tuple element is `trace_ts` instead, and the time stamp is\nadded as an extra element last in the message tuple.\n\nIf a match specification (applicable only for `call`, `send`, and `'receive'`\ntracing) contains a `{message}` action function with a non-boolean value, that\nvalue is added as an extra element to the message tuple either in the last\nposition or before the timestamp (if it is present).\n\nTrace messages:\n\n[](){: #process_trace_messages }\n\n- **`{trace, Pid, send, Msg, To}`{: #process_trace_messages_send }** - When\n process `Pid` sends message `Msg` to process `To`.\n\n- **`{trace, Pid, send_to_non_existing_process, Msg, To}`{:\n #process_trace_messages_send_to_non_existing_process }** - When process `Pid`\n sends message `Msg` to the non-existing process `To`.\n\n- **`{trace, Pid, 'receive', Msg}`{: #process_trace_messages_receive }** -\n When process `Pid` receives message `Msg`. If `Msg` is set to time-out, a receive\n statement can have timed out, or the process received a message with the\n payload `timeout`.\n\n- **`{trace, Pid, call, {M, F, Args}}`{: #process_trace_messages_call }** - When\n process `Pid` calls a traced function. The return values of calls are never\n supplied, only the call and its arguments.\n\n Trace flag `arity` can be used to change the contents of this message, so that\n `Arity` is specified instead of `Args`.\n\n- **`{trace, Pid, return_to, {M, F, Arity}}`{: #process_trace_messages_return_to\n }** - When process `Pid` returns _to_ the specified function. This trace\n message is sent if both the flags `call` and `return_to` are set, and the\n function is set to be traced on _local_ function calls. The message is only\n sent when returning from a chain of tail recursive function calls, where at\n least one call generated a `call` trace message (that is, the functions match\n specification matched, and `{message, false}` was not an action).\n\n- **`{trace, Pid, return_from, {M, F, Arity}, ReturnValue}`{:\n #process_trace_messages_return_from }** - When `Pid` returns _from_ the\n specified function. This trace message is sent if flag `call` is set, and the\n function has a match specification with a `return_trace` or `exception_trace`\n action.\n\n- **`{trace, Pid, exception_from, {M, F, Arity}, {Class, Value}}`{:\n #process_trace_messages_exception_from }** - When `Pid` exits _from_ the\n specified function because of an exception. This trace message is sent if flag\n `call` is set, and the function has a match specification with an\n `exception_trace` action.\n\n- **`{trace, Pid, spawn, Pid2, {M, F, Args}}`{: #process_trace_messages_spawn\n }** - When `Pid` spawns a new process `Pid2` with the specified function call\n as entry point.\n\n `Args` is supposed to be the argument list, but can be any term if the spawn\n is erroneous.\n\n- **`{trace, Pid, spawned, Pid2, {M, F, Args}}`{:\n #process_trace_messages_spawned }** - When `Pid` is spawned by process `Pid2`\n with the specified function call as entry point.\n\n `Args` is supposed to be the argument list, but can be any term if the spawn\n is erroneous.\n\n- **`{trace, Pid, exit, Reason}`{: #process_trace_messages_exit }** - When `Pid`\n exits with reason `Reason`.\n\n- **`{trace, Pid, register, RegName}`{: #process_trace_messages_register\n }** - When process `Pid` gets the name `RegName` registered.\n\n- **`{trace, Pid, unregister, RegName}`{: #process_trace_messages_unregister\n }** - When process `Pid` gets the name `RegName` unregistered. This is done\n automatically when a registered process or port exits.\n\n- **`{trace, Pid, link, Pid2}`{: #process_trace_messages_link }** - When `Pid`\n links to a process `Pid2`.\n\n- **`{trace, Pid, unlink, Pid2}`{: #process_trace_messages_unlink }** - When\n `Pid` removes the link from a process `Pid2`.\n\n- **`{trace, Pid, getting_linked, Pid2}`{:\n #process_trace_messages_getting_linked }** - When `Pid` gets linked to a\n process `Pid2`.\n\n- **`{trace, Pid, getting_unlinked, Pid2}`{:\n #process_trace_messages_getting_unlinked }** - When `Pid` gets unlinked\n from a process `Pid2`.\n\n- **`{trace, Port, open, Pid, Driver}`{: #process_trace_messages_open }** - When\n `Pid` opens a new port `Port` with the running `Driver`.\n\n `Driver` is the name of the driver as an atom.\n\n- **[](){: #process_trace_messages_in_proc }\n `{trace, Pid, in | in_exiting, {M, F, Arity} | 0}`{:\n #process_trace_messages_in_exiting_proc }**\n When `Pid` is scheduled to run. The process runs in function `{M, F, Arity}`.\n On some rare occasions, the current function cannot be determined, then the\n last element is `0`.\n\n- **[](){: #process_trace_messages_out_proc } [](){:\n #process_trace_messages_out_exiting_proc }\n `{trace, Pid, out | out_exiting | out_exited, {M, F, Arity} | 0}`{:\n #process_trace_messages_out_exited_proc }**\n When `Pid` is scheduled out. The process was running in function `{M, F,\n Arity}`. On some rare occasions, the current function cannot be determined,\n then the last element is `0`.\n\n- **`{trace, Pid, gc_minor_start, Info}`{:\n #process_trace_messages_gc_minor_start }** - [](){: #gc_minor_start } Sent\n when a garbage collection of the young generation is about to be started.\n `Info` is a list of two-element tuples, where the first element is a key,\n and the second is the value. Do not depend on any order of the tuples.\n The following keys are defined:\n\n - **`heap_size`** - The size of the used part of the heap.\n\n - **`heap_block_size`** - The size of the memory block used for storing the\n heap and the stack.\n\n - **`old_heap_size`** - The size of the used part of the old heap.\n\n - **`old_heap_block_size`** - The size of the memory block used for storing\n the old heap.\n\n - **`stack_size`** - The size of the stack.\n\n - **`recent_size`** - The size of the data that survived the previous garbage\n collection.\n\n - **`mbuf_size`** - The combined size of message buffers associated with the\n process.\n\n - **`bin_vheap_size`** - The total size of unique off-heap binaries referenced\n from the process heap.\n\n - **`bin_vheap_block_size`** - The total size of binaries allowed in the\n virtual heap in the process before doing a garbage collection.\n\n - **`bin_old_vheap_size`** - The total size of unique off-heap binaries\n referenced from the process old heap.\n\n - **`bin_old_vheap_block_size`** - The total size of binaries allowed in the\n virtual old heap in the process before doing a garbage collection.\n\n - **`wordsize`** - For the `gc_minor_start` event it is the size of the need\n that triggered the GC. For the corresponding `gc_minor_end` event it is the\n size of reclaimed memory = start `heap_size` - end `heap_size`.\n\n All sizes are in words.\n\n- **`{trace, Pid, gc_max_heap_size, Info}`{:\n #process_trace_messages_gc_max_heap_size }** - Sent when the\n [`max_heap_size`](`e:erts:erlang#process_flag_max_heap_size`) is reached during\n garbage collection. `Info` contains the same kind of list as in message\n `gc_start`, but the sizes reflect the sizes that triggered `max_heap_size` to\n be reached.\n\n- **`{trace, Pid, gc_minor_end, Info}`{: #process_trace_messages_gc_minor_end\n }** - Sent when young garbage collection is finished. `Info` contains the same\n kind of list as in message `gc_minor_start`, but the sizes reflect the new\n sizes after garbage collection.\n\n- **`{trace, Pid, gc_major_start, Info}`{:\n #process_trace_messages_gc_major_start }** - Sent when fullsweep garbage\n collection is about to be started. `Info` contains the same kind of list as in\n message `gc_minor_start`.\n\n- **`{trace, Pid, gc_major_end, Info}`{: #process_trace_messages_gc_major_end\n }** - Sent when fullsweep garbage collection is finished. `Info` contains the\n same kind of list as in message `gc_minor_start`, but the sizes reflect the\n new sizes after a fullsweep garbage collection.\n\nIf the tracing process dies or the tracer module returns `remove`, the\nflags are silently removed.\n\nReturns a number indicating the number of processes that matched `Procs`.\nIf `Procs` is a process identifier, the return value is `1`. If\n`Procs` is `all` or `existing`, the return value is the number of\nprocesses running. If `Procs` is `new`, the return value is `0`.\n\nFailure: `badarg` if the specified arguments are not supported. For example,\n`cpu_timestamp` is not supported on all platforms.","ref":"trace.html#process/4"},{"type":"function","title":"trace.recv/3","doc":"Set trace pattern for _message receiving_.\n\nMust be combined with `process/4` or `port/4` to set the `'receive'` trace flag\nfor one or more processes or ports.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nThe default value for the `receive` trace pattern in each session is\n`true`. That is, all messages received by processes having `'receive'`\ntrace enabled will be traced. Use this function to limit traced\n`'receive'` events based on the message content, the sender, and/or the\nreceiver.\n\nArgument `MatchSpec` can take the following forms:\n\n- **`MatchExpression`** - A match specification. The matching is done on\n the list `[Node, Sender, Msg]`. `Node` is the node name of the sender.\n `Sender` is the process or port identity of the sender, or the atom\n `undefined` if the sender is not known (which can be the case for remote\n senders). `Msg` is the message term. The pid of the receiving process can be\n accessed with the guard function `self/0`. An empty list is the same as\n `true`. For more information, see section\n [Match Specifications in Erlang](`e:erts:match_spec.md`) in the User's Guide\n for the ERTS application.\n\n- **`true`** - Enable tracing for all received messages (to `'receive'` traced\n processes). Any match specification is removed. _This is the default_.\n\n- **`false`** - Disable tracing for all received messages. Any match\n specification is removed.\n\nArgument `FlagList` must be `[]` for receive tracing.\n\nThe return value is always `1`.\n\n*Examples:*\n\nOnly trace messages from a specific process `Pid`:\n\n```erlang\n> trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).\n1\n```\n\nOnly trace messages matching `{reply, _}`:\n\n```erlang\n> trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).\n1\n```\n\nOnly trace messages from other nodes:\n\n```erlang\n> trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).\n1\n```\n\n> #### Note {: .info }\n>\n> A match specification for `'receive'` trace can use all guard and body\n> functions except `caller`, `is_seq_trace`, `get_seq_token`, `set_seq_token`,\n> `enable_trace`, `disable_trace`, `trace`, `silent`, and `process_dump`.\n\nFails by raising an error exception with an error reason of:\n\n- **`badarg`** - If an argument is invalid.\n\n- **`system_limit`** - If a match specification passed as argument has excessive\n nesting which causes scheduler stack exhaustion for the scheduler that the\n calling process is executing on.\n [Scheduler stack size](`e:erts:erl_cmd.md#sched_thread_stack_size`) can be configured\n when starting the runtime system.","ref":"trace.html#recv/3"},{"type":"function","title":"trace.send/3","doc":"Set trace pattern for _message sending_.\n\nMust be combined with `process/4` or `port/4` to set the `send` trace flag for\none or more processes or ports.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nThe default value for the `send` trace pattern in each session is\n`true`. That is, all messages sent from processes having `send` trace\nenabled will be traced. Use this function to limit traced `send`\nevents based on the message content, the sender, and/or the receiver.\n\nArgument `MatchSpec` can take the following forms:\n\n- **`MatchExpression`** - A match specification. The matching is done on\n the list `[Receiver, Msg]`. `Receiver` is the process or port identity of the\n receiver and `Msg` is the message term. The pid of the sending process can be\n accessed with the guard function `self/0`. An empty list is the same as\n `true`. For more information, see section\n [Match Specifications in Erlang](`e:erts:match_spec.md`) in the User's Guide\n for the ERTS application.\n\n- **`true`** - Enable tracing for all sent messages (from `send` traced\n processes). Any match specification is removed.\n\n- **`false`** - Disable tracing for all sent messages. Any match specification\n is removed.\n\nArgument `FlagList` must be `[]`.\n\nThe return value is always `1`.\n\n*Examples:*\n\nOnly trace messages to a specific process `Pid`:\n\n```erlang\n> trace:send(Session, [{[Pid, '_'],[],[]}], []).\n1\n```\n\nOnly trace messages matching `{reply, _}`:\n\n```erlang\n> trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).\n1\n```\n\nOnly trace messages sent to the sender itself:\n\n```erlang\n> trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).\n1\n```\n\nOnly trace messages sent to other nodes:\n\n```erlang\n> trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).\n1\n```\n\n> #### Note {: .info }\n>\n> A match specification for `send` trace can use all guard and body functions\n> except `caller`.\n\nFails by raising an error exception with an error reason of:\n\n- **`badarg`** - If an argument is invalid.\n\n- **`system_limit`** - If a match specification passed as argument has excessive\n nesting which causes scheduler stack exhaustion for the scheduler that the\n calling process is executing on.\n [Scheduler stack size](`e:erts:erl_cmd.md#sched_thread_stack_size`) can be configured\n when starting the runtime system.","ref":"trace.html#send/3"},{"type":"function","title":"trace.session_create/3","doc":"Create a new trace session.\n\nArgument `Name` is an atom name for the session. It will be returned when\ninspecting with `session_info/1`.\n\nArgument `Tracer` specifies the consumer of all trace events for the session. It\ncan be an identifier of a local process or port to receive all trace\nmessages.\n\n`Tracer` can also be a tuple `{TracerModule, TracerState}` for a tracer module\nto be called instead of sending a trace message. The tracer module can then\nignore or change the trace message. For more details on how to write a tracer\nmodule, see module `m:erl_tracer`.\n\nArgument `Opts` must be `[]`.\n\nReturns an opaque handle to the trace session. The handle will keep the session\nalive. If the handle is dropped and garbage collected, the session will be\ndestroyed and cleaned up as if `session_destroy/1` was called.","ref":"trace.html#session_create/3"},{"type":"function","title":"trace.session_destroy/1","doc":"Destroy a trace session and cleanup all its settings on processes, ports, and\nfunctions.\n\nThe only things not cleaned up are trace messages that have already been sent.\n\nReturns `true` if the session was active. Returns `false` if the session had\nalready been destroyed by either an earler call to this function or the garbage\ncollector.","ref":"trace.html#session_destroy/1"},{"type":"function","title":"trace.session_info/1","doc":"Return which trace sessions that affect a port, process, function, or event.\n\nArgument `all` returns all active trace sessions that exists on the node.\n\nReturns a list of [weak session handles](`t:session_weak_ref/0`) or `undefined` if the\nprocess/port/function does not exists.","ref":"trace.html#session_info/1"},{"type":"type","title":"trace.match_variable/0","doc":"","ref":"trace.html#t:match_variable/0"},{"type":"type","title":"trace.session/0","doc":"A handle to an isolated trace session.","ref":"trace.html#t:session/0"},{"type":"opaque","title":"trace.session_strong_ref/0","doc":"","ref":"trace.html#t:session_strong_ref/0"},{"type":"opaque","title":"trace.session_weak_ref/0","doc":"A weak session handle as returned by `session_info/1`. A weak session handle can\nbe used like a full session handle, but it will not prevent the session from\nbeing destroyed when the last strong handle is garbage collected.","ref":"trace.html#t:session_weak_ref/0"},{"type":"type","title":"trace.trace_flag/0","doc":"","ref":"trace.html#t:trace_flag/0"},{"type":"type","title":"trace.trace_info_flag/0","doc":"","ref":"trace.html#t:trace_info_flag/0"},{"type":"type","title":"trace.trace_info_item_result/0","doc":"","ref":"trace.html#t:trace_info_item_result/0"},{"type":"type","title":"trace.trace_info_return/0","doc":"","ref":"trace.html#t:trace_info_return/0"},{"type":"type","title":"trace.trace_match_spec/0","doc":"","ref":"trace.html#t:trace_match_spec/0"},{"type":"type","title":"trace.trace_pattern_flag/0","doc":"","ref":"trace.html#t:trace_pattern_flag/0"},{"type":"type","title":"trace.trace_pattern_mfa/0","doc":"","ref":"trace.html#t:trace_pattern_mfa/0"},{"type":"extras","title":"Kernel Application","doc":"\n# Kernel Application","ref":"kernel_app.html"},{"type":"extras","title":"Description - Kernel Application","doc":"The Kernel application has all the code necessary to run the Erlang runtime\nsystem: file servers, code servers, and so on.\n\nThe Kernel application is the first application started. It is mandatory in the\nsense that the minimal system based on Erlang/OTP consists of Kernel and STDLIB.\nKernel contains the following functional areas:\n\n- Start, stop, supervision, configuration, and distribution of applications\n- Code loading\n- Logging\n- Global name service\n- Supervision of Erlang/OTP\n- Communication with sockets\n- Operating system interface","ref":"kernel_app.html#description"},{"type":"extras","title":"Logger Handlers - Kernel Application","doc":"Two standard logger handlers are defined in the Kernel application. These are\ndescribed in the [Kernel User's Guide](logger_chapter.md), and in the\n`m:logger_std_h` and [`logger_disk_log_h` ](`m:logger_disk_log_h`)manual pages.\n\n[](){: #erl_signal_server }","ref":"kernel_app.html#logger-handlers"},{"type":"extras","title":"OS Signal Event Handler - Kernel Application","doc":"Asynchronous OS signals may be subscribed to via the Kernel applications event\nmanager (see [OTP Design Principles](`e:system:design_principles.md`) and\n`m:gen_event`) registered as `erl_signal_server`. A default signal handler is\ninstalled which handles the following signals:\n\n- **`sigusr1`** - The default handler will halt Erlang and produce a crashdump\n with slogan \"Received SIGUSR1\". This is equivalent to calling\n `erlang:halt(\"Received SIGUSR1\")`.\n\n- **`sigquit`** - The default handler will halt Erlang immediately. This is\n equivalent to calling `erlang:halt()`.\n\n- **`sigterm`** - The default handler will terminate Erlang normally. This is\n equivalent to calling `init:stop()`.","ref":"kernel_app.html#os-signal-event-handler"},{"type":"extras","title":"Events - Kernel Application","doc":"Any event handler added to `erl_signal_server` must handle the following events.\n\n- **`sighup`** - Hangup detected on controlling terminal or death of controlling\n process\n\n- **`sigquit`** - Quit from keyboard\n\n- **`sigabrt`** - Abort signal from abort\n\n- **`sigalrm`** - Timer signal from alarm\n\n- **`sigterm`** - Termination signal\n\n- **`sigusr1`** - User-defined signal 1\n\n- **`sigusr2`** - User-defined signal 2\n\n- **`sigchld`** - Child process stopped or terminated\n\n- **`sigstop`** - Stop process\n\n- **`sigtstp`** - Stop typed at terminal\n\nSetting OS signals are described in `os:set_signal/2`.","ref":"kernel_app.html#events"},{"type":"extras","title":"Configuration - Kernel Application","doc":"The following configuration parameters are defined for the Kernel application.\nFor more information about configuration parameters, see file\n[`app`](app.md).\n\n- **`connect_all = true | false`{: #connect_all }** - If enabled (`true`), which\n also is the default, `m:global` will actively connect to all nodes that\n becomes known to it. Note that you also want to enable\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n in order for `global` to ensure that a fully connected network is maintained.\n `prevent_overlapping_partitions` will also prevent inconsistencies in\n `global`'s name registration and locking.\n\n The now deprecated command line argument\n [`-connect_all `](`e:erts:erl_cmd.md#connect_all`) has the same\n effect as the `connect_all` configuration parameter. If this configuration\n parameter is defined, it will override the command line argument.\n\n- **`distributed = [Distrib]`{: #distributed }** - Specifies which applications\n that are distributed and on which nodes they are allowed to execute. In this\n parameter:\n\n - `Distrib = {App,Nodes} | {App,Time,Nodes}`\n - `App = atom()`\n - `Time = integer()>0`\n - `Nodes = [node() | {node(),...,node()}]`\n\n The parameter is described in `application:load/2`.\n\n- **`dist_auto_connect = Value`{: #dist_auto_connect }** - Specifies when nodes\n are automatically connected. If this parameter is not specified, a node is\n always automatically connected, for example, when a message is to be sent to\n that node. `Value` is one of:\n\n - **`never`** - Connections are never automatically established, they must be\n explicitly connected. See `m:net_kernel`.\n\n - **`once`** - Connections are established automatically, but only once per\n node. If a node goes down, it must thereafter be explicitly connected. See\n `m:net_kernel`.\n\n- **`epmd_module = module()`{: #epmd_module }** - Configures the module\n responsible for communication with [epmd](`e:erts:epmd_cmd.md`). If this parameter\n is undefined, it defaults to `erl_epmd`.\n\n The now deprecated command line argument\n [`-epmd_module `](`e:erts:erl_cmd.md#epmd_module`) has the same\n effect as the `epmd_module` configuration parameter. If this configuration\n parameter is defined, it will override the command line argument.\n\n- **`erl_epmd_node_listen_port = integer()`{: #erl_epmd_node_listen_port }** - Configures the port used by `m:erl_epmd`\n to listen for connection and connect to other nodes. If this flag is set, the\n Erlang VM will boot in distributed mode even if EPMD is not available. If not\n set, a port is chosen automatically (equivalent to port `0`). See `m:erl_epmd`\n for more details.\n\n The now deprecated command line argument\n [`erl_epmd_port `](`e:erts:erl_cmd.md#erl_epmd_port`) has the same\n effect as the `erl_epmd_node_listen_port` configuration parameter. If this\n configuration parameter is defined, it will override the command line argument.\n\n- **`permissions = [Perm]`{: #permissions }** - Specifies the default permission\n for applications when they are started. In this parameter:\n\n - `Perm = {ApplName,Bool}`\n - `ApplName = atom()`\n - `Bool = boolean()`\n\n Permissions are described in `application:permit/2`.\n\n- **`logger = [Config]`{: #logger }** - Specifies the configuration for\n [Logger](`m:logger`), except the primary log level, which is specified with\n [`logger_level`](kernel_app.md#logger_level), and the compatibility with\n [SASL Error Logging](`e:sasl:error_logging.md`), which is specified with\n [`logger_sasl_compatible`](kernel_app.md#logger_sasl_compatible).\n\n The `logger `parameter is described in section\n [Logging](logger_chapter.md#logger_parameter) in the Kernel User's Guide.\n\n- **`logger_level = Level`{: #logger_level }** - Specifies the primary log level\n for Logger. Log events with the same, or a more severe level, pass through the\n primary log level check. See section [Logging](logger_chapter.md) in the\n Kernel User's Guide for more information about Logger and log levels.\n\n `Level = emergency | alert | critical | error | warning | notice | info | debug | all | none`\n\n To change the primary log level at runtime, use\n [`logger:set_primary_config(level, Level)`](`logger:set_primary_config/2`).\n\n Defaults to `notice`.\n\n- **`logger_metadata = Metadata`{: #logger_metadata }** - Specifies primary\n metadata for log events.\n\n `Metadata = map()`\n\n Defaults to `#{}`.\n\n- **`logger_sasl_compatible = true | false`{: #logger_sasl_compatible }** -\n Specifies if Logger behaves backwards compatible with the SASL error logging\n functionality from releases prior to Erlang/OTP 21.0.\n\n If this parameter is set to `true`, the default Logger handler does not log\n any progress-, crash-, or supervisor reports. If the SASL application is then\n started, it adds a Logger handler named `sasl`, which logs these events\n according to values of the SASL configuration parameter `sasl_error_logger`\n and `sasl_errlog_type`.\n\n See section\n [Deprecated Error Logger Event Handlers and Configuration](`e:sasl:sasl_app.md#deprecated_error_logger_config`)\n in the sasl(6) manual page for information about the SASL configuration\n parameters.\n\n See section [SASL Error Logging](`e:sasl:error_logging.md`) in the SASL User's\n Guide, and section\n [Backwards Compatibility with error_logger](logger_chapter.md#backwards-compatibility-with-error_logger)\n in the Kernel User's Guide for information about the SASL error logging\n functionality, and how Logger can be backwards compatible with this.\n\n Defaults to `false`.\n\n > #### Note {: .info }\n >\n > If this parameter is set to `true`, `sasl_errlog_type` indicates that\n > progress reports shall be logged, and the configured primary log level is\n > `notice` or more severe, then SASL automatically sets the primary log level\n > to `info`. That is, this setting can potentially overwrite the value of the\n > Kernel configuration parameter `logger_level`. This is to allow progress\n > reports, which have log level `info`, to be forwarded to the handlers.\n\n- **`global_groups = [GroupTuple]`{: #global_groups }** - Defines global groups,\n see `m:global_group`. In this parameter:\n\n - `GroupTuple = {GroupName, [Node]} | {GroupName, PublishType, [Node]}`\n - `GroupName = atom()`\n - `PublishType = normal | hidden`\n - `Node = node()`\n\n- **`inet_default_connect_options = [{Opt, Val}]`{: #inet_default_connect_options }** - Specifies default options for `connect`\n sockets, see `m:inet`.\n\n- **`inet_default_listen_options = [{Opt, Val}]`{: #inet_default_listen_options\n }** - Specifies default options for `listen` (and `accept`) sockets, see\n `m:inet`.\n\n- **`inet_dist_use_interface = ip_address()`{: #inet_dist_use_interface }** - If\n the host of an Erlang node has many network interfaces, this parameter\n specifies which one to listen on. For the type definition of `ip_address()`,\n see `m:inet`.\n\n- **`inet_dist_listen_min = First`{: #inet_dist_listen } \n `inet_dist_listen_max = Last`** \n Defines the `First..Last` port range for the listener socket of a distributed\n Erlang node.\n\n- **`inet_dist_listen_options = Opts`{: #inet_dist_listen_options }** - Defines\n a list of extra socket options to be used when opening the listening socket\n for a distributed Erlang node. See `gen_tcp:listen/2`.\n\n- **`inet_dist_connect_options = Opts`{: #inet_dist_connect_options }** -\n Defines a list of extra socket options to be used when connecting to other\n distributed Erlang nodes. See `gen_tcp:connect/4`.\n\n- **`inet_parse_error_log = silent`{: #inet_parse_error_log }** - If set, no log\n events are issued when erroneous lines are found and skipped in the various\n Inet configuration files.\n\n- **`inetrc = Filename`{: #inetrc }** - The name (string) of an Inet user\n configuration file. For details, see section\n [`Inet Configuration`](`e:erts:inet_cfg.md`) in the ERTS User's Guide.\n\n- **`net_setuptime = SetupTime`{: #net_setuptime }** -\n `SetupTime` must be a positive integer or floating point number, and is\n interpreted as the maximum allowed time for each network operation during\n connection setup to another Erlang node. The maximum allowed value is `120`.\n If higher values are specified, `120` is used. Default is 7 seconds if the\n variable is not specified, or if the value is incorrect (for example, not a\n number).\n\n Notice that this value does not limit the total connection setup time, but\n rather each individual network operation during the connection setup and\n handshake.\n\n- **`net_ticker_spawn_options = Opts`{: #net_ticker_spawn_options }** - Defines\n a list of extra spawn options for net ticker processes. There exist one such\n process for each connection to another node. A net ticker process is\n responsible for supervising the connection it is associated with. These\n processes also execute the distribution handshake protocol when setting up\n connections. When there is a large number of distribution connections, setting\n up garbage collection options can be helpful to reduce memory usage. Default\n is `[link, {priority, max}]`, and these two options cannot be changed. The\n `monitor` and `{monitor, MonitorOpts}` options are not allowed and will be\n dropped if present. See the documentation of the `erlang:spawn_opt/4` BIF for\n information about valid options. If the `Opts` list is not a proper list, or\n containing invalid options the setup of connections will fail.\n\n Note that the behavior described above is only true if the distribution\n carrier protocol used is implemented as described in\n [ERTS User's Guide ➜ How to implement an Alternative Carrier for the Erlang Distribution ➜ Distribution Module](`e:erts:alt_dist.md#distribution-module`)\n without further alterations. The implementer of the distribution carrier\n protocol used, may have chosen to ignore the `net_ticker_spawn_options`\n parameter or altered its behavior. Currently all distribution modules shipped\n with OTP do, however, behave as described above.\n\n- **`net_tickintensity = NetTickIntensity`{: #net_tickintensity }** - _Net tick\n intensity_ specifies how many ticks to send during a\n [net tick time](kernel_app.md#net_ticktime) period when no other data is sent\n over a connection to another node. This also determines how often to check for\n data from the other node. The higher net tick intensity, the closer to the\n chosen net tick time period the node will detect an unresponsive node. The net\n tick intensity defaults to `4`. The value of `NetTickIntensity` should be an\n integer in the range `4..1000`. If the `NetTickIntensity` is not an integer or\n an integer less than `4`, `4` will silently be used. If `NetTickIntensity` is\n an integer larger than `1000`, `1000` will silently be used.\n\n > #### Note {: .info }\n >\n > Note that all communicating nodes are expected to use the same _net tick\n > intensity_ as well as the same _net tick time_.\n\n > #### Warning {: .warning }\n >\n > Be careful not to set a too high net tick intensity, since you can overwhelm\n > the node with work if it is set too high.\n\n- **`net_ticktime = NetTickTime`{: #net_ticktime }** - Specifies the _net tick\n time_ in seconds. This is the approximate time a connected node may be\n unresponsive until it is considered down and thereby disconnected.\n\n Net tick time together with\n [net tick intensity](kernel_app.md#net_tickintensity) determines an interval\n `TickInterval = NetTickTime/NetTickIntensity`. Once every `TickInterval`\n seconds, each connected node is ticked if nothing has been sent to it during\n that last `TickInterval` seconds. A tick is a small package sent on the\n connection. A connected node is considered to be down if no ticks or payload\n packages have been received during the last `NetTickIntensity` number of\n `TickInterval` seconds intervals. This ensures that nodes that are not\n responding, for reasons such as hardware errors, are considered to be down.\n\n As the availability is only checked every `TickInterval` seconds, the actual\n time `T` a node have been unresponsive when detected may vary between `MinT`\n and `MaxT`, where:\n\n ```c\n MinT = NetTickTime - NetTickTime / NetTickIntensity\n MaxT = NetTickTime + NetTickTime / NetTickIntensity\n ```\n\n `NetTickTime` defaults to `60` seconds and `NetTickIntensity` defaults to `4`.\n Thus, `45 #### Note {: .info }\n >\n > Notice that _all_ communicating nodes are to have the _same_ `NetTickTime`\n > and `NetTickIntensity` values specified, as it determines both the frequency\n > of outgoing ticks and the expected frequency of incominging ticks.\n\n `NetTickTime` needs to be a multiple of `NetTickIntensity`. If the configured\n values are not, `NetTickTime` will internally be rounded up to the nearest\n millisecond.\n [`net_kernel:get_net_ticktime()`](`net_kernel:get_net_ticktime/0`) will,\n however, report net tick time truncated to the nearest second.\n\n Normally, a terminating node is detected immediately by the transport protocol\n (like TCP/IP).\n\n- **`prevent_overlapping_partitions = true | false`{:\n #prevent_overlapping_partitions }** - If enabled (`true`), `global` will\n actively prevent overlapping partitions from forming when connections are lost\n between nodes. This fix is enabled by default. If you are about to disable\n this fix, make sure to read the\n [`global`](`m:global#prevent_overlapping_partitions`) documentation about this\n fix for more important information about this.\n\n- **`shutdown_timeout = integer() | infinity`{: #shutdown_timeout }** -\n Specifies the time `application_controller` waits for an application to\n terminate during node shutdown. If the timer expires, `application_controller`\n brutally kills `application_master` of the hanging application. If this\n parameter is undefined, it defaults to `infinity`.\n\n- **`sync_nodes_mandatory = [NodeName]`{: #sync_nodes_mandatory }** - Specifies\n which other nodes that _must_ be alive for this node to start properly. If\n some node in the list does not start within the specified time, this node does\n not start either. If this parameter is undefined, it defaults to `[]`.\n\n- **`sync_nodes_optional = [NodeName]`{: #sync_nodes_optional }** - Specifies\n which other nodes that _can_ be alive for this node to start properly. If some\n node in this list does not start within the specified time, this node starts\n anyway. If this parameter is undefined, it defaults to the empty list.\n\n- **`sync_nodes_timeout = integer() | infinity`{: #sync_nodes_timeout }** -\n Specifies the time (in milliseconds) that this node waits for the mandatory\n and optional nodes to start. If this parameter is undefined, no node\n synchronization is performed. This option ensures that `global` is\n synchronized.\n\n- **`start_distribution = true | false`{: #start_distribution }** - Starts all\n distribution services, such as `rpc`, `global`, and `net_kernel` if the\n parameter is `true`. This parameter is to be set to `false` for systems who\n want to disable all distribution functionality.\n\n Defaults to `true`.\n\n- **`start_dist_ac = true | false`{: #start_dist_ac }** - Starts the `dist_ac`\n server if the parameter is `true`. This parameter is to be set to `true` for\n systems using distributed applications.\n\n Defaults to `false`. If this parameter is undefined, the server is started if\n parameter `distributed` is set.\n\n- **`start_boot_server = true | false`{: #start_boot_server }** - Starts the\n `boot_server` if the parameter is `true` (see `m:erl_boot_server`). This\n parameter is to be set to `true` in an embedded system using this service.\n\n Defaults to `false`.\n\n- **`boot_server_slaves = [SlaveIP]`{: #boot_server_slaves }** - If\n configuration parameter `start_boot_server` is `true`, this parameter can be\n used to initialize `boot_server` with a list of slave IP addresses:\n\n `SlaveIP = string() | atom | {integer(),integer(),integer(),integer()}`,\n\n where `0 <= integer() <=255`.\n\n Examples of `SlaveIP` in atom, string, and tuple form:\n\n `'150.236.16.70', \"150,236,16,70\", {150,236,16,70}`.\n\n Defaults to `[]`.\n\n- **`start_disk_log = true | false`{: #start_disk_log }** - Starts the\n `disk_log_server` if the parameter is `true` (see `m:disk_log`). This\n parameter is to be set to `true` in an embedded system using this service.\n\n Defaults to `false`.\n\n- **`start_pg = true | false`{: #start_pg }** - Starts the\n default `pg` scope server (see `m:pg`) if the parameter is `true`. This\n parameter is to be set to `true` in an embedded system that uses this service.\n\n Defaults to `false`.\n\n- **`start_timer = true | false`{: #start_timer }** - Starts the `timer_server`\n if the parameter is `true` (see `m:timer`). This parameter is to be set to\n `true` in an embedded system using this service.\n\n Defaults to `false`.\n\n- **`shell_history = enabled | disabled | module()`{: #shell_history }** -\n Specifies whether shell history should be logged to disk between usages of\n `erl` (`enabled`), not logged at all (`disabled`), or a user-specified module\n will be used to log shell history. This module should export\n `load() -> [string()]` returning a list of strings to load in the shell when\n it starts, and `add(iodata()) -> ok.` called every time new line is entered in\n the shell. By default logging is disabled.\n\n- **`shell_history_drop = [string()]`{: #shell_history_drop }** - Specific log\n lines that should not be persisted. For example `[\"q().\", \"init:stop().\"]`\n will allow to ignore commands that shut the node down. Defaults to `[]`.\n\n- **`shell_history_file_bytes = integer()`{: #shell_history_file_bytes }** - How\n many bytes the shell should remember. By default, the value is set to 512kb,\n and the minimal value is 50kb.\n\n- **`shell_history_path = string()`{: #shell_history_path }** - Specifies where\n the shell history files will be stored. defaults to the user's cache directory\n as returned by `filename:basedir(user_cache, \"erlang-history\")`.\n\n- **`shutdown_func = {Mod :: atom(), Func :: atom()}`{: #shutdown_func }** -\n Sets a function that `application_controller` calls when it starts to\n terminate. The function is called as `Mod:Func(Reason)`, where `Reason` is the\n terminate reason for `application_controller`, and it must return as soon as\n possible for `application_controller` to terminate properly.\n\n- **`source_search_rules = [DirRule] | [SuffixRule]`{: #source_search_rules }**\n\n Where:\n\n - `DirRule = {ObjDirSuffix,SrcDirSuffix}`\n - `SuffixRule = {ObjSuffix,SrcSuffix,[DirRule]}`\n - `ObjDirSuffix = string()`\n - `SrcDirSuffix = string()`\n - `ObjSuffix = string()`\n - `SrcSuffix = string()`\n\n Specifies a list of rules for use by `filelib:find_file/2`\n `filelib:find_source/2` If this is set to some other value than the empty\n list, it replaces the default rules. Rules can be simple pairs of directory\n suffixes, such as `{\"ebin\", \"src\"}`, which are used by `filelib:find_file/2`,\n or triples specifying separate directory suffix rules depending on file name\n extensions, for example `[{\".beam\", \".erl\", [{\"ebin\", \"src\"}]}`, which are\n used by `filelib:find_source/2`. Both kinds of rules can be mixed in the list.\n\n The interpretation of `ObjDirSuffix` and `SrcDirSuffix` is as follows: if the\n end of the directory name where an object is located matches `ObjDirSuffix`,\n then the name created by replacing `ObjDirSuffix` with `SrcDirSuffix` is\n expanded by calling `filelib:wildcard/1`, and the first regular file found\n among the matches is the source file.\n\n- **`standard_io_encoding = Encoding`{: #standard_io_encoding }** - Set whether\n bytes sent or received via standard_io should be interpreted as unicode or\n latin1. By default input and output is interpreted as Unicode if it is\n supported on the host. With this flag you may configure the encoding on\n startup.\n\n This works similarly to\n [`io:setopts(standard_io, {encoding, Encoding})`](`io:setopts/2`) but is\n applied before any bytes on standard_io may have been read.\n\n Encoding is one of:\n\n - **`unicode`** - Configure standard_io to use unicode mode.\n\n - **`latin1`** - Configure standard_io to use latin1 mode.\n\n - **`_`** - Anything other than unicode or latin1 will be ignored and the\n system will configure the encoding by itself, typically unicode on modern\n systems.\n\n See\n [Escripts and non-interactive I/O in Unicode Usage in Erlang](`e:stdlib:unicode_usage.md#escripts-and-non-interactive-i-o`)\n for more details.\n\n- **`os_cmd_shell = string()`{: #os_cmd_shell }** - Specifies which shell to\n use when invoking system commands via `os:cmd/2`. By default the shell is detected\n automatically.","ref":"kernel_app.html#configuration"},{"type":"extras","title":"Deprecated Configuration Parameters - Kernel Application","doc":"In Erlang/OTP 21.0, a new API for logging was added. The old `error_logger`\nevent manager, and event handlers running on this manager, still work, but they\nare no longer used by default.\n\nThe following application configuration parameters can still be set, but they\nare only used if the corresponding configuration parameters for Logger are not\nset.\n\n- **`error_logger`** - Replaced by setting the [`type`](`m:logger_std_h#type`),\n and possibly [`file`](`m:logger_std_h#file`) and\n [`modes`](`m:logger_std_h#modes`) parameters of the default `logger_std_h`\n handler. Example:\n\n ```text\n erl -kernel logger '[{handler,default,logger_std_h,#{config=>#{file=>\"/tmp/erlang.log\"}}}]'\n ```\n\n- **`error_logger_format_depth`**{: #error_logger_format_depth } - Replaced by setting the\n [`depth`](`m:logger_formatter#depth`) parameter of the default handlers\n formatter. Example:\n\n ```text\n erl -kernel logger '[{handler,default,logger_std_h,#{formatter=>{logger_formatter,#{legacy_header=>true,template=>[{logger_formatter,header},\"\\n\",msg,\"\\n\"],depth=>10}}}]'\n ```\n\nSee [Backwards compatibility with error_logger](logger_chapter.md#backwards-compatibility-with-error_logger)\nfor more information.","ref":"kernel_app.html#deprecated-configuration-parameters"},{"type":"extras","title":"Kernel Release Notes","doc":"\n# Kernel Release Notes\n\nThis document describes the changes made to the Kernel application.","ref":"notes.html"},{"type":"extras","title":"Kernel 10.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-10-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- `gen_sctp:peeloff/2` has been fixed to inherit socket options to the peeled off socket more like `gen_tcp:accept/1`, for example the options `tos` or `tclass`.\n \n When setting SCTP options that are unsupported on the platform, some should be silently ignored, but a bug caused the option parsing to derail so the options after could bail out and cause an error instead. This has been fixed.\n\n Own Id: OTP-19225 Aux Id: [PR-8789]\n\n- Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.\n\n Own Id: OTP-19260 Aux Id: [PR-8884]\n\n- [`inet:getifaddrs/0,1`](`inet:getifaddrs/1`) is improved when using\n inet_backend = socket.\n\n Own Id: OTP-19264\n\n- Fixed `t:logger:report/0` to mandate at least one element in the report. This fixes an issue with overlapping `spec` domains in all `m:logger` functions that use `t:logger:report/0`.\n\n Own Id: OTP-19302 Aux Id: [PR-8959]\n\n- Fixed deadlock on `code_server`. Multiple calls loading the same module with an `on_load` function loading call would create a deadlock.\n\n Own Id: OTP-19305 Aux Id: [PR-8744], [GH-7466], [GH-8510]\n\n[PR-8789]: https://github.com/erlang/otp/pull/8789\n[PR-8884]: https://github.com/erlang/otp/pull/8884\n[PR-8959]: https://github.com/erlang/otp/pull/8959\n[PR-8744]: https://github.com/erlang/otp/pull/8744\n[GH-7466]: https://github.com/erlang/otp/issues/7466\n[GH-8510]: https://github.com/erlang/otp/issues/8510","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The Kernel application now recognizes the `epmd_module` and `erl_epmd_listen_port` parameters, similar to `-kernel:connect_all`.\n\n Own Id: OTP-19253 Aux Id: [PR-8671]\n\n- The `inetrc` kernel argument will now tolerate atoms again to improve compatibility with old configurations that relied on atoms working by accident.\n \n The expected type always was, and still remains, a string.\n\n Own Id: OTP-19280 Aux Id: [GH-8899], [PR-8902]\n\n- The `t:file:io_device/0` type has been updated to clearly show the difference between a `raw` and `cooked` IoDevice.\n\n Own Id: OTP-19301 Aux Id: [PR-8956]\n\n- Erlang/OTP type specifications has been updated to eliminate overlapping domains.\n\n Own Id: OTP-19310 Aux Id: [GH-8810], [GH-8821], [PR-8986]\n\n- Added the kernel parameter [`os_cmd_shell`](kernel_app.md#os_cmd_shell) that controls which shell should be used by `os:cmd/1`.\n\n Own Id: OTP-19342 Aux Id: [PR-8972]\n\n- Added logging support to `t:io:user/0`, `t:io:standard_io/0` and `t:io:standard_error/0`. See `io:setopts/2` for more details.\n\n Own Id: OTP-19372 Aux Id: [PR-8947]\n\n[PR-8671]: https://github.com/erlang/otp/pull/8671\n[GH-8899]: https://github.com/erlang/otp/issues/8899\n[PR-8902]: https://github.com/erlang/otp/pull/8902\n[PR-8956]: https://github.com/erlang/otp/pull/8956\n[GH-8810]: https://github.com/erlang/otp/issues/8810\n[GH-8821]: https://github.com/erlang/otp/issues/8821\n[PR-8986]: https://github.com/erlang/otp/pull/8986\n[PR-8972]: https://github.com/erlang/otp/pull/8972\n[PR-8947]: https://github.com/erlang/otp/pull/8947","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 10.1.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-10-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- On windows the socket:recv could return with success ({ok, Data}) even though not all data had been read.\n\n Own Id: OTP-19328\n\n- gen_udp:send on domain local can leak inet_reply messages.\n\n Own Id: OTP-19332 Aux Id: [#8989]\n\n- Failure to create an UDP IPv6 socket when inet_backend = socket with certain IPv6 socket options.\n\n Own Id: OTP-19357\n\n- net:getifaddrs does not properly report the running flag on windows.\n\n Own Id: OTP-19366 Aux Id: OTP-19061, ERIERL-1134\n\n[#8989]: https://github.com/erlang/otp/issues/8989","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 10.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-10-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug has been fixed where receiving an SCTP message with `gen_sctp` could waste the first fragments of a message and only deliver the last fragment.\n \n This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.\n \n A bug has been fixed with a lingering time-out from after an SCTP connect that could stop the flow of incoming messages on an active `gen_tcp` socket.\n\n Own Id: OTP-19235 Aux Id: ERIERL-1133, [PR-8837]\n\n- An boolean option `non_block_send` for SCTP, has ben added to be able to achieve the old behaviour to avoid blocking send operations by passing the OS network stack error message (`{error,eagain}` through.\n\n Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134\n\n[PR-8837]: https://github.com/erlang/otp/pull/8837","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 10.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-10-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A faulty assertion was corrected in the `prim_tty` module. This assertion could trigger when invalid UTF-8 was read from stdin just as the mode was changed from unicode to latin1.\n\n Own Id: OTP-19097 Aux Id: [PR-8503]\n\n- Opening a `disk_log` file and combining `head_func` with `rotate` options did not work.\n\n Own Id: OTP-19104 Aux Id: ERIERL-870\n\n- Fixed an error info printout for `erlang:is_process_alive/1` on non-local pids.\n\n Own Id: OTP-19134 Aux Id: [PR-8560]\n\n- A race in the kTLS flavour of SSL distribution has been fixed so that `inet_drv.c` doesn't read ahead too much data, which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the `inet_drv.c` buffer as unencrypted.\n\n Own Id: OTP-19175 Aux Id: [GH-8561], [PR-8690]\n\n- Fixed a deadlock when an application crashes during startup and log messages were sent to standard out. Logger would fail to print the messages to standard out and instead print them to standard error.\n\n Own Id: OTP-19205\n\n- The `-proto_dist` init parameter will no longer be ignored when specified multiple times. It will now log a warning and use the first specified value.\n\n Own Id: OTP-19208 Aux Id: [PR-8672]\n\n- Corrected socket:ioctl for genaddr (SIOCGENADDR).\n\n Own Id: OTP-19216\n\n[PR-8503]: https://github.com/erlang/otp/pull/8503\n[PR-8560]: https://github.com/erlang/otp/pull/8560\n[GH-8561]: https://github.com/erlang/otp/issues/8561\n[PR-8690]: https://github.com/erlang/otp/pull/8690\n[PR-8672]: https://github.com/erlang/otp/pull/8672","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Added functions `getservbyname` and `getservbyport` to the `net` module.\n\n Own Id: OTP-19101 Aux Id: OTP-18835\n\n- Introduced enet | esock variants of `m:inet` functions, either when called with sockets,\n with explicit inet_backend config or with the e inet_backend kernel config option.\n\n Own Id: OTP-19132 Aux Id: OTP-19101\n\n- The function `socket:i/0` now uses the `m:net` module (instead of the `m:inet` module) for service translation.\n\n Own Id: OTP-19138 Aux Id: OTP-19101\n\n- A boolean option `read_ahead` has been implemented for `gen_tcp`, default `true`, to facilitate not reading past (caching data) the end of a packet. In particular, for kTLS, caching data could read in data that was supposed to be decrypted by the platform's network stack, before crypto parameters could be activated.\n\n Own Id: OTP-19199 Aux Id: OTP-19175, [GH-8561], [GH-8690], [GH-8785]\n\n[GH-8561]: https://github.com/erlang/otp/issues/8561\n[GH-8690]: https://github.com/erlang/otp/issues/8690\n[GH-8785]: https://github.com/erlang/otp/issues/8785","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 10.0.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-10-0-1"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Polish the `m:logger` documentation.\n\n Own Id: OTP-19118 Aux Id: [PR-8534]\n\n[PR-8534]: https://github.com/erlang/otp/pull/8534","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 10.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-10-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed a crash when calling `file:delete/2` with an empty option list.\n\n Own Id: OTP-18590 Aux Id: [PR-7220]\n\n- New functions have been added to the undocumented module `m:inet_dns` that take a flag to specify if encode/decode is for mDNS. This affects how CLASS values in the private range, with the top bit set, are handled.\n\n Own Id: OTP-18878 Aux Id: [GH-7718], OTP-17734\n\n- The error information for `erlang:phash/2` has been corrected.\n\n Own Id: OTP-18904 Aux Id: [PR-7960]\n\n- `get_until` requests using the I/O protocol now correctly return a binary or list when `eof` is the last item returned by the callback.\n\n Own Id: OTP-18930 Aux Id: [PR-7993], [GH-4992]\n\n- Calling `logger:add_handlers/1` with config option now works.\n\n Own Id: OTP-18954 Aux Id: [GH-8061], [PR-8076]\n\n- The `code:del_path/1` function now also works on paths added through `-pa`, `-pz` , `-path` and the boot script.\n\n Own Id: OTP-18959 Aux Id: [GH-6692], [PR-7697]\n\n- A call to `socket:[recv|recvfrom|recvmsg]/*` with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.\n\n Own Id: OTP-19063 Aux Id: OTP-18835\n\n- Improve heuristic for when a characters is wide in the shell for systems with old libc versions.\n\n Own Id: OTP-19087 Aux Id: [PR-8382]\n\n- Fix reading a line when reading from `t:io:user/0` to not consider `\\r` without `\\n` to be a new line when `erl` is started with `-noshell`.\n\n Own Id: OTP-19088 Aux Id: [PR-8396], [GH-8360]\n\n[PR-7220]: https://github.com/erlang/otp/pull/7220\n[GH-7718]: https://github.com/erlang/otp/issues/7718\n[PR-7960]: https://github.com/erlang/otp/pull/7960\n[PR-7993]: https://github.com/erlang/otp/pull/7993\n[GH-4992]: https://github.com/erlang/otp/issues/4992\n[GH-8061]: https://github.com/erlang/otp/issues/8061\n[PR-8076]: https://github.com/erlang/otp/pull/8076\n[GH-6692]: https://github.com/erlang/otp/issues/6692\n[PR-7697]: https://github.com/erlang/otp/pull/7697\n[PR-8382]: https://github.com/erlang/otp/pull/8382\n[PR-8396]: https://github.com/erlang/otp/pull/8396\n[GH-8360]: https://github.com/erlang/otp/issues/8360","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Added `file:read_file/2` with a `raw` option for reading files without going through the file server.\n\n Own Id: OTP-18589 Aux Id: [PR-7220]\n\n- The undocumented Erlang DNS resolver library (`inet_dns` and `inet_res`) has been augmented to handle IXFR, NOTIFY, UPDATE and TSIG records. With this some bug fixes and code cleanup has been done, and the resolver used in the test suite has been changed to Knot DNS. See the source code. \n \n Kudos to Alexander Clouter that did almost all the work!\n\n Own Id: OTP-18713 Aux Id: [PR-6985], [GH-6985]\n\n- The `ebin` directories for escripts are now cached.\n\n Own Id: OTP-18778 Aux Id: [PR-7556]\n\n- `-callback` attributes haven been added to `m:application`, `m:logger_handler`, and `m:logger_formatter`.\n\n Own Id: OTP-18795 Aux Id: [PR-7703]\n\n- Progress reports from before logger is started are now logged when log level is set to debug.\n\n Own Id: OTP-18807 Aux Id: [PR-7732] ERIERL-985\n\n- The `code:where_is_file/2` and\n `code:which/1` functions now check for existence of the file directly instead of listing the content of each directory in the code path.\n\n Own Id: OTP-18816 Aux Id: [PR-7711]\n\n- Type specs has been added to the [`logger:Level/1,2,3`](`m:logger`) functions.\n\n Own Id: OTP-18820 Aux Id: [PR-7779]\n\n- For `inet_backend = socket`, setting the `active` socket option alone, to `once`, `true` or `N` has been optimized, as well as the corresponding data delivery.\n\n Own Id: OTP-18835\n\n- New functions `socket:sendv/*` for sending I/O vectors have been added.\n\n Own Id: OTP-18845\n\n- The shell now pages long output from the documentation help command ([`h(Module)`](`c:h/1`)), auto completions and the search command.\n\n Own Id: OTP-18846 Aux Id: [PR-7845]\n\n- Native coverage support has been implemented in the JIT. It will automatically be used by the `m:cover` tool to reduce the execution overhead when running cover-compiled code.\n \n There are also new APIs to support native coverage without using the `cover` tool.\n \n To instrument code for native coverage it must be compiled with the [`line_coverage`](`m:compile#line_coverage`) option.\n \n To enable native coverage in the runtime system, start it like so:\n \n ```text\n $ erl +JPcover true\n ```\n \n There are also the following new functions for supporting native coverage:\n \n * `code:coverage_support/0`\n * `code:get_coverage/2`\n * `code:reset_coverage/1`\n * `code:get_coverage_mode/0`\n * `code:get_coverage_mode/1`\n * `code:set_coverage_mode/1`\n\n Own Id: OTP-18856 Aux Id: [PR-7856]\n\n- Optimized code loading by moving certain operations from the code server to the caller.\n\n Own Id: OTP-18941 Aux Id: [PR-7981]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- Application startup has been optimized by removing an intermediary process.\n\n Own Id: OTP-18963 Aux Id: [PR-8042]\n\n- The existing experimental support for archive files will be changed in a future release. The support for having an archive in an escript will remain, but the support for using archives in a release will either become more limited or completely removed.\n \n As of Erlang/OTP 27, the function `code:lib_dir/2`, the `-code_path_choice` flag, and using `m:erl_prim_loader` for reading members of an archive are deprecated.\n \n To remain compatible with future version of Erlang/OTP `escript` scripts that need to retrieve data files from its archive should use `escript:extract/2` instead of `erl_prim_loader` and `code:lib_dir/2`.\n\n *** POTENTIAL INCOMPATIBILITY ***\n\n Own Id: OTP-18966 Aux Id: [PR-8091]\n\n- The undocumented and deprecated `file:pid2name` function has been removed.\n\n Own Id: OTP-18967 Aux Id: [PR-8092]\n\n- There is a new module `m:trace` in Kernel providing the same trace functionality as `erlang:trace/3` and `erlang:trace_pattern/3`, but with the addition of **dynamic isolated trace sessions**.\n\n Own Id: OTP-18980\n\n- Error logging has been improved when the `t:io:standard_io/0` reader and/or writer terminates with an error.\n\n Own Id: OTP-18989 Aux Id: [PR-8103]\n\n- `inet_backend = socket` has been optimized and reworked to be more compatible with the original `inet_backend = inet`.\n\n Own Id: OTP-19004 Aux Id: OTP-18835\n\n- Add an simple example (echo server) )to the socket users guide.\n\n Own Id: OTP-19042\n\n- `inet:i/0,1,2` has been improved to allow port numbers to be shown explicitly.\n\n Own Id: OTP-19053 Aux Id: [#6724]\n\n- The `socket` documentation has been reworked, and due to\n that a few details were fixed:\n * `socket:is_supported/1` now returns `true` for example for `protocols`\n that is a \"category\", not an item.\n * `socket:cancel_monitor/1` no longer badargs for a monitor that was set by\n another process, instead it returns `false` as for other unknown\n `reference()`s.\n\n Own Id: OTP-19054\n\n- Add `stdin`, `stdout` and `stderr` keys to `io:getopts/1` on `t:io:standard_io/0` to indicate if the respective I/O device is backed by a terminal.\n\n Own Id: OTP-19089 Aux Id: [PR-8396]\n\n[PR-7220]: https://github.com/erlang/otp/pull/7220\n[PR-6985]: https://github.com/erlang/otp/pull/6985\n[GH-6985]: https://github.com/erlang/otp/issues/6985\n[PR-7556]: https://github.com/erlang/otp/pull/7556\n[PR-7703]: https://github.com/erlang/otp/pull/7703\n[PR-7732]: https://github.com/erlang/otp/pull/7732\n[PR-7711]: https://github.com/erlang/otp/pull/7711\n[PR-7779]: https://github.com/erlang/otp/pull/7779\n[PR-7845]: https://github.com/erlang/otp/pull/7845\n[PR-7856]: https://github.com/erlang/otp/pull/7856\n[PR-7981]: https://github.com/erlang/otp/pull/7981\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8042]: https://github.com/erlang/otp/pull/8042\n[PR-8091]: https://github.com/erlang/otp/pull/8091\n[PR-8092]: https://github.com/erlang/otp/pull/8092\n[PR-8103]: https://github.com/erlang/otp/pull/8103\n[#6724]: https://github.com/erlang/otp/issues/6724\n[PR-8396]: https://github.com/erlang/otp/pull/8396","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 9.2.4.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-4-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* gen_udp:send on domain local can leak inet_reply messages.\n\n Own Id: OTP-19332 Aux Id: #8989\n* Failure to create an UDP IPv6 socket when inet_backend = socket with certain IPv6 socket options.\n\n Own Id: OTP-19357\n* net:getifaddrs does not properly report the running flag on windows.\n\n Own Id: OTP-19366 Aux Id: OTP-19061, ERIERL-1134","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2.4.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-4-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* A bug has been fixed where receiving an SCTP message with \\`gen_sctp\\` could waste the first fragments of a message and only deliver the last fragment.\n\n This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.\n\n A bug has been fixed with a lingering time-out from after an SCTP connect that could stop the flow of incoming messages on an active \\`gen_tcp\\` socket.\n\n Own Id: OTP-19235 Aux Id: ERIERL-1133, PR-8837\n* An boolean option \\`non_block_send\\` for SCTP, has ben added to be able to achieve the old behaviour to avoid blocking send operations by passing the OS network stack error message (\\`\\{error,eagain\\}\\` through.\n\n Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2.4.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* A race in the kTLS flavour of SSL distribution has been fixed so inet_drv.c doesn't read ahead too much data which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.\n\n Own Id: OTP-19175 Aux Id: GH-8561, PR-8690\n* Fix a deadlock when an application crashes during startup and log messages were sent to standard out. Logger would fail to print the messages to standard out and instead print them to standard error.\n\n Own Id: OTP-19205\n* Add the stdlib application parameters `shell_redraw_prompt_on_output` which when set to `false` disables redrawing of the shell prompt if any other output is done.\n\n Own Id: OTP-19213 Aux Id: PR-8763 ERIERL-1108","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2.4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* A call to socket:\\[recv|recvfrom|recvmsg]/* with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.\n\n Own Id: OTP-19063 Aux Id: OTP-18835\n* Open a `disk_log` file and combining `head_func` with `rotate` options did not work.\n\n Own Id: OTP-19104 Aux Id: ERIERL-870","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* Fix the shell Job Control Mode to not crash when typing `TAB` or `CTRL+R`.\n\n Own Id: OTP-19072 Aux Id: PR-8391\n* Fix calls to blocking `m:application` APIs to throw an exception with reason `terminating` if called when the system is terminating.\n\n This is done in order to avoid deadlocks during shutdown or restart.\n\n Own Id: OTP-19078 Aux Id: PR-8422","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* When using IPv6, classic gen_udp failed to add (group) membership (drop was used instead).\n\n Own Id: OTP-19049 Aux Id: #8176\n* The check in inet_res of the RD bit has been relaxed slightly.\n\n Own Id: OTP-19056 Aux Id: PR-8312, OTP-17323","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* Fix performance bug when using `io:fread` to read from `standard_io`. This regression was introduced in OTP 26.0.\n\n Own Id: OTP-18910 Aux Id: PR-7933 GH-7924\n* A bug in the code server could cause it to crash in some concurrent scenarios. This bug was introduced in 26.1.\n\n Own Id: OTP-18948 Aux Id: PR-8046\n* Fixed gen_udp:open/2 type spec to include already supported module socket address types.\n\n Own Id: OTP-18990 Aux Id: GH-8158\n* Fix reading of password for ssh client when in `user_interactive` mode.\n\n Own Id: OTP-19007 Aux Id: ERIERL-1049","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* Fix `group` (that is the shell) to properly handle when an `get_until` callback function returned `{done, eof, []}` when an `eof` was detected.\n\n Own Id: OTP-18901","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- For `inet_backend = socket`, an unexpected receive error such as `etimedout`\n caused the receiving state machine server to crash. This bug has now been\n fixed.\n\n Own Id: OTP-18749 Aux Id: GH-7608\n\n- Fix bug where reading using `file` from a unicode enabled `standard_io`,\n `standard_error` or any other `group` backed device would result in incorrect\n values being returned or a crash.\n\n Now instead a no_translation error is returned to the caller when unicode data\n is read using `file`. See\n [Using Unicode](`e:stdlib:unicode_usage.md#escripts-and-non-interactive-i-o`)\n in the STDLIB User's Guide for more details on how to correctly read from\n `standard_io`.\n\n Own Id: OTP-18800 Aux Id: PR-7714 GH-7591\n\n- The native resolver interface module has gotten a rewrite of its ETS table\n handling to minimize term copying, and also to move the handling of client\n time-outs to the clients, which helps the native resolver name server from\n digging itself into a tar pit when heavily loaded.\n\n Own Id: OTP-18812 Aux Id: ERIERL-997\n\n- Replaced unintentional Erlang Public License 1.1 headers in some files with\n the intended Apache License 2.0 header.\n\n Own Id: OTP-18815 Aux Id: PR-7780\n\n- Fix bug in `pg` if a client process both monitored a group/scope and joined a\n group. The termination of such process resulted in crash of the `pg` server\n process.\n\n Own Id: OTP-18833 Aux Id: GH-7625, PR-7659\n\n- Fix crash when using `file:consult` and the underlying file read returns an\n error while reading.\n\n Own Id: OTP-18873 Aux Id: PR-7831\n\n- Corrected gen_tcp_socket listen option handling.\n\n Own Id: OTP-18883 Aux Id: #7764","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add Windows support for DGRAM socket connect.\n\n Own Id: OTP-18762\n\n- Document the, previously opaque, types select_tag() and completion_tag().\n\n Own Id: OTP-18818 Aux Id: #7337","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 9.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed an issue with truncated crash slogans on failed emulator start.\n\n Own Id: OTP-18623 Aux Id: GH-7344\n\n- Fix shell:start_interactive function specification.\n\n Own Id: OTP-18628 Aux Id: GH-7280\n\n- Fix code:get_doc/1 to return missing, when it can't find erts instead of\n crashing.\n\n Own Id: OTP-18654 Aux Id: PR-7404\n\n- Function socket:close/1 could cause a VM crash on Windows.\n\n Own Id: OTP-18669 Aux Id: OTP-18029\n\n- Fix deadlock when `erl.exe` is used as part of a pipe on Windows and trying to\n set the encoding of the `standard_io` device.\n\n Own Id: OTP-18675 Aux Id: PR-7473 GH-7459\n\n- Expanded the documentation about how to use the `standard_io`,\n `standard_error` and `user` I/O devices.\n\n Added the types [`io:standard_io/0`](`t:io:standard_io/0`),\n `io:standard:error/0` and [`io:user/0`](`t:io:user/0`).\n\n Own Id: OTP-18676 Aux Id: PR-7473 GH-7459\n\n- Fix logger's overload protection mechanism to only fetch memory used by\n messages when needed.\n\n Own Id: OTP-18677 Aux Id: PR-7418 GH-7417\n\n- Fixed a number of socket-related issues causing incompatibilities with gen_tcp\n and gen_udp respectively.\n\n Own Id: OTP-18685\n\n- gen_tcp:connect with socket address and socket (inet-) backend fails because\n of missing callback function.\n\n Own Id: OTP-18707 Aux Id: #7530\n\n- The DNS RR cache used by \\`inet_res\\` has been fixed to preserve insert order,\n which is beneficial when the DNS server returns RRs in some specific order for\n e.g load balancing purposes.\n\n Own Id: OTP-18731 Aux Id: GH-7577, PR-7578\n\n- The options \\`reuseport\\`, \\`reuseport_lb\\` and \\`exclusiveaddruse\\` were\n accidentally not allowed for e.g \\`gen_udp:open/1,2\\`, which has now been\n corrected.\n\n Own Id: OTP-18734 Aux Id: OTP-18344, PR-6522, GH-6461, GH-7569\n\n- `gen_udp:recv/*` for Unix Domain Socket in binary mode and passive mode has\n been fixed to not crash.\n\n Own Id: OTP-18747 Aux Id: GH-7605\n\n- Fixed issue where cursor would not be placed at the end of the expression when\n navigating shell history.\n\n Own Id: OTP-18757 Aux Id: PR-7631","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Update gen_tcp_socket and gen_udp_socket to handle 'completion' (socket on\n Windows).\n\n Own Id: OTP-18586 Aux Id: OTP-18029\n\n- Add support for Unix Domain Sockets (only for STREAM sockets) on Windows for\n 'socket'.\n\n Own Id: OTP-18611 Aux Id: OTP-18029, #5024\n\n- Add basic support for socket ioctl on Windows.\n\n Own Id: OTP-18660\n\n- The [`file:location/0`](`t:file:location/0`) type is now exported.\n\n Own Id: OTP-18681\n\n- Add support for (Windows) socket option exclusiveaddruse.\n\n Own Id: OTP-18686\n\n- \\[socket] Add support for the 'nopush' option.\n\n Own Id: OTP-18687\n\n- Add support for socket option 'BSP STATE'.\n\n Own Id: OTP-18693\n\n- Add tcp socket options 'keepcnt', 'keepidle' and 'keepintvl'.\n\n Own Id: OTP-18698\n\n- Add support for misc (Windows) socket options ('max_msg_size' and 'maxdg').\n\n Own Id: OTP-18710\n\n- The keyboard shortcuts for the shell are now configurable.\n\n Own Id: OTP-18754 Aux Id: PR-7604 PR-7647\n\n- Optimized code_server to reduce repeated work when loading the same module\n concurrently.\n\n Own Id: OTP-18755 Aux Id: PR-7503","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 9.0.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-0-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix bug where when you entered Alt+Enter in the terminal, the cursor would\n move to the last line, instead of moving to the next line.\n\n Own Id: OTP-18580 Aux Id: PR-7242\n\n- Fix so that the shell does not crash on startup when termcap is not available.\n\n Own Id: OTP-18624 Aux Id: GH-7296\n\n- Multiple socket:accept calls issue. When making multiple accept calls, only\n the last call is active.\n\n Own Id: OTP-18635 Aux Id: #7328\n\n- Fix the shell to ignore terminal delay when the terminal capabilities report\n that they should be used.\n\n Own Id: OTP-18636 Aux Id: PR-7352 GH-7308\n\n- Fix \"oldshell\" to echo characters while typing on Windows.\n\n Own Id: OTP-18637 Aux Id: PR-7359 GH-7324\n\n- Fix eof handling when reading from stdin when erlang is started using\n `-noshell`.\n\n Own Id: OTP-18640 Aux Id: PR-7384 GH-7368 GH-7286 GH-6881\n\n- On Windows, a call to the function socket:close, when there are waiting active\n calls to read, write or accept functions, could hang.\n\n Own Id: OTP-18646\n\n- Fix issues when reading or configuring `standard_io` on Windows when erl.exe\n is started using `-noshell` flag.\n\n Own Id: OTP-18649 Aux Id: GH-7261 PR-7400\n\n- gen_udp:connect with inet_backend = socket fails when the Address is a\n hostname (string or atom).\n\n Own Id: OTP-18650\n\n- Fixed problem which would cause shell to crash if particular escape sequence\n was written to stdout.\n\n Own Id: OTP-18651 Aux Id: PR-7242\n\n- Fixed problem where output would disappear if it was received after a prompt\n was written in the shell.\n\n Own Id: OTP-18652 Aux Id: PR-7242\n\n- Fix a crash where the location of erts could not be found in rebar3 dev\n builds.\n\n Own Id: OTP-18656 Aux Id: PR-7404 GH-7390\n\n- Introduce the KERNEL application parameter `standard_io_encoding` that can be\n used to set the default encoding for standard_io. This option needs to be set\n to `latin1` if the application wants to treat all input data as bytes rather\n than utf-8 encoded characters.\n\n Own Id: OTP-18657 Aux Id: GH-7230 PR-7384","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.0.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The POSIX error `exdev` was sometimes incorrectly described as \"cross domain\n link\" in some error messages.\n\n Own Id: OTP-18578 Aux Id: GH-7213\n\n- Corrected the socket send function description (send with Timeout = nowait).\n The send function(s) could not return \\{ok, \\{RestData, SelectInfo\\}\\}\n\n Own Id: OTP-18584 Aux Id: #7238","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 9.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-9-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed a bug where duplicate keys were allowed in the .app file of an\n application. Duplicate keys are now rejected and the application will not\n start if they exist.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18210 Aux Id: GH-5877 PR-5878\n\n- Fix inconsistent handling in logger_formatter of the branched values in\n conditional branches. For example using `msg` in a conditional branch would\n not be formatted as it should before this fix.\n\n Own Id: OTP-18225 Aux Id: PR-6036\n\n- Fix the logger_std_h handler to log to standard_error if logging to\n standard_io fails for any reason.\n\n Own Id: OTP-18226 Aux Id: PR-6253\n\n- Fix the TLS distribution to work when starting Erlang in embedded mode and a\n connection is done before kernel is fully started.\n\n Own Id: OTP-18248 Aux Id: PR-6227 GH-6085\n\n- erl `-remsh` has been improved to provide better error reasons and work when\n using a shell without terminal support (that is an \"oldshell\").\n\n Own Id: OTP-18271 Aux Id: PR-6279\n\n- Fix logging of log events generated before kernel is started to not fail if\n the code for formatting those log messaged have not yet been loaded.\n\n Own Id: OTP-18286 Aux Id: PR-5955\n\n- `proc_lib:start*/*` has become synchronous when the started process fails.\n This requires that a failing process use a new function\n `proc_lib:init_fail/2,3`, or exits, to indicate failure. All OTP behaviours\n have been fixed to do this.\n\n All these start functions now consume the `'EXIT'` message from a process link\n for all error returns. Previously it was only the `start_link/*` functions\n that did this, and only when the started function exited, not when it used\n `init_ack/1,2` or `init_fail/2,3` to create the return value.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18471 Aux Id: GH-6339, PR-6843\n\n- Fixed a bug where `file:read(standard_io, ...)` unexpectedly returned `eof` in\n binary mode.\n\n Own Id: OTP-18486 Aux Id: PR-6881\n\n- Return type for `seq_trace:get_token/1` fixed.\n\n Own Id: OTP-18528 Aux Id: PR-7009\n\n- Looking up, connecting to and sending to a host with an empty name is now\n handled by trying to look up the address of the root domain, which fails.\n Previously some of these operations caused an internal exception, which\n contradicted type specifications.\n\n Own Id: OTP-18543 Aux Id: GH-6353\n\n- Replaced a regex with a special case handling of ANSI Select Graphic Rendition\n escape characters, to speed up io output that make use of these escape\n sequences.\n\n Own Id: OTP-18547 Aux Id: PR-7092","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The Erlang shell has been improved to support the following features:\n\n - Auto-complete variables, record names, record field names, map keys,\n function parameter types and filenames.\n - Open external editor in the shell (with C-o) to edit the current expression\n in an editor.\n - Support defining records (with types), functions and function typespecs, and\n custom types in the shell.\n - Do not save pager commands, and input to io:getline in history.\n\n Own Id: OTP-14835 Aux Id: PR-5924\n\n- The TTY/terminal subsystem has been rewritten by moving more code to Erlang\n from the old linked-in driver and implementing all the I/O primitives needed\n in a NIF instead.\n\n On Unix platforms the user should not notice a lot of difference, besides\n better handling of unicode characters and fixing of some long standing bugs.\n\n Windows users will notice that erl.exe has the same functionality as a normal\n Unix shell and that werl.exe has been removed and replaced with a symlink to\n erl.exe. This makes the Windows Erlang terminal experience identical to that\n of Unix.\n\n The re-write brings with it a number of bug fixes and feature additions:\n\n - The TTY is now reset when Erlang exits, fixing zsh to not break when\n terminating an Erlang session.\n - `standard_error` now uses the same unicode mode as `standard_io`.\n - Hitting backspace when searching the shell history with an empty search\n string no longer breaks the shell.\n - Tab expansion now works on remote nodes started using the JCL interface.\n - It is now possible to configure the shell slogan and the session slogans\n (that is the texts that appear when you start an Erlang shell). See the\n kernel documentation for more details.\n - Added shell:start_interactive for starting the interactive shell from a\n non-interactive Erlang session (for example an escript).\n - On Windows, when starting in detached mode the standard handler are now set\n to `nul` devices instead of being unset.\n - Standard I/O now always defaults to `unicode` mode if supported. Previously\n the default was `latin1` if the runtime system had been started with\n `-oldshell` or `-noshell` (for example in an `escript`). To send raw bytes\n over standard out, one now explicitly has to specify\n `io:setopts(standard_io, [{encoding, latin1}]).`\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17932 Aux Id: PR-6144 GH-3150 GH-3390 GH-4343 GH-4225\n\n- Add support for socket on Windows.\n\n - Pre release status.\n - Error codes not finalized.\n - No explicit support for Windows specific options (socket options, flags for\n read and write).\n - New async api for Windows (completion). See the `Asynchronous calls` chapter\n in the (Socket Usage) Users Guide.\n - To ensure platform independence, gen_tcp and gen_udp is _intended_ to be\n used (not yet updated).\n\n Own Id: OTP-18029\n\n- As announced since the release of OTP 24, support for:\n\n - version 4 node container types in the external term format are now\n mandatory. That is, references supporting up to 5 32-bit integer\n identifiers, and process and port identifiers with support for 64-bit data\n storage. The distribution flag\n [`DFLAG_V4_NC`](`e:erts:erl_dist_protocol.md#DFLAG_V4_NC`) is therefor now\n also mandatory. OTP has since OTP 24 supported this. Also note that the\n external format produced by `term_to_binary()` and `term_to_iovec()` will\n unconditionally produce pids, ports, and references supporting this larger\n format.\n - the [new link protocol](`e:erts:erl_dist_protocol.md#new_link_protocol`)\n introduced in OTP 23.3 is now mandatory. The distribution flag\n [`DFLAG_UNLINK_ID`](`e:erts:erl_dist_protocol.md#DFLAG_UNLINK_ID`) is\n therefor now also mandatory.\n\n Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from\n releases prior to OTP 24.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18140 Aux Id: PR-6072\n\n- Support for Kernel TLS (kTLS), has been added to the SSL application, for TLS\n distribution (`-proto_dist inet_tls`), the SSL option `{ktls, true}`. Using\n this for general SSL sockets is uncomfortable, undocumented and not\n recommended since it requires very platform dependent raw options.\n\n This, for now, only works for some not too old Linux distributions. Roughly, a\n kernel 5.2.0 or later with support for UserLand Protocols and the kernel\n module `tls` is required.\n\n Own Id: OTP-18235 Aux Id: PR-6104, PR-5840\n\n- Add code:get_doc/2 which adds support to fetch documentation skeletons of\n functions using debug_info chunks instead of eep48 doc chunks.\n\n Own Id: OTP-18261 Aux Id: PR-5924\n\n- The Erlang shell's auto-completion when typing `tab` has been changed to\n happen after the editing current line instead of before it.\n\n This behaviour can be configured using a the `shell_expand_location` STDLIB\n configuration parameter.\n\n Own Id: OTP-18278 Aux Id: PR-6260\n\n- Typing `Ctrl+L` in a shell now clears the screen and redraws the current line\n instead of only redrawing the current line. To only redraw the current line,\n you must now type `Alt+L`. This brings the behaviour of `Ctrl+L` closer to how\n bash and other shells work.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18285 Aux Id: PR-6262\n\n- gen_server optimized by caching callback functions\n\n Own Id: OTP-18305 Aux Id: PR-5831\n\n- Prepare the `pg` communication protocol for upgrade. The plan is for OTP-28\n nodes to be able to use an upgraded `pg` protocol while still being able to\n talk with OTP 26 nodes.\n\n Own Id: OTP-18327 Aux Id: PR-6433\n\n- New `disk_log` log type `rotate`, where the log files are compressed upon\n rotation.\n\n Own Id: OTP-18331 Aux Id: ERIERL-870\n\n- The following `inet:setopts/2` options have been introduced:\n\n - **[`reuseport`](`m:inet#option-reuseport`)** - Reuse of local port. Load\n balancing may or may not be provided depending on underlying OS.\n\n - **[`reuseport_lb`](`m:inet#option-reuseport_lb`)** - Reuse of local port.\n Load balancing provided.\n\n - **[`exclusiveaddruse`](`m:inet#option-exclusiveaddruse`)** - Exclusive\n address/port usage on Windows. This socket option is Windows specific and\n will silently be ignored on other systems.\n\n The behavior of setting [`reuseaddr`](`m:inet#option-reuseaddr`) on Windows\n have changed in a _backwards incompatible_ way. The underlying `SO_REUSEADDR`\n socket option is now only set if both the `reusaddr` and the `reuseport`\n `inet` options have been set. This since the underlying `SO_REUSEADDR` socket\n option on Windows behaves similar to how BSD behaves if both the underlying\n socket options `SO_REUSEADDR` and `SO_REUSEPORT` have been set. See the\n documentation of the `reuseaddr` option for more information.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18344 Aux Id: PR-6522, PR-6944, OTP-18324, PR-6481, GH-6461\n\n- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18405 Aux Id:\n GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814\n\n- The function `file:pid2name/1` is deprecated and will be removed in\n Erlang/OTP 27.\n\n Own Id: OTP-18419\n\n- The modules Erlang DNS resolver `inet_res` and helper modules have been\n updated for RFC6891; to handle OPT RR with DNSSEC OK (DO) bit.\n\n Own Id: OTP-18442 Aux Id: PR-6786, GH-6606\n\n- Introduced `application:get_supervisor/1`.\n\n Own Id: OTP-18444 Aux Id: PR-6035\n\n- Handling of `on_load` modules during boot has been improved by adding an extra\n step in the boot order for embedded mode that runs all `on_load` handlers,\n instead of relying on explicit invocation of them, later, when the kernel\n supervision tree starts.\n\n This is mostly a code improvement and OTP internal simplification to avoid\n future bugs and to simplify code maintenance.\n\n Own Id: OTP-18447\n\n- Reduce contention on the code_server by doing the code preparation on the\n client.\n\n Own Id: OTP-18448 Aux Id: PR-6736\n\n- Added a mode to ensure_all_loaded, to start children application and their\n dependencies concurrently.\n\n Own Id: OTP-18451 Aux Id: PR-6737\n\n- Cache OTP boot code paths, to limit how many folders that are being accessed\n during a module lookup. Can be disabled with -cache_boot_path false. OTP boot\n code paths consists of ERL_LIB environment variables. The various otp/\\*/ebin\n folders. And the \\{path, ...\\} clauses in the init script.\n\n Own Id: OTP-18452 Aux Id: PR-6729\n\n- Erlang distribution code in Kernel and SSL has been refactored a bit to\n facilitate debugging and re-usability, which shouldn't have any noticeable\n effects on behaviour or performance.\n\n Own Id: OTP-18456\n\n- Add cache attribute to code path apis.\n\n Added an optional cache/nocache argument to all code:add_path*,\n code:set_path*, and code:replace_path\\* functions. These functions will then\n avoid doing file-accesses if they are cached. Cache can be cleared with\n code:clear_cache/0. Added code:del_paths/1 to make it easier to clear multiple\n paths.\n\n Own Id: OTP-18466 Aux Id: PR-6832\n\n- Deprecates `dbg:stop_clear/0` because it is simply a function alias to\n `dbg:stop/0`\n\n Own Id: OTP-18478 Aux Id: GH-6903\n\n- Improvements to code:ensure_modules_loaded/1: Previously it would prepare\n modules and then abandon references to said modules if they had on_load\n callbacks. This pull request makes it so they keep the references around and\n then serially load them without having to fetch the object code and prepare\n them again.\n\n Own Id: OTP-18484 Aux Id: PR-6844\n\n- The internal DNS resolver has been updated to handle DNS LOC RR:s (RFC 1876).\n This is an undocumented module, although still used by power users. See the\n source code.\n\n Own Id: OTP-18510 Aux Id: GH-6098, PR-6982\n\n- Reduced memory consumption in `global` when informing other nodes about lost\n connections.\n\n Own Id: OTP-18521 Aux Id: PR-7025\n\n- The `net_kernel`, `global`, and `global_group` servers now have\n [_fully asynchronous distributed signaling_](`m:erlang#process_flag_async_dist`)\n enabled all the time which prevents them from ever getting blocked on send of\n distributed signals.\n\n Documentation about blocking distributed signals has also been improved.\n\n Own Id: OTP-18533 Aux Id: PR-7061\n\n- Allow IPv6 addresses as host in `http` packets decoded by\n `erlang:decode_packet/3` and `gen_tcp` packet option. The IPv6 address should\n be enclosed within `[]` according to RFC2732.\n\n Own Id: OTP-18540 Aux Id: PR-6900\n\n- Remove deprecated functions in OTP-26\n\n Own Id: OTP-18542\n\n- Removed `code:is_module_native/1` since HiPE has been removed. It has since\n OTP 24 been deprecated and scheduled for removal in OTP 26.\n\n Removed `code:rehash/0` since the code path feature no longer is present. It\n has since OTP 19 been deprecated and has since OTP 24 been scheduled for\n removal in OTP 26.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18551 Aux Id: PR-7106\n\n- Added support for multiple line expressions and navigation in the shell. Added\n new keybindings:\n\n - navigate up (ctrl+up)/(alt+up)\n - navigate down (ctrl+down)/(alt+down)\n - insert newline in middle of line (alt+enter)\n - navigate top (alt+<)/(alt+shift+up)\n - navigate bottom (alt+>)/(alt+shift+down)\n - clear current expression (alt+c)\n - cancel search (alt+c)\n - opening editor on mac (option+o)/(alt+o)\n\n Modifies the prompt for new lines to make it clearer that the prompt has\n entered multi-line mode. Supports terminal with small window size, recommend\n not go lower than 7 rows and 40 columns. Modifies the search prompt to support\n multi-line statements. Redraw the prompt after continuing from JCL menu.\n\n Own Id: OTP-18575 Aux Id: PR-7169","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.5.4.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5-4-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"* Fixed gen_udp:open/2 type spec to include already supported module socket address types.\n\n Own Id: OTP-19050 Aux Id: OTP-18990","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.5.4.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- gen_tcp:connect with socket address and socket (inet-) backend fails because\n of missing callback function.\n\n Own Id: OTP-18707 Aux Id: #7530","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.5.4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Multiple socket:accept calls issue. When making multiple accept calls, only\n the last call is active.\n\n Own Id: OTP-18635 Aux Id: #7328\n\n- gen_udp:connect with inet_backend = socket fails when the Address is a\n hostname (string or atom).\n\n Own Id: OTP-18650","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.5.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed a bug on Windows where `file:read_file_info/1` would fail for files with\n corrupt metadata.\n\n Own Id: OTP-18348 Aux Id: GH-6356\n\n- Accept connection setup from OTP 23 and 24 nodes that are not using epmd.\n\n Own Id: OTP-18404 Aux Id: GH-6595, PR-6625","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.5.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The tcp connect option 'bind_to_device' could not be used with inet_backend =\n 'socket'. 'inet' requires value type binarry() and 'socket' requires value\n type 'string()'.\n\n Own Id: OTP-18357 Aux Id: #6509\n\n- Minor issue processing options when calling gen_tcp:connect with a sockaddr()\n and inet_backend = socket.\n\n Own Id: OTP-18358 Aux Id: #6528","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.5.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed shutdown crash in gen_tcp socket backend, when the other end closed the\n socket.\n\n Own Id: OTP-18270 Aux Id: #6331\n\n- `erl_tar` can now read gzip-compressed tar files that are padded. There is a\n new option `compressed_one` for `file:open/2` that will read a single member\n from a gzip file,\n\n Own Id: OTP-18289 Aux Id: PR-6343\n\n- Fix `os:cmd` to not translate all exceptions thrown to `badarg`. For example\n `emfile` from `erlang:open_port` was translated to `badarg`.\n\n This bug has existed since Erlang/OTP 24.\n\n Own Id: OTP-18291 Aux Id: PR-6382\n\n- Spec for function net:if_names/0 incorrect\n\n Own Id: OTP-18296 Aux Id: OTP-16464\n\n- Missing ctrl option name transation for TOS and TTL (on FreeBSD) when using\n gen_udp with the 'socket' inet_backend.\n\n Own Id: OTP-18315\n\n- gen_udp:open/2 with option(s) add_membership or drop_membership would drop\n earlier options.\n\n Own Id: OTP-18323 Aux Id: #6476\n\n- The `inet:setopts/2` `{reuseaddr, true}` option will now be ignored on Windows\n unless the socket is an UDP socket. For more information see the documentation\n of the `reuseaddr` option part of the documentation of `inet:setopts/2`.\n\n Prior to OTP 25 the `{reuseaddr, true}` option was ignored for all sockets on\n Windows, but as of OTP 25.0 this was changed so that it was not ignored for\n any sockets.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18324 Aux Id: GH-6461, PR-6481","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The distribution socket option handling in `inet_tcp_dist` has been cleaned up\n to clarify which were mandatory and which just had default values.\n\n Own Id: OTP-18293\n\n- Improve warning message format for gen_tcp_socket.\n\n Own Id: OTP-18317","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.5.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Listen sockets created with the socket module, leaked (erlang-) monitors.\n\n Own Id: OTP-18240 Aux Id: #6285\n\n- `m:peer` nodes failed to halt when the process supervising the control\n connection crashed. When an alternative control connection was used, this\n supervision process also quite frequently crashed when the `peer` node was\n stopped by the node that started it which caused the `peer` node to linger\n without ever halting.\n\n Own Id: OTP-18249 Aux Id: PR-6301","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed inconsistency bugs in `m:global` due to `nodeup`/`nodedown` messages not\n being delivered before/after traffic over connections. Also fixed various\n other inconsistency bugs and deadlocks in both `m:global_group` and `global`.\n\n As building blocks for these fixes, a new BIF `erlang:nodes/2` has been\n introduced and `net_kernel:monitor_nodes/2` has been extended.\n\n The [`-hidden`](`e:erts:erl_cmd.md#hidden`) and\n [`-connect_all`](`e:erts:erl_cmd.md#connect_all`) command line arguments did\n not work if multiple instances were present on the command line which has been\n fixed. The new kernel parameter [`connect_all`](kernel_app.md#connect_all) has\n also been introduced in order to replace the `-connect_all` command line\n argument.\n\n Own Id: OTP-17934 Aux Id: PR-6007\n\n- Fixed IPv6 multicast_if and membership socket options.\n\n Own Id: OTP-18091 Aux Id: #5789\n\n- Fixed issue with inet:getifaddrs hanging on pure IPv6 Windows\n\n Own Id: OTP-18102 Aux Id: #5904\n\n- The type specifications for `inet:getopts/2` and `inet:setopts/2` have been\n corrected regarding SCTP options.\n\n Own Id: OTP-18115 Aux Id: PR-5939\n\n- The type specifications for `inet:parse_*` have been tightened.\n\n Own Id: OTP-18121 Aux Id: PR-5972\n\n- Fix gen_tcp:connect/3 spec to include the inet_backend option.\n\n Own Id: OTP-18171 Aux Id: PR-6131\n\n- Fix bug where using a binary as the format when calling\n `logger:log(Level, Format, Args)` (or any other logging function) would cause\n a crash or incorrect logging.\n\n Own Id: OTP-18229 Aux Id: PR-6212","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add rudimentary debug feature (option) for the inet-driver based sockets, such\n as gen_tcp and gen_udp.\n\n Own Id: OTP-18032\n\n- Introduced the `hidden` and `dist_listen` options to `net_kernel:start/2`.\n\n Also documented the [`-dist_listen`](`e:erts:erl_cmd.md#dist_listen`) command\n line argument which was erroneously documented as a `kernel` parameter and not\n as a command line argument.\n\n Own Id: OTP-18107 Aux Id: PR-6009\n\n- Scope and group monitoring have been introduced in `m:pg`. For more\n information see the documentation of\n [`pg:monitor_scope()`](`pg:monitor_scope/0`),\n [`pg:monitor()`](`pg:monitor/1`), and [`pg:demonitor()`](`pg:demonitor/1`).\n\n Own Id: OTP-18163 Aux Id: PR-6058, PR-6275\n\n- A new function `global:disconnect/0` has been introduced with which one can\n cleanly disconnect a node from all other nodes in a cluster of `global` nodes.\n\n Own Id: OTP-18232 Aux Id: OTP-17843, PR-6264","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.4.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A call to [`net_kernel:setopts(new, Opts)`](`net_kernel:setopts/2`) at the\n same time as a connection was being set up could cause a deadlock between the\n `net_kernel` process and the process setting up the connection.\n\n Own Id: OTP-18198 Aux Id: GH-6129, PR-6216","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The DNS resolver `inet_res` has been fixed to ignore trailing dot difference\n in the request domain between the sent request and the received response, when\n validating a response.\n\n Own Id: OTP-18112 Aux Id: ERIERL-811\n\n- A bug in `inet_res` has been fixed where a missing internal `{ok,_}` wrapper\n caused `inet_res:resolve/*` to return a calculated host name instead of an\n `{ok,Msg}` tuple, when resolving an IP address or a host name that is an IP\n address string.\n\n Own Id: OTP-18122 Aux Id: GH-6015, PR-6020\n\n- The `erlang:is_alive()` BIF could return `true` before configured distribution\n service was available. This bug was introduced in OTP 25.0 ERTS version 13.0.\n\n The `erlang:monitor_node()` and `erlang:monitor()` BIFs could erroneously fail\n even though configured distribution service was available. This occurred if\n these BIFs were called after the distribution had been started using dynamic\n node name assignment but before the name had been assigned.\n\n Own Id: OTP-18124 Aux Id: OTP-17558, PR-6032\n\n- Added the missing mandatory `address/0` callback in the `gen_tcp_dist`\n example.\n\n Own Id: OTP-18136","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The DNS resolver implementation has been rewritten to validate replies more\n thoroughly, and a bit optimized to create less garbage.\n\n Own Id: OTP-17323\n\n- The socket option 'reuseaddr' is _no longer_ ignored on Windows.\n\n Own Id: OTP-17447 Aux Id: GH-4819\n\n- Fix bug where using the atoms `string` or `report` as the format when calling\n `logger:log(Level, Format, Args)` (or any other logging function) would cause\n a crash or incorrect logging.\n\n Own Id: OTP-17551 Aux Id: GH-5071 PR-5075\n\n- As of OTP 25, `global` will by default prevent overlapping partitions due to\n network issues by actively disconnecting from nodes that reports that they\n have lost connections to other nodes. This will cause fully connected\n partitions to form instead of leaving the network in a state with overlapping\n partitions.\n\n Prevention of overlapping partitions can be disabled using the\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n `kernel(6)` parameter, making `global` behave like it used to do. This is,\n however, problematic for all applications expecting a fully connected network\n to be provided, such as for example `mnesia`, but also for `global` itself. A\n network of overlapping partitions might cause the internal state of `global`\n to become inconsistent. Such an inconsistency can remain even after such\n partitions have been brought together to form a fully connected network again.\n The effect on other applications that expects that a fully connected network\n is maintained may vary, but they might misbehave in very subtle hard to detect\n ways during such a partitioning. Since you might get hard to detect issues\n without this fix, you are _strongly_ advised _not_ to disable this fix. Also\n note that this fix _has_ to be enabled on _all_ nodes in the network in order\n to work properly.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17911 Aux Id: PR-5687, PR-5611, OTP-17843\n\n- Starting the helper program for name resolving; `inet_gethost`, has been\n improved to use an absolute file system path to ensure that the right program\n is started.\n\n If the helper program can not be started - the system now halts, to avoid\n running with a silently broken name resolver.\n\n Own Id: OTP-17958 Aux Id: OTP-17978\n\n- The type specification for `inet_res:getbyname/2,3` has been corrected to\n reflect that it can return peculiar `#hostent{}` records.\n\n Own Id: OTP-17986 Aux Id: PR-5412, PR-5803\n\n- `code:module_status/1` would always report BEAM files loaded from an archive\n as `modified`, and `code:modified_modules/0` would always return the name of\n all modules loaded from archives.\n\n Own Id: OTP-17990 Aux Id: GH-5801\n\n- In logger fix file handler shutdown delay by using erlang timers instead of\n the timer module's timers.\n\n Own Id: OTP-18001 Aux Id: GH-5780 PR-5829\n\n- Fix the meta data in log events generated by logger on failure to not contain\n the original log event's meta data.\n\n Own Id: OTP-18003 Aux Id: PR-5771\n\n- Fix logger file backend to re-create the log folder if it has been deleted.\n\n Own Id: OTP-18015 Aux Id: GH-5828 PR-5845\n\n- \\[socket] Encode of sockaddr has been improved.\n\n Own Id: OTP-18020\n\n- Fix `put_chars` requests to the io server with incomplete unicode data to exit\n with `no_translation` error.\n\n Own Id: OTP-18070 Aux Id: PR-5885","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The net module now works on Windows.\n\n Own Id: OTP-16464\n\n- An Erlang installation directory is now relocatable on the file system given\n that the paths in the installation's `RELEASES` file are paths that are\n relative to the installations root directory. The\n `` `release_handler:create_RELEASES/4 `` function can generate a `RELEASES`\n file with relative paths if its `RootDir` parameter is set to the empty\n string.\n\n Own Id: OTP-17304\n\n- The following distribution flags are now mandatory: `DFLAG_BIT_BINARIES`,\n `DFLAG_EXPORT_PTR_TAG`, `DFLAG_MAP_TAGS`, `DFLAG_NEW_FLOATS`, and\n `DFLAG_FUN_TAGS`. This mainly concerns libraries or application that implement\n the distribution protocol themselves.\n\n Own Id: OTP-17318 Aux Id: PR-4972\n\n- Fix `os:cmd` to work on Android OS.\n\n Own Id: OTP-17479 Aux Id: PR-4917\n\n- The configuration files [`.erlang`](`e:erts:erl_cmd.md`),\n [`.erlang.cookie`](`e:system:distributed.md`) and\n [`.erlang.crypt`](`m:beam_lib#module-erlang-crypt`) can now be located in the XDG\n Config Home directory.\n\n See the documentation for each file and `filename:basedir/2` for more details.\n\n Own Id: OTP-17554 Aux Id: GH-5016 PR-5408 OTP-17821\n\n- Dynamic node name improvements: `erlang:is_alive/0` changed to return true for\n pending dynamic node name and new function `net_kernel:get_state/0`.\n\n Own Id: OTP-17558 Aux Id: OTP-17538, PR-5111, GH-5402\n\n- The types for callback result types in `gen_statem` has bee augmented with\n arity 2 types where it is possible for a callback module to specify the type\n of the callback data, so the callback module can get type validation of it.\n\n Own Id: OTP-17589 Aux Id: PR-4926\n\n- The tagged tuple tests and fun-calls have been optimized and are now a little\n bit cheaper than previously.\n\n These optimizations become possible after making sure that all boxed terms\n have at least one word allocated after the arity word. This has been\n accomplished by letting all empty tuples refer to the same empty tuple literal\n which also reduces memory usage for empty tuples.\n\n Own Id: OTP-17608\n\n- A [`net_ticker_spawn_options`](kernel_app.md#net_ticker_spawn_options)\n `kernel` configuration parameter with which one can set spawn options for the\n distribution channel ticker processes has been introduced.\n\n Own Id: OTP-17617 Aux Id: PR-5069\n\n- The most, or at least the most used, `m:rpc` operations now require `m:erpc`\n support in order to communicate with other Erlang nodes. `erpc` was introduced\n in OTP 23. That is, `rpc` operations against Erlang nodes of releases prior to\n OTP 23 will fail.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17681 Aux Id: PR-5307\n\n- The new module `peer` supersedes the `slave` module. The `slave` module is now\n deprecated and will be removed in OTP 27.\n\n `peer` contains an extended and more robust API for starting erlang nodes.\n\n Own Id: OTP-17720 Aux Id: PR-5162\n\n- In order to make it easier for the user to manage multiple outstanding\n asynchronous `call` requests, new functionality utilizing request identifier\n collections have been introduced in\n [`erpc`](`t:erpc:request_id_collection/0`),\n [`gen_server`](`t:gen_server:request_id_collection/0`),\n [`gen_statem`](`t:gen_statem:request_id_collection/0`), and\n [`gen_event`](`t:gen_event:request_id_collection/0`).\n\n Own Id: OTP-17784 Aux Id: PR-5792\n\n- Type specifications have been added to the `gen_server`, and the documentation\n has been updated to utilize this.\n\n This surfaced a few type violations that has been corrected in `global`,\n `logger_olp` and `rpc`.\n\n Own Id: OTP-17915 Aux Id: PR-5751, GH-2375, GH-2690\n\n- IP address validation functions `is_ipv4_address/1`, `is_ipv6_address/1` and\n `is_ip_address/1` have been added to the module `inet` in Kernel.\n\n Own Id: OTP-17923 Aux Id: PR-5646\n\n- An API for multihomed SCTP connect has been added in the guise of\n `gen_sctp:connectx_init/*`\n\n Own Id: OTP-17951 Aux Id: PR-5656\n\n- \\[socket] Add encoding of the field hatype of the type sockaddr_ll (family\n 'packet').\n\n Own Id: OTP-17968 Aux Id: OTP-16464\n\n- Added support for configurable features as described in EEP-60. Features can\n be enabled/disabled during compilation with options\n (`-enable-feature Feature`, `-disable-feature Feature` and\n `+{feature, Feature, enable|disable}`) to `erlc` as well as with directives\n (`-feature(Feature, enable|disable).`) in the file. Similar options can be\n used to `erl` for enabling/disabling features allowed at runtime. The new\n `maybe` expression (EEP-49) is fully supported as the feature `maybe_expr`.\n The features support is documented in the reference manual.\n\n Own Id: OTP-17988","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.3.2.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-3-2-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- gen_tcp:connect with socket address and socket (inet-) backend fails because\n of missing callback function.\n\n Own Id: OTP-18707 Aux Id: #7530","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.3.2.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-3-2-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Spec for function net:if_names/0 incorrect\n\n Own Id: OTP-18296 Aux Id: OTP-16464\n\n- Missing ctrl option name transation for TOS and TTL (on FreeBSD) when using\n gen_udp with the 'socket' inet_backend.\n\n Own Id: OTP-18315\n\n- The tcp connect option 'bind_to_device' could not be used with inet_backend =\n 'socket'. 'inet' requires value type binarry() and 'socket' requires value\n type 'string()'.\n\n Own Id: OTP-18357 Aux Id: #6509\n\n- Minor issue processing options when calling gen_tcp:connect with a sockaddr()\n and inet_backend = socket.\n\n Own Id: OTP-18358 Aux Id: #6528","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Improve warning message format for gen_tcp_socket.\n\n Own Id: OTP-18317","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.3.2.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-3-2-2"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A new function `global:disconnect/0` has been introduced with which one can\n cleanly disconnect a node from all other nodes in a cluster of `global` nodes.\n\n Own Id: OTP-18232 Aux Id: OTP-17843, PR-6264","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.3.2.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-3-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A call to [`net_kernel:setopts(new, Opts)`](`net_kernel:setopts/2`) at the\n same time as a connection was being set up could cause a deadlock between the\n `net_kernel` process and the process setting up the connection.\n\n Own Id: OTP-18198 Aux Id: GH-6129, PR-6216","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.3.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-3-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- inet:getopts/2 for the 'raw' option for a socket created with inet-backend\n 'socket' failed.\n\n Own Id: OTP-18078 Aux Id: GH-5930\n\n- Corrected the behaviour of the shutdown function when using with the\n inet_backend = socket. It was not sufficiently compatible with the \"old\"\n gen_tcp.\n\n Own Id: OTP-18080 Aux Id: GH-5930","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.3.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix failed accepted connection setup after previous established connection\n from same node closed down silently.\n\n Own Id: OTP-17979 Aux Id: ERIERL-780\n\n- Fixed a problem where typing Ctrl-R in the shell could hang if there were some\n problem with the history log file.\n\n Own Id: OTP-17981 Aux Id: PR-5791","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Handling of `send_timeout` for `gen_tcp` has been corrected so that the\n timeout is honored also when sending 0 bytes.\n\n Own Id: OTP-17840\n\n- By default `global` does _not_ take any actions to restore a fully connected\n network when connections are lost due to network issues. This is problematic\n for all applications expecting a fully connected network to be provided, such\n as for example `mnesia`, but also for `global` itself. A network of\n overlapping partitions might cause the internal state of `global` to become\n inconsistent. Such an inconsistency can remain even after such partitions have\n been brought together to form a fully connected network again. The effect on\n other applications that expects that a fully connected network is maintained\n may vary, but they might misbehave in very subtle hard to detect ways during\n such a partitioning.\n\n In order to prevent such issues, we have introduced a _prevent overlapping\n partitions_ fix which can be enabled using the\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n `kernel(6)` parameter. When this fix has been enabled, `global` will actively\n disconnect from nodes that reports that they have lost connections to other\n nodes. This will cause fully connected partitions to form instead of leaving\n the network in a state with overlapping partitions. Note that this fix _has_\n to be enabled on _all_ nodes in the network in order to work properly. Since\n this quite substantially changes the behavior, this fix is currently disabled\n by default. Since you might get hard to detect issues without this fix you\n are, however, _strongly_ advised to enable this fix in order to avoid issues\n such as the ones described above. As of OTP 25 this fix will become enabled by\n default.\n\n Own Id: OTP-17843 Aux Id: ERIERL-732, PR-5611\n\n- Fix bug where `logger` would crash when logging a report including improper\n lists.\n\n Own Id: OTP-17851\n\n- Make `erlang:set_cookie` work for dynamic node names.\n\n Own Id: OTP-17902 Aux Id: GH-5402, PR-5670","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add support for using socket:sockaddr_in() and socket:sockaddr_in6() when\n using gen_sctp, gen_tcp and gen_udp. This will make it possible to use Link\n Local IPv6 addresses.\n\n Own Id: OTP-17455 Aux Id: GH-4852\n\n- A [`net_tickintensity`](kernel_app.md#net_tickintensity) `kernel` parameter\n has been introduced. It can be used to control the amount of ticks during a\n [`net_ticktime`](kernel_app.md#net_ticktime) period.\n\n A new `net_kernel:start/2` function has also been introduced in order to make\n it easier to add new options. The use of `net_kernel:start/1` has been\n deprecated.\n\n Own Id: OTP-17905 Aux Id: ERIERL-732, PR-5740\n\n- Improve documentation for the dynamic node name feature.\n\n Own Id: OTP-17918","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- socket:which_sockets( pid() ) uses wrong keyword when looking up socket owner\n ('ctrl' instead of 'owner').\n\n Own Id: OTP-17716\n\n- In epmd_ntop, the #if defined(EPMD6) conditional was inverted and it was only\n including the IPv6-specific code when EPMD6 was undefined. This was causing\n IPv6 addrs to be interpreted as IPv4 addrs and generating nonsense IPv4\n addresses as output.\n\n Several places were incorrectly using 'num_sockets' instead of 'i' to index\n into the iserv_addr array during error logging. This would result in a read\n into uninitialized data in the iserv_addr array.\n\n Thanks to John Eckersberg for providing this fix.\n\n Own Id: OTP-17730\n\n- Minor fix of the `erl_uds_dist` distribution module example.\n\n Own Id: OTP-17765 Aux Id: PR-5289\n\n- A bug has been fixed for the legacy TCP socket adaption module\n `gen_tcp_socket` where it did bind to a socket address when given a file\n descriptor, but should not.\n\n Own Id: OTP-17793 Aux Id: PR-5348, OTP-17451, PR-4787, GH-4680, PR-2989,\n OTP-17216\n\n- Improve the error printout when [`open_port/2`](`open_port/2`) fails because\n of invalid arguments.\n\n Own Id: OTP-17805 Aux Id: PR-5406\n\n- Calling socket:monitor/1 on an already closed socket should succeed and result\n in an immediate DOWN message. This has now been fixed.\n\n Own Id: OTP-17806\n\n- Fix the configuration option `logger_metadata` to work.\n\n Own Id: OTP-17807 Aux Id: PR-5418\n\n- Fix tls and non-tls distribution to use erl_epmd:address_please to figure out\n if IPv4 or IPv6 addresses should be used when connecting to the remote node.\n\n Before this fix, a dns lookup of the remote node hostname determined which IP\n version was to be used which meant that the hostname had to resolve to a valid\n ip address.\n\n Own Id: OTP-17809 Aux Id: PR-5337 GH-5334","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add `logger:reconfigure/0`.\n\n Own Id: OTP-17375 Aux Id: PR-4663 PR-5186\n\n- Add socket function ioctl/2,3,4 for socket device control.\n\n Own Id: OTP-17528\n\n- Add simple support for socknames/1 for gen_tcp_socket and gen_udp_socket.\n\n Own Id: OTP-17531\n\n- The types for callback result types in `gen_statem` has bee augmented with\n arity 2 types where it is possible for a callback module to specify the type\n of the callback data, so the callback module can get type validation of it.\n\n Own Id: OTP-17738 Aux Id: PR-4926, OTP-17589","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.1.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The internal, undocumented, but used, module `inet_dns` has been fixed to\n handle mDNS high bit usage of the Class field.\n\n Code that uses the previously obsolete, undocumented and unused record field\n `#dns_rr.func` will need to be updated since that field is now used as a\n boolean flag for the mDNS high Class bit. Code that uses the also undocumented\n record `#dns_query` will need to be recompiled since a boolean field\n `#dns_query.unicast_response` has been added for the mDNS high Class bit.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17734 Aux Id: GH-5327, OTP-17659\n\n- The fix for Linux's behaviour when reconnecting an UDP socket in PR-5120\n released in OTP-24.1.2 has been refined to only dissolve the socket's\n connection before a connect if the socket is already connected, that is: only\n for a reconnect.\n\n This allows code to open a socket with an ephemeral port, get the port number\n and connect; without the port number changing (on Linux). This turned out to\n have at least one valid use case (besides test cases).\n\n Should one reconnect the socket then the port number may change, on Linux; it\n is a known quirk, which can be worked around by binding to a specific port\n number when opening the socket. If you can do without an ephemeral port, that\n is...\n\n Own Id: OTP-17736 Aux Id: GH-5279, PR-5120, OTP-17559","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.1.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The undocumented DNS encode/decode module `inet_dns` has been cleaned up to\n handle the difference between \"symbolic\" and \"raw\" records in a more\n consistent manner.\n\n PR-5145/OTP-17584 introduced a change that contributed to an already existing\n confusion, which this correction should remedy.\n\n Own Id: OTP-17659 Aux Id: ERIERL-702","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Add more info about the socket 'type' ('socket' or 'port') for the DOWN\n message when monitoring sockets.\n\n Own Id: OTP-17640","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The extended error information has been corrected and improved for the\n following BIFs: [`binary_to_existing_atom/2`](`binary_to_existing_atom/2`),\n [`list_to_existing_atom/1`](`list_to_existing_atom/1`),\n `erlang:send_after/{3,4}`, and `erlang:start_timer/{3,4}`.\n\n Own Id: OTP-17449 Aux Id: GH-4900\n\n- Fixed rare bug that could cause net_kernel process to hang for ever. Have seen\n to happen with massive number of TLS connections while remote nodes are\n restarting. Bug exists since OTP-22.0.\n\n Own Id: OTP-17476 Aux Id: GH-4931, PR-4934\n\n- Improve handling of closed sockets for inet:info/1.\n\n Own Id: OTP-17492\n\n- This change fixes a performance problem introduced in pull-request #2675.\n Pull-request #2675 made so the system tried to start children of already\n started applications which is unnecessary. This change fixes this performance\n problem.\n\n Own Id: OTP-17519\n\n- Fix code:get_doc/1 to not crash when module is located in an escript.\n\n Own Id: OTP-17570 Aux Id: PR-5139 GH-4256 ERL-1261\n\n- Parsing of the result value in the native DNS resolver has been made more\n defensive against incorrect results.\n\n Own Id: OTP-17578 Aux Id: ERIERL-683\n\n- A bug in the option handling for the legacy socket adaptor, that is; when\n using `inet_backend = socket`, has been fixed. Now socket options are set\n before the bind() call so options regarding, for example address reuse have\n the desired effect.\n\n Own Id: OTP-17580 Aux Id: GH-5122\n\n- `inet:ntoa/1` has been fixed to not accept invalid numerical addresses.\n\n Own Id: OTP-17583 Aux Id: GH-5136\n\n- Parsing of DNS records has been improved for records of known types to not\n accept and present malformed ones in raw format.\n\n Own Id: OTP-17584 Aux Id: PR-5145\n\n- The `ip_mreq()` type for the `{ip,add_membership}` and `{ip,drop_membership}`\n socket options has been corrected to have an `interface` field instead of,\n incorrectly, an `address` field.\n\n Own Id: OTP-17590 Aux Id: PR-5170","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add simple utility function to display existing sockets i the erlang shell\n (socket:i/0).\n\n Own Id: OTP-17376 Aux Id: OTP-17157\n\n- gen_udp can now be configured to use the socket inet-backend (in the same way\n as gen_tcp).\n\n Own Id: OTP-17410\n\n- Functions `erlang:set_cookie(Cookie)` and `erlang:get_cookie(Node)` have been\n added for completeness and to facilitate configuring distributed nodes with\n different cookies.\n\n The documentation regarding distribution cookies has been improved to be less\n vague.\n\n Own Id: OTP-17538 Aux Id: GH-5063, PR-5111\n\n- A workaround has been implemented for Linux's quirky behaviour to not adjust\n the source IP address when connecting a connected (reconnecing) UDP socket.\n\n The workaround is to, on Linux, always dissolve any connection before\n connecting an UDP socket.\n\n Own Id: OTP-17559 Aux Id: GH-5092, PR-5120\n\n- Documented our recommendation against opening NFS-mounted files, FIFOs,\n devices, and similar using `file:open/2`.\n\n Own Id: OTP-17576 Aux Id: ERIERL-685","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 8.0.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-0-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- For `gen_tcp:connect/3,4` it is possible to specify a specific source port,\n which should be enough to bind the socket to an address with that port before\n connecting.\n\n Unfortunately that feature was lost in OTP-17216 that made it mandatory to\n specify the source address to get an address binding, and ignored a specified\n source port if no source address was specified.\n\n That bug has now been corrected.\n\n Own Id: OTP-17536 Aux Id: OTP-17216, ERIERL-677","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.0.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix a race condition in Global.\n\n Own Id: OTP-16033 Aux Id: ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923\n\n- After a node restart with `init:restart/0,1`, the module `socket` was not\n usable because supporting tables had been cleared and not re-initialized. This\n has now been fixed.\n\n Handling of the \".\" domain as a search domain was incorrect and caused a crash\n in the DNS resolver `inet_res`, which has now been fixed.\n\n Own Id: OTP-17439 Aux Id: GH-4827, PR-4888, GH-4838\n\n- Handling of combinations of the `fd` option and binding to an address has been\n corrected, especially for the `local` address family.\n\n Own Id: OTP-17451 Aux Id: OTP-17374\n\n- Bug fixes and code cleanup for the new `socket` implementation, such as:\n\n Assertions on the result of demonitoring has been added in the NIF code, where\n appropriate.\n\n Internal state handling for socket close in the NIF code has been reviewed.\n\n Looping over `close()` for `EINTR` in the NIF code has been removed, since it\n is strongly discouraged on Linux and Posix is not clear about if it is\n allowed.\n\n The `inet_backend` temporary socket option for legacy `gen_tcp` sockets has\n been documented.\n\n The return value from `net:getaddrinfo/2` has been corrected: the `protocol`\n field is now an `t:atom/0`, instead of, incorrectly,\n [`list(atom())`](`t:list/1`). The documentation has also been corrected about\n this return type.\n\n Deferred close of a `socket:sendfile/*` file was broken and has been\n corrected.\n\n Some debug code, not enabled by default, in the socket NIF has been corrected\n to not accidentally core dump for debug printouts of more or less innocent\n events.\n\n Own Id: OTP-17452","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 8.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-8-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug has been fixed for the internal `inet_res` resolver cache that handled a\n resolver configuration file status timer incorrectly and caused performance\n problems due to many unnecessary file system accesses.\n\n Own Id: OTP-14700 Aux Id: PR-2848\n\n- Change the value of the tag `head` returned by `disk_log:info/1` from\n `{ok, Head}` to just `Head`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16809 Aux Id: ERL-1313\n\n- Two options have been added to `erl_call`. The `-fetch_stdout` option fetches\n stdout data resulting from the code invoked by `erl_call`. The `-fetch_stdout`\n option disables printing of the result term. In order to implement the first\n of these two options a new function called `ei_xrpc_from` has been added to\n erl_interface. For details see the `erl_call` documentation and\n `erl_interface` documentation.\n\n Own Id: OTP-17132\n\n- Missing runtime dependencies has been added to this application.\n\n Own Id: OTP-17243 Aux Id: PR-4557\n\n- `inet:get_rc/0` has been corrected to return host entries as separate entries\n instead of (incorrectly) in a list within the list. This bug was introduced by\n OTP-16487 in OTP-23.0-rc1.\n\n Own Id: OTP-17262 Aux Id: GH-4588, PR-4604, OTP-16487\n\n- The type gen_tcp:option_name() had a duplicate pktoptions value.\n\n Own Id: OTP-17277\n\n- Fixed removal of empty groups from internal state in `pg`.\n\n Own Id: OTP-17286 Aux Id: PR-4619\n\n- `erl -remsh` now prints an error message when it fails to connect to the\n remote node.\n\n Own Id: OTP-17287 Aux Id: PR-4581\n\n- Fix bugs related to corrupt shell history files.\n\n Error messages printed by shell history are now logged as logger error reports\n instead of written to standard error.\n\n Own Id: OTP-17288 Aux Id: PR-4581\n\n- A logger warning is now issues when too many arguments are given to `-name` or\n `-sname`. Example: `erl -name a b`.\n\n Own Id: OTP-17315 Aux Id: GH-4626\n\n- The cache used by `inet_res` now, again, can handle multiple IP addresses per\n domain name, and thus fixes a bug introduced in PR-3041 (OTP-13126) and\n PR-2891 (OTP-14485).\n\n Own Id: OTP-17344 Aux Id: PR-4633, GH-4631, OTP-14485, OTP-12136\n\n- Sockets created with socket:accept not counted (socket:info/0).\n\n Own Id: OTP-17372\n\n- The `{fd, Fd}` option to `gen_tcp:listen/2` did not work for `inet_backend`\n `socket`, which has been fixed.\n\n Own Id: OTP-17374 Aux Id: PR-4787, GH-4680, PR-2989, OTP-17216","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The cache used by the DNS resolver `inet_res` has been improved to use ETS\n lookups instead of server calls. This is a considerable speed improvement for\n cache hits.\n\n Own Id: OTP-13126 Aux Id: PR-3041\n\n- The cache ETS table type for the internal DNS resolver `inet_res` has changed\n type (internally) to get better speed and atomicity.\n\n Own Id: OTP-14485 Aux Id: PR-2891\n\n- The experimental `socket` module can now use any protocol (by name) the OS\n supports. Suggested in PR-2641, implemented in PR-2670.\n\n Own Id: OTP-14601 Aux Id: PR-2641, PR-2670, OTP-16749\n\n- The DNS resolver `inet_res` has been updated to support CAA (RFC 6844) and URI\n (RFC 7553) records.\n\n Own Id: OTP-16517 Aux Id: PR-2827\n\n- A compatibility adaptor for `gen_tcp` to use the new `socket` API has been\n implemented (`gen_tcp_socket`). Used when setting the kernel application\n variable `inet_backend = socket`.\n\n Own Id: OTP-16611 Aux Id: OTP-16749\n\n- Extended error information for failing BIF calls as proposed in\n [EEP 54](https://github.com/erlang/eep/blob/master/eeps/eep-0054.md) has been\n implemented.\n\n When a BIF call from the Erlang shell fails, more information about which\n argument or arguments that were in error will be printed. The same extended\n error information will by `proc_lib`, `common_test`, and `qlc` when BIF calls\n fail.\n\n For applications that wish to provide the same extended error information,\n there are new functions `erl_error:format_exception/3` and\n `erl_error:format_exception/4`.\n\n There is a new [`error/3`](`error/3`) BIF that allows applications or\n libraries to provide extended error information in the same way for their own\n exceptions.\n\n Own Id: OTP-16686\n\n- The file server can now be bypassed in `file:delete/1,2` with the `raw`\n option.\n\n Own Id: OTP-16698 Aux Id: PR-2634\n\n- An example implementation of Erlang distribution over UDS using distribution\n processes has been introduced.\n\n Thanks to Jérôme de Bretagne\n\n Own Id: OTP-16703 Aux Id: PR-2620\n\n- The [_process alias_](`e:system:ref_man_processes.md#process-aliases`) feature\n as outlined by\n [EEP 53](https://github.com/erlang/eep/blob/master/eeps/eep-0053.md) has been\n introduced. It is introduced in order to provide a lightweight mechanism that\n can prevent late replies after timeout or connection loss. For more\n information, see EEP 53 and the documentation of the new\n [`alias/1`](`erlang:alias/1`) BIF and the new options to the\n [`monitor/3`](`erlang:monitor/3`) BIF.\n\n The `call` operation in the framework used by `gen_server`, `gen_statem`, and\n `gen_event` has been updated to utilize alias in order to prevent late\n responses. The `gen_statem` behavior still use a proxy process in the\n distributed case, since it has always prevented late replies and aliases won't\n work against pre OTP 24 nodes. The proxy process can be removed in OTP 26.\n\n The alias feature also made it possible to introduce new functions similar to\n the [`erpc:receive_response()`](`erpc:receive_response/2`) function in the gen\n behaviors, so the new functions\n [`gen_server:receive_response()`](`gen_server:receive_response/2`),\n [`gen_statem:receive_response()`](`gen_statem:receive_response/2`),\n [`gen_event:receive_response()`](`gen_event:receive_response/2`) have also\n been introduced.\n\n Own Id: OTP-16718 Aux Id: PR-2735\n\n- The experimental new socket API has been further developed. Some backwards\n incompatible changes with respect to OTP 23 have been made.\n\n The control message format has been changed so a decoded value is now in the\n 'value' field instead of in the 'data' field. The 'data' field now always\n contains binary data.\n\n Some type names have been changed regarding message headers and control\n message headers.\n\n `socket:bind/2` now returns plain `ok` instead of `{ok, Port}` which was only\n relevant for the `inet` and `inet6` address families and often not\n interesting. To find out which port was chosen use `socket:sockname/1`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16749 Aux Id: OTP-14601\n\n- New function `os:env/0` returns all OS environment variables as a list of\n 2-tuples.\n\n Own Id: OTP-16793 Aux Id: ERL-1332, PR-2740\n\n- Remove the support for distributed disk logs. The new function\n `disk_log:all/0` is to be used instead of `disk_log:accessible_logs/0`. The\n function `disk_log:close/1` is to be used instead of `disk_log:lclose/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16811\n\n- Expand the spec for `erl_epmd:listen_port_please/2` to mirror\n `erl_epmd:port_please/2`.\n\n Own Id: OTP-16947 Aux Id: PR-2781\n\n- A new erl parameter for specifying a file descriptor with configuration data\n has been added. This makes it possible to pass the parameter \"-configfd FD\"\n when executing the erl command. When this option is given, the system will try\n to read and parse configuration parameters from the file descriptor.\n\n Own Id: OTP-16952\n\n- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963\n\n- The `pg2` module has been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16968\n\n- Accept references up to a size of 160-bits from remote nodes. This is the\n first step in an upgrade path toward using references up to 160-bits in a\n future OTP release.\n\n Own Id: OTP-17005 Aux Id: OTP-16718\n\n- Allow utf-8 binaries as parts of logger_formatter template.\n\n Own Id: OTP-17015\n\n- Let `disk_log:open/1` change the size if a wrap log is opened for the first\n time, that is, the disk log process does not exist, and the value of option\n `size` does not match the current size of the disk log.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17062 Aux Id: ERL-1418, GH-4469, ERIERL-537\n\n- Allow the shell history of an erlang node to be fetched and stores using a\n custom callback module. See `shell_history` configuration parameter in the\n [kernel documentation](kernel_app.md) for more details.\n\n Own Id: OTP-17103 Aux Id: PR-2949\n\n- The simple logger (used to log events that happen before kernel has been\n started) has been improved to print prettier error messages.\n\n Own Id: OTP-17106 Aux Id: PR-2885\n\n- `socket:sendfile/2,3,4,5` has been implemented, for platforms that support the\n underlying socket library call.\n\n Own Id: OTP-17154 Aux Id: OTP-16749\n\n- Add socket monitor(s) for all types sockets.\n\n Own Id: OTP-17155\n\n- Fix various issues with the gen_tcp_socket. Including documenting some\n incompatibilities.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17156\n\n- inet:i/0 now also shows existing gen_tcp compatibility sockets (based on\n 'socket').\n\n Own Id: OTP-17157\n\n- Added support in logger for setting primary metadata. The primary metadata is\n passed as a base metadata to all log events in the system. See\n [Metadata](logger_chapter.md#metadata) in the Logger chapter of the Kernel\n User's Guide for more details.\n\n Own Id: OTP-17181 Aux Id: PR-2457\n\n- Recognize new key 'optional_applications' in application resource files.\n\n Own Id: OTP-17189 Aux Id: PR-2675\n\n- The `Fun`'s passed to logger:log/2,3,4 can now return metadata that will only\n be fetched when needed. See [`logger:log/2,3,4`](`logger:log/2`) for more\n details.\n\n Own Id: OTP-17198 Aux Id: PR-2721\n\n- `erpc:multicall()` has been rewritten to be able to utilize the newly\n introduced and improved selective receive optimization.\n\n Own Id: OTP-17201 Aux Id: PR-4534\n\n- Add utility fiunction inet:info/1 to provide miscellaneous info about a\n socket.\n\n Own Id: OTP-17203 Aux Id: OTP-17156\n\n- The behaviour for `gen_tcp:connect/3,4` has been changed to not per default\n bind to an address, which allows the network stack to delay the address and\n port selection to when the remote address is known. This allows better port\n re-use, and thus enables far more outgoing connections, since the ephemeral\n port range no longer has to be a hard limit.\n\n There is a theoretical possibility that this behaviour change can affect the\n set of possible error values, or have other small implications on some\n platforms.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17216 Aux Id: PR-2989\n\n- An option `{nxdomain_reply, boolean()}` has been implemented in the DNS\n resolver `inet_res`. It is useful since an `nxdomain` error from a name server\n does contain the SOA record if the domain exists at all. This record is useful\n to determine a TTL for negative caching of the failed entry.\n\n Own Id: OTP-17266 Aux Id: PR-4564\n\n- Optimized lookup of local processes part of groups in `pg`.\n\n Own Id: OTP-17284 Aux Id: PR-4615\n\n- The return values from module `socket` functions `send()`, `sendto()`,\n `sendmsg()`, `sendfile()` and `recv()` has been changed to return a tuple\n tagged with `select` when a `SelectInfo` was returned, and not sometimes\n tagged with `ok`.\n\n This is a backwards incompatible change that improves usability for code using\n asynchronous operations.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17355 Aux Id: OTP-17154\n\n- Fixed warnings in code matching on underscore prefixed variables.\n\n Own Id: OTP-17385 Aux Id: OTP-17123","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 7.3.1.7 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1-7"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A new function `global:disconnect/0` has been introduced with which one can\n cleanly disconnect a node from all other nodes in a cluster of `global` nodes.\n\n Own Id: OTP-18232 Aux Id: OTP-17843, PR-6264","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 7.3.1.6 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A call to [`net_kernel:setopts(new, Opts)`](`net_kernel:setopts/2`) at the\n same time as a connection was being set up could cause a deadlock between the\n `net_kernel` process and the process setting up the connection.\n\n Own Id: OTP-18198 Aux Id: GH-6129, PR-6216","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 7.3.1.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- By default `global` does _not_ take any actions to restore a fully connected\n network when connections are lost due to network issues. This is problematic\n for all applications expecting a fully connected network to be provided, such\n as for example `mnesia`, but also for `global` itself. A network of\n overlapping partitions might cause the internal state of `global` to become\n inconsistent. Such an inconsistency can remain even after such partitions have\n been brought together to form a fully connected network again. The effect on\n other applications that expects that a fully connected network is maintained\n may vary, but they might misbehave in very subtle hard to detect ways during\n such a partitioning.\n\n In order to prevent such issues, we have introduced a _prevent overlapping\n partitions_ fix which can be enabled using the\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n `kernel(6)` parameter. When this fix has been enabled, `global` will actively\n disconnect from nodes that reports that they have lost connections to other\n nodes. This will cause fully connected partitions to form instead of leaving\n the network in a state with overlapping partitions. Note that this fix _has_\n to be enabled on _all_ nodes in the network in order to work properly. Since\n this quite substantially changes the behavior, this fix is currently disabled\n by default. Since you might get hard to detect issues without this fix you\n are, however, _strongly_ advised to enable this fix in order to avoid issues\n such as the ones described above. As of OTP 25 this fix will become enabled by\n default.\n\n Own Id: OTP-17843 Aux Id: ERIERL-732, PR-5611\n\n- Fix failed accepted connection setup after previous established connection\n from same node closed down silently.\n\n Own Id: OTP-17979 Aux Id: ERIERL-780","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A [`net_tickintensity`](kernel_app.md#net_tickintensity) `kernel` parameter\n has been introduced. It can be used to control the amount of ticks during a\n [`net_ticktime`](kernel_app.md#net_ticktime) period.\n\n A new `net_kernel:start/2` function has also been introduced in order to make\n it easier to add new options. The use of `net_kernel:start/1` has been\n deprecated.\n\n Own Id: OTP-17905 Aux Id: ERIERL-732, PR-5740","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 7.3.1.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Parsing of the result value in the native DNS resolver has been made more\n defensive against incorrect results.\n\n Own Id: OTP-17578 Aux Id: ERIERL-683","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 7.3.1.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix code:get_doc/1 to not crash when module is located in an escript.\n\n Own Id: OTP-17570 Aux Id: PR-5139 GH-4256 ERL-1261","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 7.3.1.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Handling of the \".\" domain as a search domain was incorrect and caused a crash\n in the DNS resolver `inet_res`, which has now been fixed.\n\n Own Id: OTP-17473 Aux Id: GH-4838, OTP-17439\n\n- Fixed rare bug that could cause net_kernel process to hang for ever. Have seen\n to happen with massive number of TLS connections while remote nodes are\n restarting. Bug exists since OTP-22.0.\n\n Own Id: OTP-17476 Aux Id: GH-4931, PR-4934","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 7.3.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix a race condition in Global.\n\n Own Id: OTP-16033 Aux Id: ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 7.3.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug in the Erlang DNS resolver has been fixed, where it could be made to\n bring down the kernel supervisor and thereby the whole node, when getting an\n incorrect (IN A reply to an IN CNAME query) reply from the DNS server and used\n the reply record's value without verifying its type.\n\n Own Id: OTP-17361","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 7.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The range check for compression pointers in DNS encoding was faulty, which\n caused incorrect label compression encoding for very large DNS messages;\n larger than about 16 kBytes, such as AXFR responses. This more than 11 year\n old bug has now been corrected.\n\n Own Id: OTP-13641 Aux Id: PR-2959\n\n- Fix of internal links in the `erpc` documentation.\n\n Own Id: OTP-17202 Aux Id: PR-4516\n\n- Fix bug where complex seq_trace tokens (that is lists, tuples, maps etc) could\n becomes corrupted by the GC. The bug was introduced in OTP-21.\n\n Own Id: OTP-17209 Aux Id: PR-3039\n\n- When running Xref in the `modules` mode, the Debugger application would show\n up as a dependency for the Kernel applications.\n\n Own Id: OTP-17223 Aux Id: GH-4546, PR-4554","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- `m:erl_epmd` (the epmd client) will now try to reconnect to the local EPMD if\n the connection is broken.\n\n Own Id: OTP-17178 Aux Id: PR-3003","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 7.2.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- When using the DNS resolver option `servfail_retry_timeout` it did not honour\n the overall call time-out in e.g `inet_res:getbyname/3`. This misbehaviour has\n now been fixed. Also, the `servfail_retry_timeout` behaviour has been improved\n to only be enforced for servers that gives a servfail answer.\n\n Own Id: OTP-12960 Aux Id: ERIERL-598, PR-4509","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 7.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The `apply` call's in `logger.hrl` are now called with `erlang` prefix to\n avoid clashed with local [`apply/3`](`apply/3`) functions.\n\n Own Id: OTP-16976 Aux Id: PR-2807\n\n- Fix memory leak in `pg`.\n\n Own Id: OTP-17034 Aux Id: PR-2866\n\n- Fix crash in `logger_proxy` due to stray `gen_server:call` replies not being\n handled. The stray replies come when logger is under heavy load and the flow\n control mechanism is reaching its limit.\n\n Own Id: OTP-17038\n\n- Fixed a bug in `erl_epmd:names()` that caused it to return the illegal return\n value `noport` instead of `{error, Reason}` where `Reason` is the actual error\n reason. This bug also propagated to `net_adm:names()`.\n\n This bug was introduced in `kernel` version 7.1 (OTP 23.1).\n\n Own Id: OTP-17054 Aux Id: ERL-1424","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add export of some resolver documented types.\n\n Own Id: OTP-16954 Aux Id: ERIERL-544\n\n- Add configurable retry timeout for resolver lookups.\n\n Own Id: OTP-16956 Aux Id: ERIERL-547\n\n- `gen_server:multi_call()` has been optimized in the special case of only\n calling the local node with timeout set to `infinity`.\n\n Own Id: OTP-17058 Aux Id: PR-2887","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 7.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A fallback has been implemented for file:sendfile when using inet_backend\n socket\n\n Own Id: OTP-15187 Aux Id: ERL-1293\n\n- Make default TCP distribution honour option `backlog` in\n `inet_dist_listen_options`.\n\n Own Id: OTP-16694 Aux Id: PR-2625\n\n- Raw option handling for the experimental `gen_tcp_socket` backend was broken\n so that all raw options were ignored by for example `gen_tcp:listen/2`, a bug\n that now has been fixed. Reported by Jan Uhlig.\n\n Own Id: OTP-16743 Aux Id: ERL-1287\n\n- Accept fails with inet-backend socket.\n\n Own Id: OTP-16748 Aux Id: ERL-1284\n\n- Fixed various minor errors in the socket backend of gen_tcp.\n\n Own Id: OTP-16754\n\n- Correct `disk_log:truncate/1` to count the header. Also correct the\n documentation to state that `disk_log:truncate/1` can be used with external\n disk logs.\n\n Own Id: OTP-16768 Aux Id: ERL-1312\n\n- Fix erl_epmd:port_please/2,3 type specs to include all possible error values.\n\n Own Id: OTP-16783\n\n- Fix `erl -erl_epmd_port` to work properly. Before this fix it did not work at\n all.\n\n Own Id: OTP-16785\n\n- Fix typespec for internal function `erlang:seq_trace_info/1` to allow\n `t:term/0` as returned label. This in turn fixes so that calls to\n `seq_trace:get_token/1` can be correctly analyzer by dialyzer.\n\n Own Id: OTP-16823 Aux Id: PR-2722\n\n- Fix erroneous double registration of processes in `pg` when distribution is\n dynamically started.\n\n Own Id: OTP-16832 Aux Id: PR-2738","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Make (use of) the socket registry optional (still enabled by default). Its now\n possible to build OTP with the socket registry turned off, turn it off by\n setting an environment variable and controlling in runtime (via function calls\n and arguments when creating sockets).\n\n Own Id: OTP-16763\n\n- `erl -remsh nodename` no longer requires the hostname to be given when used\n together with dynamic nodenames.\n\n Own Id: OTP-16784","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 7.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-7-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix race condition during shutdown when `shell_history` is enabled. The race\n condition would trigger crashes in `disk_log`.\n\n Own Id: OTP-16008 Aux Id: PR-2302\n\n- Fix the Erlang distribution to handle the scenario when a node connects that\n can handle message fragmentation but can not handle the atom cache. This bug\n only affects users that have implemented a custom distribution carrier. It has\n been present since OTP-21.\n\n The `DFLAG_FRAGMENT` distribution flag was added to the set of flags that can\n be rejected by a distribution implementation.\n\n Own Id: OTP-16284\n\n- Fix bug where a binary was not allowed to be the format string in calls to\n `logger:log`.\n\n Own Id: OTP-16395 Aux Id: PR-2444\n\n- Fix bug where `logger` would end up in an infinite loop when trying to log the\n crash of a handler or formatter.\n\n Own Id: OTP-16489 Aux Id: ERL-1134\n\n- `code:lib_dir/1` has been fixed to also return the lib dir for `erts`.\n\n This is been marked as an incompatibility for any application that depended on\n `{error,bad_name}` to be returned for `erts`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16502\n\n- The application `stop/1` callback was not called if the application master of\n the application terminated.\n\n Own Id: OTP-16504 Aux Id: PR-2328\n\n- Fix bug in `application:loaded_applications/0` that could cause it to fail\n with `badarg` if for example a concurrent upgrade/downgrade is running.\n\n Own Id: OTP-16627 Aux Id: PR-2601","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A new module `m:erpc` has been introduced in the `kernel` application. The\n `erpc` module implements an enhanced subset of the operations provided by the\n `m:rpc` module. Enhanced in the sense that it makes it possible to distinguish\n between returned value, raised exceptions, and other errors. `erpc` also has\n better performance and scalability than the original `rpc` implementation.\n This by utilizing the newly introduced\n [`spawn_request()`](`erlang:spawn_request/5`) BIF. Also the `rpc` module\n benefits from these improvements by utilizing `erpc` when it is possible.\n\n This change has been marked as a potential incompatibility since\n [`rpc:block_call()`](`rpc:block_call/5`) now only is guaranteed to block other\n `block_call()` operations. The documentation previously claimed that it would\n block all `rpc` operations. This has however never been the case. It\n previously did not block node-local `block_call()` operations.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13450 Aux Id: OTP-15251\n\n- A client node can receive its node name dynamically from the node that it\n first connects to. This featured can by used by\n\n - starting with `erl -sname undefined`\n - erl_interface functions `ei_connect_init` and friends\n - `erl_call -R`\n\n Own Id: OTP-13812\n\n- Improved the printout of single line logger events for most of the OTP\n behaviours in STDLIB and Kernel. This includes `proc_lib`, `gen_server`,\n `gen_event`, `gen_statem`, `gen_fsm`, `supervisor`, `supervisor_bridge` and\n `application`.\n\n Improved the [`chars_limit`](`m:logger_formatter#chars_limit`) and\n [`depth`](`m:logger_formatter#depth`) handling in `proc_lib` and when\n formatting of exceptions.\n\n Own Id: OTP-15299\n\n- Remove usage and documentation of old requests of the I/O-protocol.\n\n Own Id: OTP-15695\n\n- Directories can now be opened by `file:open/2` when passing the `directory`\n option.\n\n Own Id: OTP-15835 Aux Id: PR-2212\n\n- The check of whether to log or not based on the log level in `logger` has been\n optimized by using `persistent_term` to store the log level.\n\n Own Id: OTP-15948 Aux Id: PR-2356\n\n- `file:read_file_info/2` can now be used on opened files and directories.\n\n Own Id: OTP-15956 Aux Id: PR-2231\n\n- The `-config` option to `erl` now can take multiple config files without\n repeating the `-config` option. Example:\n\n erl -config sys local\n\n Own Id: OTP-16148 Aux Id: PR-2373\n\n- Improved node connection setup handshake protocol. Made possible to agree on\n protocol version without dependence on `epmd` or other prior knowledge of peer\n node version. Also added exchange of node incarnation (\"creation\") values and\n expanded the distribution capability flag field from 32 to 64 bits.\n\n Own Id: OTP-16229\n\n- The possibility to run Erlang distribution without relying on EPMD has been\n extended. To achieve this a couple of new options to the inet distribution has\n been added.\n\n - **\\-dist_listen false** - Setup the distribution channel, but do not listen\n for incoming connection. This is useful when you want to use the current\n node to interact with another node on the same machine without it joining\n the entire cluster.\n\n - **\\-erl_epmd_port Port** - Configure a default port that the built-in EPMD\n client should return. This allows the local node to know the port to connect\n to for any other node in the cluster.\n\n The `erl_epmd` callback API has also been extended to allow returning `-1` as\n the creation which means that a random creation will be created by the node.\n\n In addition a new callback function called `listen_port_please` has been added\n that allows the callback to return which listen port the distribution should\n use. This can be used instead of `inet_dist_listen_min/max` if the listen port\n is to be fetched from an external service.\n\n Own Id: OTP-16250\n\n- A first EXPERIMENTAL module that is a `socket` backend to `gen_tcp` and `inet`\n has been implemented. Others will follow. Feedback will be appreciated.\n\n Own Id: OTP-16260 Aux Id: OTP-15403\n\n- The new experimental `socket` module has been moved to the Kernel application.\n\n Own Id: OTP-16312\n\n- Replace usage of deprecated function in the `group` module.\n\n Own Id: OTP-16345\n\n- Minor updates due to the new spawn improvements made.\n\n Own Id: OTP-16368 Aux Id: OTP-15251\n\n- Update of [sequential tracing](`m:seq_trace#whatis`) to also support other\n information transfers than message passing.\n\n Own Id: OTP-16370 Aux Id: OTP-15251, OTP-15232\n\n- `code:module_status/1` now accepts a list of modules. `code:module_status/0`,\n which returns the statuses for all loaded modules, has been added.\n\n Own Id: OTP-16402\n\n- `filelib:wildcard/1,2` is now twice as fast when a double star (`**`) is part\n of the pattern.\n\n Own Id: OTP-16419\n\n- A new implementation of distributed named process groups has been introduced.\n It is available in the `m:pg` module.\n\n Note that this `pg` module only has the name in common with the experimental\n `pg` module that was present in `stdlib` up until OTP 17.\n\n Thanks to Maxim Fedorov for the implementation.\n\n Own Id: OTP-16453 Aux Id: PR-2524\n\n- The `pg2` module has been deprecated. It has also been scheduled for removal\n in OTP 24.\n\n You are advised to replace the usage of `pg2` with the newly introduced `m:pg`\n module. `pg` has a similar API, but with a more scalable implementation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16455\n\n- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469\n\n- The internal hosts file resolver cache `inet_hosts` has been rewritten to\n behave better when the hosts file changes. For example the cache is updated\n per entry instead of cleared and reloaded so lookups do not temporarily fail\n during reloading, and; when multiple processes simultaneously request reload\n these are now folded into one instead of all done in sequence. Reported and\n first solution suggestion by Maxim Fedorov.\n\n Own Id: OTP-16487 Aux Id: PR-2516\n\n- Add `code:all_available/0` that can be used to get all available modules.\n\n Own Id: OTP-16494\n\n- As of OTP 23, the distributed `m:disk_log` feature has been deprecated. It has\n also been scheduled for removal in OTP 24.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16495\n\n- Add the function `code:fetch_docs/1` for fetching embedded documentation for\n aa Erlang module.\n\n Own Id: OTP-16499\n\n- Improve configure for the net nif, which should increase portability.\n\n Own Id: OTP-16530 Aux Id: OTP-16464\n\n- socket: Socket counters and socket global counters are now represented as maps\n (instead of property lists).\n\n Own Id: OTP-16535\n\n- The experimental socket module has gotten restrictions removed so now the\n 'seqpacket' socket type should work for any communication domain (protocol\n family) where the OS supports it, typically the Unix Domain.\n\n Own Id: OTP-16550 Aux Id: ERIERL-476\n\n- Allow using custom IO devices in `logger_std_h`.\n\n Own Id: OTP-16563 Aux Id: PR-2523\n\n- Added `file:del_dir_r/1` which deletes a directory together with all of its\n contents, similar to `rm -rf` on Unix systems.\n\n Own Id: OTP-16570 Aux Id: PR-2565\n\n- socket: By default the socket options rcvtimeo and sndtimeo are now disabled.\n To enable these, OTP now has to be built with the configure option\n --enable-esock-rcvsndtimeo\n\n Own Id: OTP-16620\n\n- The experimental gen_tcp compatibility code utilizing the socket module could\n loose buffered data when receiving a specified number of bytes. This bug has\n been fixed. Reported by Maksim Lapshin on bugs.erlang.org ERL-1234\n\n Own Id: OTP-16632 Aux Id: ERL-1234","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.5.2.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5-2-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- By default `global` does _not_ take any actions to restore a fully connected\n network when connections are lost due to network issues. This is problematic\n for all applications expecting a fully connected network to be provided, such\n as for example `mnesia`, but also for `global` itself. A network of\n overlapping partitions might cause the internal state of `global` to become\n inconsistent. Such an inconsistency can remain even after such partitions have\n been brought together to form a fully connected network again. The effect on\n other applications that expects that a fully connected network is maintained\n may vary, but they might misbehave in very subtle hard to detect ways during\n such a partitioning.\n\n In order to prevent such issues, we have introduced a _prevent overlapping\n partitions_ fix which can be enabled using the\n `prevent_overlapping_partitions` `kernel(6)` parameter. When this fix has been\n enabled, `global` will actively disconnect from nodes that reports that they\n have lost connections to other nodes. This will cause fully connected\n partitions to form instead of leaving the network in a state with overlapping\n partitions. Note that this fix _has_ to be enabled on _all_ nodes in the\n network in order to work properly. Since this quite substantially changes the\n behavior, this fix is currently disabled by default. Since you might get hard\n to detect issues without this fix you are, however, _strongly_ advised to\n enable this fix in order to avoid issues such as the ones described above. As\n of OTP 25 this fix will become enabled by default.\n\n Own Id: OTP-17843 Aux Id: ERIERL-732, PR-5611","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A `net_tickintensity` `kernel` parameter has been introduced. It can be used\n to control the amount of ticks during a `net_ticktime` period.\n\n A new `net_kernel:start/2` function has also been introduced in order to make\n it easier to add new options. The use of `net_kernel:start/1` has been\n deprecated.\n\n Own Id: OTP-17905 Aux Id: ERIERL-732, PR-5740","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.5.2.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5-2-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed rare bug that could cause net_kernel process to hang for ever. Have seen\n to happen with massive number of TLS connections while remote nodes are\n restarting. Bug exists since OTP-22.0.\n\n Own Id: OTP-17476 Aux Id: GH-4931, PR-4934","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.5.2.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5-2-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix a race condition in Global.\n\n Own Id: OTP-16033 Aux Id: ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.5.2.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- When running Xref in the `modules` mode, the Debugger application would show\n up as a dependency for the Kernel applications.\n\n Own Id: OTP-17223 Aux Id: GH-4546, PR-4554","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.5.2.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix bug in `application:loaded_applications/0` that could cause it to fail\n with `badarg` if for example a concurrent upgrade/downgrade is running.\n\n Own Id: OTP-16627 Aux Id: PR-2601","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.5.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The DNS resolver \\`inet_res\\` has been fixed to return the last intermediate\n error when subsequent requests times out.\n\n Own Id: OTP-16414 Aux Id: ERIERL-452\n\n- The prim_net nif (net/kernel) made use of an undefined atom, notsup. This has\n now been corrected.\n\n Own Id: OTP-16440\n\n- Fix a crash when attempting to log faults when loading files during early\n boot.\n\n Own Id: OTP-16491\n\n- Fix crash in logger when logging to a remote node during boot.\n\n Own Id: OTP-16493 Aux Id: ERIERL-459","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Improved `net_kernel` debug functionality.\n\n Own Id: OTP-16458 Aux Id: PR-2525","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.5.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The 'socket state' info provided by the inet info function has been improved\n\n Own Id: OTP-16043 Aux Id: ERL-1036\n\n- Fix bug where `logger` would crash when starting when a very large log file\n needed to be rotated and compressed.\n\n Own Id: OTP-16145 Aux Id: ERL-1034\n\n- Fixed a bug causing actual nodedown reason reported by\n [`net_kernel:monitor_nodes(true, [nodedown_reason])`](`net_kernel:monitor_nodes/2`)\n to be lost and replaced by the reason `killed`.\n\n Own Id: OTP-16216\n\n- The documentation for `rpc:call/4,5/` has been updated to describe what\n happens when the called function throws or return an `'EXIT'` tuple.\n\n Own Id: OTP-16279 Aux Id: ERL-1066","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The type specification for `gen_sctp:connect/4,5` has been corrected.\n\n Own Id: OTP-15344 Aux Id: ERL-947\n\n- Extra `-mode` flags given to `erl` are ignored with a warning.\n\n Own Id: OTP-15852\n\n- Fix type spec for `seq_trace:set_token/2`.\n\n Own Id: OTP-15858 Aux Id: ERL-700\n\n- `logger:compare_levels/2` would fail with a `badarg` exception if given the\n values `all` or `none` as any of the parameters. This is now corrected.\n\n Own Id: OTP-15942 Aux Id: PR-2301\n\n- Fix bug where the log file in `logger_std_h` would not be closed when the\n inode of the file changed. This would in turn cause a file descriptor leak\n when tools like logrotate are used.\n\n Own Id: OTP-15997 Aux Id: PR-2331\n\n- Fix a race condition in the debugging function `net_kernel:nodes_info/0`.\n\n Own Id: OTP-16022\n\n- Fix race condition when closing a file opened in `compressed` or\n `delayed_write` mode.\n\n Own Id: OTP-16023","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The possibility to send ancillary data, in particular the TOS field, has been\n added to `gen_udp:send/4,5`.\n\n Own Id: OTP-15747 Aux Id: ERIERL-294\n\n- If the log file was given with relative path, the standard logger handler\n (`logger_std_h`) would store the file name with relative path. If the current\n directory of the node was later changed, a new file would be created relative\n the new current directory, potentially failing with an `enoent` if the new\n directory did not exist. This is now corrected and `logger_std_h` always\n stores the log file name as an absolute path, calculated from the current\n directory at the time of the handler startup.\n\n Own Id: OTP-15850\n\n- Support local sockets with inet:i/0.\n\n Own Id: OTP-15935 Aux Id: PR-2299","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- `user`/`user_drv` could respond to io requests before they had been processed,\n which could cause data to be dropped if the emulator was halted soon after a\n call to `io:format/2`, such as in an escript.\n\n Own Id: OTP-15805","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix so that when multiple `-sname` or `-name` are given to `erl` the first one\n is chosen. Before this fix distribution was not started at all when multiple\n name options were given.\n\n Own Id: OTP-15786 Aux Id: ERL-918\n\n- Fix `inet_res` configuration pointing to non-existing files to work again.\n This was broken in KERNEL-6.3 (OTP-21.3).\n\n Own Id: OTP-15806","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A simple socket API is provided through the socket module. This is a low level\n API that does _not_ replace gen\\_\\[tcp|udp|sctp]. It is intended to\n _eventually_ replace the inet driver, but not the high level gen-modules\n (gen_tcp, gen_udp and gen_sctp). It also provides a basic API that facilitates\n the implementation of other protocols, that is TCP, UDP and SCTP.\n\n Known issues are; No support for the Windows OS (currently).\n\n Own Id: OTP-14831\n\n- Improved the documentation for the linger option.\n\n Own Id: OTP-15491 Aux Id: PR-2019\n\n- Global no longer tries more than once when connecting to other nodes.\n\n Own Id: OTP-15607 Aux Id: ERIERL-280\n\n- The dist messages EXIT, EXIT2 and MONITOR_DOWN have been updated with new\n versions that send the reason term as part of the payload of the message\n instead of as part of the control message.\n\n The old versions are still present and can be used when communicating with\n nodes that don't support the new versions.\n\n Own Id: OTP-15611\n\n- Kernel configuration parameter `start_distribution = boolean()` is added. If\n set to `false`, the system is started with all distribution functionality\n disabled. Defaults to `true`.\n\n Own Id: OTP-15668 Aux Id: PR-2088\n\n- In OTP-21.3, a warning was introduced for duplicated applications/keys in\n configuration. This warning would be displayed both when the configuration was\n given as a file on system start, and during runtime via\n `application:set_env/1,2`.\n\n The warning is now changed to a `badarg` exception in\n `application:set_env/1,2`. If the faulty configuration is given in a\n configuration file on system start, the startup will fail.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15692 Aux Id: PR-2170","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.3.1.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-3-1-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix bug where the log file in `logger_std_h` would not be closed when the\n inode of the file changed. This would in turn cause a file descriptor leak\n when tools like logrotate are used.\n\n Own Id: OTP-15997 Aux Id: PR-2331","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.3.1.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-3-1-2"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The possibility to send ancillary data, in particular the TOS field, has been\n added to `gen_udp:send/4,5`.\n\n Own Id: OTP-15747 Aux Id: ERIERL-294","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.3.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-3-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix type spec for `seq_trace:set_token/2`.\n\n Own Id: OTP-15858 Aux Id: ERL-700","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.3.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed a performance regression when reading files opened with the `compressed`\n flag.\n\n Own Id: OTP-15706 Aux Id: ERIERL-336","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- If for example the `/etc/hosts` did not come into existence until after the\n kernel application had started, its content was never read. This bug has now\n been corrected.\n\n Own Id: OTP-14702 Aux Id: PR-2066\n\n- Fix bug where doing `seq_trace:reset_trace()` while another process was doing\n a garbage collection could cause the run-time system to segfault.\n\n Own Id: OTP-15490\n\n- Fix `erl_epmd:port_please` spec to include `t:atom/0` and `t:string/0`.\n\n Own Id: OTP-15557 Aux Id: PR-2117\n\n- The Logger handler logger_std_h now keeps track of the inode of its log file\n in order to re-open the file if the inode changes. This may happen, for\n instance, if the log file is opened and saved by an editor.\n\n Own Id: OTP-15578 Aux Id: ERL-850\n\n- When user specific file modes are given to the logger handler `logger_std_h`,\n they were earlier accepted without any control. This is now changes, so Logger\n will adjust the file modes as follows:\n\n \\- If `raw` is not found in the list, it is added. \n \\- If none of `write`, `append` or `exclusive` are found in the list, `append`\n is added. \n \\- If none of `delayed_write` or `{delayed_write,Size,Delay}` are found in the\n list, `delayed_write` is added.\n\n Own Id: OTP-15602","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The standard logger handler, `logger_std_h`, now has a new internal feature\n for log rotation. The rotation scheme is as follows:\n\n The log file to which the handler currently writes always has the same name,\n i.e. the name which is configured for the handler. The archived files have the\n same name, but with extension \".N\", where N is an integer. The newest archive\n has extension \".0\", and the oldest archive has the highest number.\n\n The size at which the log file is rotated, and the number of archive files\n that are kept, is specified with the handler specific configuration parameters\n `max_no_bytes` and `max_no_files` respectively.\n\n Archives can be compressed, in which case they get a \".gz\" file extension\n after the integer. Compression is specified with the handler specific\n configuration parameter `compress_on_rotate`.\n\n Own Id: OTP-15479\n\n- The new functions `logger:i/0` and `logger:i/1` are added. These provide the\n same information as `logger:get_config/0` and other `logger:get_*_config`\n functions, but the information is more logically sorted and more readable.\n\n Own Id: OTP-15600\n\n- Logger is now protected against overload due to massive amounts of log events\n from the emulator or from remote nodes.\n\n Own Id: OTP-15601\n\n- Logger now uses os:system_time/1 instead of erlang:system_time/1 to generate\n log event timestamps.\n\n Own Id: OTP-15625\n\n- Add functions `application:set_env/1,2` and `application:set_env/2`. These\n take a list of application configuration parameters, and the behaviour is\n equivalent to calling `application:set_env/4` individually for each\n application/key combination, except it is more efficient.\n\n `set_env/1,2` warns about duplicated applications or keys. The warning is also\n emitted during boot, if applications or keys are duplicated within one\n configuration file, e.g. sys.config.\n\n Own Id: OTP-15642 Aux Id: PR-2164\n\n- Handler specific configuration parameters for the standard handler\n `logger_std_h` are changed to be more intuitive and more similar to the\n disk_log handler.\n\n Earlier there was only one parameter, `type`, which could have the values\n `standard_io`, `standard_error`, `{file,FileName}` or `{file,FileName,Modes}`.\n\n This is now changed, so the following parameters are allowed:\n\n `type = standard_io | standard_error | file` \n `file = file:filename()` \n `modes = [file:mode()]`\n\n All parameters are optional. `type` defaults to `standard_io`, unless a file\n name is given, in which case it defaults to `file`. If `type` is set to\n `file`, the file name defaults to the same as the handler id.\n\n The potential incompatibility is that `logger:get_config/0` and\n `logger:get_handler_config/1` now returns the new parameters, even if the\n configuration was set with the old variant, e.g. `#{type=>{file,FileName}}`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15662\n\n- The new configuration parameter `file_check` is added to the Logger handler\n `logger_std_h`. This parameter specifies how long (in milliseconds) the\n handler may wait before checking if the log file still exists and the inode is\n the same as when it was opened.\n\n The default value is 0, which means that this check is done prior to each\n write operation. Setting a higher number may improve performance, but adds the\n risk of losing log events.\n\n Own Id: OTP-15663","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.2.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-2-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Setting the `recbuf` size of an inet socket the `buffer` is also automatically\n increased. Fix a bug where the auto adjustment of inet buffer size would be\n triggered even if an explicit inet buffer size had already been set.\n\n Own Id: OTP-15651 Aux Id: ERIERL-304","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A new function, `logger:update_handler_config/3` is added, and the handler\n callback `changing_config` now has a new argument, `SetOrUpdate`, which\n indicates if the configuration change comes from `set_handler_config/2,3` or\n `update_handler_config/2,3`.\n\n This allows the handler to consistently merge the new configuration with the\n old (if the change comes from `update_handler_config/2,3`) or with the default\n (if the change comes from `set_handler_config/2,3`).\n\n The built-in handlers `logger_std_h` and `logger_disk_log_h` are updated\n accordingly. A bug which could cause inconsistency between the handlers'\n internal state and the stored configuration is also corrected.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15364\n\n- Fix fallback when custom erl_epmd client does not implement address_please.\n\n Own Id: OTP-15388 Aux Id: PR-1983\n\n- The logger ets table did not have the `read_concurrency` option. This is now\n added.\n\n Own Id: OTP-15453 Aux Id: ERL-782\n\n- During system start, logger has a simple handler which prints to stdout. After\n the kernel supervision is started, this handler is removed and replaced by the\n default handler. Due to a bug, logger earlier issued a debug printout saying\n it received an unexpected message, which was the EXIT message from the simple\n handler's process. This is now corrected. The simple handler's process now\n unlinks from the logger process before terminating.\n\n Own Id: OTP-15466 Aux Id: ERL-788\n\n- The logger handler `logger_std_h` would not re-create it's log file if it was\n removed. Due to this it could not be used with tools like 'logrotate'. This is\n now corrected.\n\n Own Id: OTP-15469","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A function `inet:getifaddrs/1` that takes a list with a namespace option has\n been added, for platforms that support that feature, for example Linux\n (only?).\n\n Own Id: OTP-15121 Aux Id: ERIERL-189, PR-1974\n\n- Added the `nopush` option for TCP sockets, which corresponds to `TCP_NOPUSH`\n on \\*BSD and `TCP_CORK` on Linux.\n\n This is also used internally in `file:sendfile` to reduce latency on\n subsequent send operations.\n\n Own Id: OTP-15357 Aux Id: ERL-698\n\n- Optimize handling of send_delay for tcp sockes to better work with the new\n pollthread implementation introduced in OTP-21.\n\n Own Id: OTP-15471 Aux Id: ERIERL-229","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix bug causing net_kernel process crash on connection attempt from node with\n name identical to local node.\n\n Own Id: OTP-15438 Aux Id: ERL-781","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The values `all` and `none` are documented as valid value for the Kernel\n configuration parameter `logger_level`, but would cause a crash during node\n start. This is now corrected.\n\n Own Id: OTP-15143\n\n- Fix some potential buggy behavior in how ticks are sent on inter node\n distribution connections. Tick is now sent to c-node even if there are unsent\n buffered data, as c-nodes need ticks in order to send reply ticks. The amount\n of sent data was also calculated wrongly when ticks were suppressed due to\n unsent buffered data.\n\n Own Id: OTP-15162 Aux Id: ERIERL-191\n\n- Non semantic change in dist_util.erl to silence dialyzer warning.\n\n Own Id: OTP-15170\n\n- Fixed `net_kernel:connect_node(node())` to return `true` (and do nothing) as\n it always has before OTP-21.0. Also documented this successful \"self connect\"\n as the expected behavior.\n\n Own Id: OTP-15182 Aux Id: ERL-643\n\n- The single_line option on logger_formatter would in some cases add an unwanted\n comma after the association arrows in a map. This is now corrected.\n\n Own Id: OTP-15228\n\n- Improved robustness of distribution connection setup. In OTP-21.0 a truly\n asynchronous connection setup was introduced. This is further improvement on\n that work to make the emulator more robust and also be able to recover in\n cases when involved Erlang processes misbehave.\n\n Own Id: OTP-15297 Aux Id: OTP-15279, OTP-15280","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A new macro, `?LOG(Level,...)`, is added. This is equivalent to the existing\n `?LOG_ (...)` macros.\n\n A new variant of Logger report callback is added, which takes an extra\n argument containing options for size limiting and line breaks. Module\n `proc_lib` in `STDLIB` uses this for crash reports.\n\n Logger configuration is now checked a bit more for errors.\n\n Own Id: OTP-15132\n\n- The socket options `recvtos`, `recvttl`, `recvtclass` and `pktoptions` have\n been implemented in the socket modules. See the documentation for the\n `gen_tcp`, `gen_udp` and `inet` modules. Note that support for these in the\n runtime system is platform dependent. Especially for `pktoptions` which is\n very Linux specific and obsoleted by the RFCs that defined it.\n\n Own Id: OTP-15145 Aux Id: ERIERL-187\n\n- Add `logger:set_application_level/2` for setting the logger level of all\n modules in one application.\n\n Own Id: OTP-15146","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 6.0.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed bug in `net_kernel` that could cause an emulator crash if certain\n connection attempts failed. Bug exists since kernel-6.0 (OTP-21.0).\n\n Own Id: OTP-15280 Aux Id: ERIERL-226, OTP-15279","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 6.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-6-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Clarify the documentation of `rpc:multicall/5`.\n\n Own Id: OTP-10551\n\n- The DNS resolver when getting econnrefused from a server retained an invalid\n socket so look up towards the next server(s) also failed.\n\n Own Id: OTP-13133 Aux Id: PR-1557\n\n- No resolver backend returns V4Mapped IPv6 addresses any more. This was\n inconsistent before, some did, some did not. To facilitate working with such\n addresses a new function `inet:ipv4_mapped_ipv6_address/1` has been added.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13761 Aux Id: ERL-503\n\n- The type specifications for [`file:posix/0`](`t:file:posix/0`) and\n [`inet:posix/0`](`t:inet:posix/0`) have been updated according to which errors\n file and socket operations should be able to return.\n\n Own Id: OTP-14019 Aux Id: ERL-550\n\n- Fix name resolving in IPv6 only environments when doing the initial\n distributed connection.\n\n Own Id: OTP-14501\n\n- File operations used to accept [filenames](`t:file:name_all/0`) containing\n null characters (integer value zero). This caused the name to be truncated and\n in some cases arguments to primitive operations to be mixed up. Filenames\n containing null characters inside the filename are now _rejected_ and will\n cause primitive file operations to fail.\n\n Also environment variable operations used to accept\n [names](`t:os:env_var_name/0`) and [values](`t:os:env_var_value/0`) of\n environment variables containing null characters (integer value zero). This\n caused operations to silently produce erroneous results. Environment variable\n names and values containing null characters inside the name or value are now\n _rejected_ and will cause environment variable operations to fail.\n\n Primitive environment variable operations also used to accept the `$=`\n character in environment variable names causing various problems. `$=`\n characters in environment variable names are now also _rejected_.\n\n Also `os:cmd/1` now reject null characters inside its\n [command](`t:os:os_command/0`).\n\n `erlang:open_port/2` will also reject null characters inside the port name\n from now on.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14543 Aux Id: ERL-370\n\n- `os:putenv` and `os:getenv` no longer access the process environment directly\n and instead work on a thread-safe emulation. The only observable difference is\n that it's _not_ kept in sync with libc `getenv(3)` / `putenv(3)`, so those who\n relied on that behavior in drivers or NIFs will need to add manual\n synchronization.\n\n On Windows this means that you can no longer resolve DLL dependencies by\n modifying the `PATH` just before loading the driver/NIF. To make this less of\n a problem, the emulator now adds the target DLL's folder to the DLL search\n path.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14666\n\n- Fixed connection tick toward primitive hidden nodes (erl_interface) that could\n cause faulty tick timeout in rare cases when payload data is sent to hidden\n node but not received.\n\n Own Id: OTP-14681\n\n- Make group react immediately on an EXIT-signal from shell in e.g ssh.\n\n Own Id: OTP-14991 Aux Id: PR1705\n\n- Calls to `gen_tcp:send/2` on closed sockets now returns `{error, closed}`\n instead of `{error,enotconn}`.\n\n Own Id: OTP-15001\n\n- The `included_applications` key are no longer duplicated as application\n environment variable. Earlier, the included applications could be read both\n with `application:get[_all]_env(...)` and `application:get[_all]_key(...)`\n functions. Now, it can only be read with `application:get[_all]_key(...)`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15071\n\n- Owner and group changes through `file:write_file_info`, `file:change_owner`,\n and `file:change_group` will no longer report success on permission errors.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15118","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A new logging API is added to Erlang/OTP, see the `m:logger` manual page, and\n section [Logging](logger_chapter.md) in the Kernel User's Guide.\n\n Calls to `error_logger` are automatically redirected to the new API, and\n legacy error logger event handlers can still be used. It is, however,\n recommended to use the Logger API directly when writing new code.\n\n Notice the following potential incompatibilities:\n\n - Kernel configuration parameters `error_logger` still works, but is overruled\n if the default handler's output destination is configured with Kernel\n configuration parameter `logger`.\n\n In general, parameters for configuring error logger are overwritten by new\n parameters for configuring Logger.\n\n - The concept of SASL error logging is deprecated, meaning that by default the\n SASL application does not affect which log events are logged.\n\n By default, supervisor reports and crash reports are logged by the default\n Logger handler started by Kernel, and end up at the same destination\n (terminal or file) as other standard log event from Erlang/OTP.\n\n Progress reports are not logged by default, but can be enabled by setting\n the primary log level to info, for example with the Kernel configuration\n parameter `logger_level`.\n\n To obtain backwards compatibility with the SASL error logging functionality\n from earlier releases, set Kernel configuration parameter\n `logger_sasl_compatible` to `true`. This prevents the default Logger handler\n from logging any supervisor-, crash-, or progress reports. Instead, SASL\n adds a separate Logger handler during application start, which takes care of\n these log events. The SASL configuration parameters `sasl_error_logger` and\n `sasl_errlog_type` specify the destination (terminal or file) and severity\n level to log for these events.\n\n Since Logger is new in Erlang/OTP 21.0, we do reserve the right to introduce\n changes to the Logger API and functionality in patches following this release.\n These changes might or might not be backwards compatible with the initial\n version.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13295\n\n- The function `inet:i/0` has been documented.\n\n Own Id: OTP-13713 Aux Id: PR-1645\n\n- Typespecs for `netns` and `bind_to_device` options have been added to\n `gen_tcp`, `gen_udp` and `gen_sctp` functions.\n\n Own Id: OTP-14359 Aux Id: PR-1816\n\n- New functionality for implementation of alternative carriers for the Erlang\n distribution has been introduced. This mainly consists of support for usage of\n distribution controller processes (previously only ports could be used as\n distribution controllers). For more information see\n [ERTS User's Guide ➜ How to implement an Alternative Carrier for the Erlang Distribution ➜ Distribution Module](`e:erts:alt_dist.md#distribution-module`).\n\n Own Id: OTP-14459\n\n- `seq_trace` labels may now be any erlang term.\n\n Own Id: OTP-14899\n\n- The SSL distribution protocol `-proto inet_tls` has stopped setting the SSL\n option `server_name_indication`. New verify funs for client and server in\n `inet_tls_dist` has been added, not documented yet, that checks node name if\n present in peer certificate. Usage is still also yet to be documented.\n\n Own Id: OTP-14969 Aux Id: OTP-14465, ERL-598\n\n- Changed timeout of `gen_server` calls to `auth` server from default 5 seconds\n to `infinity`.\n\n Own Id: OTP-15009 Aux Id: ERL-601\n\n- The callback module passed as `-epmd_module` to erl has been expanded to be\n able to do name and port resolving.\n\n Documentation has also been added in the `m:erl_epmd` reference manual and\n ERTS User's Guide\n [How to Implement an Alternative Node Discovery for Erlang Distribution](`e:erts:alt_disco.md`).\n\n Own Id: OTP-15086 Aux Id: PR-1694\n\n- Included config file specified with relative path in sys.config are now first\n searched for relative to the directory of sys.config itself. If not found, it\n is also searched for relative to the current working directory. The latter is\n for backwards compatibility.\n\n Own Id: OTP-15137 Aux Id: PR-1838","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 5.4.3.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-4-3-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Non semantic change in dist_util.erl to silence dialyzer warning.\n\n Own Id: OTP-15170","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.4.3.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-4-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix some potential buggy behavior in how ticks are sent on inter node\n distribution connections. Tick is now sent to c-node even if there are unsent\n buffered data, as c-nodes need ticks in order to send reply ticks. The amount\n of sent data was calculated wrongly when ticks where suppressed due to unsent\n buffered data.\n\n Own Id: OTP-15162 Aux Id: ERIERL-191","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.4.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-4-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Correct a few contracts.\n\n Own Id: OTP-14889\n\n- Reject loading modules with names containing directory separators ('/' or '\\\\'\n on Windows).\n\n Own Id: OTP-14933 Aux Id: ERL-564, PR-1716\n\n- Fix bug in handling of os:cmd/2 option max_size on windows.\n\n Own Id: OTP-14940","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.4.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Add `os:cmd/2` that takes an options map as the second argument.\n\n Add `max_size` as an option to `os:cmd/2` that control the maximum size of the\n result that `os:cmd/2` will return.\n\n Own Id: OTP-14823","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Refactored an internal API.\n\n Own Id: OTP-14784","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Processes which did output after switching jobs (Ctrl+G) could be left forever\n stuck in the io request.\n\n Own Id: OTP-14571 Aux Id: ERL-472","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Lock counting can now be fully toggled at runtime in the lock counting\n emulator (`-emu_type lcnt`). Everything is enabled by default to match the old\n behavior, but specific categories can be toggled at will with minimal runtime\n overhead when disabled. Refer to the documentation on `lcnt:rt_mask/1` for\n details.\n\n Own Id: OTP-13170\n\n- `lcnt:collect` and `lcnt:clear` will no longer block all other threads in the\n runtime system.\n\n Own Id: OTP-14412\n\n- General Unicode improvements.\n\n Own Id: OTP-14462","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 5.3.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The documentation for the 'quiet' option in disk_log:open/1 had an incorrect\n default value.\n\n Own Id: OTP-14498","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Function `inet:ntoa/1` has been fixed to return lowercase letters according to\n RFC 5935 that has been approved after this function was written. Previously\n uppercase letters were returned so this may be a backwards incompatible change\n depending on how the returned address string is used.\n\n Function `inet:parse_address/1` has been fixed to accept %-suffixes on scoped\n addresses. The addresses does not work yet, but gives no parse errors.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13006 Aux Id: ERIERL-20, ERL-429\n\n- Fix bug where gethostname would incorrectly fail with enametoolong on Linux.\n\n Own Id: OTP-14310\n\n- Fix bug causing `code:is_module_native` to falsely return true when `local`\n call trace is enabled for the module.\n\n Own Id: OTP-14390\n\n- Add early reject of invalid node names from distributed nodes.\n\n Own Id: OTP-14426","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Since Unicode is now allowed in atoms an extra check is needed for node names,\n which are restricted to Latin-1.\n\n Own Id: OTP-13805\n\n- Replaced usage of deprecated symbolic [`time unit`](`t:erlang:time_unit/0`)\n representations.\n\n Own Id: OTP-13831 Aux Id: OTP-13735\n\n- `file:write_file(Name, Data, [raw])` would turn `Data` into a single binary\n before writing. This meant it could not take advantage of the `writev()`\n system call if it was given a list of binaries and told to write with `raw`\n mode.\n\n Own Id: OTP-13909\n\n- The performance of the `disk_log` has been somewhat improved in some corner\n cases (big items), and the documentation has been clarified.\n\n Own Id: OTP-14057 Aux Id: PR-1245\n\n- Functions for detecting changed code has been added. `code:modified_modules/0`\n returns all currently loaded modules that have changed on disk.\n `code:module_status/1` returns the status for a module. In the shell and in\n `c` module, `mm/0` is short for `code:modified_modules/0`, and `lm/0` reloads\n all currently loaded modules that have changed on disk.\n\n Own Id: OTP-14059\n\n- Introduce an event manager in Erlang to handle OS signals. A subset of OS\n signals may be subscribed to and those are described in the Kernel\n application.\n\n Own Id: OTP-14186\n\n- Sockets can now be bound to device (SO_BINDTODEVICE) on platforms where it is\n supported.\n\n This has been implemented e.g to support VRF-Lite under Linux; see\n [VRF ](https://www.kernel.org/doc/Documentation/networking/vrf.txt), and\n GitHub pull request [\\#1326](https://github.com/erlang/otp/pull/1326).\n\n Own Id: OTP-14357 Aux Id: PR-1326\n\n- Added option to store shell_history on disk so that the history can be reused\n between sessions.\n\n Own Id: OTP-14409 Aux Id: PR-1420\n\n- The size of crash reports created by `gen_server`, `gen_statem` and `proc_lib`\n is limited with aid of the Kernel application variable\n `error_logger_format_depth`. The purpose is to limit the size of the messages\n sent to the `error_logger` process when processes with huge message queues or\n states crash.\n\n The crash report generated by `proc_lib` includes the new tag\n `message_queue_len`. The neighbour report also includes the new tag\n `current_stacktrace`. Finally, the neighbour report no longer includes the\n tags `messages` and `dictionary`.\n\n The new function `error_logger:get_format_depth/0` can be used to retrieve the\n value of the Kernel application variable `error_logger_format_depth`.\n\n Own Id: OTP-14417\n\n- One of the ETS tables used by the `global` module is created with\n `{read_concurrency, true}` in order to reduce contention.\n\n Own Id: OTP-14419\n\n- Warnings have been added to the relevant documentation about not using\n un-secure distributed nodes in exposed environments.\n\n Own Id: OTP-14425","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 5.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix a race during cleanup of os:cmd that would cause os:cmd to hang\n indefinitely.\n\n Own Id: OTP-14232 Aux Id: seq13275","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The functions in the '`file`' module that take a list of paths (e.g.\n `file:path_consult/2`) will now continue to search in the path if the path\n contains something that is not a directory.\n\n Own Id: OTP-14191\n\n- Two OTP processes that are known to receive many messages are 'rex' (used by\n 'rpc') and 'error_logger'. Those processes will now store unprocessed messages\n outside the process heap, which will potentially decrease the cost of garbage\n collections.\n\n Own Id: OTP-14192","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 5.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- `code:add_pathsa/1` and command line option `-pa` both revert the given list\n of directories when adding it at the beginning of the code path. This is now\n documented.\n\n Own Id: OTP-13920 Aux Id: ERL-267\n\n- Add lost runtime dependency to erts-8.1. This should have been done in\n kernel-5.1 (OTP-19.1) as it cannot run without at least erts-8.1 (OTP-19.1).\n\n Own Id: OTP-14003\n\n- Type and doc for gen\\_\\{tcp,udp,sctp\\}:controlling_process/2 has been\n improved.\n\n Own Id: OTP-14022 Aux Id: PR-1208","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix a memory leak when calling seq_trace:get_system_tracer().\n\n Own Id: OTP-13742\n\n- Fix for the problem that when adding the ebin directory of an application to\n the code path, the `code:priv_dir/1` function returns an incorrect path to the\n priv directory of the same application.\n\n Own Id: OTP-13758 Aux Id: ERL-195\n\n- Fix code_server crash when adding code paths of two levels.\n\n Own Id: OTP-13765 Aux Id: ERL-194\n\n- Respect -proto_dist switch while connection to EPMD\n\n Own Id: OTP-13770 Aux Id: PR-1129\n\n- Fixed a bug where init:stop could deadlock if a process with infinite shutdown\n timeout (e.g. a supervisor) attempted to load code while terminating.\n\n Own Id: OTP-13802\n\n- Close stdin of commands run in os:cmd. This is a backwards compatibility fix\n that restores the behaviour of pre 19.0 os:cmd.\n\n Own Id: OTP-13867 Aux Id: seq13178","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add `net_kernel:setopts/2` and `net_kernel:getopts/2` to control options for\n distribution sockets in runtime.\n\n Own Id: OTP-13564\n\n- Rudimentary support for DSCP has been implemented in the guise of a `tclass`\n socket option for IPv6 sockets.\n\n Own Id: OTP-13582","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 5.0.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-0-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- When calling os:cmd from a process that has set trap_exit to true an 'EXIT'\n message would be left in the message queue. This bug was introduced in kernel\n vsn 5.0.1.\n\n Own Id: OTP-13813","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.0.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix a os:cmd bug where creating a background job using & would cause os:cmd to\n hang until the background job terminated or closed its stdout and stderr file\n descriptors. This bug has existed from kernel 5.0.\n\n Own Id: OTP-13741","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 5.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-5-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The handling of `on_load` functions has been improved. The major improvement\n is that if a code upgrade fails because the `on_load` function fails, the\n previous version of the module will now be retained.\n\n Own Id: OTP-12593\n\n- `rpc:call()` and `rpc:block_call()` would sometimes cause an exception (which\n was not mentioned in the documentation). This has been corrected so that\n `{badrpc,Reason}` will be returned instead.\n\n Own Id: OTP-13409\n\n- On Windows, for modules that were loaded early (such as the `lists` module),\n `code:which/1` would return the path with mixed slashes and backslashes, for\n example: `\"C:\\\\Program Files\\\\erl8.0/lib/stdlib-2.7/ebin/lists.beam\"`. This\n has been corrected.\n\n Own Id: OTP-13410\n\n- Make file:datasync use fsync instead of fdatasync on Mac OSX.\n\n Own Id: OTP-13411\n\n- The default chunk size for the fallback sendfile implementation, used on\n platforms that do not have a native sendfile, has been decreased in order to\n reduce connectivity issues.\n\n Own Id: OTP-13444\n\n- Large file writes (2Gb or more) could fail on some Unix platforms (for\n example, OS X and FreeBSD).\n\n Own Id: OTP-13461\n\n- A bug has been fixed where the DNS resolver inet_res did not refresh its view\n of the contents of for example resolv.conf immediately after start and hence\n then failed name resolution. Reported and fix suggested by Michal Ptaszek in\n GitHUB pull req #949.\n\n Own Id: OTP-13470 Aux Id: Pull #969\n\n- Fix process leak from global_group.\n\n Own Id: OTP-13516 Aux Id: PR-1008\n\n- The function `inet:gethostbyname/1` now honors the resolver option `inet6`\n instead of always looking up IPv4 addresses.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13622 Aux Id: PR-1065\n\n- The `Status` argument to `init:stop/1` is now sanity checked to make sure\n `erlang:halt` does not fail.\n\n Own Id: OTP-13631 Aux Id: PR-911","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add \\{line_delim, byte()\\} option to inet:setopts/2 and decode_packet/3\n\n Own Id: OTP-12837\n\n- Added `os:perf_counter/1`.\n\n The perf_counter is a very very cheap and high resolution timer that can be\n used to timestamp system events. It does not have monoticity guarantees, but\n should on most OS's expose a monotonous time.\n\n Own Id: OTP-12908\n\n- The os:cmd call has been optimized on unix platforms to be scale better with\n the number of schedulers.\n\n Own Id: OTP-13089\n\n- New functions that can load multiple modules at once have been added to the\n '`code`' module. The functions are `code:atomic_load/1`,\n `code:prepare_loading/1`, `code:finish_loading/1`, and\n `code:ensure_modules_loaded/1`.\n\n Own Id: OTP-13111\n\n- The code path cache feature turned out not to be very useful in practice and\n has been removed. If an attempt is made to enable the code path cache, there\n will be a warning report informing the user that the feature has been removed.\n\n Own Id: OTP-13191\n\n- When an attempt is made to start a distributed Erlang node with the same name\n as an existing node, the error message will be much shorter and easier to read\n than before. Example:\n\n `Protocol 'inet_tcp': the name somename@somehost seems to be in use by another Erlang node`\n\n Own Id: OTP-13294\n\n- The output of the default error logger is somewhat prettier and easier to\n read. The default error logger is used during start-up of the OTP system. If\n the start-up fails, the output will be easier to read.\n\n Own Id: OTP-13325\n\n- The functions `rpc:safe_multi_server_call/2,3` that were deprecated in R12B\n have been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13449\n\n- Update the error reasons in dist_util, and show them in the logs if\n net_kernel:verbose(1) has been called.\n\n Own Id: OTP-13458\n\n- Experimental support for Unix Domain Sockets has been implemented. Read the\n sources if you want to try it out. Example:\n `gen_udp:open(0, [{ifaddr,{local,\"/tmp/socket\"}}])`. Documentation will be\n written after user feedback on the experimental API.\n\n Own Id: OTP-13572 Aux Id: PR-612\n\n- Allow heart to be configured to not kill the previous emulator before calling\n the HEART_COMMAND. This is done by setting the environment variable\n HEART_NO_KILL to TRUE.\n\n Own Id: OTP-13650","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 4.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-4-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- `code:load_abs([10100])` would bring down the entire runtime system and create\n a crash dump. Corrected to generate an error exception in the calling process.\n\n Also corrected specs for code loading functions and added more information in\n the documentation about the error reasons returned by code-loading functions.\n\n Own Id: OTP-9375\n\n- `gen_tcp:accept/2` was not\n [time warp safe](`e:erts:time_correction.md#time-warp-safe-code`). This since\n it used the same time as returned by `erlang:now/0` when calculating timeout.\n This has now been fixed.\n\n Own Id: OTP-13254 Aux Id: OTP-11997, OTP-13222\n\n- Correct the contract for `inet:getifaddrs/1`.\n\n Own Id: OTP-13335 Aux Id: ERL-95","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Time warp safety improvements.\n\n Introduced the options `monotonic_timestamp`, and `strict_monotonic_timestamp`\n to the trace, sequential trace, and system profile functionality. This since\n the already existing `timestamp` option is not time warp safe.\n\n Introduced the option `safe_fixed_monotonic_time` to `ets:info/2` and\n `dets:info/2`. This since the already existing `safe_fixed` option is not time\n warp safe.\n\n Own Id: OTP-13222 Aux Id: OTP-11997\n\n- Add validation callback for heart\n\n The erlang heart process may now have a validation callback installed. The\n validation callback will be executed, if present, before any heartbeat to\n heart port program. If the validation fails, or stalls, no heartbeat will be\n sent and the node will go down.\n\n With the option `'check_schedulers'` heart executes a responsiveness check of\n the schedulers before a heartbeat is sent to the port program. If the\n responsiveness check fails, the heartbeat will not be performed (as intended).\n\n Own Id: OTP-13250\n\n- Clarify documentation of `net_kernel:allow/1`\n\n Own Id: OTP-13299\n\n- EPMD supports both IPv4 and IPv6\n\n Also affects oldest supported windows version.\n\n Own Id: OTP-13364","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 4.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-4-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Host name lookups though inet_res, the Erlang DNS resolver, are now done case\n insensitively according to RFC 4343. Patch by Holger Weiß.\n\n Own Id: OTP-12836\n\n- IPv6 distribution handler has been updated to share code with IPv4 so that all\n features are supported in IPv6 as well. A bug when using an IPv4 address as\n hostname has been fixed.\n\n Own Id: OTP-13040\n\n- Caching of host names in the internal DNS resolver inet_res has been made\n character case insensitive for host names according to RFC 4343.\n\n Own Id: OTP-13083\n\n- Cooked file mode buffering has been fixed so file:position/2 now works\n according to Posix on Posix systems i.e. when file:position/2 returns an error\n the file pointer is unaffected.\n\n The Windows system documentation, however, is unclear on this point so the\n documentation of file:position/2 still does not promise anything.\n\n Cooked file mode file:pread/2,3 and file:pwrite/2,3 have been corrected to\n honor character encoding like the combination of file:position/2 and\n file:read/2 or file:write/2 already does. This is probably not very useful\n since the character representation on the caller's side is latin1, period.\n\n Own Id: OTP-13155 Aux Id: PR#646","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add \\{line_delim, byte()\\} option to inet:setopts/2 and decode_packet/3\n\n Own Id: OTP-12837","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-4-1"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- A mechanism for limiting the amount of text that the built-in error logger\n events will produce has been introduced. It is useful for limiting both the\n size of log files and the CPU time used to produce them.\n\n This mechanism is experimental in the sense that it may be changed if it turns\n out that it does not solve the problem it is supposed to solve. In that case,\n there may be backward incompatible improvements to this mechanism.\n\n See the documentation for the config parameter `error_logger_format_depth` in\n the Kernel application for information about how to turn on this feature.\n\n Own Id: OTP-12864","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 4.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-4-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix error handling in `file:read_line/1` for Unicode contents.\n\n Own Id: OTP-12144\n\n- Introduce `os:getenv/2` which is similar to `os:getenv/1` but returns the\n passed default value if the required environment variable is undefined.\n\n Own Id: OTP-12342\n\n- It is now possible to paste text in JCL mode (using Ctrl-Y) that has been\n copied in the previous shell session. Also a bug that caused the JCL mode to\n crash when pasting text has been fixed.\n\n Own Id: OTP-12673\n\n- Ensure that each segment of an IPv6 address when parsed from a string has a\n maximum of 4 hex digits\n\n Own Id: OTP-12773","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- New BIF: `erlang:get_keys/0`, lists all keys associated with the process\n dictionary. Note: `erlang:get_keys/0` is auto-imported.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12151 Aux Id: seq12521\n\n- The internal group to user_drv protocol has been changed to be synchronous in\n order to guarantee that output sent to a process implementing the user_drv\n protocol is printed before replying. This protocol is used by the\n standard_output device and the ssh application when acting as a client.\n\n This change changes the previous unlimited buffer when printing to standard_io\n and other devices that end up in user_drv to 1KB.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12240\n\n- The `inflateInit/2` and `deflateInit/6` functions now accepts a WindowBits\n argument equal to 8 and -8.\n\n Own Id: OTP-12564\n\n- Map error logger warnings to warning messages by default.\n\n Own Id: OTP-12755\n\n- Map beam error logger warnings to warning messages by default. Previously\n these messages were mapped to the error channel by default.\n\n Own Id: OTP-12781\n\n- gen_tcp:shutdown/2 is now asynchronous\n\n This solves the following problems with the old implementation:\n\n It doesn't block when the TCP peer is idle or slow. This is the expected\n behaviour when shutdown() is called: the caller needs to be able to continue\n reading from the socket, not be prevented from doing so.\n\n It doesn't truncate the output. The current version of gen_tcp:shutdown/2 will\n truncate any outbound data in the driver queue after about 10 seconds if the\n TCP peer is idle of slow. Worse yet, it doesn't even inform anyone that the\n data has been truncated: 'ok' is returned to the caller; and a FIN rather than\n an RST is sent to the TCP peer.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12797\n\n- There are many cases where user code needs to be able to distinguish between a\n socket that was closed normally and one that was aborted. Setting the option\n \\{show_econnreset, true\\} enables the user to receive ECONNRESET errors on\n both active and passive sockets.\n\n Own Id: OTP-12843","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 3.2.0.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-3-2-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The 'raw' socket option could not be used multiple times in one call to any\n e.g gen_tcp function because only one of the occurrences were used. This bug\n has been fixed, and also a small bug concerning propagating error codes from\n within inet:setopts/2.\n\n Own Id: OTP-11482 Aux Id: seq12872","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 3.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-3-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug causing an infinite loop in hostname resolving has been corrected. To\n trigger this bug you would have to enter an bogus search method from a\n configuration file e.g .inetrc.\n\n Bug pinpointed by Emil Holmström\n\n Own Id: OTP-12133\n\n- The standard_error process now handles the getopts I/O protocol request\n correctly and stores its encoding in the same way as standard_io.\n\n Also, io:put_chars(standard_error, \\[oops]) could previously crash the\n standard_error process. This is now corrected.\n\n Own Id: OTP-12424","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Configuration parameters for the Kernel application that allows setting socket\n options for the distribution sockets have been added. See the application\n Kernel documentation; parameters 'inet_dist_listen_options' and\n 'inet_dist_connect_options'.\n\n Own Id: OTP-12476 Aux Id: OTP-12476","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 3.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Make sure to install .hrl files when needed\n\n Own Id: OTP-12197\n\n- Removed the undocumented application environment variable 'raw_files' from the\n kernel application. This variable was checked (by call to\n application:get_env/2) each time a raw file was to be opened in the file\n module.\n\n Own Id: OTP-12276\n\n- A bug has been fixed when using the netns option to gen_udp, which\n accidentally only worked if it was the last option.\n\n Own Id: OTP-12314","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Updated documentation for inet buffer size options.\n\n Own Id: OTP-12296\n\n- Introduce new option 'raw' in file_info and link_info functions. This option\n allows the caller not to go through the file server for information about\n files guaranteed to be local.\n\n Own Id: OTP-12325","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 3.0.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-3-0-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Accept inet:ip_address() in net_adm:names/1\n\n Own Id: OTP-12154","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 3.0.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-3-0-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- OTP-11850 fixed filelib:wildcard/1 to work with broken symlinks. This\n correction, however, introduced problems since symlinks were no longer\n followed for functions like filelib:ensure_dir/1, filelib:is_dir/1,\n filelib:file_size/1, etc. This is now corrected.\n\n Own Id: OTP-12054 Aux Id: seq12660","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 3.0.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-3-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- If the Config given to application_controller:change_application_data included\n other config files, it was only expanded for already existing (loaded)\n applications. If an upgrade added a new application which had config data in\n an included config file, the new application did not get correct config data.\n\n This is now changed so config data will be expanded for all applications.\n\n Own Id: OTP-11864\n\n- It was allowed to re-load pre-loaded modules such as `erlang`, but that could\n cause strange and unwanted things to happen, such as call\n [`apply/3`](`apply/3`) to loop. Pre-loaded modules are now sticky by default.\n (Thanks to Loïc Hoguin for reporting this bug.)\n\n `code:add_path(\"/ending/in/slash/\")` removes the trailing slash, adding\n `/ending/in/slash` to the code path. However,\n `code:del_path(\"/ending/in/slash/\")` would fail to remove the path since it\n did not remove the trailing slash. This has been fixed.\n\n Own Id: OTP-11913\n\n- Fix erts_debug:size/1 to handle Map sizes\n\n Own Id: OTP-11923\n\n- The documentation for `file:file_info/1` has been removed. The function itself\n was removed a long time ago.\n\n Own Id: OTP-11982","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 3.0 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-3-0"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed a deadlock possibility in terminate application\n\n Own Id: OTP-11171\n\n- Fixed bug where sendfile would return the wrong error code for a remotely\n closed socket if the socket was in passive mode. (Thanks to Vincent Siliakus\n for reporting the bug.)\n\n Own Id: OTP-11614\n\n- The new option `persistent` is added to `application:set_env/4` and\n `application:unset_env/3`. An environment key set with the `persistent` option\n will not be overridden by the ones configured in the application resource file\n on load. This means persistent values will stick after the application is\n loaded and also on application reload. (Thanks to José Valim)\n\n Own Id: OTP-11708\n\n- The spec for file:set_cwd/1 is modified to also accept binaries as arguments.\n This has always been allowed in the code, but it was not reflected in the spec\n since binaries are mostly used for raw file names. Raw file names are names\n that are not encoded according to file:native_name_encoding(), and these are\n not allowed in file:set_cwd/1. The spec is now, however, more allowing in\n order to avoid unnecessary dialyzer warnings. Raw file names will still fail\n in runtime with reason 'no_translation'. (Thanks to José Valim)\n\n Own Id: OTP-11787","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- heart:set_cmd/1 is updated to allow unicode code points > 255 in the given\n heart command\n\n Own Id: OTP-10843\n\n- Dialyzer's `unmatched_return` warnings have been corrected.\n\n Own Id: OTP-10908\n\n- Make erlang:open_port/2 spawn and spawn_executable handle unicode.\n\n Own Id: OTP-11105\n\n- Erlang/OTP has been ported to the realtime operating system OSE. The port\n supports both smp and non-smp emulator. For details around the port and how to\n started see the User's Guide in the ose application.\n\n Note that not all parts of Erlang/OTP has been ported.\n\n Notable things that work are: non-smp and smp emulators, OSE signal\n interaction, crypto, asn1, run_erl/to_erl, tcp, epmd, distribution and most if\n not all non-os specific functionality of Erlang.\n\n Notable things that does not work are: udp/sctp, os_mon, erl_interface,\n binding of schedulers.\n\n Own Id: OTP-11334\n\n- Add the \\{active,N\\} socket option for TCP, UDP, and SCTP, where N is an\n integer in the range -32768..32767, to allow a caller to specify the number of\n data messages to be delivered to the controlling process. Once the socket's\n delivered message count either reaches 0 or is explicitly set to 0 with\n inet:setopts/2 or by including \\{active,0\\} as an option when the socket is\n created, the socket transitions to passive (\\{active, false\\}) mode and the\n socket's controlling process receives a message to inform it of the\n transition. TCP sockets receive \\{tcp_passive,Socket\\}, UDP sockets receive\n \\{udp_passive,Socket\\} and SCTP sockets receive \\{sctp_passive,Socket\\}.\n\n The socket's delivered message counter defaults to 0, but it can be set using\n \\{active,N\\} via any gen_tcp, gen_udp, or gen_sctp function that takes socket\n options as arguments, or via inet:setopts/2. New N values are added to the\n socket's current counter value, and negative numbers can be used to reduce the\n counter value. Specifying a number that would cause the socket's counter value\n to go above 32767 causes an einval error. If a negative number is specified\n such that the counter value would become negative, the socket's counter value\n is set to 0 and the socket transitions to passive mode. If the counter value\n is already 0 and inet:setopts(Socket, \\[\\{active,0\\}]) is specified, the\n counter value remains at 0 but the appropriate passive mode transition message\n is generated for the socket.\n\n Thanks to Steve Vinoski\n\n Own Id: OTP-11368\n\n- A call to either the [`garbage_collect/1`](`garbage_collect/1`) BIF or the\n [`check_process_code/2`](`check_process_code/2`) BIF may trigger garbage\n collection of another processes than the process calling the BIF. The previous\n implementations performed these kinds of garbage collections without\n considering the internal state of the process being garbage collected. In\n order to be able to more easily and more efficiently implement yielding native\n code, these types of garbage collections have been rewritten. A garbage\n collection like this is now triggered by an asynchronous request signal, the\n actual garbage collection is performed by the process being garbage collected\n itself, and finalized by a reply signal to the process issuing the request.\n Using this approach processes can disable garbage collection and yield without\n having to set up the heap in a state that can be garbage collected.\n\n The [`garbage_collect/2`](`erlang:garbage_collect/2`), and\n [`check_process_code/3`](`erlang:check_process_code/3`) BIFs have been\n introduced. Both taking an option list as last argument. Using these, one can\n issue asynchronous requests.\n\n `code:purge/1` and `code:soft_purge/1` have been rewritten to utilize\n asynchronous `check_process_code` requests in order to parallelize work.\n\n Characteristics impact: A call to the\n [`garbage_collect/1`](`garbage_collect/1`) BIF or the\n [`check_process_code/2`](`check_process_code/2`) BIF will normally take longer\n time to complete while the system as a whole won't be as much negatively\n effected by the operation as before. A call to `code:purge/1` and\n `code:soft_purge/1` may complete faster or slower depending on the state of\n the system while the system as a whole won't be as much negatively effected by\n the operation as before.\n\n Own Id: OTP-11388 Aux Id: OTP-11535, OTP-11648\n\n- Add sync option to file:open/2.\n\n The sync option adds the POSIX O_SYNC flag to the open system call on\n platforms that support the flag or its equivalent, e.g.,\n FILE_FLAG_WRITE_THROUGH on Windows. For platforms that don't support it,\n file:open/2 returns \\{error, enotsup\\} if the sync option is passed in. Thank\n to Steve Vinoski and Joseph Blomstedt\n\n Own Id: OTP-11498\n\n- The contract of `inet:ntoa/1` has been corrected.\n\n Thanks to Max Treskin.\n\n Own Id: OTP-11730","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.16.4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-16-4-1"},{"type":"extras","title":"Known Bugs and Problems - Kernel Release Notes","doc":"- When using gen_tcp:connect and the `fd` option with `port` and/or `ip`, the\n `port` and `ip` options were ignored. This has been fixed so that if `port`\n and/or `ip` is specified together with `fd` a bind is requested for that `fd`.\n If `port` and/or `ip` is not specified bind will not be called.\n\n Own Id: OTP-12061","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Kernel 2.16.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-16-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix the typespec for the inet:ifget/2 and inet:ifget/3 return value. Thanks to\n Ali Sabil.\n\n Own Id: OTP-11377\n\n- Fix various typos in erts, kernel and ssh. Thanks to Martin Hässler.\n\n Own Id: OTP-11414\n\n- Fix rpc multicall sample code. Thanks to Edwin Fine.\n\n Own Id: OTP-11471\n\n- Under rare circumstances a process calling `inet:close/1`, `gen_tcp:close/1`,\n `gen_udp:close/1`, or `gen_sctp:close/1` could hang in the call indefinitely.\n\n Own Id: OTP-11491","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add more SCTP errors as described in RFC 4960. Thanks to Artem Teslenko.\n\n Own Id: OTP-11379\n\n- Add new BIF os:unsetenv/1 which deletes an environment variable. Thanks to\n Martin Hässler.\n\n Own Id: OTP-11446","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.16.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-16-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix indentation of User switch command help in Erlang shell. Thanks to Sylvain\n Benner.\n\n Own Id: OTP-11209","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The previous undocumented function ntoa/1 has been added to inet docs and\n exported in the inet module.\n\n Own Id: OTP-10676 Aux Id: OTP-10314\n\n- Fix typo in abcast() function comment. Thanks to Johannes Weissl.\n\n Own Id: OTP-11219\n\n- Add application:ensure_all_started/1-2. Thanks to Fred Hebert.\n\n Own Id: OTP-11250\n\n- Make edlin understand a few important control keys. Thanks to Stefan\n Zegenhagen.\n\n Own Id: OTP-11251\n\n- Cleanup of hipe_unified_loader, eliminating uses of is_subtype/2 in specs,\n change module-local void functions to return 'ok' instead of [] and made sure\n there are no dialyzer warnings with --Wunmatched_returns. Thanks to Kostis\n Sagonas.\n\n Own Id: OTP-11301","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.16.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-16-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug in prim_inet has been corrected. If the port owner was killed at a bad\n time while closing the socket port the port could become orphaned hence\n causing port and socket leaking. Reported by Fred Herbert, Dmitry Belyaev and\n others.\n\n Own Id: OTP-10497 Aux Id: OTP-10562\n\n- A few bugs regarding case sensitivity for hostname resolution while using e.g\n the internal lookup types 'file' and 'dns' has been corrected. When looking up\n hostnames ASCII letters a-z are to be regarded as the same as A-Z according to\n RFC 4343 \"Domain Name System (DNS) Case Insensitivity Clarification\", and this\n was not always the case.\n\n Own Id: OTP-10689 Aux Id: seq12227","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Add `application:ensure_started/1,2`. It is equivavlent to\n `application:start/1,2` except it returns `ok` for already started\n applications.\n\n Own Id: OTP-10910\n\n- Optimize communication with file io server. Thanks to Anthony Ramine.\n\n Own Id: OTP-11040\n\n- Erlang source files with non-ASCII characters are now encoded in UTF-8\n (instead of latin1).\n\n Own Id: OTP-11041 Aux Id: OTP-10907\n\n- Optimization of simultaneous `inet_db` operations on the same socket by using\n a lock free implementation.\n\n Impact on the characteristics of the system: Improved performance.\n\n Own Id: OTP-11074\n\n- The `high_msgq_watermark` and `low_msgq_watermark` `inet` socket options\n introduced in OTP-R16A could only be set on TCP sockets. These options are now\n generic and can be set on all types of sockets.\n\n Own Id: OTP-11075 Aux Id: OTP-10336\n\n- Fix deep list argument error under Windows in os:cmd/1. Thanks to Aleksandr\n Vinokurov .\n\n Own Id: OTP-11104","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.16.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-16-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug that could cause a crash with wrong reason has been corrected in the\n `application_controller` module.\n\n Own Id: OTP-10754\n\n- Fix `code:is_module_native/1` that sometimes in R16A returned false for hipe\n compiled modules containing BIFs such as `lists`.\n\n Own Id: OTP-10870\n\n- Respect `{exit_on_close,false}` option on tcp socket in non-passive mode when\n receiving fails (due to an ill-formed packet for example) by only doing a half\n close and still allow sending on the socket. (Thanks to Anthony Molinaro and\n Steve Vinoski for reporting the problem)\n\n Own Id: OTP-10879","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Slightly nicer error message when node start fails due to duplicate name.\n Thanks to Magnus Henoch.\n\n Own Id: OTP-10797\n\n- Miscellaneous updates due to Unicode support.\n\n Own Id: OTP-10820\n\n- Add a new function code:get_mode() can be used to detect how the code servers\n behaves. Thanks to Vlad Dumitrescu\n\n Own Id: OTP-10823\n\n- Fix type of error Reason on gen_tcp:send/2. Thanks to Sean Cribbs.\n\n Own Id: OTP-10839\n\n- `file:list_dir_all/1` and `file:read_link_all/1` that can handle raw file\n names have been added. See the User Guide for STDLIB for information about raw\n file names.\n\n Own Id: OTP-10852","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.16 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-16"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- It is no longer possible to have `{Mod,Vsn}` in the 'modules' list in a .app\n file.\n\n This was earlier possible, although never documented in the .app file\n reference manual. It was however visible in the documentation of\n `application:load/[1,2]`, where the same term as in a .app file can be used as\n the first argument.\n\n The possibility has been removed since the `Vsn` part was never used.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10417\n\n- The contract of `erl_ddll:format_error/1` has been corrected. (Thanks to\n Joseph Wayne Norton.)\n\n Own Id: OTP-10473\n\n- Change printout of application crash message on startup to formatted strings\n (Thanks to Serge Aleynikov)\n\n Own Id: OTP-10620\n\n- The type `ascii_string()` in the `base64` module has been corrected. The type\n [`file:file_info()`](`t:file:file_info/0`) has been cleaned up. The type\n [`file:fd()`](`t:file:fd/0`) has been made opaque in the documentation.\n\n Own Id: OTP-10624 Aux Id: kunagi-352 \\[263]","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Inet exported functionality\n\n inet:parse_ipv4_address/1, inet:parse_ipv4strict_address/1,\n inet:parse_ipv6_address/1, inet:parse_ipv6strict_address/1,\n inet:parse_address/1 and inet:parse_strict_address is now exported from the\n inet module.\n\n Own Id: OTP-8067 Aux Id: kunagi-274 \\[185]\n\n- A boolean socket option 'ipv6_v6only' for IPv6 sockets has been added. The\n default value of the option is OS dependent, so applications aiming to be\n portable should consider using `{ipv6_v6only,true}` when creating an `inet6`\n listening/destination socket, and if necessary also create an `inet` socket on\n the same port for IPv4 traffic. See the documentation.\n\n Own Id: OTP-8928 Aux Id: kunagi-193 \\[104]\n\n- Support for Unicode has been implemented.\n\n Own Id: OTP-10302\n\n- The documentation for `global:register_name/3` has been updated to mention\n that the use of `{Module,Function}` as the method argument (resolve function)\n is deprecated.\n\n Own Id: OTP-10419\n\n- Fixed bug where sendfile on oracle solaris would return an error when a\n partial send was done.\n\n Own Id: OTP-10549\n\n- The `error_handler` module will now call `'$handle_undefined_function'/2` if\n an attempt is made to call a non-existing function in a module that exists.\n See the documentation for `error_handler` module for details.\n\n Own Id: OTP-10617 Aux Id: kunagi-340 \\[251]\n\n- Where necessary a comment stating encoding has been added to Erlang files. The\n comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630\n\n- Do not return wrong terms unnecessarily. (Thanks to Kostis Sagonas.)\n\n Own Id: OTP-10662\n\n- Some examples overflowing the width of PDF pages have been corrected.\n\n Own Id: OTP-10665\n\n- Add file:allocate/3 operation\n\n This operation allows pre-allocation of space for files. It succeeds only on\n systems that support such operation. (Thanks to Filipe David Manana)\n\n Own Id: OTP-10680\n\n- Add application:get_key/3. The new function provides a default value for a\n configuration parameter. Thanks to Serge Aleynikov.\n\n Own Id: OTP-10694\n\n- Add search to Erlang shell's history. Thanks to Fred Herbert.\n\n Own Id: OTP-10739","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.15.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-15-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Ensure 'erl_crash.dump' when asked for it. This will change erl_crash.dump\n behaviour.\n\n \\* Not setting ERL_CRASH_DUMP_SECONDS will now terminate beam immediately on a\n crash without writing a crash dump file.\n\n \\* Setting ERL_CRASH_DUMP_SECONDS to 0 will also terminate beam immediately on\n a crash without writing a crash dump file, i.e. same as not setting\n ERL_CRASH_DUMP_SECONDS environment variable.\n\n \\* Setting ERL_CRASH_DUMP_SECONDS to a negative value will let the beam wait\n indefinitely on the crash dump file being written.\n\n \\* Setting ERL_CRASH_DUMP_SECONDS to a positive value will let the beam wait\n that many seconds on the crash dump file being written.\n\n A positive value will set an alarm/timeout for restart both in beam and in\n heart if heart is running.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10422 Aux Id: kunagi-250 \\[161]","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.15.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-15-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed issue where using controlling_process/2 with self() as the second\n argument caused the port to leak if self() crashes. (Thanks to Ricardo\n Catalinas Jiménez)\n\n Own Id: OTP-10094\n\n- When sending large files using the file:sendfile fallback file:sendfile would\n crash. This is now fixed.\n\n Own Id: OTP-10098\n\n- Fix rpc:call/5 for local calls with a finite Timeout (Thanks to Tomer\n Chachamu)\n\n Own Id: OTP-10149\n\n- fix escript/primary archive reloading\n\n If the mtime of an escript/primary archive file changes after being added to\n the code path, correctly reload the archive and update the cache. (Thanks to\n Tuncer Ayaz)\n\n Own Id: OTP-10151\n\n- Support added for home directories named with non-ASCII characters (codepoints\n above 127) on a system running in Unicode file mode (e.g. on MacOSX or Linux\n with startup arguments +fnu or +fna with the right LOCALE). Also environment\n variables with Unicode content are supported in applicable environments.\n\n Own Id: OTP-10160\n\n- Allow mixed IPv4 and IPv6 addresses to sctp_bindx\n\n Also allow mixed address families to bind, since the first address on a\n multihomed sctp socket must be bound with bind, while the rest are to be bound\n using sctp_bindx. At least Linux supports adding address of mixing families.\n Make inet_set_faddress function available also when HAVE_SCTP is not defined,\n since we use it to find an address for bind to be able to mix ipv4 and ipv6\n addresses. Thanks to Tomas Abrahamsson\n\n Own Id: OTP-10217","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Document inet options: high_watermark, priority, linger and a some other\n options that previously was undocumented.\n\n Own Id: OTP-10053\n\n- Remove bit8 option support from inet\n\n Own Id: OTP-10056\n\n- The type of the disk log header has been corrected. (Thanks to Niclas Eklund.)\n\n Own Id: OTP-10131","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.15.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-15-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Driver output has been corrected so output of large binaries (> 4 GiB) now\n does not silently fail or crash the emulator, but either outputs the binary or\n fails the call. This means that writing a binary > 4 Gib to file now works but\n on e.g 64-bit Windows (that has scatter/gather I/O buffer segment lengths of\n 32 bits) fails. The behaviour may change in the future to always write the\n binary, in parts if necessary.\n\n Own Id: OTP-9820 Aux Id: OTP-9795\n\n- erts: minor fix for unnecessary condition erts: change SENDFILE_CHUNK_SIZE\n from signed to unsigned (Thanks to jovi zhang)\n\n Own Id: OTP-9872\n\n- Two contracts in `gen_sctp` have been corrected.\n\n Own Id: OTP-9874\n\n- If a process calls a module with an running on_load handler, the process is\n supposed to be suspended. But if the module with the on_load handler was\n loading used `code:load_binary/3`, the call would instead fail with an `undef`\n exception.\n\n Own Id: OTP-9875\n\n- File name and error reason is now returned if creation of a cookie fails.\n (Thanks to Magnus Henoch)\n\n Own Id: OTP-9954\n\n- Fix port leak in `zlib` when passing invalid data to\n `compress,uncompress,zip,unzip,gzip,gunzip`.\n\n Own Id: OTP-9981\n\n- Various typographical errors corrected in documentation for the global,\n error_logger, etop, lists, ets and supervisor modules and in the c_portdriver\n and kernel_app documentation. (Thanks to Ricardo Catalinas Jiménez)\n\n Own Id: OTP-9987\n\n- Fix returned error from gen_tcp:accept/1,2 when running out of ports.\n\n The \\{error, enfile\\} return value is badly misleading and confusing for this\n case, since the Posix ENFILE errno value has a well-defined meaning that has\n nothing to do with Erlang ports. The fix changes the return value to \\{error,\n system_limit\\}, which is consistent with e.g. various file(3) functions.\n inet:format_error/1 has also been updated to support system_limit in the same\n manner as file:format_error/1. (Thanks to Per Hedeland)\n\n Own Id: OTP-9990\n\n- `erts_debug:size/1` has been corrected to take sharing in the environment of\n funs into account. For funs it used to always give the same result as\n `erts_debug:flat_size/1`.\n\n Own Id: OTP-9991\n\n- In some cases when the process doing file:sendfile crashes while sending the\n file the efile_drv code would not clean up after itself correctly. This has\n now been fixed.\n\n Own Id: OTP-9993\n\n- On BSD based platforms file:sendfile would sometime go into an infinite loop\n when sending big files. This has now been fixed.\n\n Own Id: OTP-9994\n\n- While `disk_log` eagerly collects logged terms for better performance,\n collecting too much data may choke the system and cause huge binaries to be\n written.\n\n The problem was addressed in OTP-9764, but the situation was not improved in\n all cases.\n\n (Thanks to Richard Carlsson.)\n\n Own Id: OTP-9999 Aux Id: OTP-9764\n\n- The documentation of .app files incorrectly said that the default value for\n the `mod` parameter is `undefined`. This is now corrected to `[]`.\n\n Own Id: OTP-10002","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.15 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-15"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Calls to `global:whereis_name/1` have been substituted for calls to\n `global:safe_whereis_name/1` since the latter is not safe at all.\n\n The reason for not doing this earlier is that setting a global lock masked out\n a bug concerning the restart of supervised children. The bug has now been\n fixed by a modification of `global:whereis_name/1`. (Thanks to Ulf Wiger for\n code contribution.)\n\n A minor race conditions in `gen_fsm:start*` has been fixed: if one of these\n functions returned `{error, Reason}` or ignore, the name could still be\n registered (either locally or in `global`. (This is the same modification as\n was done for gen_server in OTP-7669.)\n\n The undocumented function `global:safe_whereis_name/1` has been removed.\n\n Own Id: OTP-9212 Aux Id: seq7117, OTP-4174\n\n- Honor option `packet_size` for http packet parsing by both TCP socket and\n `erlang:decode_packet`. This gives the ability to accept HTTP headers larger\n than the default setting, but also avoid DoS attacks by accepting lines only\n up to whatever length you wish to allow. For consistency, packet type `line`\n also honor option `packet_size`. (Thanks to Steve Vinoski)\n\n Own Id: OTP-9389\n\n- `disk_log:reopen/2,3` and `disk_log:breopen/3` could return the error reason\n from `file:rename/2` rather than the reason `{file_error, Filename, Reason}`.\n This bug has been fixed.\n\n The message `{disk_log, Node, {error, disk_log_stopped}}` which according the\n documentation is sent upon failure to truncate or reopen a disk log was\n sometimes turned into a reply. This bug has been fixed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9508\n\n- Environment variable 'shutdown_timeout' is added to kernel application.\n Earlier, application_controller would hang forever if an application top\n supervisor did not terminate upon a shutdown request. If this new environment\n variable is set to a positive integer T, then application controller will now\n give up after T milliseconds and instead brutally kill the application. For\n backwards compatibility, the default value for shutdown_timeout is 'infinity'.\n\n Own Id: OTP-9540\n\n- Add '-callback' attributes in stdlib's behaviours\n\n Replace the behaviour_info(callbacks) export in stdlib's behaviours with\n -callback' attributes for all the callbacks. Update the documentation with\n information on the callback attribute Automatically generate 'behaviour_info'\n function from '-callback' attributes\n\n 'behaviour_info(callbacks)' is a special function that is defined in a module\n which describes a behaviour and returns a list of its callbacks.\n\n This function is now automatically generated using the '-callback' specs. An\n error is returned by lint if user defines both '-callback' attributes and the\n behaviour_info/1 function. If no type info is needed for a callback use a\n generic spec for it. Add '-callback' attribute to language syntax\n\n Behaviours may define specs for their callbacks using the familiar spec\n syntax, replacing the '-spec' keyword with '-callback'. Simple lint checks are\n performed to ensure that no callbacks are defined twice and all types referred\n are declared.\n\n These attributes can be then used by tools to provide documentation to the\n behaviour or find discrepancies in the callback definitions in the callback\n module.\n\n Add callback specs into 'application' module in kernel Add callback specs to\n tftp module following internet documentation Add callback specs to\n inets_service module following possibly deprecated comments\n\n Own Id: OTP-9621\n\n- make tab completion work in remote shells (Thanks to Mats Cronqvist)\n\n Own Id: OTP-9673\n\n- Add missing parenthesis in heart doc.\n\n Add missing spaces in the Reference Manual distributed section.\n\n In the HTML version of the doc those spaces are necessary to separate those\n words.\n\n Own Id: OTP-9693\n\n- Fixes net_kernel:get_net_ticktime() doc\n\n Adds missing description when \\`ignored' is returned. (Thanks to Ricardo\n Catalinas Jiménez )\n\n Own Id: OTP-9713\n\n- While `disk_log` eagerly collects logged terms for better performance,\n collecting too much data may choke the system and cause huge binaries to be\n written. In order to remedy the situation a (small) limit on the amount of\n data that is collected before writing to disk has been introduced.\n\n Own Id: OTP-9764\n\n- - Correct callback spec in application module\n - Refine warning about callback specs with extra ranges\n - Cleanup autoimport compiler directives\n - Fix Dialyzer's warnings in typer\n - Fix Dialyzer's warning for its own code\n - Fix bug in Dialyzer's behaviours analysis\n - Fix crash in Dialyzer\n - Variable substitution was not generalizing any unknown variables.\n\n Own Id: OTP-9776\n\n- Fix a crash when file:change_time/2,3 are called with invalid dates\n\n Calling file:change_time/2,3 with an invalid date tuple (e.g\n file:change_time(\"file.txt\", \\{undefined, undefined\\})) will cause\n file_server_2 to crash. error_logger will shutdown and the whole VM will stop.\n Change behavior to validate given dates on system boundaries. (i.e before\n issuing a server call).(Thanks to Ahmed Omar)\n\n Own Id: OTP-9785","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- An option list argument can now be passed to\n `file:read_file_info/2, file:read_link_info/2` and `file:write_file_info/3`\n and set time type information in the call. Valid options are\n `{time, local}, {time, universal}` and `{time, posix}`. In the case of `posix`\n time no conversions are made which makes the operation a bit faster.\n\n Own Id: OTP-7687\n\n- `file:list_dir/1,2` will now fill an buffer entire with filenames from the\n efile driver before sending it to an erlang process. This will speed up this\n file operation in most cases.\n\n Own Id: OTP-9023\n\n- gen_sctp:open/0-2 may now return \\{error,eprotonosupport\\} if SCTP is not\n supported\n\n gen_sctp:peeloff/1 has been implemented and creates a one-to-one socket which\n also are supported now\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9239\n\n- Sendfile has been added to the file module's API. sendfile/2 is used to read\n data from a file and send it to a tcp socket using a zero copying mechanism if\n available on that OS.\n\n Thanks to Tuncer Ayaz and Steve Vinovski for original implementation\n\n Own Id: OTP-9240\n\n- Tuple funs (a two-element tuple with a module name and a function) are now\n officially deprecated and will be removed in R16. Use '`fun M:F/A`' instead.\n To make you aware that your system uses tuple funs, the very first time a\n tuple fun is applied, a warning will be sent to the error logger.\n\n Own Id: OTP-9649","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.14.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-14-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fix type of Packet arg of gen_tcp:send/2 and gen_udp:send/4\n\n The type is marked as a binary() or a string() but in practice it can be an\n iodata(). The test suite was updated to confirm the gen_tcp/2 and\n gen_udp:send/4 functions accept iodata() (iolists) packets. (Thanks to Filipe\n David Manana)\n\n Own Id: OTP-9514\n\n- XML files have been corrected.\n\n Own Id: OTP-9550 Aux Id: OTP-9541","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The types and specifications of the inet modules have been improved.\n\n Own Id: OTP-9260\n\n- Types and specifications have been added.\n\n Own Id: OTP-9356\n\n- Contracts in STDLIB and Kernel have been improved and type errors have been\n corrected.\n\n Own Id: OTP-9485\n\n- Update documentation and specifications of some of the zlib functions.\n\n Own Id: OTP-9506","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.14.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-14-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The send_timeout option in gen_tcp did not work properly in active mode or\n with \\{active,once\\} options. This is now corrected.\n\n Own Id: OTP-9145\n\n- Fixed various typos across the documentation (Thanks to Tuncer Ayaz)\n\n Own Id: OTP-9154\n\n- Fix typo in doc of rpc:pmap/3 (Thanks to Ricardo Catalinas Jiménez)\n\n Own Id: OTP-9168\n\n- A bug in inet_res, the specialized DNS resolver, has been corrected. A late\n answer with unfortunate timing could cause a runtime exception. Some code\n cleanup and improvements also tagged along. Thanks to Evegeniy Khramtsov for a\n pinpointing bug report and bug fix testing.\n\n Own Id: OTP-9221 Aux Id: OTP-8712","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Types and specifications have been added.\n\n Own Id: OTP-9268\n\n- Erlang types and specifications are used for documentation.\n\n Own Id: OTP-9272\n\n- Two opaque types that could cause warnings when running Dialyzer have been\n modified.\n\n Own Id: OTP-9337","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.14.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-14-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- `os:find_executable/{1,2}` will no longer return the path of a directory that\n happens to be in the PATH.\n\n Own Id: OTP-8983 Aux Id: seq11749\n\n- Fix -spec for file:write_file/3\n\n Change type for second parameter from binary() to iodata(), since the function\n explicitly takes steps to accept lists as well as binaries. (thanks to Magnus\n Henoch).\n\n Own Id: OTP-9067\n\n- Sanitize the specs of the code module\n\n After the addition of unicode_binary() to the file:filename() type, dialyzer\n started complaining about erroneous or incomplete specs in some functions of\n the 'code' module. The culprit was hard-coded information in erl_bif_types for\n functions of this module, which were not updated. Since these functions have\n proper specs these days and code duplication (pun intended) is never a good\n idea, their type information was removed from erl_bif_types.\n\n While doing this, some erroneous comments were fixed in the code module and\n also made sure that the code now runs without dialyzer warnings even when the\n -Wunmatched_returns option is used.\n\n Some cleanups were applied to erl_bif_types too.\n\n Own Id: OTP-9100\n\n- \\- Add spec for function that does not return - Strengthen spec - Introduce\n types to avoid duplication in specs - Add specs for functions that do not\n return - Add specs for behaviour callbacks - Simplify two specs\n\n Own Id: OTP-9127","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.14.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-14-2"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The Erlang VM now supports Unicode filenames. The feature is turned on by\n default on systems where Unicode filenames are mandatory (Windows and MacOSX),\n but can be enabled on other systems with the '+fnu' emulator option. Enabling\n the Unicode filename feature on systems where it is not default is however\n considered experimental and not to be used for production. Together with the\n Unicode file name support, the concept of \"raw filenames\" is introduced, which\n means filenames provided without implicit unicode encoding translation. Raw\n filenames are provided as binaries, not lists. For further information, see\n stdlib users guide and the chapter about using Unicode in Erlang. Also see the\n file module manual page.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8887\n\n- There is now a new function inet:getifaddrs/0 modeled after C library function\n getifaddrs() on BSD and LInux that reports existing interfaces and their\n addresses on the host. This replaces the undocumented and unsupported\n inet:getiflist/0 and inet:ifget/2.\n\n Own Id: OTP-8926","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.14.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-14-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- In embedded mode, on_load handlers that called `code:priv_dir/1` or other\n functions in `code` would hang the system. Since the `crypto` application now\n contains an on_loader handler that calls `code:priv_dir/1`, including the\n `crypto` application in the boot file would prevent the system from starting.\n\n Also extended the `-init_debug` option to print information about on_load\n handlers being run to facilitate debugging.\n\n Own Id: OTP-8902 Aux Id: seq11703","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.14.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-14-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed: inet:setopts(S, \\[\\{linger,\\{true,2\\}\\}]) returned \\{error,einval\\} for\n SCTP sockets. The inet_drv had a bug when checking the option size.\n\n Own Id: OTP-8726 Aux Id: seq11617\n\n- gen_udp:connect/3 was broken for SCTP enabled builds. It did not detect remote\n end errors as it should.\n\n Own Id: OTP-8729\n\n- reference() has been substituted for ref() in the documentation.\n\n Own Id: OTP-8733\n\n- A bug introduced in kernel-2.13.5.3 has been fixed. If running\n `net_kernel:set_net_ticktime/1` twice within the `TransitionPerod` the second\n call caused the net_kernel process to crash with a `badmatch`.\n\n Own Id: OTP-8787 Aux Id: seq11657, OTP-8643\n\n- inet:getsockopt for SCTP sctp_default_send_param had a bug to not initialize\n required feilds causing random answers. It is now corrected.\n\n Own Id: OTP-8795 Aux Id: seq11655\n\n- For a socket in the HTTP packet mode, the return value from `gen_tcp:recv/2,3`\n if there is an error in the header will be `{ok,{http_error,String}}` instead\n of `{error,{http_error,String}}` to be consistent with `ssl:recv/2,3`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8831","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Even when configuring erlang with --enable-native-libs, the native code for\n modules loaded very early (such as lists) would not get loaded. This has been\n corrected. (Thanks to Paul Guyot.)\n\n Own Id: OTP-8750\n\n- The undocumented function inet:ifget/2 has been improved to return interface\n hardware address (MAC) on platforms supporting getaddrinfo() (such as BSD\n unixes). Note it still does not work on all platforms for example not Windows\n nor Solaris, so the function is still undocumented.\n\n Buffer overflow and field init bugs for inet:ifget/2 and inet:getservbyname/2\n has also been fixed.\n\n Thanks to Michael Santos.\n\n Own Id: OTP-8816\n\n- As a usability improvement the 'inet6' option to functions gen_tcp:listen/2,\n gen_tcp:connect/3-4, gen_udp:open/2 and gen_sctp:open/1-2 is now implicit if\n the address argument or the 'ip' option contain an IPv6 address (8-tuple).\n\n Own Id: OTP-8822","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.14 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-14"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- os:find_executable can now be fed with the complete name of the executable on\n Windows and still find it. I.e os:find_executable(\"werl.exe\") will work as\n os:find_executable(\"werl\").\n\n Own Id: OTP-3626\n\n- The shell's line editing has been improved to more resemble the behaviour of\n readline and other shells. (Thanks to Dave Peticolas)\n\n Own Id: OTP-8635\n\n- Under certain circumstances the net kernel could hang. (Thanks to Scott Lystig\n Fritchie.)\n\n Own Id: OTP-8643 Aux Id: seq11584\n\n- The kernel DNS resolver was leaking one or two ports if the DNS reply could\n not be parsed or if the resolver(s) caused noconnection type errors. Bug now\n fixed. A DNS specification borderline truncated reply triggering the port\n leakage bug has also been fixed.\n\n Own Id: OTP-8652","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- As of this version, the global name server no longer supports nodes running\n Erlang/OTP R11B.\n\n Own Id: OTP-8527\n\n- The file module's functions write,read and read_line now handles named\n io_servers like 'standard_io' and 'standard_error' correctly.\n\n Own Id: OTP-8611\n\n- The functions file:advise/4 and file:datasync/1 have been added. (Thanks to\n Filipe David Manana.)\n\n Own Id: OTP-8637\n\n- When exchanging groups between nodes `pg2` did not remove duplicated members.\n This bug was introduced in R13B03 (kernel-2.13.4).\n\n Own Id: OTP-8653\n\n- There is a new option 'exclusive' to file:open/2 that uses the OS O_EXCL flag\n where supported to open the file in exclusive mode.\n\n Own Id: OTP-8670","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.13.5.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-5-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug introduced in Kernel 2.13.5.2 has been fixed.\n\n Own Id: OTP-8686 Aux Id: OTP-8643","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.13.5.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Under certain circumstances the net kernel could hang. (Thanks to Scott Lystig\n Fritchie.)\n\n Own Id: OTP-8643 Aux Id: seq11584","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.13.5.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A race condition in `os:cmd/1` could cause the caller to get stuck in\n `os:cmd/1` forever.\n\n Own Id: OTP-8502","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.13.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A race bug affecting `pg2:get_local_members/1` has been fixed. The bug was\n introduced in R13B03.\n\n Own Id: OTP-8358\n\n- The loading of native code was not properly atomic in the SMP emulator, which\n could cause crashes. Also a per-MFA information table for the native code has\n now been protected with a lock since it turns that it could be accessed\n concurrently in the SMP emulator. (Thanks to Mikael Pettersson.)\n\n Own Id: OTP-8397\n\n- user.erl (used in oldshell) is updated to handle unicode in prompt strings\n (io:get_line/\\{1,2\\}). io_lib is also updated to format prompts with the 't'\n modifier (i.e. ~ts instead of ~s).\n\n Own Id: OTP-8418 Aux Id: OTP-8393\n\n- The resolver routines failed to look up the own node name as hostname, if the\n OS native resolver was erroneously configured, bug reported by Yogish Baliga,\n now fixed.\n\n The resolver routines now tries to parse the hostname as an IP string as most\n OS resolvers do, unless the native resolver is used.\n\n The DNS resolver inet_res and file resolver inet_hosts now do not read OS\n configuration files until they are needed. Since the native resolver is\n default, in most cases they are never needed.\n\n The DNS resolver's automatic updating of OS configuration file data\n (/etc/resolv.conf) now uses the 'domain' keyword as default search domain if\n there is no 'search' keyword.\n\n Own Id: OTP-8426 Aux Id: OTP-8381","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The expected return value for an on_load function has been changed. (See the\n section about code loading in the Reference manual.)\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8339\n\n- Explicit top directories in archive files are now optional.\n\n For example, if an archive (app-vsn.ez) just contains an app-vsn/ebin/mod.beam\n file, the file info for the app-vsn and app-vsn/ebin directories are faked\n using the file info from the archive file as origin. The virtual directories\n can also be listed. For short, the top directories are virtual if they does\n not exist.\n\n Own Id: OTP-8387\n\n- `code:clash/0` now looks inside archives (.ez files). (Thanks to Tuncer Ayaz.)\n\n Own Id: OTP-8413\n\n- There are new `gen_sctp:connect_init/*` functions that initiate an SCTP\n connection without blocking for the result. The result is delivered\n asynchronously as an sctp_assoc_change event. (Thanks to Simon Cornish.)\n\n Own Id: OTP-8414","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.13.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A link in `m:pg2` has been fixed. (Thanks to Christophe Romain.)\n\n Own Id: OTP-8198\n\n- A ticker process could potentially be blocked indefinitely trying to send a\n tick to a node not responding. If this happened, the connection would not be\n brought down as it should.\n\n Own Id: OTP-8218\n\n- A bug in `pg2` when members who died did not leave process groups has been\n fixed. (Thanks to Matthew Dempsky.)\n\n Own Id: OTP-8259","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8201\n\n- The top directory in archive files does not need to have a `-vsn` suffix\n anymore. For example if the archive file has the name like `mnesia-4.4.7.ez`\n the top directory in the archive can either be named `mnesia` or\n `mnesia-4.4.7`. If the archive file has a name like `mnesia.ez` the top\n directory in the archive must be named `mnesia` as earlier.\n\n Own Id: OTP-8266\n\n- The -on_load() directive can be used to run a function when a module is\n loaded. It is documented in the section about code loading in the Reference\n Manual.\n\n Own Id: OTP-8295","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.13.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-3"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The DNS resolver client inet_res has been rewritten, documented and released.\n See inet_res(3) and Erts User's Guide: Inet configuration.\n\n It can formally not be incompatible with respect to earlier versions since\n there was no earlier official version. However it was used before and some\n details have changed.\n\n Configuration now initializes from /etc/resolv.conf and /etc/hosts on all unix\n platforms regardless of which distribution mode the node is started in. The\n directory (/etc) these files are supposed to reside in can be changed via an\n environment variable. These configuration file locations can also be changed\n in the inet configuration. The files are monitored for change and re-read,\n which makes a few resolver configuration variables out of application control.\n The /etc/hosts entries have now their own cache table that is shadowed (with\n lookup method 'file' is used) by the application configured host entries. This\n problem (that inet_res configuration only worked for distribution mode long\n names) was among other reported by Matthew O'Gorman many moons ago.\n\n The lookup methods are still 'native' only per default. Resolver configuration\n is done on all Unix platforms just to get a usable configuration for direct\n calls to inet_res.\n\n The functions `inet_res:nslookup/3..5` and `inet_res:nnslookup/4..4` are no\n longer recommended to use, instead use `inet_res:lookup/3..5` and\n `inet_res:resolve/3..5` which provide clearer argument types and the\n possibility to override options in the call.\n\n Users of previous unsupported versions of inet_res have included internal\n header files to get to the internal record definitions in order to examine DNS\n replies. This is still unsupported and there are access functions in inet_dns\n to use instead. These are documented in inet_res(3).\n\n Bug fix: a compression reference loop would make DNS message decoding loop\n forever. Problem reported by Florian Weimer.\n\n Bug fix and patch suggestion by Sergei Golovan: configuring IPv6 nameservers\n did not work. His patch (as he warned) created many UDP sockets; one per\n nameserver. This has been fixed in the released version.\n\n Improvement: `inet_res` is now EDNS0 capable. The current implementation is\n simple and does not probe and cache EDNS info for nameservers, which a fully\n capable implementation probably should do. EDNS has to be enabled via resolver\n configuration, and if a nameserver replies that it does not support EDNS,\n `inet_res` falls back to a regular DNS query.\n\n Improvement: now `inet_res` automatically falls back to TCP if it gets a\n truncated answer from a nameserver.\n\n Warning: some of the ancient and exotic record types handled by `inet_res` and\n `inet_dns` are not supported by current versions of BIND, so they could not be\n tested after the rewrite, with reasonable effort, e.g MD, MF, NULL, and SPF.\n The risk for bugs in these particular records is still low since their code is\n mostly shared with other tested record types.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7955 Aux Id: OTP-7107 OTP-6852\n\n- A TCP socket with option `{packet,4}` could crash the emulator if it received\n a packet header with a very large size value (>2Gb). The same bug caused\n `erlang:decode_packet/3` to return faulty values. (Thanks to Georgos Seganos.)\n\n Own Id: OTP-8102\n\n- The file module has now a read_line/1 function similar to the io:get_line/2,\n but with byte oriented semantics. The function file:read_line/1 works for raw\n files as well, but for good performance it is recommended to use it together\n with the 'read_ahead' option for raw file access.\n\n Own Id: OTP-8108","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.13.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug when doing io:get_line (among other calls) from a file opened with\n encoding other than latin1, causing false unicode errors to occur, is now\n corrected.\n\n Own Id: OTP-7974","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Added functionality to get higher resolution timestamp from system. The\n erlang:now function returns a timestamp that's not always consistent with the\n actual operating system time (due to resilience against large time changes in\n the operating system). The function os:timestamp/0 is added to get a similar\n timestamp as the one being returned by erlang:now, but untouched by Erlangs\n time correcting and smoothing algorithms. The timestamp returned by\n os:timestamp is always consistent with the operating systems view of time,\n like the calendar functions for getting wall clock time, but with higher\n resolution. Example of usage can be found in the os manual page.\n\n Own Id: OTP-7971","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.13.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Many concurrent calls to `os:cmd/1` will only block one scheduler thread at a\n time, making an smp emulator more responsive if the OS is slow forking\n processes.\n\n Own Id: OTP-7890 Aux Id: seq11219\n\n- Fixed hanging early RPC that did IO operation during node start.\n\n Own Id: OTP-7903 Aux Id: seq11224\n\n- The error behavior of gen_tcp and gen_udp has been corrected.\n gen_tcp:connect/3,4 and gen_udp:send/4 now returns \\{error,eafnosupport\\} for\n conflicting destination address versus socket address family. Other corner\n cases for IP address string host names combined with not using the native (OS)\n resolver (which is not default) has also been changed to return\n \\{error,nxdomain\\} instead of \\{error,einval\\}. Those changes just may\n surprise old existing code. gen_tcp:listen/2 and gen_udp:open/2 now fails for\n conflicting local address versus socket address family instead of trying to\n use an erroneous address. Problem reported by Per Hedeland.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7929","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Several glitches and performance issues in the Unicode and I/O-system\n implementation of R13A have been corrected.\n\n Own Id: OTP-7896 Aux Id: OTP-7648 OTP-7887\n\n- The unsupported DNS resolver client inet_res has now been improved to handle\n NAPTR queries.\n\n Own Id: OTP-7925 Aux Id: seq11231","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.13 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-13"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The old Erlang DNS resolver inet_res has been corrected to handle TXT records\n with more than one character string. Patch courtesy of Geoff Cant.\n\n Own Id: OTP-7588\n\n- When chunk reading a disk log opened in read_only mode, bad terms could crash\n the disk log process.\n\n Own Id: OTP-7641 Aux Id: seq11090\n\n- `gen_tcp:send()` did sometimes (only observed on Solaris) return\n `{error,enotconn}` instead of the expected `{error,closed}` as the peer socket\n had been explicitly closed.\n\n Own Id: OTP-7647\n\n- The gen_sctp option sctp_peer_addr_params,\n #sctp_paddrparams\\{address=\\{IP,Port\\} was erroneously decoded in the inet\n driver. This bug has now been corrected.\n\n Own Id: OTP-7755","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Erlang programs can now access STDERR on platforms where such a file\n descriptor is available by using the io_server 'standard_error', i.e.\n io:format(standard_error,\"~s~n\",\\[ErrorMessage]),\n\n Own Id: OTP-6688\n\n- The format of the string returned by `erlang:system_info(system_version)` (as\n well as the first message when Erlang is started) has changed. The string now\n contains the both the OTP version number as well as the erts version number.\n\n Own Id: OTP-7649\n\n- As of this version, the global name server no longer supports nodes running\n Erlang/OTP R10B.\n\n Own Id: OTP-7661\n\n- A `{nodedown, Node}` message passed by the `net_kernel:monitor_nodes/X`\n functionality is now guaranteed to be sent after `Node` has been removed from\n the result returned by `erlang:nodes/Y`.\n\n Own Id: OTP-7725\n\n- The deprecated functions `erlang:fault/1`, `erlang:fault/2`, and\n `file:rawopen/2` have been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7812\n\n- Nodes belonging to different independent clusters can now co-exist on the same\n host with the help of a new environment variable setting ERL_EPMD_PORT.\n\n Own Id: OTP-7826\n\n- The copyright notices have been updated.\n\n Own Id: OTP-7851","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12.5.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- When chunk reading a disk log opened in read_only mode, bad terms could crash\n the disk log process.\n\n Own Id: OTP-7641 Aux Id: seq11090\n\n- Calling `gen_tcp:send()` from several processes on socket with option\n `send_timeout` could lead to much longer timeout than specified. The solution\n is a new socket option `{send_timeout_close,true}` that will do automatic\n close on timeout. Subsequent calls to send will then immediately fail due to\n the closed connection.\n\n Own Id: OTP-7731 Aux Id: seq11161","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.12.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The documentation of `rpc:pmap/3` has been corrected. (Thanks to Kirill\n Zaborski.)\n\n Own Id: OTP-7537\n\n- The listen socket used for the distributed Erlang protocol now uses the socket\n option 'reuseaddr', which is useful when you force the listen port number\n using kernel options 'inet_dist_listen_min' and 'inet_dist_listen_max' and\n restarts a node with open connections.\n\n Own Id: OTP-7563\n\n- Fixed memory leak of unclosed TCP-ports. A gen_tcp:send() followed by a\n failing gen_tcp:recv() could in some cases cause the port to linger after\n being closed.\n\n Own Id: OTP-7615","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Processes spawned using `proc_lib` (including `gen_server` and other library\n modules that use `proc_lib`) no longer keep the entire argument list for the\n initial call, but only the arity.\n\n Also, if `proc_lib:spawn/1` is used to spawn a fun, the actual fun is not\n kept, but only module, function name, and arity of the function that\n implements the fun.\n\n The reason for the change is that keeping the initial fun (or a fun in an\n argument list), would prevent upgrading the code for the module. A secondary\n reason is that keeping the fun and function arguments could waste a\n significant amount of memory.\n\n The drawback with the change is that the crash reports will provide less\n precise information about the initial call (only `Module:Function/Arity`\n instead of `Module:Function(Arguments)`). The function\n `proc_lib:initial_call/1` still returns a list, but each argument has been\n replaced with a dummy atom.\n\n Own Id: OTP-7531 Aux Id: seq11036\n\n- `io:get_line/1` when reading from standard input is now substantially faster.\n There are also some minor performance improvements in `io:get_line/1` when\n reading from any file opened in binary mode. (Thanks to Fredrik Svahn.)\n\n Own Id: OTP-7542\n\n- There is now experimental support for loading of code from archive files. See\n the documentation of `code`, `init`, `erl_prim_loader `and `escript` for more\n info.\n\n The error handling of `escripts` has been improved.\n\n An `escript` may now set explicit arguments to the emulator, such as\n `-smp enabled`.\n\n An `escript` may now contain a precompiled beam file.\n\n An `escript` may now contain an archive file containing one or more\n applications (experimental).\n\n The internal module `code_aux` has been removed.\n\n Own Id: OTP-7548 Aux Id: otp-6622\n\n- `code:is_sticky/1` is now documented. (Thanks to Vlad Dumitrescu.)\n\n Own Id: OTP-7561\n\n- In the job control mode, the \"s\" and \"r\" commands now take an optional\n argument to specify which shell to start. (Thanks to Robert Virding.)\n\n Own Id: OTP-7617\n\n- `net_adm:world/0,1` could crash if called in an emulator that has not been\n started with either the `-sname` or `-name` option; now it will return an\n empty list. (Thanks to Edwin Fine.)\n\n Own Id: OTP-7618","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Large files are now handled on Windows, where the filesystem supports it.\n\n Own Id: OTP-7410","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- New BIF `erlang:decode_packet/3` that extracts a protocol packet from a\n binary. Similar to the socket option `{packet, Type}`. Also documented the\n socket packet type `http` and made it official. _NOTE_: The tuple format for\n `http` packets sent from an active socket has been changed in an incompatible\n way.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7404\n\n- Setting the `{active,once}` for a socket (using inets:setopts/2) is now\n specially optimized (because the `{active,once}` option is typically used much\n more frequently than other options).\n\n Own Id: OTP-7520","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- SCTP_ADDR_CONFIRMED events are now handled by gen_sctp.\n\n Own Id: OTP-7276\n\n- When leaving a process group with `pg2:leave/2` the process was falsely\n assumed to be a member of the group. This bug has been fixed.\n\n Own Id: OTP-7277\n\n- In the Erlang shell, using up and down arrow keys, the wrong previous command\n could sometimes be retrieved.\n\n Own Id: OTP-7278\n\n- The documentation for `erlang:trace/3` has been corrected.\n\n Own Id: OTP-7279 Aux Id: seq10927\n\n- In the SMP emulator, there was small risk that `code:purge(Mod)` would kill a\n process that was running code in `Mod` and unload the module `Mod` before the\n process had terminated. `code:purge(Mod)` now waits for confirmation (using\n `erlang:monitor/2`) that the process has been killed before proceeding.\n\n Own Id: OTP-7282\n\n- `zlib:inflate` failed when the size of the inflated data was an exact multiple\n of the internal buffer size (4000 bytes by default).\n\n Own Id: OTP-7359","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Additional library directories can now be specified in the environment\n variable ERL_LIBS. See the manual page for the `code` module. (Thanks to Serge\n Aleynikov.)\n\n Own Id: OTP-6940\n\n- crypto and zlib drivers improved to allow concurrent smp access.\n\n Own Id: OTP-7262\n\n- There is a new function `init:stop/1` which can be used to shutdown the system\n cleanly AND generate a non-zero exit status or crash dump. (Thanks to Magnus\n Froberg.)\n\n Own Id: OTP-7308\n\n- The `hide` option for [`open_port/2`](`open_port/2`) is now documented.\n (Thanks to Richard Carlsson.)\n\n Own Id: OTP-7358","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12.2.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-2-1"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- `os:cmd/1` on unix platforms now use `/bin/sh` as shell instead of looking for\n `sh` in the `PATH` environment.\n\n Own Id: OTP-7283","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug caused by a race condition involving `disk_log` and `pg2` has been\n fixed.\n\n Own Id: OTP-7209 Aux Id: seq10890\n\n- The beta testing module `gen_sctp` now supports active mode as stated in the\n documentation. Active mode is still rather untested, and there are some issues\n about what should be the right semantics for `gen_sctp:connect/5`. In\n particular: should it be blocking or non-blocking or choosable. There is a\n high probability it will change semantics in a (near) future patch.\n\n Try it, give comments and send in bug reports\\!\n\n Own Id: OTP-7225","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- `erlang:system_info/1` now accepts the `logical_processors`, and\n `debug_compiled` arguments. For more info see the, `m:erlang` documentation.\n\n The scale factor returned by `test_server:timetrap_scale_factor/0` is now also\n effected if the emulator uses a larger amount of scheduler threads than the\n amount of logical processors on the system.\n\n Own Id: OTP-7175\n\n- Updated the documentation for `erlang:function_exported/3` and `io:format/2`\n functions to no longer state that those functions are kept mainly for\n backwards compatibility.\n\n Own Id: OTP-7186\n\n- A process executing the `processes/0` BIF can now be preempted by other\n processes during its execution. This in order to disturb the rest of the\n system as little as possible. The returned result is, of course, still a\n consistent snapshot of existing processes at a time during the call to\n `processes/0`.\n\n The documentation of the `processes/0` BIF and the\n [`is_process_alive/1`](`is_process_alive/1`) BIF have been updated in order to\n clarify the difference between an existing process and a process that is\n alive.\n\n Own Id: OTP-7213\n\n- [`tuple_size/1`](`tuple_size/1`) and [`byte_size/1`](`byte_size/1`) have been\n substituted for [`size/1`](`size/1`) in the documentation.\n\n Own Id: OTP-7244","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12.1.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-1-2"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The `{allocator_sizes, Alloc}` and `alloc_util_allocators` arguments are now\n accepted by `erlang:system_info/1`. For more information see the `m:erlang`\n documentation.\n\n Own Id: OTP-7167","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Fixed a problem in group that could cause the ssh server to lose answers or\n hang.\n\n Own Id: OTP-7185 Aux Id: seq10871","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.12.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- file:read/2 and file:consult_stream/1,3 did not use an empty prompt on I/O\n devices. This bug has now been corrected.\n\n Own Id: OTP-7013\n\n- The sctp driver has been updated to work against newer lksctp packages e.g\n 1.0.7 that uses the API spelling change adaption -> adaptation. Older lksctp\n (1.0.6) still work. The erlang API in gen_sctp.erl and inet_sctp.hrl now\n spells 'adaptation' regardless of the underlying C API.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7120","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The documentation has been updated so as to reflect the last updates of the\n Erlang shell as well as the minor modifications of the control sequence `p` of\n the `io_lib` module.\n\n Superfluous empty lines have been removed from code examples and from Erlang\n shell examples.\n\n Own Id: OTP-6944 Aux Id: OTP-6554, OTP-6911\n\n- [`tuple_size/1`](`tuple_size/1`) and [`byte_size/1`](`byte_size/1`) have been\n substituted for [`size/1`](`size/1`).\n\n Own Id: OTP-7009","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.12 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-12"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug for raw files when reading 0 bytes returning 'eof' instead of empty data\n has been corrected.\n\n Own Id: OTP-6291 Aux Id: OTP-6967\n\n- A bug in gen_udp:fdopen reported by David Baird and also found by Dialyzer has\n been fixed.\n\n Own Id: OTP-6836 Aux Id: OTP-6594\n\n- Calling `error_logger:tty(true)` multiple times does not give multiple error\n log printouts.\n\n Own Id: OTP-6884 Aux Id: seq10767\n\n- The global name server now ignores `nodeup` messages when the command line\n flag `-connect_all false` has been used. (Thanks to Trevor Woollacott.)\n\n Own Id: OTP-6931\n\n- file:write_file/3, file:write/2 and file:read/2 could crash (contrary to\n documentation) for odd enough file system problems, e.g write to full file\n system. This bug has now been corrected.\n\n In this process the file module has been rewritten to produce better error\n codes. Posix error codes now originate from the OS file system calls or are\n generated only for very similar causes (for example 'enomem' is generated if a\n memory allocation fails, and 'einval' is generated if the file handle in\n Erlang is a file handle but currently invalid).\n\n More Erlang-ish error codes are now generated. For example `{error,badarg}` is\n now returned from `file:close/1` if the argument is not of a file handle type.\n See file(3).\n\n The possibility to write a single byte using `file:write/2` instead of a list\n or binary of one byte, contradictory to the documentation, has been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6967 Aux Id: OTP-6597 OTP-6291\n\n- Monitor messages produced by the system monitor functionality, and garbage\n collect trace messages could contain erroneous heap and/or stack sizes when\n the actual heaps and/or stacks were huge.\n\n As of erts version 5.6 the `large_heap` option to\n `erlang:system_monitor/[1,2]` has been modified. The monitor message is sent\n if the sum of the sizes of all memory blocks allocated for all heap\n generations is equal to or larger than the specified size. Previously the\n monitor message was sent if the memory block allocated for the youngest\n generation was equal to or larger than the specified size.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6974 Aux Id: seq10796\n\n- `inet:getopts/2` returned random values on Windows Vista.\n\n Own Id: OTP-7003","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Minor documentation corrections for file:pread/2 and file:pread/3.\n\n Own Id: OTP-6853\n\n- The deprecated functions `file:file_info/1`, `init:get_flag/1`,\n `init:get_flags/0`, and `init:get_args/0` have been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6886\n\n- Contract directives for modules in Kernel and STDLIB.\n\n Own Id: OTP-6895\n\n- The functions io:columns/0, io:columns/1, io:rows/0 and io:rows/1 are added to\n allow the user to get information about the terminal geometry. The shell takes\n some advantage of this when formatting output. For regular files and other\n io-devices where height and width are not applicable, the functions return\n \\{error,enotsup\\}.\n\n Potential incompatibility: If one has written a custom io-handler, the handler\n has to either return an error or take care of io-requests regarding terminal\n height and width. Usually that is no problem as io-handlers, as a rule of\n thumb, should give an error reply when receiving unknown io-requests, instead\n of crashing.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6933\n\n- The undocumented and unsupported functions `inet:ip_to_bytes/1`,\n `inet:ip4_to_bytes/1`, `inet:ip6_to_bytes/1`, and `inet:bytes_to_ip6/16` have\n been removed.\n\n Own Id: OTP-6938\n\n- Added new checksum combine functions to `zlib`. And fixed a bug in\n `zlib:deflate`. Thanks Matthew Dempsky.\n\n Own Id: OTP-6970\n\n- The [`spawn_monitor/1`](`spawn_monitor/1`) and\n [`spawn_monitor/3`](`spawn_monitor/3`) BIFs are now auto-imported (i.e. they\n no longer need an `erlang:` prefix).\n\n Own Id: OTP-6975\n\n- All functions in the `code` module now fail with an exception if they are\n called with obviously bad arguments, such as a tuple when an atom was\n expected. Some functions now also fail for undocumented argument types (for\n instance, `ensure_loaded/1` now only accepts an atom as documented; it used to\n accept a string too).\n\n Dialyzer will generally emit warnings for any calls that use undocumented\n argument types. Even if the call happens to still work in R12B, you should\n correct your code. A future release will adhere to the documentation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6983","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.5.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-5-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The kernel parameter dist_auto_connect once could fail to block a node if\n massive parallel sends were issued during a transient failure of network\n communication\n\n Own Id: OTP-6893 Aux Id: seq10753","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.11.5.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The internal (rarely used) DNS resolver has been modified to not use the\n domain search list when asked to resolve an absolute name; a name with a\n terminating dot. There was also a bug causing it to create malformed DNS\n queries for absolute names that has been corrected, correction suggested by\n Scott Lystig Fritchie. The code has also been corrected to look up cached RRs\n in the same search order as non-cached, now allows having the root domain\n among the search domains, and can now actually do a zone transfer request.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6806 Aux Id: seq10714 EABln35459\n\n- zlib:close/1 would leave an EXIT message in the message queue if the calling\n process had the trap_exit flag enabled.\n\n Own Id: OTP-6811","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The documentation of [`process_flag(priority, Level)`](`process_flag/2`) has\n been updated, see the `m:erlang` documentation.\n\n Own Id: OTP-6745 Aux Id: OTP-6715","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The shell has been updated to fix the following flaws: Shell process exit left\n you with an unresponsive initial shell if not using oldshell. Starting a\n restricted shell with a nonexisting callback module resulted in a shell where\n no commands could be used, not even init:stop/0. Fun's could not be used as\n parameters to local shell functions (in shell_default or user_default) when\n restricted_shell was active.\n\n Own Id: OTP-6537\n\n- The undocumented feature gen_tcp:fdopen/2 was broken in R11B-4. It is now\n fixed again.\n\n Own Id: OTP-6615\n\n- Corrected cancellation of timers in three places in the inet_res module.\n (Problem found by Dialyzer.)\n\n Own Id: OTP-6676","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Corrected protocol layer flue for socket options SO_LINGER, SO_SNDBUF and\n SO_RCVBUF, for SCTP.\n\n Own Id: OTP-6625 Aux Id: OTP-6336\n\n- The behaviour of the inet option \\{active,once\\} on peer close is improved and\n documented.\n\n Own Id: OTP-6681\n\n- The inet option send_timeout for connection oriented sockets is added to allow\n for timeouts in communicating send requests to the underlying TCP stack.\n\n Own Id: OTP-6684 Aux Id: seq10637 OTP-6681\n\n- Minor Makefile changes.\n\n Own Id: OTP-6689 Aux Id: OTP-6742\n\n- The documentation of [`process_flag(priority, Level)`](`process_flag/2`) has\n been updated, see the `m:erlang` documentation.\n\n Own Id: OTP-6715","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.4.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-4-2"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- process_flag/2 accepts the new flag `sensitive`.\n\n Own Id: OTP-6592 Aux Id: seq10555","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.4.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug in gen_udp:open that broke the 'fd' option has been fixed.\n\n Own Id: OTP-6594 Aux Id: seq10619","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.11.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Added a warning to the documentation for the `error_logger` functions\n `error_msg/1,2`, `warning_msg/1,2` and `info_msg/1,2` that calling these\n function with bad arguments can crash the standard event handler.\n\n Own Id: OTP-4575 Aux Id: seq7693\n\n- A bug in `inet_db` concerning getting the resolver option `retry` has been\n corrected.\n\n Own Id: OTP-6380 Aux Id: seq10534\n\n- Names registered by calling `global:register_name()` or\n `global:re_register_name()` were not always unregistered when the registering\n or registered process died. This bug has been fixed.\n\n Own Id: OTP-6428\n\n- When setting the kernel configuration parameter `error_logger` to `false`, the\n documentation stated that \"No error logger handler is installed\". This is\n true, but error logging is not turned off, as the initial, primitive error\n logger event handler is kept, printing raw event messages to tty.\n\n Changing this behavior can be viewed as a backward incompatible change.\n Instead a new value `silent` for the configuration parameter has been added,\n which ensures that error logging is completely turned off.\n\n Own Id: OTP-6445\n\n- Clarified the documentation for `code:lib_dir/1` and `code:priv_dir/1`. The\n functions traverse the names of the code path, they do not search the actual\n directories.\n\n Own Id: OTP-6466\n\n- `io:setopts` returned `{error,badarg}`, when called with only an `expand_fun`\n argument. (Thanks to igwan.)\n\n Own Id: OTP-6508","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- An interface towards the SCTP Socket API Extensions has been implemented.It is\n an Open Source patch courtesy of Serge Aleynikov and Leonid Timochouk. The\n Erlang code parts has been adapted by the OTP team, changing the Erlang API\n somewhat.\n\n The Erlang interface consists of the module `gen_sctp` and an include file\n `-include_lib(\"kernel/include/inet_sctp.hrl\").` for option record definitions.\n The `gen_sctp` module is documented.\n\n The delivered Open Source patch, before the OTP team rewrites, was written\n according to\n [http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\n and was claimed to work fine, tested on Linux Fedora Core 5.0 (kernel\n 2.6.15-2054 or later) and on Solaris 10 and 11. The OTP team rewrites used the\n same standard document but might have accidentally broken some functionality.\n If so, it will soon be patched to working state. The tricky parts in C and the\n general design has essentially not changed. During the rewrites the code was\n hand tested on SuSE Linux Enterprise Server 10, and briefly on Solaris 10.\n Feedbach on code and docs is very much appreciated.\n\n The SCTP interface is in beta state. It has only been hand tested and has no\n automatic test suites in OTP meaning everything is most certainly not tested.\n Socket active mode is broken. IPv6 is not tested. The documentation has been\n reworked due to the API changes, but has not been proofread after this.\n\n Thank you from the OTP team to Serge Aleynikov and Leonid Timochouk for a\n valuable contribution. We hope we have not messed it up too much.\n\n Own Id: OTP-6336\n\n- A `{minor_version,Version}` option is now recognized by\n [`term_to_binary/2`](`term_to_binary/2`). \\{minor_version,1\\} will cause\n floats to be encoded in an exact and more space-efficient way compared to the\n previous encoding.\n\n Own Id: OTP-6434\n\n- Monitoring of nodes has been improved. Now the following properties apply to\n `net_kernel:monitor_nodes/[1,2]`:\n\n - `nodeup` messages will be delivered before delivery of any message from the\n remote node passed through the newly established connection.\n - `nodedown` messages will not be delivered until all messages from the remote\n node that have been passed through the connection have been delivered.\n - Subscriptions can also be made before the `net_kernel` server has been\n started.\n\n Own Id: OTP-6481\n\n- Setting and getting socket options in a \"raw\" fashion is now allowed. Using\n this feature will inevitably produce non portable code, but will allow setting\n ang getting arbitrary uncommon options on TCP stacks that do have them.\n\n Own Id: OTP-6519\n\n- Dialyzer warnings have been eliminated.\n\n Own Id: OTP-6523\n\n- The documentation for `file:delete/1` and `file:set_cwd/1` has been updated to\n clarify what happens if the input arguments are of an incorrect type.\n\n Own Id: OTP-6535","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.3.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-3-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- An erroneous packet size could be used for the first messages passed through a\n newly established connection between two Erlang nodes. This could cause\n messages to be discarded, or termination of the connection.\n\n Own Id: OTP-6473","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.11.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- On Unix, the `unix:cmd/1` function could leave an 'EXIT' message in the\n message queue for the calling process That problem was more likely to happen\n in an SMP emulator.\n\n Own Id: OTP-6368","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- More interfaces are added in erl_ddll, to support different usage scenarios.\n\n Own Id: OTP-6307 Aux Id: OTP-6234\n\n- Locks set by calling `global:set_lock()` were not always deleted when the\n locking process died. This bug has been fixed.\n\n Own Id: OTP-6341 Aux Id: seq10445","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.2 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Behavior in case of disappeared nodes when using he dist_auto_connect once got\n changed in R11B-1. The timeouts regarding normal distributed operations is now\n reverted to the old (pre R11B-1).\n\n Own Id: OTP-6258 Aux Id: OTP-6200, seq10449\n\n- Start-up problems for the internal process used by the `inet:gethostbyname()`\n functions were eliminated. If the internal process (`inet_gethost_native`) had\n not previously been started, and if several processes at the same time called\n one of the `inet:gethostbyname()` functions, the calls could fail.\n\n Own Id: OTP-6286","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Code cleanup: the old internal obsolete file_server has been removed. It was\n only used when communicating with R7 and older nodes.\n\n Own Id: OTP-6245\n\n- Trying to open a non-existent or badly formed disk log no longer results in a\n crash report. In particular, `ets:file2tab/1` reports no error when the\n argument is not a well-formed disk log file. (The return value has not been\n changed, it is still an error tuple.)\n\n Own Id: OTP-6278 Aux Id: seq10421\n\n- There are new BIFs `erlang:spawn_monitor/1,3`, and the new option `monitor`\n for `spawn_opt/2,3,4,5`.\n\n The `observer_backend` module has been updated to handle the new BIFs.\n\n Own Id: OTP-6281\n\n- To help Dialyzer find more bugs, many functions in the Kernel and STDLIB\n applications now only accept arguments of the type that is documented.\n\n For instance, the functions `lists:prefix/2` and `lists:suffix/2` are\n documented to only accept lists as their arguments, but they actually accepted\n anything and returned `false`. That has been changed so that the functions\n cause an exception if one or both arguments are not lists.\n\n Also, the `string:strip/3` function is documented to take a character argument\n that is a character to strip from one or both ends of the string. Given a list\n instead of a character, it used to do nothing, but will now cause an\n exception.\n\n Dialyzer will find most cases where those functions are passed arguments of\n the wrong type.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6295","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.1.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-1-1"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- There is now an option read_packets for UDP sockets that sets the maximum\n number of UDP packets that will be read for each invocation of the socket\n driver.\n\n Own Id: OTP-6249 Aux Id: seq10452","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- In R11B-0, the erl_ddll server process is always started. Despite that, the\n configuration parameter `start_ddll` for the Kernel application was still\n obeyed, which would cause the erl_ddll server to be started TWICE (and the\n system shutting down as a result). In this release, `start_ddll` is no longer\n used and its documentation has been removed.\n\n Own Id: OTP-6163\n\n- The kernel option \\{dist_auto_connect,once\\} could block out nodes that had\n never been connected, causing persistent partitioning of networks.\n Furthermore, partial restarts of networks could cause inconsistent global name\n databases. Both problems are now solved.\n\n Own Id: OTP-6200 Aux Id: seq10377","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Late arriving tcp_closed and udp_closed messages are now removed from the\n message queue of a process calling gen_tcp:close/1, gen_udp:close/1, and\n inet:close/1.\n\n Own Id: OTP-6197","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.11 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-11"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- When repairing a disk log with a corrupt index file (caused by for instance a\n hard disk failure) the old contents of the index file is kept unmodified. This\n will make repeated attempts to open the disk log fail every time.\n\n Own Id: OTP-5558 Aux Id: seq9823\n\n- Previously [`unlink/1`](`unlink/1`) and `erlang:demonitor/2` behaved\n completely asynchronous. This had one undesirable effect, though. You could\n never know when you were guaranteed _not_ to be affected by a link that you\n had unlinked or a monitor that you had demonitored.\n\n The new behavior of [`unlink/1`](`unlink/1`) and `erlang:demonitor/2` can be\n viewed as two operations performed atomically. Asynchronously send an unlink\n signal or a demonitor signal, and ignore any future results of the link or\n monitor.\n\n _NOTE_: This change can cause some obscure code to fail which previously did\n not. For example, the following code might hang:\n\n ```erlang\n Mon = erlang:monitor(process, Pid),\n %% ...\n exit(Pid, bang),\n erlang:demonitor(Mon),\n receive\n {'DOWN', Mon, process, Pid, _} -> ok\n %% We were previously guaranteed to get a down message\n %% (since we exited the process ourself), so we could\n %% in this case leave out:\n %% after 0 -> ok\n end,\n ```\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-5772\n\n- The behavior when an application fails to start and possibly causes the\n runtime system to halt has been cleaned up, including fixing some minor bugs.\n\n `application_controller` should now always terminate with a non-nested string,\n meaning the slogan in an `erl_crash.dump` should always be easy to read.\n\n `init` now makes sure that the slogan passed to `erlang:halt/1` does not\n exceed the maximum allowed length.\n\n Redundant calls to [`list_to_atom/1`](`list_to_atom/1`) has been removed from\n the primitive `error_logger` event handler. (Thanks Serge Aleynikov for\n pointing this out).\n\n The changes only affects the contents of the error messages and crashdump file\n slogan.\n\n Own Id: OTP-5964\n\n- The `erl_ddll` server is now started when OTP is started and placed under the\n Kernel supervisor. This fixes several minor issues. It used to be started on\n demand.\n\n The documentation for the `start` and `stop` functions in the `erl_ddll`\n module has been removed, as those functions are not meant to be used by other\n applications.\n\n Furthermore, the `erl_ddll:stop/1` function no longer terminates the\n `erl_ddll` server, as that would terminate the entire runtime system.\n\n Own Id: OTP-6033","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Removed some unused functions from `application_master`.\n\n Own Id: OTP-3889\n\n- Global no longer allows the registration of a process under more than one\n name. If the old (buggy) behavior is desired the Kernel application variable\n `global_multi_name_action` can be given the value `allow`.\n\n Own Id: OTP-5640 Aux Id: OTP-5603\n\n- The (slightly misleading) warnings that was shown when the `erlang.erl` file\n was compiled has been eliminated.\n\n Own Id: OTP-5947\n\n- The `auth` module API is deprecated.\n\n Own Id: OTP-6037\n\n- Added `erlang:demonitor/2`, making it possible to at the same time flush a\n received `'DOWN'` message, if there is one. See `m:erlang`.\n\n Own Id: OTP-6100 Aux Id: OTP-5772","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.13 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-13"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Large files (more than 2 GBytes) are now handled on Solaris 8.\n\n Own Id: OTP-5849 Aux Id: seq10157\n\n- During startup, a garbage `{'DOWN', ...}` message was left by\n `inet_gethost_native`, that caused problems for the starting code server.\n\n Own Id: OTP-5978 Aux Id: OTP-5974","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- `global` now makes several attempts to connect nodes when maintaining the\n fully connected network. More than one attempt is sometimes needed under very\n heavy load.\n\n Own Id: OTP-5889\n\n- `erl_epmd` now explicitly sets the timeout to `infinity` when calling\n `gen_server:call`. The old timeout of 15 seconds could time out under very\n heavy load.\n\n Own Id: OTP-5959\n\n- Corrected the start of code server to use reference-tagged tuples to ensure\n that an unexpected message sent to the parent process does not cause a halt of\n the system. Also removed the useless `start/*` functions in both `code.erl`\n and `code_server.erl` and no longer exports the `init` function from\n `code_server.erl`.\n\n Own Id: OTP-5974 Aux Id: seq10243, OTP-5978","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.12 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-12"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- A bug in `global` has been fixed: the locker process added `nonode@nohost` to\n the list of nodes to lock. This could happen before any nodes got known to the\n global name server. Depending on net configuration the symptom was a delay.\n\n Own Id: OTP-5792 Aux Id: OTP-5563\n\n- If an `.app` file is missing, the error reason returned by\n `application:load/1` has been corrected to\n `{\"no such file or directory\", \"FILE.app\"}`, instead of the less informative\n `{\"unknown POSIX error\",\"FILE.app\"}`.\n\n Own Id: OTP-5809\n\n- Bug fixes: `disk_log:accessible_logs/0` no longer reports all `pg2` process\n groups as distributed disk logs; `disk_log:pid2name/1` did not recognize\n processes of distributed disk logs.\n\n Own Id: OTP-5810\n\n- The functions `file:consult/1`, `file:path_consult/2`, `file:eval/1,2`,\n `file:path_eval/2,3`, `file:script/1,2`, `file:path_script/2,3` now return\n correct line numbers in error tuples.\n\n Own Id: OTP-5814\n\n- If there were user-defined variables in the boot script, and their values were\n not provided using the `-boot_var` option, the emulator would refuse to start\n with a confusing error message. Corrected to show a clear, understandable\n message.\n\n The `prim_file` module was modified to not depend on the `lists` module, to\n make it possible to start the emulator using a user-defined loader. (Thanks to\n Martin Bjorklund.)\n\n Own Id: OTP-5828 Aux Id: seq10151\n\n- Minor corrections in the description of open modes. (Thanks to Richard\n Carlsson.)\n\n Own Id: OTP-5856","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- `application_controller` now terminates with the actual error reason, instead\n of `shutdown`. This means that the crash dump now should be somewhat more\n informative, in the case where the runtime system is terminated due to an\n error in an application.\n\n Example: If the (permanent) application `app1` fails to start, the slogan now\n will be:\n \"`Kernel pid terminated (application_controller) ({application_start_failure,app1,{shutdown, {app1,start,[normal,[]]}}})`\"\n\n rather than the previous\n \"`Kernel pid terminated (application_controller) (shutdown)`\".\n\n Own Id: OTP-5811","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.11.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-11-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Timers could sometimes timeout too early. This bug has now been fixed.\n\n Automatic cancellation of timers created by `erlang:send_after(Time,` pid(),\n Msg), and `erlang:start_timer(Time,` pid(), Msg) has been introduced. Timers\n created with the receiver specified by a pid, will automatically be cancelled\n when the receiver exits. For more information see the `m:erlang` man page.\n\n In order to be able to maintain a larger amount of timers without increasing\n the maintenance cost, the internal timer wheel and bif timer table have been\n enlarged.\n\n Also a number of minor bif timer optimizations have been implemented.\n\n Own Id: OTP-5795 Aux Id: OTP-5090, seq8913, seq10139, OTP-5782","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Documentation improvements:\n\n \\- documentation for `erlang:link/1` corrected\n\n \\- command line flag `-code_path_cache` added\n\n \\- `erl` command line flags clarifications\n\n \\- `m:net_kernel` clarifications\n\n Own Id: OTP-5847","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.11 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-11"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Several bug fixes and improvements in the global name registration facility\n (see `m:global`):\n\n - the name resolving procedure did not always unlink no longer registered\n processes;\n - the global name could sometimes hang when a `nodedown` was immediately\n followed by a `nodeup`;\n - global names were not always unregistered when a node went down;\n - it is now possible to set and delete locks at the same time as the global\n name server is resolving names--the handling of global locks has been\n separated from registration of global names;\n\n As of this version, `global` no longer supports nodes running Erlang/OTP R7B\n or earlier.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-5563\n\n- The functions `global:set_lock/3` and `global:trans/4` now accept the value\n `0` (zero) of the `Retries` argument.\n\n Own Id: OTP-5737\n\n- The `inet:getaddr(Addr, Family)` no longer validates the `Addr` argument if it\n is a 4 or 8 tuple containing the IP address, except for the size of the tuple\n and that it contains integers in the correct range.\n\n The reason for the change is that validation could cause the following\n sequence of calls to fail:\n\n `{ok,Addr} = inet:getaddr(localhost, inet6), gen_tcp:connect(Addr, 7, [inet6])`\n\n Own Id: OTP-5743","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The previously undocumented and UNSUPPORTED `zlib` module has been updated in\n an incompatible way and many bugs have been corrected. It is now also\n documented.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-5715\n\n- Added `application` interface functions `which_applications/1`, `set_env/4`\n and `unset_env/3`, which take an additional `Timeout` argument. To be used in\n situations where the standard gen_server timeout (5000ms) is not adequate.\n\n Own Id: OTP-5724 Aux Id: seq10083\n\n- Improved documentation regarding synchronized start of applications with\n included applications (using start phases and `application_starter`).\n\n Own Id: OTP-5754\n\n- New socket options `priority` and `tos` for platforms that support them\n (currently only Linux).\n\n Own Id: OTP-5756\n\n- The global name server has been optimized when it comes to maintaining a fully\n connected network.\n\n Own Id: OTP-5770","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.10.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-10-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The native resolver has gotten an control API for extended debugging and soft\n restart. It is: `inet_gethost_native:control(Control)` \n `Control = {debug_level,Level} | soft_restart` \n `Level = integer() in the range 0-4`.\n\n Own Id: OTP-5751 Aux Id: EABln25013","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.10.10 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-10"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- If several processes (at the same node) simultaneously tried to start the same\n distributed application, this could lead to `application:start` returning an\n erroneous value, or even hang.\n\n Own Id: OTP-5606 Aux Id: seq9838","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The manual pages for most of the Kernel and some of the STDLIB modules have\n been updated, in particular regarding type definitions.\n\n The documentation of the return value for `erts:info/1` has been corrected.\n\n The documentation for `erlang:statistics/1` now lists all possible arguments.\n\n Own Id: OTP-5360\n\n- When the native resolver fails a `gethostbyaddr` lookup, `nxdomain` should be\n returned. There should be no attempt to fallback on a routine that succeeds if\n only the syntax of the IP address is valid. This has been fixed.\n\n Own Id: OTP-5598 Aux Id: OTP-5576\n\n- Replaced some tuple funs with the new `fun M:F/A` construct.\n\n The high-order functions in the `lists` module no longer accept bad funs under\n any circumstances. '`lists:map(bad_fun, [])`' used to return '`[]`' but now\n causes an exception.\n\n Unused, broken compatibility code in the `ets` module was removed. (Thanks to\n Dialyzer.)\n\n Eliminated 5 discrepancies found by Dialyzer in the Appmon application.\n\n Own Id: OTP-5633\n\n- The possibility to have comments following the list of tuples in a config file\n (file specified with the `-config` flag) has been added.\n\n Own Id: OTP-5661 Aux Id: seq10003","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.9 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-9"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- '`erl -config sys.config`' would fail to start if the `sys.config` file did\n not contain any whitespace at all after the dot. (Thanks to Anders Nygren.)\n\n Own Id: OTP-5543\n\n- A bug regarding tcp sockets which results in hanging `gen_tcp:send/2` has been\n corrected. To encounter this bug you needed one process that read from a\n socket, one that wrote more date than the reader read out so the sender got\n suspended, and then the reader closed the socket. (Reported and diagnosed by\n Alexey Shchepin.)\n\n Corrected a bug in the (undocumented and unsupported) option `{packet,http}`\n for `gen_tcp.` (Thanks to Claes Wikstrom and Luke Gorrie.)\n\n Updated the documentation regarding the second argument to `gen_tcp:recv/2`,\n the `Length` to receive.\n\n Own Id: OTP-5582 Aux Id: seq9839","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- At startup, the Erlang resolver hosts table was used to look up the name of\n the local (and possibly stand alone) host. This was incorrect. The configured\n resolver method is now used for this purpose.\n\n Own Id: OTP-5393\n\n- The `erlang:port_info/1` BIF is now documented. Minor corrections of the\n documentation for `erlang:port_info/2`.\n\n Added a note to the documentation of the `math` module that all functions are\n not available on all platforms.\n\n Added more information about the `+c` option in the `erl` man page in the ERTS\n documentation.\n\n Own Id: OTP-5555\n\n- The new `fun M:F/A` construct creates a fun that refers to the latest version\n of `M:F/A.` This syntax is meant to replace tuple funs `{M,F}` which have many\n problems.\n\n The new type test [`is_function(Fun,A)`](`is_function/2`) (which may be used\n in guards) test whether `Fun` is a fun that can be applied with `A` arguments.\n (Currently, `Fun` can also be a tuple fun.)\n\n Own Id: OTP-5584\n\n- According to the documentation `global` implements the equivalent of\n [`register/2`](`register/2`), which returns `badarg` if a process is already\n registered. As it turns out there is no check in `global` if a process is\n registered under more than one name. If some process is accidentally or by\n design given several names, it is possible that the name registry becomes\n inconsistent due to the way the resolve function is called when name clashes\n are discovered (see `register_name/3` in `m:global`).\n\n In OTP R11B `global` will not allow the registration of a process under more\n than one name. To help finding code where `no` will be returned, a Kernel\n application variable, `global_multi_name_action`, is hereby introduced.\n Depending on its value (`info`, `warning`, or `error`), messages are sent to\n the error logger when `global` discovers that some process is given more than\n one name. The variable only affects the node where it is defined.\n\n Own Id: OTP-5603","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.8 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-8"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- In case of a DNS lookup loop, `inet_db:getbyname` ends up building an infinite\n list. This has been fixed.\n\n Own Id: OTP-5449\n\n- When doing an `inet6` name lookup on an IPv4 address it was possible to get an\n address on IPv4 format back. This has been corrected. Some other minor\n inconsistencies regarding IPv6 name lookup have also been corrected.\n\n Own Id: OTP-5576","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.7 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Under certain circumstances the `net_kernel` could emit spurious nodedown\n messages. This bug has been fixed.\n\n Own Id: OTP-5396\n\n- Removed description of the `keep_zombies` configuration parameter in the\n `kernel` man page.\n\n Own Id: OTP-5497","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- Eliminated Dialyzer warnings (caused by dead code) in the `init` and\n `prim_file` modules.\n\n Own Id: OTP-5496\n\n- `inet_config` now also checks the environment variable `ERL_INETRC` for a\n possible user configuration file. See the ERTS User's Guide for details.\n\n Own Id: OTP-5512","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.6 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-6"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- The `c` option for the `+B` flag has been introduced which makes it possible\n to use Ctrl-C (Ctrl-Break on Windows) to interrupt the shell process rather\n than to invoke the emulator break handler. All new `+B` options are also\n supported on Windows (werl) as of now. Furthermore, Ctrl-C on Windows has now\n been reserved for copying text (what Ctrl-Ins was used for previously).\n Ctrl-Break should be used for break handling. Lastly, the documentation of the\n system flags has been updated.\n\n Own Id: OTP-5388\n\n- The possibility to start the Erlang shell in parallel with the rest of the\n system was reintroduced for backwards compatibility in STDLIB 1.13.1. The flag\n to be used for this is now called `async_shell_start` and has been documented.\n New shells started from the JCL menu are not synchronized with `init` anymore.\n This makes it possible to start a new shell (e.g. for debugging purposes) even\n if the initial shell has not come up.\n\n Own Id: OTP-5406 Aux Id: OTP-5218","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.5 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- Documentation for `erlang:binary_to_float/1` deleted. The BIF itself was\n removed several releases ago.\n\n Updated documentation for [`apply/2`](`apply/2`) and [`apply/3`](`apply/3`).\n\n Own Id: OTP-5391","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- `net_kernel:monitor_nodes/2` which takes a flag and an option list has been\n added. By use of `net_kernel:monitor_nodes/2` one can subscribe for\n `nodeup/nodedown` messages with extra information. It is now possible to\n monitor hidden nodes, and get `nodedown` reason. See the `m:net_kernel`\n documentation for more information.\n\n Own Id: OTP-5374","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.4 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The application master for an application now terminates the application\n faster, which reduces the risk for timeouts in other parts of the system.\n\n Own Id: OTP-5363 Aux Id: EABln19084\n\n- A BIF `erlang:raise/3` has been added. See the manual for details. It is\n intended for internal system programming only, advanced error handling.\n\n Own Id: OTP-5376 Aux Id: OTP-5257","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Kernel 2.10.3 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-3"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- With the `-eval` flag (`erl -eval Expr`), an arbitrary expression can be\n evaluated during system initialization. This is documented in `m:init`.\n\n Own Id: OTP-5260\n\n- The unsupported and undocumented modules `socks5`, `socks5_auth`,\n `socks5_tcp`, and `socks5_udp` have been removed.\n\n Own Id: OTP-5266","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Kernel 2.10.1 - Kernel Release Notes","doc":"","ref":"notes.html#kernel-2-10-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","doc":"- The Pman 'trace shell' functionality was broken and has now been fixed.\n Furthermore, Pman could not correctly find the pid of the active shell if more\n than one shell process was running on the node. This has also been corrected.\n\n Own Id: OTP-5191\n\n- The documentation for the `auth:open/1` function which no longer exists has\n been removed. (Thanks to Miguel Barreiro.)\n\n Own Id: OTP-5208\n\n- Corrected the `crc32/3` function in the undocumented and unsupported `zlib`\n module.\n\n Own Id: OTP-5227","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Kernel Release Notes","doc":"- You can now start Erlang with the `-rsh` flag which gives you a remote initial\n shell instead of a local one. Example:\n\n ```text\n erl -sname this_node -rsh other_node@other_host\n ```\n\n Own Id: OTP-5210\n\n- If `/etc/hosts` specified two hosts with the same IP address (on separate\n lines), only the last host would be registered by inet_db during inet\n configuration. This has been corrected now so that both aliases are registered\n with the same IP address.\n\n Own Id: OTP-5212 Aux Id: seq7128\n\n- The documentation for BIFs that take I/O lists have been clarified. Those are\n [`list_to_binary/1`](`list_to_binary/1`),\n [`port_command/2`](`port_command/2`), [`port_control/3`](`port_control/3`).\n\n Documentation for all `is_*` BIFs (such as [`is_atom/1`](`is_atom/1`)) has\n been added.\n\n Removed the documentation for `erlang:float_to_binary/2` which was removed\n from the run-time system several releases ago.\n\n Own Id: OTP-5222","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Introduction","doc":"\n# Introduction","ref":"introduction_chapter.html"},{"type":"extras","title":"Scope - Introduction","doc":"The Kernel application has all the code necessary to run the Erlang runtime\nsystem: file servers, code servers, and so on.\n\nThe Kernel application is the first application started. It is mandatory in the\nsense that the minimal system based on Erlang/OTP consists of Kernel and STDLIB.\nKernel contains the following functional areas:\n\n- Start, stop, supervision, configuration, and distribution of applications\n- Code loading\n- Logging\n- Global name service\n- Supervision of Erlang/OTP\n- Communication with sockets\n- Operating system interface","ref":"introduction_chapter.html#scope"},{"type":"extras","title":"Prerequisites - Introduction","doc":"It is assumed that the reader is familiar with the Erlang programming language.","ref":"introduction_chapter.html#prerequisites"},{"type":"extras","title":"Socket Usage","doc":"\n# Socket Usage","ref":"socket_usage.html"},{"type":"extras","title":"Introduction - Socket Usage","doc":"The socket interface (module) is basically a \"thin\" layer on top of the OS\nsocket interface. It is assumed that, unless you have special needs,\ngen\\_\\[tcp|udp|sctp] should be sufficient (when they become available).\n\nNote that just because we have a documented and described option, it does _not_\nmean that the OS supports it. So its recommended that the user reads the\nplatform specific documentation for the option used.","ref":"socket_usage.html#introduction"},{"type":"extras","title":"Asynchronous calls - Socket Usage","doc":"Some functions allow for an _asynchronous_ call\n([`accept/2`](`m:socket#accept-nowait`),\n[`connect/3`](`m:socket#connect-nowait`), [`recv/3,4`](`m:socket#recv-nowait`),\n[`recvfrom/3,4`](`m:socket#recvfrom-nowait`),\n[`recvmsg/2,3,5`](`m:socket#recvmsg-nowait`),\n[`send/3,4`](`m:socket#send-nowait`), [`sendmsg/3,4`](`m:socket#sendmsg-nowait`)\nand [`sendto/4,5`](`m:socket#sendto-nowait`)). This is achieved by setting the\n`Timeout` argument to `nowait`. For instance, if calling the\n[`recv/3`](`m:socket#recv-nowait`) function with Timeout set to `nowait` (i.e.\n`recv(Sock, 0, nowait)`) when there is actually nothing to read, it will return\nwith:\n\n- **On Unix** - `{select, `[`SelectInfo`](`t:socket:select_info/0`)`}`\n\n `SelectInfo` contains the [`SelectHandle`](`t:socket:select_handle/0`).\n\n- **On Windows** -\n `{completion, `[`CompletionInfo`](`t:socket:completion_info/0`)`}`\n\n `CompletionInfo` contains the\n [`CompletionHandle`](`t:socket:completion_handle/0`).\n\nWhen data eventually arrives a 'select' or 'completion' message will be sent to\nthe caller:\n\n- **On Unix** - `{'$socket', socket(), select, SelectHandle}`\n\n The caller can then make another call to the recv function and now expect\n data.\n\n Note that all other users are _locked out_ until the 'current user' has called\n the function (recv in this case). So either immediately call the function or\n [`cancel`](`socket:cancel/2`).\n\n- **On Windows** -\n `{'$socket', socket(), completion, {CompletionHandle, CompletionStatus}}`\n\n The `CompletionStatus` contains the result of the operation (read).\n\nThe user must also be prepared to receive an abort message:\n\n- `{'$socket', socket(), abort, Info}`\n\nIf the operation is aborted for whatever reason (e.g. if the socket is closed\n\"by someone else\"). The `Info` part contains the abort reason (in this case that\nthe socket has been closed `Info = {SelectHandle, closed}`).\n\nThe general form of the 'socket' message is:\n\n- `{'$socket', Sock :: socket(), Tag :: atom(), Info :: term()}`\n\nWhere the format of `Info` is a function of `Tag`:\n\n| _Tag_ | _Info value type_ |\n| ---------- | ----------------------------------------- |\n| select | select_handle() |\n| completion | \\{completion_handle(), CompletionStatus\\} |\n| abort | \\{select_handle(), Reason :: term()\\} |\n\n_Table: socket message info value type_\n\nThe `select_handle()` is the same as was returned in the\n[`SelectInfo`](`t:socket:select_info/0`).\n\nThe `completion_handle()` is the same as was returned in the\n[`CompletionInfo`](`t:socket:completion_info/0`).","ref":"socket_usage.html#asynchronous-calls"},{"type":"extras","title":"Socket Registry - Socket Usage","doc":"The _socket registry_ is how we keep track of sockets. There are two functions\nthat can be used for interaction: `socket:number_of/0` and\n`socket:which_sockets/1`.\n\nIn systems which create and delete _many_ sockets dynamically, it (the socket\nregistry) could become a bottleneck. For such systems, there are a couple of\nways to control the use of the socket registry.\n\nFirstly, its possible to effect the global default value when building OTP from\nsource with the two configure options:\n\n```text\n--enable-esock-socket-registry (default) | --disable-esock-socket-registry\n```\n\nSecond, its possible to effect the global default value by setting the\nenvironment variable `ESOCK_USE_SOCKET_REGISTRY` (boolean) before starting the\nerlang.\n\nThird, its possible to alter the global default value in runtime by calling the\nfunction [`use_registry/1`](`socket:use_registry/1`).\n\nAnd finally, its possible to override the global default when creating a socket\n(with [`open/2`](`socket:open/2`) and [`open/4`](`socket:open/4`)) by providing\nthe attribute `use_registry` (boolean) in the their `Opts` argument (which\neffects _that_ specific socket).","ref":"socket_usage.html#socket-registry"},{"type":"extras","title":"Example - Socket Usage","doc":"This example is intended to show how to create a simple (echo) server\n(and client).\n\n```erlang\n-module(example).\n\n-export([client/2, client/3]).\n-export([server/0, server/1, server/2]).\n\n\n%% ======================================================================\n\n%% === Client ===\n\nclient(#{family := Family} = ServerSockAddr, Msg)\n when is_list(Msg) orelse is_binary(Msg) ->\n {ok, Sock} = socket:open(Family, stream, default),\n ok = maybe_bind(Sock, Family),\n ok = socket:connect(Sock, ServerSockAddr),\n client_exchange(Sock, Msg);\n\nclient(ServerPort, Msg)\n when is_integer(ServerPort) andalso (ServerPort > 0) ->\n Family = inet, % Default\n Addr = get_local_addr(Family), % Pick an address\n SockAddr = #{family => Family,\n\t\t addr => Addr,\n\t\t port => ServerPort},\n client(SockAddr, Msg).\n\nclient(ServerPort, ServerAddr, Msg)\n when is_integer(ServerPort) andalso (ServerPort > 0) andalso\n is_tuple(ServerAddr) ->\n Family = which_family(ServerAddr),\n SockAddr = #{family => Family,\n\t\t addr => ServerAddr,\n\t\t port => ServerPort},\n client(SockAddr, Msg).\n\n%% Send the message to the (echo) server and wait for the echo to come back.\nclient_exchange(Sock, Msg) when is_list(Msg) ->\n client_exchange(Sock, list_to_binary(Msg));\nclient_exchange(Sock, Msg) when is_binary(Msg) ->\n ok = socket:send(Sock, Msg, infinity),\n {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),\n ok.\n\n\n%% ======================================================================\n\n%% === Server ===\n\nserver() ->\n %% Make system choose port (and address)\n server(0).\n\n%% This function return the port and address that it actually uses,\n%% in case server/0 or server/1 (with a port number) was used to start it.\n\nserver(#{family := Family, addr := Addr, port := _} = SockAddr) ->\n {ok, Sock} = socket:open(Family, stream, tcp),\n ok = socket:bind(Sock, SockAddr),\n ok = socket:listen(Sock),\n {ok, #{port := Port}} = socket:sockname(Sock),\n Acceptor = start_acceptor(Sock),\n {ok, {Port, Addr, Acceptor}};\n\nserver(Port) when is_integer(Port) ->\n Family = inet, % Default\n Addr = get_local_addr(Family), % Pick an address\n SockAddr = #{family => Family,\n\t\t addr => Addr,\n\t\t port => Port},\n server(SockAddr).\n\nserver(Port, Addr)\n when is_integer(Port) andalso (Port >= 0) andalso\n is_tuple(Addr) ->\n Family = which_family(Addr),\n SockAddr = #{family => Family,\n\t\t addr => Addr,\n\t\t port => Port},\n server(SockAddr).\n\n\n%% --- Echo Server - Acceptor ---\n\nstart_acceptor(LSock) ->\n Self = self(),\n {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end),\n receive\n\t{'DOWN', MRef, process, Pid, Info} ->\n\t erlang:error({failed_starting_acceptor, Info});\n\t{Pid, started} ->\n\t %% Transfer ownership\n\t socket:setopt(LSock, otp, owner, Pid),\n\t Pid ! {self(), continue},\n\t erlang:demonitor(MRef),\n\t Pid\n end.\n \nacceptor_init(Parent, LSock) ->\n Parent ! {self(), started},\n receive\n\t{Parent, continue} ->\n\t ok\n end,\n acceptor_loop(LSock).\n\nacceptor_loop(LSock) ->\n case socket:accept(LSock, infinity) of\n\t{ok, ASock} ->\n\t start_handler(ASock),\n\t acceptor_loop(LSock);\n\t{error, Reason} ->\n\t erlang:error({accept_failed, Reason})\n end.\n\n\n%% --- Echo Server - Handler ---\n\nstart_handler(Sock) ->\n Self = self(),\n {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end),\n receive\n\t{'DOWN', MRef, process, Pid, Info} ->\n\t erlang:error({failed_starting_handler, Info});\n\t{Pid, started} ->\n\t %% Transfer ownership\n\t socket:setopt(Sock, otp, owner, Pid),\n\t Pid ! {self(), continue},\n\t erlang:demonitor(MRef),\n\t Pid\n end.\n\nhandler_init(Parent, Sock) ->\n Parent ! {self(), started},\n receive\n\t{Parent, continue} ->\n\t ok\n end,\n handler_loop(Sock, undefined).\n\n%% No \"ongoing\" reads\n%% The use of 'nowait' here is clearly *overkill* for this use case,\n%% but is intended as an example of how to use it.\nhandler_loop(Sock, undefined) ->\n case socket:recv(Sock, 0, nowait) of\n\t{ok, Data} ->\n\t echo(Sock, Data),\n\t handler_loop(Sock, undefined);\n\n\t{select, SelectInfo} ->\n\t handler_loop(Sock, SelectInfo);\n\n\t{completion, CompletionInfo} ->\n\t handler_loop(Sock, CompletionInfo);\n\n\t{error, Reason} ->\n\t erlang:error({recv_failed, Reason})\n end;\n\n%% This is the standard (asyncronous) behaviour.\nhandler_loop(Sock, {select_info, recv, SelectHandle}) ->\n receive\n\t{'$socket', Sock, select, SelectHandle} ->\n\t case socket:recv(Sock, 0, nowait) of\n\t\t{ok, Data} ->\n\t\t echo(Sock, Data),\n\t\t handler_loop(Sock, undefined);\n\n\t\t{select, NewSelectInfo} ->\n\t\t handler_loop(Sock, NewSelectInfo);\n\n\t\t{error, Reason} ->\n\t\t erlang:error({recv_failed, Reason})\n\t end\n end;\n\n%% This is the (asyncronous) behaviour on platforms that support 'completion',\n%% currently only Windows.\nhandler_loop(Sock, {completion_info, recv, CompletionHandle}) ->\n receive\n\t{'$socket', Sock, completion, {CompletionHandle, CompletionStatus}} ->\n\t case CompletionStatus of\n\t\t{ok, Data} ->\n\t\t echo(Sock, Data),\n\t\t handler_loop(Sock, undefined);\n\t\t{error, Reason} ->\n\t\t erlang:error({recv_failed, Reason})\n\t end\n end.\n\necho(Sock, Data) when is_binary(Data) ->\n ok = socket:send(Sock, Data, infinity),\n io:format(\"** ECHO **\"\n\t \"~n~s~n\", [binary_to_list(Data)]).\n\n\n%% ======================================================================\n\n%% === Utility functions ===\n\nmaybe_bind(Sock, Family) ->\n maybe_bind(Sock, Family, os:type()).\n\nmaybe_bind(Sock, Family, {win32, _}) ->\n Addr = get_local_addr(Family),\n SockAddr = #{family => Family,\n addr => Addr,\n port => 0},\n socket:bind(Sock, SockAddr);\nmaybe_bind(_Sock, _Family, _OS) ->\n ok.\n\n%% The idea with this is extract a \"usable\" local address\n%% that can be used even from *another* host. And doing\n%% so using the net module.\n\nget_local_addr(Family) ->\n Filter =\n\tfun(#{addr := #{family := Fam},\n\t flags := Flags}) ->\n\t\t(Fam =:= Family) andalso (not lists:member(loopback, Flags));\n\t (_) ->\n\t\tfalse\n\tend,\n {ok, [SockAddr|_]} = net:getifaddrs(Filter),\n #{addr := #{addr := Addr}} = SockAddr,\n Addr.\n\nwhich_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 4) ->\n inet;\nwhich_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 8) ->\n inet6.\n```\n\n\n[](){: #socket_options }","ref":"socket_usage.html#example"},{"type":"extras","title":"Socket Options - Socket Usage","doc":"Options for level `otp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ------------------- | ------------------------------------------------------------- | ----- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------- |\n| assoc_id | integer() | no | yes | type = seqpacket, protocol = sctp, is an association |\n| debug | boolean() | yes | yes | none |\n| iow | boolean() | yes | yes | none |\n| controlling_process | pid() | yes | yes | none |\n| rcvbuf | default \\| pos_integer() \\| \\{pos_integer(), pos_ineteger()\\} | yes | yes | The tuple format is _not_ allowed on Windows. 'default' only valid for set. The tuple form is only valid for type 'stream' and protocol 'tcp'. |\n| rcvctrlbuf | default \\| pos_integer() | yes | yes | default only valid for set |\n| sndctrlbuf | default \\| pos_integer() | yes | yes | default only valid for set |\n| fd | integer() | no | yes | none |\n| use_registry | boolean() | no | yes | the value is set when the socket is created, by a call to [`open/2`](`socket:open/2`) or [`open/4`](`socket:open/4`). |\n\n_Table: option levels_\n\nOptions for level `socket`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ---------------- | ----------------- | ----- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| acceptconn | boolean() | no | yes | none |\n| bindtodevice | string() | yes | yes | Before Linux 3.8, this socket option could be set, but not get. Only works for some socket types (e.g. `inet`). If empty value is set, the binding is removed. |\n| broadcast | boolean() | yes | yes | type = dgram |\n| bsp_state | map() | no | yes | Windows only |\n| debug | integer() | yes | yes | may require admin capability |\n| domain | domain() | no | yes | _Not_ on FreeBSD (for instance) |\n| dontroute | boolean() | yes | yes | none |\n| exclusiveaddruse | boolean() | yes | yes | Windows only |\n| keepalive | boolean() | yes | yes | none |\n| linger | abort \\| linger() | yes | yes | none |\n| maxdg | integer() | no | yes | Windows only |\n| max_msg_size | integer() | no | yes | Windows only |\n| oobinline | boolean() | yes | yes | none |\n| peek_off | integer() | yes | yes | domain = local (unix). Currently disabled due to a possible infinite loop when calling recv(\\[peek]) the second time. |\n| priority | integer() | yes | yes | none |\n| protocol | protocol() | no | yes | _Not_ on (some) Darwin (for instance) |\n| rcvbuf | non_neg_integer() | yes | yes | none |\n| rcvlowat | non_neg_integer() | yes | yes | none |\n| rcvtimeo | timeval() | yes | yes | This option is not normally supported (see why below). OTP has to be explicitly built with the `--enable-esock-rcvsndtime` configure option for this to be available. Since our implementation is _nonblocking_, its unknown if and how this option works, or even if it may cause malfunctions. Therefore, we do not recommend setting this option. Instead, use the `Timeout` argument to, for instance, the [`recv/3`](`socket:recv/3`) function. |\n| reuseaddr | boolean() | yes | yes | none |\n| reuseport | boolean() | yes | yes | domain = inet \\| inet6 |\n| sndbuf | non_neg_integer() | yes | yes | none |\n| sndlowat | non_neg_integer() | yes | yes | not changeable on Linux |\n| sndtimeo | timeval() | yes | yes | This option is not normally supported (see why below). OTP has to be explicitly built with the `--enable-esock-rcvsndtime` configure option for this to be available. Since our implementation is _nonblocking_, its unknown if and how this option works, or even if it may cause malfunctions. Therefore, we do not recommend setting this option. Instead, use the `Timeout` argument to, for instance, the [`send/3`](`socket:send/3`) function. |\n| timestamp | boolean() | yes | yes | none |\n| type | type() | no | yes | none |\n\n_Table: socket options_\n\nOptions for level `ip`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ---------------------- | --------------------- | ----- | ----- | ---------------------------------------------------------- |\n| add_membership | ip_mreq() | yes | no | none |\n| add_source_membership | ip_mreq_source() | yes | no | none |\n| block_source | ip_mreq_source() | yes | no | none |\n| drop_membership | ip_mreq() | yes | no | none |\n| drop_source_membership | ip_mreq_source() | yes | no | none |\n| freebind | boolean() | yes | yes | none |\n| hdrincl | boolean() | yes | yes | type = raw |\n| minttl | integer() | yes | yes | type = raw |\n| msfilter | null \\| ip_msfilter() | yes | no | none |\n| mtu | integer() | no | yes | type = raw |\n| mtu_discover | ip_pmtudisc() | yes | yes | none |\n| multicast_all | boolean() | yes | yes | none |\n| multicast_if | any \\| ip4_address() | yes | yes | none |\n| multicast_loop | boolean() | yes | yes | none |\n| multicast_ttl | uint8() | yes | yes | none |\n| nodefrag | boolean() | yes | yes | type = raw |\n| pktinfo | boolean() | yes | yes | type = dgram |\n| recvdstaddr | boolean() | yes | yes | type = dgram |\n| recverr | boolean() | yes | yes | none |\n| recvif | boolean() | yes | yes | type = dgram \\| raw |\n| recvopts | boolean() | yes | yes | type =/= stream |\n| recvorigdstaddr | boolean() | yes | yes | none |\n| recvttl | boolean() | yes | yes | type =/= stream |\n| retopts | boolean() | yes | yes | type =/= stream |\n| router_alert | integer() | yes | yes | type = raw |\n| sendsrcaddr | boolean() | yes | yes | none |\n| tos | ip_tos() | yes | yes | some high-priority levels may require superuser capability |\n| transparent | boolean() | yes | yes | requires admin capability |\n| ttl | integer() | yes | yes | none |\n| unblock_source | ip_mreq_source() | yes | no | none |\n\n_Table: ip options_\n\nOptions for level `ipv6`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ---------------------- | ------------------ | ----- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| addrform | inet | yes | no | allowed only for IPv6 sockets that are connected and bound to a v4-mapped-on-v6 address |\n| add_membership | ipv6_mreq() | yes | no | none |\n| authhdr | boolean() | yes | yes | type = dgram \\| raw, obsolete? |\n| drop_membership | ipv6_mreq() | yes | no | none |\n| dstopts | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| flowinfo | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| hoplimit | boolean() | yes | yes | type = dgram \\| raw. On some platforms (e.g. FreeBSD) is used to set in order to get `hoplimit` as a control message heeader. On others (e.g. Linux), `recvhoplimit` is set in order to get `hoplimit`. |\n| hopopts | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| mtu | boolean() | yes | yes | Get: Only after the socket has been connected |\n| mtu_discover | ipv6_pmtudisc() | yes | yes | none |\n| multicast_hops | default \\| uint8() | yes | yes | none |\n| multicast_if | integer() | yes | yes | type = dgram \\| raw |\n| multicast_loop | boolean() | yes | yes | none |\n| recverr | boolean() | yes | yes | none |\n| recvhoplimit | boolean() | yes | yes | type = dgram \\| raw. On some platforms (e.g. Linux), `recvhoplimit` is set in order to get `hoplimit` |\n| recvpktinfo \\| pktinfo | boolean() | yes | yes | type = dgram \\| raw. On some platforms (e.g. FreeBSD) is used to set in order to get `hoplimit` as a control message heeader. On others (e.g. Linux), `recvhoplimit` is set in order to get `hoplimit`. |\n| recvtclass | boolean() | yes | yes | type = dgram \\| raw. On some platforms is used to set (=true) in order to get the `tclass` control message heeader. On others, `tclass` is set in order to get `tclass` control message heeader. |\n| router_alert | integer() | yes | yes | type = raw |\n| rthdr | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| tclass | integer() | yes | yes | Set the traffic class associated with outgoing packets. RFC3542. |\n| unicast_hops | default \\| uint8() | yes | yes | none |\n| v6only | boolean() | yes | no | none |\n\n_Table: ipv6 options_\n\nOptions for level `tcp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ------------- | ------------ | ----- | ----- | -------------------------------------------------------------------------------------------------------- |\n| congestion | string() | yes | yes | none |\n| cork | boolean() | yes | yes | 'nopush' one some platforms (FreeBSD) |\n| keepcnt | integer() | yes | yes | On Windows (at least), it is illegal to set to a value greater than 255. |\n| keepidle | integer() | yes | yes | none |\n| keepintvl | integer() | yes | yes | none |\n| maxseg | integer() | yes | yes | Set not allowed on all platforms. |\n| nodelay | boolean() | yes | yes | none |\n| nopush | boolean() | yes | yes | 'cork' on some platforms (Linux). On Darwin this has a different meaning than on, for instance, FreeBSD. |\n\n_Table: tcp options_\n\nOptions for level `udp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ------------- | ------------ | ----- | ----- | --------------------------------- |\n| cork | boolean() | yes | yes | none |\n\n_Table: udp options_\n\nOptions for level `sctp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ----------------- | ---------------------- | ----- | ----- | --------------------------------- |\n| associnfo | sctp_assocparams() | yes | yes | none |\n| autoclose | non_neg_integer() | yes | yes | none |\n| disable_fragments | boolean() | yes | yes | none |\n| events | sctp_event_subscribe() | yes | no | none |\n| initmsg | sctp_initmsg() | yes | yes | none |\n| maxseg | non_neg_integer() | yes | yes | none |\n| nodelay | boolean() | yes | yes | none |\n| rtoinfo | sctp_rtoinfo() | yes | yes | none |\n\n_Table: sctp options_","ref":"socket_usage.html#socket-options"},{"type":"extras","title":"Logging","doc":"\n# Logging\n\nErlang provides a standard API for logging through `Logger`, which is part of\nthe Kernel application. Logger consists of the API for issuing log events, and a\ncustomizable backend where log handlers, filters and formatters can be plugged\nin.\n\nBy default, the Kernel application installs one log handler at system start.\nThis handler is named `default`. It receives and processes standard log events\nproduced by the Erlang runtime system, standard behaviours and different\nErlang/OTP applications. The log events are by default written to the terminal.\n\nYou can also configure the system so that the default handler prints log events\nto a single file, or to a set of wrap logs via `m:disk_log`.\n\nBy configuration, you can also modify or disable the default handler, replace it\nby a custom handler, and install additional handlers.","ref":"logger_chapter.html"},{"type":"extras","title":"Overview - Logging","doc":"A _log event_ consists of a _log level_, the _message_ to be logged, and\n_metadata_.\n\nThe Logger backend forwards log events from the API, first through a set of\n_primary filters_, then through a set of secondary filters attached to each log\nhandler. The secondary filters are in the following named _handler filters_.\n\nEach filter set consists of a _log level check_, followed by zero or more\n_filter functions_.\n\nThe following figure shows a conceptual overview of Logger. The figure shows two\nlog handlers, but any number of handlers can be installed.\n\n```mermaid\n---\ntitle: Conceptual Overview\n---\nflowchart TD\n DB[(Config DB)]\n API ---> ML[Module Level Global Level Global Filters]\n API -.Update configuration.-> DB\n ML -.-> DB\n ML ---> HL1[Hander Level Handler Filter]\n ML ---> HL2[Hander Level Handler Filter]\n HL1 ---> HC1[Handler Callback]\n HL2 ---> HC2[Handler Callback]\n HL1 -.-> DB\n HL2 -.-> DB\n subgraph Legend\n direction LR\n start1[ ] -->|Log event flow| stop1[ ]\n style start1 height:0px;\n style stop1 height:0px;\n start2[ ] -.->|Look up configuration| stop2[ ]\n style start2 height:0px;\n style stop2 height:0px;\n end\n```\n\nLog levels are expressed as atoms. Internally in Logger, the atoms are mapped to\ninteger values, and a log event passes the log level check if the integer value\nof its log level is less than or equal to the currently configured log level.\nThat is, the check passes if the event is equally or more severe than the\nconfigured level. See section [Log Level](#log-level) for a\nlisting and description of all log levels.\n\nThe primary log level can be overridden by a log level configured per module.\nThis is to, for instance, allow more verbose logging from a specific part of the\nsystem.\n\nFilter functions can be used for more sophisticated filtering than the log level\ncheck provides. A filter function can stop or pass a log event, based on any of\nthe event's contents. It can also modify all parts of the log event. See section\n[Filters](#filters) for more details.\n\nIf a log event passes through all primary filters and all handler filters for a\nspecific handler, Logger forwards the event to the _handler callback_. The\nhandler formats and prints the event to its destination. See section\n[Handlers](#handlers) for more details.\n\nEverything up to and including the call to the handler callbacks is executed on\nthe client process, that is, the process where the log event was issued. It is\nup to the handler implementation if other processes are involved or not.\n\nThe handlers are called in sequence, and the order is not defined.","ref":"logger_chapter.html#overview"},{"type":"extras","title":"Logger API - Logging","doc":"The API for logging consists of a set of [macros](`m:logger#module-macros`), and a set\nof functions on the form `logger:Level/1,2,3`, which are all shortcuts for\n[`logger:log(Level,Arg1[,Arg2[,Arg3]])`](`logger:log/2`).\n\nThe macros are defined in `logger.hrl`, which is included in a module with the\ndirective\n\n```erlang\n-include_lib(\"kernel/include/logger.hrl\").\n```\n\nThe difference between using the macros and the exported functions is that\nmacros add location (originator) information to the metadata, and performs lazy\nevaluation by wrapping the logger call in a case statement, so it is only\nevaluated if the log level of the event passes the primary log level check.","ref":"logger_chapter.html#logger-api"},{"type":"extras","title":"Log Level - Logging","doc":"The log level indicates the severity of a event. In accordance with the Syslog\nprotocol, [RFC 5424](https://www.ietf.org/rfc/rfc5424.txt), eight log levels can\nbe specified. The following table lists all possible log levels by name (atom),\ninteger value, and description:\n\n| **Level** | **Integer** | **Description** |\n| --------- | ----------- | --------------------------------- |\n| emergency | 0 | system is unusable |\n| alert | 1 | action must be taken immediately |\n| critical | 2 | critical conditions |\n| error | 3 | error conditions |\n| warning | 4 | warning conditions |\n| notice | 5 | normal but significant conditions |\n| info | 6 | informational messages |\n| debug | 7 | debug-level messages |\n\n_Table: Log Levels_\n\nNotice that the integer value is only used internally in Logger. In the API, you\nmust always use the atom. To compare the severity of two log levels, use\n`logger:compare_levels/2`.","ref":"logger_chapter.html#log-level"},{"type":"extras","title":"Log Message - Logging","doc":"The log message contains the information to be logged. The message can consist\nof a format string and arguments (given as two separate parameters in the Logger\nAPI), a string or a report.\n\nExample, format string and arguments:\n\n```erlang\nlogger:error(\"The file does not exist: ~ts\",[Filename])\n```\n\nExample, string:\n\n```erlang\nlogger:notice(\"Something strange happened!\")\n```\n\nA report, which is either a map or a key-value list, is the preferred way to log\nusing Logger as it makes it possible for different backends to filter and format\nthe log event as it needs to.\n\nExample, report:\n\n```erlang\n?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })\n```\n\nReports can be accompanied by a _report callback_ specified in the log event's\n[metadata](#metadata). The report callback is a convenience\nfunction that the [formatter](#formatters) can use to convert\nthe report to a format string and arguments, or directly to a string. The\nformatter can also use its own conversion function, if no callback is provided,\nor if a customized formatting is desired.\n\nThe report callback must be a fun with one or two arguments. If it takes one\nargument, this is the report itself, and the fun returns a format string and\narguments:\n\n```erlang\nfun((logger:report()) -> {io:format(),[term()]})\n```\n\nIf it takes two arguments, the first is the report, and the second is a map\ncontaining extra data that allows direct conversion to a string:\n\n```erlang\nfun((logger:report(),logger:report_cb_config()) -> unicode:chardata())\n```\n\nThe fun must obey the `depth` and `chars_limit` parameters provided in the\nsecond argument, as the formatter cannot do anything useful of these parameters\nwith the returned string. The extra data also contains a field named\n`single_line`, indicating if the printed log message may contain line breaks or\nnot. This variant is used when the formatting of the report depends on the size\nor single line parameters.\n\nExample, report, and metadata with report callback:\n\n```erlang\nlogger:debug(#{got => connection_request, id => Id, state => State},\n #{report_cb => fun(R) -> {\"~p\",[R]} end})\n```\n\nThe log message can also be provided through a fun for lazy evaluation. The fun\nis only evaluated if the primary log level check passes, and is therefore\nrecommended if it is expensive to generate the message. The lazy fun must return\na string, a report, or a tuple with format string and arguments.","ref":"logger_chapter.html#log-message"},{"type":"extras","title":"Metadata - Logging","doc":"Metadata contains additional data associated with a log message. Logger inserts\nsome metadata fields by default, and the client can add custom metadata in three\ndifferent ways:\n\n- **Set primary metadata** - Primary metadata applies is the base metadata given\n to all log events. At startup it can be set using the kernel configuration\n parameter [logger_metadata](kernel_app.md#logger_metadata). At run-time it can\n be set and updated using `logger:set_primary_config/1` and\n `logger:update_primary_config/1` respectively.\n\n- **Set process metadata** - Process metadata is set and updated with\n `logger:set_process_metadata/1` and `logger:update_process_metadata/1`,\n respectively. This metadata applies to the process on which these calls are\n made, and Logger adds the metadata to all log events issued on that process.\n\n- **Add metadata to a specific log event** - Metadata associated with one\n specific log event is given as the last parameter to the log macro or Logger\n API function when the event is issued. For example:\n\n ```text\n ?LOG_ERROR(\"Connection closed\",#{context => server})\n ```\n\nSee the description of the `t:logger:metadata/0` type for information about\nwhich default keys Logger inserts, and how the different metadata maps are\nmerged.","ref":"logger_chapter.html#metadata"},{"type":"extras","title":"Filters - Logging","doc":"Filters can be primary, or attached to a specific handler. Logger calls the\nprimary filters first, and if they all pass, it calls the handler filters for\neach handler. Logger calls the handler callback only if all filters attached to\nthe handler in question also pass.\n\nA filter is defined as:\n\n```text\n{FilterFun, Extra}\n```\n\nwhere `FilterFun` is a function of arity 2, and `Extra` is any term. When\napplying the filter, Logger calls the function with the log event as the first\nargument, and the value of `Extra` as the second argument. See\n`t:logger:filter/0` for type definitions.\n\nThe filter function can return `stop`, `ignore` or the (possibly modified) log\nevent.\n\nIf `stop` is returned, the log event is immediately discarded. If the filter is\nprimary, no handler filters or callbacks are called. If it is a handler filter,\nthe corresponding handler callback is not called, but the log event is forwarded\nto filters attached to the next handler, if any.\n\nIf the log event is returned, the next filter function is called with the\nreturned value as the first argument. That is, if a filter function modifies the\nlog event, the next filter function receives the modified event. The value\nreturned from the last filter function is the value that the handler callback\nreceives.\n\nIf the filter function returns `ignore`, it means that it did not recognize the\nlog event, and thus leaves to other filters to decide the event's destiny.\n\nThe configuration option `filter_default` specifies the behaviour if all filter\nfunctions return `ignore`, or if no filters exist. `filter_default` is by\ndefault set to `log`, meaning that if all existing filters ignore a log event,\nLogger forwards the event to the handler callback. If `filter_default` is set to\n`stop`, Logger discards such events.\n\nPrimary filters are added with `logger:add_primary_filter/2` and removed with\n`logger:remove_primary_filter/1`. They can also be added at system start via the\nKernel configuration parameter [`logger`](#logger_parameter).\n\nHandler filters are added with `logger:add_handler_filter/3` and removed with\n`logger:remove_handler_filter/2`. They can also be specified directly in the\nconfiguration when adding a handler with `logger:add_handler/3` or via the\nKernel configuration parameter [`logger`](#logger_parameter).\n\nTo see which filters are currently installed in the system, use\n`logger:get_config/0`, or `logger:get_primary_config/0` and\n`logger:get_handler_config/1`. Filters are listed in the order they are applied,\nthat is, the first filter in the list is applied first, and so on.\n\nFor convenience, the following built-in filters exist:\n\n- **`logger_filters:domain/2`** - Provides a way of filtering log events based\n on a `domain` field in `Metadata`.\n\n- **`logger_filters:level/2`** - Provides a way of filtering log events based on\n the log level.\n\n- **`logger_filters:progress/2`** - Stops or allows progress reports from\n `supervisor` and `application_controller`.\n\n- **`logger_filters:remote_gl/2`** - Stops or allows log events originating from\n a process that has its group leader on a remote node.","ref":"logger_chapter.html#filters"},{"type":"extras","title":"Handlers - Logging","doc":"A handler is defined as a module exporting at least the following callback\nfunction:\n\n```text\nlog(LogEvent, Config) -> term()\n```\n\nThis function is called when a log event has passed through all primary filters,\nand all handler filters attached to the handler in question. The function call\nis executed on the client process, and it is up to the handler implementation if\nother processes are involved or not.\n\nLogger allows adding multiple instances of a handler callback. That is, if a\ncallback module implementation allows it, you can add multiple handler instances\nusing the same callback module. The different instances are identified by unique\nhandler identities.\n\nIn addition to the mandatory callback function `log/2`, a handler module can\nexport the optional callback functions `adding_handler/1`, `changing_config/3`,\n`filter_config/1`, and `removing_handler/1`. See `m:logger_handler` for more\ninformation about these function.\n\nThe following built-in handlers exist:\n\n- **`logger_std_h`** - This is the default handler used by OTP. Multiple\n instances can be started, and each instance will write log events to a given\n destination, terminal or file.\n\n- **`logger_disk_log_h`** - This handler behaves much like `logger_std_h`,\n except it uses `m:disk_log` as its destination.\n\n- **`error_logger`{: #ErrorLoggerManager }** - This handler is provided for\n backwards compatibility only. It is not started by default, but will be\n automatically started the first time an `error_logger` event handler is added\n with\n [`error_logger:add_report_handler/1,2`](`error_logger:add_report_handler/1`).\n\n The old `error_logger` event handlers in STDLIB and SASL still exist, but they\n are not added by Erlang/OTP 21.0 or later.","ref":"logger_chapter.html#handlers"},{"type":"extras","title":"Formatters - Logging","doc":"A formatter can be used by the handler implementation to do the final formatting\nof a log event, before printing to the handler's destination. The handler\ncallback receives the formatter information as part of the handler\nconfiguration, which is passed as the second argument to\n[`HModule:log/2`](`c:logger_handler:log/2`).\n\nThe formatter information consist of a formatter module, `FModule` and its\nconfiguration, `FConfig`. `FModule` must export the following function, which\ncan be called by the handler:\n\n```text\nformat(LogEvent,FConfig)\n\t-> FormattedLogEntry\n```\n\nThe formatter information for a handler is set as a part of its configuration\nwhen the handler is added. It can also be changed during runtime with\n[`logger:set_handler_config(HandlerId,formatter,{Module,FConfig})` ](`logger:set_handler_config/3`),\nwhich overwrites the current formatter information, or with\n[`logger:update_formatter_config/2,3`](`logger:update_formatter_config/2`),\nwhich only modifies the formatter configuration.\n\nIf the formatter module exports the optional callback function\n[`check_config(FConfig)`](`c:logger_formatter:check_config/1`), Logger calls\nthis function when the formatter information is set or modified, to verify the\nvalidity of the formatter configuration.\n\nIf no formatter information is specified for a handler, Logger uses\n`logger_formatter` as default. See the `m:logger_formatter` manual page for more\ninformation about this module.","ref":"logger_chapter.html#formatters"},{"type":"extras","title":"Configuration - Logging","doc":"At system start, Logger is configured through Kernel configuration parameters.\nThe parameters that apply to Logger are described in section\n[Kernel Configuration Parameters](#kernel-configuration-parameters).\nExamples are found in section\n[Configuration Examples](#configuration-examples).\n\nDuring runtime, Logger configuration is changed via API functions. See section\n[Configuration API Functions](`m:logger#configuration-api-functions`) in the `m:logger`\nmanual page.","ref":"logger_chapter.html#configuration"},{"type":"extras","title":"Primary Logger Configuration - Logging","doc":"Logger API functions that apply to the primary Logger configuration are:\n\n- [`get_primary_config/0`](`logger:get_primary_config/0`)\n- [`set_primary_config/1,2`](`logger:set_primary_config/1`)\n- [`update_primary_config/1`](`logger:update_primary_config/1`)\n- [`add_primary_filter/2`](`logger:add_primary_filter/2`)\n- [`remove_primary_filter/1`](`logger:remove_primary_filter/1`)\n\nThe primary Logger configuration is a map with the following keys:\n\n- **`level = `{: #primary_level }`t:logger:level/0` ` | all | none`** - Specifies\n the primary log level, that is, log event that are equally or more severe than\n this level, are forwarded to the primary filters. Less severe log events are\n immediately discarded.\n\n See section [Log Level](#log-level) for a listing and\n description of possible log levels.\n\n The initial value of this option is set by the Kernel configuration parameter\n [`logger_level`](#logger_level). It is changed during runtime\n with\n [`logger:set_primary_config(level,Level)`](`logger:set_primary_config/2`).\n\n Defaults to `notice`.\n\n- **`filters = [{FilterId,Filter}]`** - Specifies the primary filters.\n\n - `FilterId = ` `t:logger:filter_id/0`\n - `Filter = ` `t:logger:filter/0`\n\n The initial value of this option is set by the Kernel configuration parameter\n [`logger`](#logger_parameter). During runtime, primary\n filters are added and removed with `logger:add_primary_filter/2` and\n `logger:remove_primary_filter/1`, respectively.\n\n See section [Filters](#filters) for more detailed\n information.\n\n Defaults to `[]`.\n\n- **`filter_default = log | stop`** - Specifies what happens to a log event if\n all filters return `ignore`, or if no filters exist.\n\n See section [Filters](#filters) for more information about\n how this option is used.\n\n Defaults to `log`.\n\n- **`metadata = `[`metadata()`](`t:logger:metadata/0`)** - The primary metadata\n to be used for all log calls.\n\n See section [Metadata](#metadata) for more information about\n how this option is used.\n\n Defaults to `#{}`.","ref":"logger_chapter.html#primary-logger-configuration"},{"type":"extras","title":"Handler Configuration - Logging","doc":"Logger API functions that apply to handler configuration are:\n\n- [`get_handler_config/0,1`](`logger:get_handler_config/0`)\n- [`set_handler_config/2,3`](`logger:set_handler_config/2`)\n- [`update_handler_config/2,3`](`logger:update_handler_config/2`)\n- [`add_handler_filter/3`](`logger:add_handler_filter/3`)\n- [`remove_handler_filter/2`](`logger:remove_handler_filter/2`)\n- [`update_formatter_config/2,3`](`logger:update_formatter_config/2`)\n\nThe configuration for a handler is a map with the following keys:\n\n- **`id =` `t:logger_handler:id/0`** - Automatically inserted by Logger. The\n value is the same as the `HandlerId` specified when adding the handler, and it\n cannot be changed.\n\n- **`module = module()`** - Automatically inserted by Logger. The value is the\n same as the `Module` specified when adding the handler, and it cannot be\n changed.\n\n- **`level =` `t:logger:level/0` ` | all | none`** - Specifies the log level for\n the handler, that is, log events that are equally or more severe than this\n level, are forwarded to the handler filters for this handler.\n\n See section [Log Level](#log-level) for a listing and\n description of possible log levels.\n\n The log level is specified when adding the handler, or changed during runtime\n with, for instance,\n [`logger:set_handler_config(HandlerId,level,Level)`](`logger:set_handler_config/3`).\n\n Defaults to `all`.\n\n- **`filters = [{FilterId,Filter}]`** - Specifies the handler filters.\n\n - `FilterId = ` `t:logger:filter_id/0`\n - `Filter = ` `t:logger:filter/0`\n\n Handler filters are specified when adding the handler, or added or removed\n during runtime with `logger:add_handler_filter/3` and\n `logger:remove_handler_filter/2`, respectively.\n\n See [Filters](#filters) for more detailed information.\n\n Defaults to `[]`.\n\n- **`filter_default = log | stop`** - Specifies what happens to a log event if\n all filters return `ignore`, or if no filters exist.\n\n See section [Filters](#filters) for more information about\n how this option is used.\n\n Defaults to `log`.\n\n- **`formatter = {FormatterModule,FormatterConfig}`** - Specifies a formatter\n that the handler can use for converting the log event term to a printable\n string.\n\n - `FormatterModule = module()`\n - `FormatterConfig =` `t:logger:formatter_config/0`\n\n The formatter information is specified when adding the handler. The formatter\n configuration can be changed during runtime with\n [`logger:update_formatter_config/2,3`](`logger:update_formatter_config/2`), or\n the complete formatter information can be overwritten with, for instance,\n `logger:set_handler_config/3`.\n\n See section [Formatters](#formatters) for more detailed\n information.\n\n Defaults to `{logger_formatter,DefaultFormatterConfig}`. See the\n `m:logger_formatter` manual page for information about this formatter and its\n default configuration.\n\n- **`config = term()`** - Handler specific configuration, that is, configuration\n data related to a specific handler implementation.\n\n The configuration for the built-in handlers is described in the\n `m:logger_std_h` and [`logger_disk_log_h` ](`m:logger_disk_log_h`)manual\n pages.\n\nNotice that `level` and `filters` are obeyed by Logger itself before forwarding\nthe log events to each handler, while `formatter` and all handler specific\noptions are left to the handler implementation.","ref":"logger_chapter.html#handler-configuration"},{"type":"extras","title":"Kernel Configuration Parameters - Logging","doc":"The following Kernel configuration parameters apply to Logger:\n\n- **`logger = [Config]`{: #logger_parameter }** - Specifies the configuration\n for [Logger](`m:logger`), except the primary log level, which is specified\n with [`logger_level`](#logger_level), and the compatibility\n with [SASL Error Logging](`e:sasl:error_logging.md`), which is specified with\n [`logger_sasl_compatible`](#logger_sasl_compatible).\n\n With this parameter, you can modify or disable the default handler, add custom\n handlers and primary logger filters, set log levels per module, and modify the\n [proxy](#logger-proxy) configuration.\n\n `Config` is any (zero or more) of the following:\n\n - **`{handler, default, undefined}`** - Disables the default handler. This\n allows another application to add its own default handler.\n\n Only one entry of this type is allowed.\n\n - **`{handler, HandlerId, Module, HandlerConfig}`** - If `HandlerId` is\n `default`, then this entry modifies the default handler, equivalent to\n calling\n\n ```text\n \t\tlogger:remove_handler(default)\n\n ```\n\n followed by\n\n ```erlang\n \t\tlogger:add_handler(default, Module, HandlerConfig)\n\n ```\n\n For all other values of `HandlerId`, this entry adds a new handler,\n equivalent to calling\n\n ```erlang\n \t\tlogger:add_handler(HandlerId, Module, HandlerConfig)\n\n ```\n\n Multiple entries of this type are allowed.\n\n - **`{filters, FilterDefault, [Filter]}`** - Adds the specified primary\n filters.\n\n - `FilterDefault = log | stop`\n - `Filter = {FilterId, {FilterFun, FilterConfig}}`\n\n Equivalent to calling\n\n ```erlang\n \t\tlogger:add_primary_filter(FilterId, {FilterFun, FilterConfig})\n\n ```\n\n for each `Filter`.\n\n `FilterDefault` specifies the behaviour if all primary filters return\n `ignore`, see section [Filters](#filters).\n\n Only one entry of this type is allowed.\n\n - **`{module_level, Level, [Module]}`** - Sets module log level for the given\n modules. Equivalent to calling\n\n ```erlang\n \t\tlogger:set_module_level(Module, Level)\n ```\n\n for each `Module`.\n\n Multiple entries of this type are allowed.\n\n - **`{proxy, ProxyConfig}`** - Sets the proxy configuration, equivalent to\n calling\n\n ```text\n \t\tlogger:set_proxy_config(ProxyConfig)\n\n ```\n\n Only one entry of this type is allowed.\n\n See section [Configuration Examples](#configuration-examples) for\n examples using the `logger` parameter for system configuration.\n\n- **`logger_metadata = map()`{: #logger_metadata }** - Specifies the primary\n metadata. See the [`kernel(6)`](kernel_app.md#logger_metadata) manual page for\n more information about this parameter.\n\n- **`logger_level = Level`{: #logger_level }** - Specifies the primary log\n level. See the [`kernel(6)`](kernel_app.md#logger_level) manual page for more\n information about this parameter.\n\n- **`logger_sasl_compatible = true | false`{: #logger_sasl_compatible }** -\n Specifies Logger's compatibility with\n [SASL Error Logging](`e:sasl:error_logging.md`). See the\n [`kernel(6)`](kernel_app.md#logger_sasl_compatible) manual page for more\n information about this parameter.","ref":"logger_chapter.html#kernel-configuration-parameters"},{"type":"extras","title":"Configuration Examples - Logging","doc":"The value of the Kernel configuration parameter `logger` is a list of tuples. It\nis possible to write the term on the command line when starting an erlang node,\nbut as the term grows, a better approach is to use the system configuration\nfile. See the [`config(4)`](config.md) manual page for more information about\nthis file.\n\nEach of the following examples shows a simple system configuration file that\nconfigures Logger according to the description.\n\nModify the default handler to print to a file instead of\n[`standard_io`](`t:io:standard_io/0`):\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h, % {handler, HandlerId, Module,\n #{config => #{file => \"log/erlang.log\"}}} % Config}\n ]}]}].\n```\n\nModify the default handler to print each log event as a single line:\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{formatter => {logger_formatter, #{single_line => true}}}}\n ]}]}].\n```\n\nModify the default handler to print the pid of the logging process for each log\nevent:\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{formatter => {logger_formatter,\n #{template => [time,\" \",pid,\" \",msg,\"\\n\"]}}}}\n ]}]}].\n```\n\nModify the default handler to only print errors and more severe log events to\n\"log/erlang.log\", and add another handler to print all log events to\n\"log/debug.log\".\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{level => error,\n config => #{file => \"log/erlang.log\"}}},\n {handler, info, logger_std_h,\n #{level => debug,\n config => #{file => \"log/debug.log\"}}}\n ]}]}].\n```","ref":"logger_chapter.html#configuration-examples"},{"type":"extras","title":"Backwards Compatibility with error_logger - Logging","doc":"Logger provides backwards compatibility with `error_logger` in the following\nways:\n\n- **API for Logging** - The `error_logger` API still exists, but should only be\n used by legacy code. It will be removed in a later release.\n\n Calls to [`error_logger:error_report/1,2`](`error_logger:error_report/1`),\n [`error_logger:error_msg/1,2`](`error_logger:error_msg/1`), and corresponding\n functions for warning and info messages, are all forwarded to Logger as calls\n to [`logger:log(Level,Report,Metadata)`](`logger:log/3`).\n\n `Level = error | warning | info` and is taken from the function name. `Report`\n contains the actual log message, and `Metadata` contains additional\n information which can be used for creating backwards compatible events for\n legacy `error_logger` event handlers, see section\n [Legacy Event Handlers](#legacy_event_handlers).\n\n- **Output Format** - To get log events on the same format as produced by\n `error_logger_tty_h` and `error_logger_file_h`, use the default formatter,\n `logger_formatter`, with configuration parameter `legacy_header` set to\n `true`. This is the default configuration of the `default` handler started by\n Kernel.\n\n- **Default Format of Log Events from OTP** - By default, all log events\n originating from within OTP, except the former so called \"SASL reports\", look\n the same as before.\n\n- **[](){: #sasl_reports } SASL Reports** \n By SASL reports we mean supervisor reports, crash reports and progress\n reports.\n\n Prior to Erlang/OTP 21.0, these reports were only logged when the SASL\n application was running, and they were printed through SASL's own event\n handlers `sasl_report_tty_h` and `sasl_report_file_h`.\n\n The destination of these log events was configured by\n [SASL configuration parameters](`e:sasl:sasl_app.md#deprecated_error_logger_config`).\n\n Due to the specific event handlers, the output format slightly differed from\n other log events.\n\n As of Erlang/OTP 21.0, the concept of SASL reports is removed, meaning that\n the default behaviour is as follows:\n\n - Supervisor reports, crash reports, and progress reports are no longer\n connected to the SASL application.\n - Supervisor reports and crash reports are issued as `error` level log events,\n and are logged through the default handler started by Kernel.\n - Progress reports are issued as `info` level log events, and since the\n default primary log level is `notice`, these are not logged by default. To\n enable printing of progress reports, set the\n [primary log level](#primary_level) to `info`.\n - The output format is the same for all log events.\n\n If the old behaviour is preferred, the Kernel configuration parameter\n [`logger_sasl_compatible`](kernel_app.md#logger_sasl_compatible) can be set to\n `true`. The\n [SASL configuration parameters](`e:sasl:sasl_app.md#deprecated_error_logger_config`)\n can then be used as before, and the SASL reports will only be printed if the\n SASL application is running, through a second log handler named `sasl`.\n\n All SASL reports have a metadata field `domain` which is set to `[otp,sasl]`.\n This field can be used by filters to stop or allow the log events.\n\n See section [SASL User's Guide](`e:sasl:error_logging.md`) for more\n information about the old SASL error logging functionality.\n\n- **[](){: #legacy_event_handlers } Legacy Event Handlers** \n To use event handlers written for `error_logger`, just add your event handler\n with\n\n ```text\n error_logger:add_report_handler/1,2.\n ```\n\n This automatically starts the error logger event manager, and adds\n `error_logger` as a handler to Logger, with the following configuration:\n\n ```erlang\n #{level => info,\n filter_default => log,\n filters => []}.\n ```\n\n > #### Note {: .info }\n >\n > This handler ignores events that do not originate from the `error_logger`\n > API, or from within OTP. This means that if your code uses the Logger API\n > for logging, then your log events will be discarded by this handler.\n >\n > The handler is not overload protected.","ref":"logger_chapter.html#backwards-compatibility-with-error_logger"},{"type":"extras","title":"Error Handling - Logging","doc":"Logger does, to a certain extent, check its input data before forwarding a log\nevent to filters and handlers. It does, however, not evaluate report callbacks,\nor check the validity of format strings and arguments. This means that all\nfilters and handlers must be careful when formatting the data of a log event,\nmaking sure that it does not crash due to bad input data or faulty callbacks.\n\nIf a filter or handler still crashes, Logger will remove the filter or handler\nin question from the configuration, and print a short error message to the\nterminal. A debug event containing the crash reason and other details is also\nissued.\n\nSee section [Log Message](#log-message) for more information\nabout report callbacks and valid forms of log messages.","ref":"logger_chapter.html#error-handling"},{"type":"extras","title":"Example: Add a handler to log info events to file - Logging","doc":"When starting an Erlang node, the default behaviour is that all log events on\nlevel `notice` or more severe, are logged to the terminal via the default\nhandler. To also log info events, you can either change the primary log level to\n`info`:\n\n```text\n1> logger:set_primary_config(level, info).\nok\n```\n\nor set the level for one or a few modules only:\n\n```erlang\n2> logger:set_module_level(mymodule, info).\nok\n```\n\nThis allows info events to pass through to the default handler, and be printed\nto the terminal as well. If there are many info events, it can be useful to\nprint these to a file instead.\n\nFirst, set the log level of the default handler to `notice`, preventing it from\nprinting info events to the terminal:\n\n```erlang\n3> logger:set_handler_config(default, level, notice).\nok\n```\n\nThen, add a new handler which prints to file. You can use the handler module\n`m:logger_std_h`, and configure it to log to file:\n\n```erlang\n4> Config = #{config => #{file => \"./info.log\"}, level => info}.\n#{config => #{file => \"./info.log\"},level => info}\n5> logger:add_handler(myhandler, logger_std_h, Config).\nok\n```\n\nSince `filter_default` defaults to `log`, this handler now receives all log\nevents. If you want info events only in the file, you must add a filter to stop\nall non-info events. The built-in filter `logger_filters:level/2` can do this:\n\n```erlang\n6> logger:add_handler_filter(myhandler, stop_non_info,\n {fun logger_filters:level/2, {stop, neq, info}}).\nok\n```\n\nSee section [Filters](#filters) for more information about the\nfilters and the `filter_default` configuration parameter.","ref":"logger_chapter.html#example-add-a-handler-to-log-info-events-to-file"},{"type":"extras","title":"Example: Implement a handler - Logging","doc":"`m:logger_handler` describes the callback functions that can be implemented for\na Logger handler.\n\nA handler callback module must export:\n\n- `log(Log, Config)`\n\nIt can optionally also export some, or all, of the following:\n\n- `adding_handler(Config)`\n- `removing_handler(Config)`\n- `changing_config(SetOrUpdate, OldConfig, NewConfig)`\n- `filter_config(Config)`\n\nWhen a handler is added, by for example a call to\n[`logger:add_handler(Id, HModule, Config)`](`logger:add_handler/3`), Logger\nfirst calls `HModule:adding_handler(Config)`. If this function returns\n`{ok,Config1}`, Logger writes `Config1` to the configuration database, and the\n`logger:add_handler/3` call returns. After this, the handler is installed and\nmust be ready to receive log events as calls to `HModule:log/2`.\n\nA handler can be removed by calling\n[`logger:remove_handler(Id)`](`logger:remove_handler/1`). Logger calls\n`HModule:removing_handler(Config)`, and removes the handler's configuration from\nthe configuration database.\n\nWhen [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`) or\n[`logger:update_handler_config/2,3`](`logger:update_handler_config/2`) is\ncalled, Logger calls\n`HModule:changing_config(SetOrUpdate, OldConfig, NewConfig)`. If this function\nreturns `{ok,NewConfig1}`, Logger writes `NewConfig1` to the configuration\ndatabase.\n\nWhen `logger:get_config/0` or\n[`logger:get_handler_config/0,1`](`logger:get_handler_config/0`) is called,\nLogger calls `HModule:filter_config(Config)`. This function must return the\nhandler configuration where internal data is removed.\n\nA simple handler that prints to the terminal can be implemented as follows:\n\n```erlang\n-module(myhandler1).\n-export([log/2]).\n\nlog(LogEvent, #{formatter := {FModule, FConfig}}) ->\n io:put_chars(FModule:format(LogEvent, FConfig)).\n```\n\nNotice that the above handler does not have any overload protection, and all log\nevents are printed directly from the client process.\n\nFor information and examples of overload protection, please refer to section\n[Protecting the Handler from Overload](#overload_protection),\nand the implementation of `m:logger_std_h` and\n[`logger_disk_log_h` ](`m:logger_disk_log_h`).\n\nThe following is a simpler example of a handler which logs to a file through one\nsingle process:\n\n```erlang\n-module(myhandler2).\n-export([adding_handler/1, removing_handler/1, log/2]).\n-export([init/1, handle_call/3, handle_cast/2, terminate/2]).\n\nadding_handler(Config) ->\n MyConfig = maps:get(config,Config,#{file => \"myhandler2.log\"}),\n {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),\n {ok, Config#{config => MyConfig#{pid => Pid}}}.\n\nremoving_handler(#{config := #{pid := Pid}}) ->\n gen_server:stop(Pid).\n\nlog(LogEvent,#{config := #{pid := Pid}} = Config) ->\n gen_server:cast(Pid, {log, LogEvent, Config}).\n\ninit(#{file := File}) ->\n {ok, Fd} = file:open(File, [append, {encoding, utf8}]),\n {ok, #{file => File, fd => Fd}}.\n\nhandle_call(_, _, State) ->\n {reply, {error, bad_request}, State}.\n\nhandle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->\n do_log(Fd, LogEvent, Config),\n {noreply, State}.\n\nterminate(_Reason, #{fd := Fd}) ->\n _ = file:close(Fd),\n ok.\n\ndo_log(Fd, LogEvent, #{formatter := {FModule, FConfig}}) ->\n String = FModule:format(LogEvent, FConfig),\n io:put_chars(Fd, String).\n```\n\n[](){: #overload_protection }","ref":"logger_chapter.html#example-implement-a-handler"},{"type":"extras","title":"Protecting the Handler from Overload - Logging","doc":"The default handlers, `m:logger_std_h` and `m:logger_disk_log_h`, feature an\noverload protection mechanism, which makes it possible for the handlers to\nsurvive, and stay responsive, during periods of high load (when huge numbers of\nincoming log requests must be handled). The mechanism works as follows:","ref":"logger_chapter.html#protecting-the-handler-from-overload"},{"type":"extras","title":"Message Queue Length - Logging","doc":"The handler process keeps track of the length of its message queue and takes\nsome form of action when the current length exceeds a configurable threshold.\nThe purpose is to keep the handler in, or to as quickly as possible get the\nhandler into, a state where it can keep up with the pace of incoming log events.\nThe memory use of the handler must never grow larger and larger, since that will\neventually cause the handler to crash. These three thresholds, with associated\nactions, exist:\n\n- **`sync_mode_qlen`** - As long as the length of the message queue is lower\n than this value, all log events are handled asynchronously. This means that\n the client process sending the log event, by calling a log function in the\n [Logger API](#logger-api), does not wait for a response from\n the handler but continues executing immediately after the event is sent. It is\n not affected by the time it takes the handler to print the event to the log\n device. If the message queue grows larger than this value, the handler starts\n handling log events synchronously instead, meaning that the client process\n sending the event must wait for a response. When the handler reduces the\n message queue to a level below the `sync_mode_qlen` threshold, asynchronous\n operation is resumed. The switch from asynchronous to synchronous mode can\n slow down the logging tempo of one, or a few, busy senders, but cannot protect\n the handler sufficiently in a situation of many busy concurrent senders.\n\n Defaults to `10` messages.\n\n- **`drop_mode_qlen`** - When the message queue grows larger than this\n threshold, the handler switches to a mode in which it drops all new events\n that senders want to log. Dropping an event in this mode means that the call\n to the log function never results in a message being sent to the handler, but\n the function returns without taking any action. The handler keeps logging the\n events that are already in its message queue, and when the length of the\n message queue is reduced to a level below the threshold, synchronous or\n asynchronous mode is resumed. Notice that when the handler activates or\n deactivates drop mode, information about it is printed in the log.\n\n Defaults to `200` messages.\n\n- **`flush_qlen`** - If the length of the message queue grows larger than this\n threshold, a flush (delete) operation takes place. To flush events, the\n handler discards the messages in the message queue by receiving them in a loop\n without logging. Client processes waiting for a response from a synchronous\n log request receive a reply from the handler indicating that the request is\n dropped. The handler process increases its priority during the flush loop to\n make sure that no new events are received during the operation. Notice that\n after the flush operation is performed, the handler prints information in the\n log about how many events have been deleted.\n\n Defaults to `1000` messages.\n\nFor the overload protection algorithm to work properly, it is required that:\n\n`sync_mode_qlen = 1`\n\nTo disable certain modes, do the following:\n\n- If `sync_mode_qlen` is set to `0`, all log events are handled synchronously.\n That is, asynchronous logging is disabled.\n- If `sync_mode_qlen` is set to the same value as `drop_mode_qlen`, synchronous\n mode is disabled. That is, the handler always runs in asynchronous mode,\n unless dropping or flushing is invoked.\n- If `drop_mode_qlen` is set to the same value as `flush_qlen`, drop mode is\n disabled and can never occur.\n\nDuring high load scenarios, the length of the handler message queue rarely grows\nin a linear and predictable way. Instead, whenever the handler process is\nscheduled in, it can have an almost arbitrary number of messages waiting in the\nmessage queue. It is for this reason that the overload protection mechanism is\nfocused on acting quickly, and quite drastically, such as immediately dropping\nor flushing messages, when a large queue length is detected.\n\nThe values of the previously listed thresholds can be specified by the user.\nThis way, a handler can be configured to, for example, not drop or flush\nmessages unless the message queue length of the handler process grows extremely\nlarge. Notice that large amounts of memory can be required for the node under\nsuch circumstances. Another example of user configuration is when, for\nperformance reasons, the client processes must never be blocked by synchronous\nlog requests. It is possible, perhaps, that dropping or flushing events is still\nacceptable, since it does not affect the performance of the client processes\nsending the log events.\n\nA configuration example:\n\n```erlang\nlogger:add_handler(my_standard_h, logger_std_h,\n #{config => #{file => \"./system_info.log\",\n sync_mode_qlen => 100,\n drop_mode_qlen => 1000,\n flush_qlen => 2000}}).\n```","ref":"logger_chapter.html#message-queue-length"},{"type":"extras","title":"Controlling Bursts of Log Requests - Logging","doc":"Large bursts of log events - many events received by the handler under a short\nperiod of time - can potentially cause problems, such as:\n\n- Log files grow very large, very quickly.\n- Circular logs wrap too quickly so that important data is overwritten.\n- Write buffers grow large, which slows down file sync operations.\n\nFor this reason, both built-in handlers offer the possibility to specify the\nmaximum number of events to be handled within a certain time frame. With this\nburst control feature enabled, the handler can avoid choking the log with\nmassive amounts of printouts. The configuration parameters are:\n\n- **`burst_limit_enable`** - Value `true` enables burst control and `false`\n disables it.\n\n Defaults to `true`.\n\n- **`burst_limit_max_count`** - This is the maximum number of events to handle\n within a `burst_limit_window_time` time frame. After the limit is reached,\n successive events are dropped until the end of the time frame.\n\n Defaults to `500` events.\n\n- **`burst_limit_window_time`** - See the previous description of\n `burst_limit_max_count`.\n\n Defaults to `1000` milliseconds.\n\nA configuration example:\n\n```erlang\nlogger:add_handler(my_disk_log_h, logger_disk_log_h,\n #{config => #{file => \"./my_disk_log\",\n burst_limit_enable => true,\n burst_limit_max_count => 20,\n burst_limit_window_time => 500}}).\n```","ref":"logger_chapter.html#controlling-bursts-of-log-requests"},{"type":"extras","title":"Terminating an Overloaded Handler - Logging","doc":"It is possible that a handler, even if it can successfully manage peaks of high\nload without crashing, can build up a large message queue, or use a large amount\nof memory. The overload protection mechanism includes an automatic termination\nand restart feature for the purpose of guaranteeing that a handler does not grow\nout of bounds. The feature is configured with the following parameters:\n\n- **`overload_kill_enable`** - Value `true` enables the feature and `false`\n disables it.\n\n Defaults to `false`.\n\n- **`overload_kill_qlen`** - This is the maximum allowed queue length. If the\n message queue grows larger than this, the handler process is terminated.\n\n Defaults to `20000` messages.\n\n- **`overload_kill_mem_size`** - This is the maximum memory size that the\n handler process is allowed to use. If the handler grows larger than this, the\n process is terminated.\n\n Defaults to `3000000` bytes.\n\n- **`overload_kill_restart_after`** - If the handler is terminated, it restarts\n automatically after a delay specified in milliseconds. The value `infinity`\n prevents restarts.\n\n Defaults to `5000` milliseconds.\n\nIf the handler process is terminated because of overload, it prints information\nabout it in the log. It also prints information about when a restart has taken\nplace, and the handler is back in action.\n\n> #### Note {: .info }\n>\n> The sizes of the log events affect the memory needs of the handler. For\n> information about how to limit the size of log events, see the\n> `m:logger_formatter` manual page.","ref":"logger_chapter.html#terminating-an-overloaded-handler"},{"type":"extras","title":"Logger Proxy - Logging","doc":"The Logger proxy is an Erlang process which is part of the Kernel application's\nsupervision tree. During startup, the proxy process registers itself as the\n`system_logger`, meaning that log events produced by the emulator are sent to\nthis process.\n\nWhen a log event is issued on a process which has its group leader on a remote\nnode, Logger automatically forwards the log event to the group leader's node. To\nachieve this, it first sends the log event as an Erlang message from the\noriginal client process to the proxy on the local node, and the proxy in turn\nforwards the event to the proxy on the remote node.\n\nWhen receiving a log event, either from the emulator or from a remote node, the\nproxy calls the Logger API to log the event.\n\nThe proxy process is overload protected in the same way as described in section\n[Protecting the Handler from Overload](#overload_protection),\nbut with the following default values:\n\n```erlang\n #{sync_mode_qlen => 500,\n drop_mode_qlen => 1000,\n flush_qlen => 5000,\n burst_limit_enable => false,\n overload_kill_enable => false}\n```\n\nFor log events from the emulator, synchronous message passing mode is not\napplicable, since all messages are passed asynchronously by the emulator. Drop\nmode is achieved by setting the `system_logger` to `undefined`, forcing the\nemulator to drop events until it is set back to the proxy pid again.\n\nThe proxy uses `erlang:send_nosuspend/2` when sending log events to a remote\nnode. If the message could not be sent without suspending the sender, it is\ndropped. This is to avoid blocking the proxy process.","ref":"logger_chapter.html#logger-proxy"},{"type":"extras","title":"See Also - Logging","doc":"`m:disk_log`, `m:erlang`, `m:error_logger`, `m:logger`, `m:logger_disk_log_h`,\n`m:logger_filters`, `m:logger_formatter`, `m:logger_std_h`,\n[`sasl(6)`](`e:sasl:sasl_app.md`)","ref":"logger_chapter.html#see-also"},{"type":"extras","title":"Logging Cookbook","doc":"\n# Logging Cookbook\n\nUsing and especially configuring Logger can be difficult at times as there are\nmany different options that can be changed and often more than one way to\nachieve the same result. This User's Guide tries to help by giving many\ndifferent examples of how you can use logger.\n\nFor more examples of practical use-cases of using Logger, Fred Hebert's blog\npost\n[Erlang/OTP 21's new logger](https://ferd.ca/erlang-otp-21-s-new-logger.html) is\na great starting point.\n\n> #### Note {: .info }\n>\n> If you find that some common Logger usage is missing from this guide, please\n> open a pull request on github with the suggested addition","ref":"logger_cookbook.html"},{"type":"extras","title":"Get Logger information - Logging Cookbook","doc":"","ref":"logger_cookbook.html#get-logger-information"},{"type":"extras","title":"Print the primary Logger configurations. - Logging Cookbook","doc":"```erlang\n1> logger:i(primary).\nPrimary configuration:\n Level: notice\n Filter Default: log\n Filters:\n (none)\n```\n\nIt is also possible to fetch the configuration using\n[`logger:get_primary_config()`](`logger:get_primary_config/0`).\n\n#### See also\n\n- [logger:i()](`logger:i/0`)\n- [Configuration](logger_chapter.md#configuration) in the Logging User's Guide","ref":"logger_cookbook.html#print-the-primary-logger-configurations"},{"type":"extras","title":"Print the configuration of all handlers. - Logging Cookbook","doc":"```erlang\n2> logger:i(handlers).\nHandler configuration:\n Id: default\n Module: logger_std_h\n Level: all\n Formatter:\n Module: logger_formatter\n Config:\n legacy_header: true\n single_line: false\n Filter Default: stop\n Filters:\n Id: remote_gl\n Fun: fun logger_filters:remote_gl/2\n Arg: stop\n Id: domain\n Fun: fun logger_filters:domain/2\n Arg: {log,super,[otp,sasl]}\n Id: no_domain\n Fun: fun logger_filters:domain/2\n Arg: {log,undefined,[]}\n Handler Config:\n burst_limit_enable: true\n burst_limit_max_count: 500\n burst_limit_window_time: 1000\n drop_mode_qlen: 200\n filesync_repeat_interval: no_repeat\n flush_qlen: 1000\n overload_kill_enable: false\n overload_kill_mem_size: 3000000\n overload_kill_qlen: 20000\n overload_kill_restart_after: 5000\n sync_mode_qlen: 10\n type: standard_io\n```\n\nYou can also print the configuration of a specific handler using\n[`logger:i(HandlerName)`](`logger:i/1`), or fetch the configuration using\n[`logger:get_handler_config()`](`logger:get_handler_config/0`), or\n[`logger:get_handler_config(HandlerName)`](`logger:get_handler_config/1`) for a\nspecific handler.\n\n#### See also\n\n- [`logger:i()`](`logger:i/0`)\n- [Configuration](logger_chapter.md#configuration) in the Logging User's Guide","ref":"logger_cookbook.html#print-the-configuration-of-all-handlers"},{"type":"extras","title":"Configure the Logger - Logging Cookbook","doc":"","ref":"logger_cookbook.html#configure-the-logger"},{"type":"extras","title":"Where did my progress reports go? - Logging Cookbook","doc":"In OTP-21 the default primary log level is `notice`. The means that many log\nmessages are by default not printed. This includes the progress reports of\nsupervisors. In order to get progress reports you need to raise the primary log\nlevel to `info`\n\n```erlang\n$ erl -kernel logger_level info\n=PROGRESS REPORT==== 4-Nov-2019::16:33:11.742069 ===\n application: kernel\n started_at: nonode@nohost\n=PROGRESS REPORT==== 4-Nov-2019::16:33:11.746546 ===\n application: stdlib\n started_at: nonode@nohost\nEshell V10.5.3 (abort with ^G)\n1>\n```","ref":"logger_cookbook.html#where-did-my-progress-reports-go"},{"type":"extras","title":"Configure Logger formatter - Logging Cookbook","doc":"In order to fit better into your existing logging infrastructure Logger can\nformat its logging messages any way you want to. Either you can use the built-in\nformatter, or you can build your own.","ref":"logger_cookbook.html#configure-logger-formatter"},{"type":"extras","title":"Single line configuration - Logging Cookbook","doc":"Since single line logging is the default of the built-in formatter you only have\nto provide the empty map as the configuration. The example below uses the\n`sys.config` to change the formatter configuration.\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{ formatter => {logger_formatter, #{ }}}}]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, an error\").\n1962-10-03T11:07:47.466763-04:00 error: Oh noes, an error\n```\n\nHowever, if you just want to change it for the current session you can also do\nthat.\n\n```erlang\n1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).\nok\n2> logger:error(\"Oh noes, another error\").\n1962-10-04T15:34:02.648713-04:00 error: Oh noes, another error\n```\n\n#### See also\n\n- [logger_formatter's Configuration](`t:logger_formatter:config/0`)\n- [Formatters](logger_chapter.md#formatters) in the Logging User's Guide\n- `logger:set_handler_config/3`","ref":"logger_cookbook.html#single-line-configuration"},{"type":"extras","title":"Add file and line number to log entries - Logging Cookbook","doc":"You can change what is printed to the log by using the formatter template:\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{ formatter => {logger_formatter,\n #{ template => [time,\" \", file,\":\",line,\" \",level,\": \",msg,\"\\n\"] }}}}]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, more errors\",#{ file => \"shell.erl\", line => 1 }).\n1962-10-05T07:37:44.104241+02:00 shell.erl:1 error: Oh noes, more errors\n```\n\nNote that file and line have to be added in the metadata by the caller of\n`logger:log/3` as otherwise Logger will not know from where it was called. The\nfile and line number are automatically added if you use the `?LOG_ERROR` macros\nin `kernel/include/logger.hrl`.\n\n#### See also\n\n- [logger_formatter's Configuration](`t:logger_formatter:config/0`)\n- [logger_formatter's Template](`t:logger_formatter:template/0`)\n- [Logger Macros](`m:logger#module-macros`)\n- [Metadata](logger_chapter.md#metadata) in the Logging User's Guide","ref":"logger_cookbook.html#add-file-and-line-number-to-log-entries"},{"type":"extras","title":"Configuring handlers - Logging Cookbook","doc":"","ref":"logger_cookbook.html#configuring-handlers"},{"type":"extras","title":"Print logs to a file - Logging Cookbook","doc":"Instead of printing the logs to stdout we print them to a rotating file log.\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{ config => #{ file => \"log/erlang.log\",\n max_no_bytes => 4096,\n max_no_files => 5},\n formatter => {logger_formatter, #{}}}}]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, even more errors\").\nok\n2> erlang:halt().\n$ cat log/erlang.log\n2019-10-07T11:47:16.837958+02:00 error: Oh noes, even more errors\n```\n\n#### See also\n\n- `m:logger_std_h`\n- [Handlers](logger_chapter.md#handlers) in the Logging User's Guide","ref":"logger_cookbook.html#print-logs-to-a-file"},{"type":"extras","title":"Debug only handler - Logging Cookbook","doc":"Add a handler that prints `debug` log events to a file, while the default\nhandler prints only up to `notice` level events to standard out.\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger_level, all},\n {logger,\n [{handler, default, logger_std_h,\n #{ level => notice }},\n {handler, debug, logger_std_h,\n #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],\n config => #{ file => \"log/debug.log\" } }}\n ]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, even more errors\").\n=ERROR REPORT==== 9-Oct-2019::14:40:54.784162 ===\nOh noes, even more errors\nok\n2> logger:debug(\"A debug event\").\nok\n3> erlang:halt().\n$ cat log/debug.log\n2019-10-09T14:41:03.680541+02:00 debug: A debug event\n```\n\nIn the configuration above we first raise the primary log level to max in order\nfor the debug log events to get to the handlers. Then we configure the default\nhandler to only log notice and below events, the default log level for a handler\nis `all`. Then the debug handler is configured with a filter to stop any log\nmessage that is not a debug level message.\n\nIt is also possible to do the same changes in an already running system using\nthe `logger` module. Then you do like this:\n\n```erlang\n$ erl\n1> logger:set_handler_config(default, level, notice).\nok\n2> logger:add_handler(debug, logger_std_h, #{\n filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],\n config => #{ file => \"log/debug.log\" } }).\nok\n3> logger:set_primary_config(level, all).\nok\n```\n\nIt is important that you do not raise the primary log level before adjusting the\ndefault handler's level as otherwise your standard out may be flooded by debug\nlog messages.\n\n#### See also\n\n- `m:logger_std_h`\n- [Filters](logger_chapter.md#filters) in the Logging User's Guide","ref":"logger_cookbook.html#debug-only-handler"},{"type":"extras","title":"Logging - Logging Cookbook","doc":"","ref":"logger_cookbook.html#logging"},{"type":"extras","title":"What to log and how - Logging Cookbook","doc":"The simplest way to log something is by using the Logger macros and give a\nreport to the macro. For example if you want to log an error:\n\n```erlang\n?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).\n```\n\nThis will print the following in the default log:\n\n```text\n=ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===\n dst: {8,8,4,4}\n src: {8,8,8,8}\n status: 418\n what: http_error\n```\n\nor the below if you use a single line formatter:\n\n```text\n2019-10-10T12:14:11.921843+02:00 error: dst: {8,8,4,4}, src: {8,8,8,8}, status: 418, what: http_error\n```\n\n#### See also\n\n- [Log Message](logger_chapter.md#log-message) in the Logging User's Guide","ref":"logger_cookbook.html#what-to-log-and-how"},{"type":"extras","title":"Report call-backs and printing of events - Logging Cookbook","doc":"If you want to do structured logging, but still want to have some control of how\nthe final log message is formatted you can give a `report_cb` as part of the\nmetadata with your log event.\n\n```erlang\nReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->\n {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),\n {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),\n {\"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n\",\n [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}\n end,\n?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP },\n #{ report_cb => ReportCB }).\n```\n\nThis will print the following:\n\n```text\n=ERROR REPORT==== 10-Oct-2019::13:29:02.230863 ===\nWhat: http_error\nStatus: 418\nSrc: 8.8.8.8 (dns.google)\nDst: 192.121.151.106 (erlang.org)\n```\n\nNote that the order that things are printed have changed, and also I added a\nreverse-dns lookup of the IP address. This will not print as nicely when using a\nsingle line formatter, however you can also use a report_cb fun with 2 arguments\nwhere the second argument is the formatting options.\n\n#### See also\n\n- [Log Message](logger_chapter.md#log-message) in the Logging User's Guide\n- [Logger Report Callbacks](`t:logger:report_cb/0`)","ref":"logger_cookbook.html#report-call-backs-and-printing-of-events"},{"type":"extras","title":"Filters - Logging Cookbook","doc":"Filters are used to remove or change log events before they reach the handlers.","ref":"logger_cookbook.html#filters"},{"type":"extras","title":"Process filters - Logging Cookbook","doc":"If we only want debug messages from a specific process it is possible to do this\nwith a filter like this:\n\n```erlang\n%% Initial setup to use a filter for the level filter instead of the primary level\nPrimaryLevel = maps:get(level, logger:get_primary_config()),\nok = logger:add_primary_filter(primary_level,\n {fun logger_filters:level/2, {log, gteq, PrimaryLevel}}),\nlogger:set_primary_config(filter_default, stop),\nlogger:set_primary_config(level, all),\n\n%% Test that things work as they should\nlogger:notice(\"Notice should be logged\"),\nlogger:debug(\"Should not be logged\"),\n\n%% Add the filter to allow PidToLog to send debug events\nPidToLog = self(),\nPidFilter = fun(LogEvent, _) when PidToLog =:= self() -> LogEvent;\n (_LogEvent, _) -> ignore end,\nok = logger:add_primary_filter(pid, {PidFilter,[]}),\nlogger:debug(\"Debug should be logged\").\n```\n\nThere is a bit of setup needed to allow filters to decide whether a specific\nprocess should be allowed to log. This is because the default primary log level\nis notice and it is enforced before the primary filters. So in order for the pid\nfilter to be useful we have to raise the primary log level to `all` and then add\na level filter that only lets certain messages at or greater than notice\nthrough. When the setup is done, it is simple to add a filter that allows a\ncertain pid through.\n\nNote that doing the primary log level filtering through a filter and not through\nthe level is quite a lot more expensive, so make sure to test that your system\ncan handle the extra load before you enable it on a production node.\n\n#### See also\n\n- [Filters](logger_chapter.md#filters) in the Logging User's Guide\n- `logger_filters:level/2`\n- `logger:set_primary_config/2`","ref":"logger_cookbook.html#process-filters"},{"type":"extras","title":"Domains - Logging Cookbook","doc":"Domains are used to specify which subsystem a certain log event originates from.\nThe default handler will by default only log events with the domain `[otp]` or\nwithout a domain. If you would like to include SSL log events into the default\nhandler log you could do this:\n\n```erlang\n1> logger:add_handler_filter(default,ssl_domain,\n {fun logger_filters:domain/2,{log,sub,[otp,ssl]}}).\n2> application:ensure_all_started(ssl).\n{ok,[crypto,asn1,public_key,ssl]}\n3> ssl:connect(\"www.erlang.org\",443,[{log_level,debug}]).\n%% lots of text\n```\n\n#### See also\n\n- [Filters](logger_chapter.md#filters) in the Logging User's Guide\n- `logger_filters:domain/2`\n- `logger:set_primary_config/2`","ref":"logger_cookbook.html#domains"},{"type":"extras","title":"EEP-48: Documentation storage and format","doc":"\n# EEP-48: Documentation storage and format\n\nThis User's Guide describes the documentation storage format initially described\nin [EEP-48](https://www.erlang.org/erlang-enhancement-proposals/eep-0048.html).\nBy standardizing how API documentation is stored, it will be possible to write\ntools that work across languages.\n\nTo fetch the EEP-48 documentation for a module, use `code:get_doc/1`.\n\nTo render the EEP-48 documentation for an Erlang module, use\n`shell_docs:render/2`.","ref":"eep48_chapter.html"},{"type":"extras","title":"The \"Docs\" storage - EEP-48: Documentation storage and format","doc":"To look for documentation for a module named `example`, a tool should:\n\nLook for `example.beam` in the code path, parse the BEAM file, and retrieve the\n`Docs` chunk. If the chunk is not available, it should look for `\"example.beam\"`\nin the code path and find the `doc/chunks/example.chunk` file in the application\nthat defines the `example` module. If no `.chunk` file exists,\ndocumentation is not available.\n\nThe choice of using a chunk or the filesystem is completely up to the language\nor library. In both cases, the documentation can be added or removed at any\nmoment by stripping the `Docs` chunk (using `m:beam_lib`) or by removing the\n`doc/chunks` directory.\n\nFor example, languages such as Elixir and LFE attach the `Docs` chunk at\ncompilation time, which can be controlled via a compiler flag, while\nother languages might want to generate the documentation separate from\nthe compilation of the source code.","ref":"eep48_chapter.html#the-docs-storage"},{"type":"extras","title":"The \"Docs\" format - EEP-48: Documentation storage and format","doc":"In both storages, the documentation is written in the exactly same format: an\nErlang term serialized to binary via\n[`term_to_binary/1`](`erlang:term_to_binary/1`). The term can be optionally\ncompressed when serialized. It must follow the type specification below:\n\n```erlang\n{docs_v1,\n Anno :: erl_anno:anno(),\n BeamLanguage :: atom(),\n Format :: binary(),\n ModuleDoc :: #{DocLanguage := DocValue} | none | hidden,\n Metadata :: map(),\n Docs ::\n [{{Kind, Name, Arity},\n Anno :: erl_anno:anno(),\n Signature :: [binary()],\n Doc :: #{DocLanguage := DocValue} | none | hidden,\n Metadata :: map()\n }]} when DocLanguage :: binary(),\n DocValue :: binary() | term()\n```\n\nwhere in the root tuple we have:\n\n- **`Anno`** - annotation (line, column, file) of the definition itself (see\n `m:erl_anno`)\n\n- **`BeamLanguage`** - an atom representing the language, for example: `erlang`,\n `elixir`, `lfe`, `alpaca`, and so on\n\n- **`Format`** - the mime type of the documentation, such as `<<\"text/markdown\">>`\n or `<<\"application/erlang+html\">>`. For details of the format used by Erlang\n see the [`EEP-48 Chapter`](`e:edoc:doc_storage.md`) in EDoc's User's\n Guide.\n\n- **`ModuleDoc`** - a map with the documentation language as key, such as\n `<<\"en\">>` or `<<\"pt_BR\">>`, and the documentation as a binary value. It can\n be atom `none` if no documentation exists or the atom `hidden` if\n documentation has been explicitly disabled for this entry.\n\n- **`Metadata`** - a map of atom keys with any term as value. This can be used to\n add annotations like the `authors` of a module, `deprecated`, or anything else\n a language or documentation tool finds relevant.\n\n- **`Docs`** - a list of documentation for other entities (such as functions and\n types) in the module.\n\nFor each entry in Docs, we have:\n\n- **`{Kind, Name, Arity}`** - the kind, name and arity identifying the function,\n callback, type, and so on. The official entities are: `function`, `type`, and\n `callback`. Other languages will add their own. For instance, Elixir and LFE\n might add `macro`.\n\n- **`Anno`** - annotation (line, column, file) of the module documentation or of\n the definition itself (see `m:erl_anno`).\n\n- **`Signature`** - the signature of the entity. It is is a list of binaries.\n Each entry represents a binary in the signature that can be joined with\n whitespace or newline. For example,\n `[<<\"binary_to_atom(Binary, Encoding)\">>, <<\"when is_binary(Binary)\">>]` can\n be rendered as a single line or two lines. It exists exclusively for\n exhibition purposes.\n\n- **`Doc`** - a map with the documentation language as key, such as `<<\"en\">>` or\n `<<\"pt_BR\">>`, and the documentation as a value. The documentation can either be\n a binary or any Erlang term, both described by `Format`. If it is an Erlang\n term, then `Format` must be `<<\"application/erlang+SUFFIX\">>`, such as\n `<<\"application/erlang+html\">>` when the documentation is an Erlang\n representation of an HTML document. `Doc` can also be atom `none`\n if no documentation exists or the atom `hidden` if documentation has been\n explicitly disabled for this entry.\n\n- **`Metadata`** - a map of atom keys with any term as value.\n\nThis shared format is the heart of the EEP as it is what effectively allows\ncross-language collaboration.\n\nThe Metadata field exists to allow languages, tools, and libraries to add custom\ninformation to each entry. This EEP documents the following metadata keys:\n\n- **`authors := [binary()]`** - a list of authors as binaries.\n\n- **`cross_references := [module() | {module(), {Kind, Name, Arity}}]`** - a\n list of modules or module entries that can be used as cross references when\n generating documentation.\n\n- **`deprecated := binary()`** - when present, it means the current entry is\n deprecated with a binary that represents the reason for deprecation and a\n recommendation to replace the deprecated code.\n\n- **`since := binary()`** - a binary representing the version such entry was\n added, such as `<<\"1.3.0\">>` or `<<\"20.0\">>`.\n\n- **`edit_url := binary()`** - a binary representing a URL to change the\n documentation itself.\n\nAny key may be added to Metadata at any time. Keys that are frequently used by\nthe community can be standardized in future versions.","ref":"eep48_chapter.html#the-docs-format"},{"type":"extras","title":"See Also - EEP-48: Documentation storage and format","doc":"`m:erl_anno`, `m:shell_docs`,\n[`EEP-48 Chapter in EDoc's User's Guide`](`e:edoc:doc_storage.md`),\n`code:get_doc/1`","ref":"eep48_chapter.html#see-also"},{"type":"extras","title":"app","doc":"\n# app\n\nApplication resource file.","ref":"app.html"},{"type":"extras","title":"Description - app","doc":"The _application resource file_ specifies the resources an application uses, and\nhow the application is started. There must always be one application resource\nfile called `Application.app` for each application `Application` in the system.\n\nThe file is read by the application controller when an application is\nloaded/started. It is also used by the functions in `systools`, for example when\ngenerating start scripts.","ref":"app.html#description"},{"type":"extras","title":"File Syntax - app","doc":"The application resource file is to be called `Application.app`, where\n`Application` is the application name. The file is to be located in directory\n`ebin` for the application.\n\nThe file must contain a single Erlang term, which is called an _application\nspecification_:\n\n```erlang\n{application, Application,\n [{description, Description},\n {id, Id},\n {vsn, Vsn},\n {modules, Modules},\n {maxP, MaxP},\n {maxT, MaxT},\n {registered, Names},\n {included_applications, Apps},\n {optional_applications, Apps},\n {applications, Apps},\n {env, Env},\n {mod, Start},\n {start_phases, Phases},\n {runtime_dependencies, RTDeps}]}.\n\n Value Default\n ----- -------\nApplication atom() -\nDescription string() \"\"\nId string() \"\"\nVsn string() \"\"\nModules [Module] []\nMaxP int() infinity\nMaxT int() infinity\nNames [Name] []\nApps [App] []\nEnv [{Par,Val}] []\nStart {Module,StartArgs} []\nPhases [{Phase,PhaseArgs}] undefined\nRTDeps [ApplicationVersion] []\n\nModule = Name = App = Par = Phase = atom()\nVal = StartArgs = PhaseArgs = term()\nApplicationVersion = string()\n```\n\n- **`Application`** - Application name.\n\nFor the application controller, all keys are optional. The respective default\nvalues are used for any omitted keys.\n\nThe functions in `systools` require more information. If they are used, the\nfollowing keys are mandatory:\n\n- `description`\n- `vsn`\n- `modules`\n- `registered`\n- `applications`\n\nThe other keys are ignored by `systools`.\n\n- **`description`** - A one-line description of the application.\n\n- **`id`** - Product identification, or similar.\n\n- **`vsn`** - Version of the application.\n\n- **`modules`** - All modules introduced by this application. `systools` uses\n this list when generating start scripts and tar files. A module can only be\n defined in one application.\n\n- **`maxP`** - _Deprecated - is ignored_\n\n Maximum number of processes allowed in the application.\n\n- **`maxT`** - Maximum time, in milliseconds, that the application is allowed to\n run. After the specified time, the application terminates automatically.\n\n- **`registered`** - All names of registered processes started in this\n application. `systools` uses this list to detect name clashes between\n different applications.\n\n- **`included_applications`** - All applications included by this application.\n When this application is started, all included applications are loaded\n automatically, but not started, by the application controller. It is assumed\n that the top-most supervisor of the included application is started by a\n supervisor of this application.\n\n- **`applications`** - All applications that must be started before this\n application. If an application is also listed in `optional_applications`, then\n the application is not required to exist (but if it exists, it is also\n guaranteed to be started before this one).\n\n `systools` uses this list to generate correct start scripts. Defaults to the\n empty list, but notice that all applications have dependencies to (at least)\n Kernel and STDLIB.\n\n- **`optional_applications`** - A list of `applications` that are optional. Note\n if you want an optional dependency to be automatically started before the\n current application whenever it is available, it must be listed on both\n `applications` and `optional_applications`.\n\n- **`env`** - Configuration parameters used by the application. The value of a\n configuration parameter is retrieved by calling `application:get_env/1,2`. The\n values in the application resource file can be overridden by values in a\n configuration file (see [`config(4)`](config.md)) or by command-line flags\n (see [`erts:erl(1)`](`e:erts:erl_cmd.md`)).\n\n- **`mod`** - Specifies the application callback module and a start argument,\n see `m:application`.\n\n Key `mod` is necessary for an application implemented as a supervision tree,\n otherwise the application controller does not know how to start it. `mod` can\n be omitted for applications without processes, typically code libraries, for\n example, STDLIB.\n\n- **`start_phases`** - A list of start phases and corresponding start arguments\n for the application. If this key is present, the application master, in\n addition to the usual call to `Module:start/2`, also calls\n `Module:start_phase(Phase,Type,PhaseArgs)` for each start phase defined by key\n `start_phases`. Only after this extended start procedure,\n `application:start(Application)` returns.\n\n Start phases can be used to synchronize startup of an application and its\n included applications. In this case, key `mod` must be specified as follows:\n\n ```erlang\n {mod, {application_starter,[Module,StartArgs]}}\n ```\n\n The application master then calls `Module:start/2` for the primary\n application, followed by calls to `Module:start_phase/3` for each start phase\n (as defined for the primary application), both for the primary application and\n for each of its included applications, for which the start phase is defined.\n\n This implies that for an included application, the set of start phases must be\n a subset of the set of phases defined for the primary application. For more\n information, see [OTP Design Principles](`e:system:applications.md`).\n\n- **`runtime_dependencies`{: #runtime_dependencies }** - A list of application\n versions that the application depends on. An example of such an application\n version is `\"kernel-3.0\"`. Application versions specified as runtime\n dependencies are minimum requirements. That is, a larger application version\n than the one specified in the dependency satisfies the requirement. For\n information about how to compare application versions, see section\n [Versions](`e:system:versions.md`) in the System Principles User's Guide.\n\n Notice that the application version specifies a source code version. One more,\n indirect, requirement is that the installed binary application of the\n specified version is built so that it is compatible with the rest of the\n system.\n\n Some dependencies can only be required in specific runtime scenarios. When\n such optional dependencies exist, these are specified and documented in the\n corresponding \"App\" documentation of the specific application.","ref":"app.html#file-syntax"},{"type":"extras","title":"See Also - app","doc":"`m:application`, `m:systools`","ref":"app.html#see-also"},{"type":"extras","title":"config","doc":"\n# config\n\nConfiguration file.","ref":"config.html"},{"type":"extras","title":"Description - config","doc":"A _configuration file_ contains values for configuration parameters for the\napplications in the system. The `erl` command-line argument\n[`-config Name`](`e:erts:erl_cmd.md#config`) tells the system to use data in the\nsystem configuration file `Name.config`.\n\nThe erl command-line argument [`-configfd`](`e:erts:erl_cmd.md#configfd`) works\nthe same way as the `-config` option but specifies a file descriptor to read\nconfiguration data from instead of a file.\n\nThe configuration data from configuration files and file descriptors are read in\nthe same order as they are given on the command line. For example,\n`erl -config a -configfd 3 -config b -configfd 4` would cause the system to read\nconfiguration data in the following order `a.config`, file descriptor `3`,\n`b.config`, and file descriptor `4`. If a configuration parameter is specified\nmore than once in the given files and file descriptors, the last one overrides\nthe previous ones.\n\nConfiguration parameter values in a configuration file or file descriptor\noverride the values in the application resource files (see [`app(4)`](app.md)).\nThe values in the configuration file are always overridden by command-line flags\n(see [`erts:erl(1)`](`e:erts:erl_cmd.md`)).\n\nThe value of a configuration parameter is retrieved by calling\n`application:get_env/1,2`.","ref":"config.html#description"},{"type":"extras","title":"File Syntax - config","doc":"The configuration file is to be called `Name.config`, where `Name` is any name.\n\nFile `.config` contains a single Erlang term and has the following syntax:\n\n```erlang\n[{Application1, [{Par11, Val11}, ...]},\n ...\n {ApplicationN, [{ParN1, ValN1}, ...]}].\n```\n\n- **`Application = atom()`** - Application name.\n\n- **`Par = atom()`** - Name of a configuration parameter.\n\n- **`Val = term()`** - Value of a configuration parameter.","ref":"config.html#file-syntax"},{"type":"extras","title":"sys.config - config","doc":"When starting Erlang in embedded mode, it is assumed that exactly one system\nconfiguration file is used, named `sys.config`. This file is to be located in\n`$ROOT/releases/Vsn`, where `$ROOT` is the Erlang/OTP root installation\ndirectory and `Vsn` is the release version.\n\nRelease handling relies on this assumption. When installing a new release\nversion, the new `sys.config` is read and used to update the application's\nconfigurations.\n\nThis means that specifying another `.config` file, or more `.config` files,\nleads to an inconsistent update of application configurations. There is,\nhowever, a way to point out other config files from a `sys.config`. How to do\nthis is described in the next section.","ref":"config.html#sys-config"},{"type":"extras","title":"Including Files from sys.config and -configfd Configurations - config","doc":"There is a way to include other configuration files from a `sys.config` file and\nfrom a configuration that comes from a file descriptor that has been pointed out\nwith the [`-configfd`](`e:erts:erl_cmd.md#configfd`) command-line argument.\n\nThe syntax for including files can be described by the\n[Erlang type language](`e:system:typespec.md`) like this:\n\n```text\n[{Application, [{Par, Val}]} | IncludeFile].\n```\n\n- **`IncludeFile = string()`** - Name of a `.config` file. The extension\n `.config` can be omitted. It is recommended to use absolute paths. If a\n relative path is used in a `sys.config`, `IncludeFile` is searched, first,\n relative to the `sys.config` directory, then relative to the current working\n directory of the emulator. If a relative path is used in a `-configfd`\n configuration, `IncludeFile` is searched, first, relative to the dictionary\n containing the [boot script](`e:sasl:script.md`) (see also the\n [`-boot`](`e:erts:erl_cmd.md#boot`) command-line argument) for the emulator,\n then relative to the current working directory of the emulator. This makes it\n possible to use `sys.config` for pointing out other `.config` files in a\n release or in a node started manually using `-config` or `-configfd` with the\n same result whatever the current working directory is.\n\nWhen traversing the contents of a `sys.config` or a `-configfd` configuration\nand a filename is encountered, its contents are read and merged with the result\nso far. When an application configuration tuple `{Application, Env}` is found,\nit is merged with the result so far. Merging means that new parameters are added\nand existing parameter values are overwritten.\n\n_Example:_\n\n```text\nsys.config:\n\n[\"/home/user/myconfig1\"\n {myapp,[{par1,val1},{par2,val2}]},\n \"/home/user/myconfig2\"].\n\nmyconfig1.config:\n\n[{myapp,[{par0,val0},{par1,val0},{par2,val0}]}].\n\nmyconfig2.config:\n\n[{myapp,[{par2,val3},{par3,val4}]}].\n```\n\nThis yields the following environment for `myapp`:\n\n```text\n[{par0,val0},{par1,val1},{par2,val3},{par3,val4}]\n```\n\nThe run-time system will abort before staring up if an include file specified in\n`sys.config` or a `-configfd` configuration does not exist, or is erroneous.\nHowever, installing a new release version will not fail if there is an error\nwhile loading an include file, but an error message is returned and the\nerroneous file is ignored.","ref":"config.html#including-files-from-sys-config-and-configfd-configurations"},{"type":"extras","title":"See Also - config","doc":"[`app(4)`](app.md), [`erts:erl(1)`](`e:erts:erl_cmd.md`),\n[OTP Design Principles](`e:system:design_principles.md`)","ref":"config.html#see-also"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/kernel-10.2/doc/html/dist/search_data-FEC33C9C.js b/prs/9277/lib/kernel-10.2/doc/html/dist/search_data-FEC33C9C.js deleted file mode 100644 index 39d48d54d5616..0000000000000 --- a/prs/9277/lib/kernel-10.2/doc/html/dist/search_data-FEC33C9C.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"behaviour","doc":"Generic OTP application functions\n\nIn OTP, _application_ denotes a component implementing some specific\nfunctionality, that can be started and stopped as a unit, and that can be reused\nin other systems. This module interacts with _application controller_, a process\nstarted at every Erlang runtime system. This module contains functions for\ncontrolling applications (for example, starting and stopping applications), and\nfunctions to access information about applications (for example, configuration\nparameters).\n\nAn application is defined by an _application specification_. The specification\nis normally located in an _application resource file_ named `Application.app`,\nwhere `Application` is the application name. For details about the application\nspecification, see [`app`](app.md).\n\nThis module can also be viewed as a behaviour for an application implemented\naccording to the OTP design principles as a supervision tree. The definition of\nhow to start and stop the tree is to be located in an _application callback\nmodule_, exporting a predefined set of functions.\n\nFor details about applications and behaviours, see\n[OTP Design Principles](`e:system:design_principles.md`).","title":"application","ref":"application.html"},{"type":"behaviour","doc":"[OTP Design Principles](`e:system:design_principles.md`),\n[kernel](kernel_app.md), [app](app.md)","title":"See Also - application","ref":"application.html#module-see-also"},{"type":"callback","doc":"This function is called by an application after a code replacement, if the\nconfiguration parameters have changed.\n\n`Changed` is a list of parameter-value tuples including all configuration\nparameters with changed values.\n\n`New` is a list of parameter-value tuples including all added configuration\nparameters.\n\n`Removed` is a list of all removed parameters.","title":"application.config_change/3","ref":"application.html#c:config_change/3"},{"type":"function","doc":"","title":"application.ensure_all_started/1","ref":"application.html#ensure_all_started/1"},{"type":"function","doc":"","title":"application.ensure_all_started/2","ref":"application.html#ensure_all_started/2"},{"type":"function","doc":"`Applications` is either an an `t:atom/0` or a list of `t:atom/0` representing\nmultiple applications.\n\nThis function is equivalent to calling [`start/1,2`](`start/1`) repeatedly on\nall dependencies that are not yet started of each application. Optional\ndependencies will also be loaded and started if they are available.\n\nThe `Mode` argument controls if the applications should be started in `serial`\nmode (one at a time) or `concurrent` mode. In concurrent mode, a dependency\ngraph is built and the leaves of the graph are started concurrently and\nrecursively. In both modes, no assertion can be made about the order the\napplications are started. If not supplied, it defaults to `serial`.\n\nReturns `{ok, AppNames}` for a successful start or for an already started\napplication (which is, however, omitted from the `AppNames` list).\n\nThe function reports `{error, {AppName,Reason}}` for errors, where `Reason` is\nany possible reason returned by [`start/1,2`](`start/1`) when starting a\nspecific dependency.\n\nIf an error occurs, the applications started by the function are stopped to\nbring the set of running applications back to its initial state.","title":"application.ensure_all_started/3","ref":"application.html#ensure_all_started/3"},{"type":"function","doc":"Equivalent to [`start(Application)`](`start/1`) except it returns `ok` for\nalready started applications.","title":"application.ensure_started/1","ref":"application.html#ensure_started/1"},{"type":"function","doc":"Equivalent to [`start(Application, Type)`](`start/2`) except it returns `ok` for\nalready started applications.","title":"application.ensure_started/2","ref":"application.html#ensure_started/2"},{"type":"function","doc":"","title":"application.get_all_env/0","ref":"application.html#get_all_env/0"},{"type":"function","doc":"Returns the configuration parameters and their values for `Application`.\n\nIf the specified application is not loaded, or if the process executing the call\ndoes not belong to any application, the function returns `[]`.","title":"application.get_all_env/1","ref":"application.html#get_all_env/1"},{"type":"function","doc":"","title":"application.get_all_key/0","ref":"application.html#get_all_key/0"},{"type":"function","doc":"Returns the application specification keys and their values for `Application`.\nIf the argument is omitted, it defaults to the application of the calling\nprocess.\n\nIf the specified application is not loaded, the function returns `undefined`. If\nthe process executing the call does not belong to any application, the function\nreturns `[]`.","title":"application.get_all_key/1","ref":"application.html#get_all_key/1"},{"type":"function","doc":"","title":"application.get_application/0","ref":"application.html#get_application/0"},{"type":"function","doc":"Returns the name of the application to which the process `Pid` or the module\n`Module` belongs.\n\nIf the specified process does not belong to any application, or if the specified\nprocess or module does not exist, the function returns `undefined`.","title":"application.get_application/1","ref":"application.html#get_application/1"},{"type":"function","doc":"","title":"application.get_env/1","ref":"application.html#get_env/1"},{"type":"function","doc":"Returns the value of configuration parameter `Par` for `Application`.\n\nReturns `undefined` if any of the following applies:\n\n- The specified application is not loaded.\n- The configuration parameter does not exist.\n- The process executing the call does not belong to any application.","title":"application.get_env/2","ref":"application.html#get_env/2"},{"type":"function","doc":"Works like `get_env/2` but returns value `Def` when configuration parameter\n`Par` does not exist.","title":"application.get_env/3","ref":"application.html#get_env/3"},{"type":"function","doc":"","title":"application.get_key/1","ref":"application.html#get_key/1"},{"type":"function","doc":"Returns the value of the application specification key `Key` for `Application`.\n\nReturns `undefined` if any of the following applies:\n\n- The specified application is not loaded.\n- The specification key does not exist.\n- The process executing the call does not belong to any application.","title":"application.get_key/2","ref":"application.html#get_key/2"},{"type":"function","doc":"Returns the `Pid` of the supervisor running at the root of `Application`.\n\nIf the specified application does not exist or does not define a callback\nmodule, the function returns `undefined`.","title":"application.get_supervisor/1","ref":"application.html#get_supervisor/1"},{"type":"function","doc":"","title":"application.load/1","ref":"application.html#load/1"},{"type":"function","doc":"Loads the application specification for an application into the application\ncontroller. It also loads the application specifications for any included\napplications. Notice that the function does not load the Erlang object code.\n\nThe application can be specified by its name `Application`. In this case, the\napplication controller searches the code path for the application resource file\n`Application.app` and loads the specification it contains.\n\nThe application specification can also be specified directly as a tuple\n`AppSpec`, having the format and contents as described in [`app`](app.md).\n\nIf `Distributed == {Application,[Time,]Nodes}`, the application becomes\ndistributed. The argument overrides the value for the application in the Kernel\nconfiguration parameter `distributed`. `Application` must be the application\nname (same as in the first argument). If a node crashes and `Time` is specified,\nthe application controller waits for `Time` milliseconds before attempting to\nrestart the application on another node. If `Time` is not specified, it defaults\nto `0` and the application is restarted immediately.\n\n`Nodes` is a list of node names where the application can run, in priority from\nleft to right. Node names can be grouped using tuples to indicate that they have\nthe same priority.\n\n_Example:_\n\n```erlang\nNodes = [cp1@cave, {cp2@cave, cp3@cave}]\n```\n\nThis means that the application is preferably to be started at `cp1@cave`. If\n`cp1@cave` is down, the application is to be started at `cp2@cave` or\n`cp3@cave`.\n\nIf `Distributed == default`, the value for the application in the Kernel\nconfiguration parameter `distributed` is used.","title":"application.load/2","ref":"application.html#load/2"},{"type":"function","doc":"Returns a list with information about the applications, and included\napplications, which are loaded using `load/1,2`. `Application` is the\napplication name. `Description` and `Vsn` are the values of their `description`\nand `vsn` application specification keys, respectively.","title":"application.loaded_applications/0","ref":"application.html#loaded_applications/0"},{"type":"function","doc":"Changes the permission for `Application` to run at the current node. The\napplication must be loaded using `load/1,2` for the function to have effect.\n\nIf the permission of a loaded, but not started, application is set to `false`,\n`start` returns `ok` but the application is not started until the permission is\nset to `true`.\n\nIf the permission of a running application is set to `false`, the application is\nstopped. If the permission later is set to `true`, it is restarted.\n\nIf the application is distributed, setting the permission to `false` means that\nthe application will be started at, or moved to, another node according to how\nits distribution is configured (see `load/2`).\n\nThe function does not return until the application is started, stopped, or\nsuccessfully moved to another node. However, in some cases where permission is\nset to `true`, the function returns `ok` even though the application is not\nstarted. This is true when an application cannot start because of dependencies\nto other applications that are not yet started. When they are started,\n`Application` is started as well.\n\nBy default, all applications are loaded with permission `true` on all nodes. The\npermission can be configured using the Kernel configuration parameter\n`permissions`.","title":"application.permit/2","ref":"application.html#permit/2"},{"type":"callback","doc":"This function is called when an application is about to be stopped, before\nshutting down the processes of the application.\n\n`State` is the state returned from [`Module:start/2`](`c:start/2`), or `[]` if\nno state was returned. `NewState` is any term and is passed to\n[`Module:stop/1`](`c:stop/1`).\n\nThe function is optional. If it is not defined, the processes are terminated and\nthen [`Module:stop(State)`](`c:stop/1`) is called.","title":"application.prep_stop/1","ref":"application.html#c:prep_stop/1"},{"type":"function","doc":"","title":"application.set_env/1","ref":"application.html#set_env/1"},{"type":"function","doc":"Sets the configuration `Config` for multiple applications.\n\nIt is equivalent to calling [`set_env/4`](`set_env/4`) on each application\nindividually, except it is more efficient. The given `Config` is validated before\nthe configuration is set.\n\n[`set_env/2`](`set_env/2`) uses the standard `gen_server` time-out value (5000\nms). Option `timeout` can be specified if another time-out value is useful, for\nexample, in situations where the application controller is heavily loaded.\n\nOption `persistent` can be set to `true` to guarantee that parameters set with\n[`set_env/2`](`set_env/2`) are not overridden by those defined in the\napplication resource file on load. This means that persistent values will stick\nafter the application is loaded and also on application reload.\n\nIf an application is given more than once or if an application has the same key\ngiven more than once, the behaviour is undefined and a warning message will be\nlogged. In future releases, an error will be raised.\n\n> #### Warning {: .warning }\n>\n> Use this function only if you know what you are doing, that is, on your own\n> applications. It is very application-dependent and configuration\n> parameter-dependent when and how often the value is read by the application.\n> Careless use of this function can put the application in a weird,\n> inconsistent, and malfunctioning state.","title":"application.set_env/2","ref":"application.html#set_env/2"},{"type":"function","doc":"","title":"application.set_env/3","ref":"application.html#set_env/3"},{"type":"function","doc":"Sets the value of configuration parameter `Par` for `Application`.\n\n[`set_env/4`](`set_env/4`) uses the standard `gen_server` time-out value (5000\nms). Option `timeout` can be specified if another time-out value is useful, for\nexample, in situations where the application controller is heavily loaded.\n\nIf [`set_env/4`](`set_env/4`) is called before the application is loaded, the\napplication environment values specified in file `Application.app` override the\nones previously set. This is also true for application reloads.\n\nOption `persistent` can be set to `true` to guarantee that parameters set with\n[`set_env/4`](`set_env/4`) are not overridden by those defined in the\napplication resource file on load. This means that persistent values will stick\nafter the application is loaded and also on application reload.\n\n> #### Warning {: .warning }\n>\n> Use this function only if you know what you are doing, that is, on your own\n> applications. It is very application-dependent and configuration\n> parameter-dependent when and how often the value is read by the application.\n> Careless use of this function can put the application in a weird,\n> inconsistent, and malfunctioning state.","title":"application.set_env/4","ref":"application.html#set_env/4"},{"type":"function","doc":"","title":"application.start/1","ref":"application.html#start/1"},{"type":"function","doc":"Starts `Application`. If it is not loaded, the application controller first\nloads it using [`load/1`](`load/1`). It ensures that any included applications\nare loaded, but does not start them. That is assumed to be taken care of in the\ncode for `Application`.\n\nThe application controller checks the value of the application specification key\n`applications`, to ensure that all applications needed to be started before this\napplication are running. If an application is missing and the application is not\nmarked as optional, `{error,{not_started,App}}` is returned, where `App` is the\nname of the missing application. Note this function makes no attempt to start\nany of the applications listed in `applications`, not even optional ones. See\n[`ensure_all_started/1,2`](`ensure_all_started/1`) for recursively starting the\ncurrent application and its dependencies.\n\nOnce validated, the application controller then creates an _application master_\nfor the application. The application master becomes the group leader of all the\nprocesses in the application. I/O is forwarded to the previous group leader,\nthough, this is just a way to identify processes that belong to the application.\nUsed for example to find itself from any process, or, reciprocally, to kill them\nall when it terminates.\n\nThe application master starts the application by calling the application\ncallback function [`Module:start/2`](`c:start/2`) as defined by the application\nspecification key `mod`.\n\nArgument `Type` specifies the type of the application. If omitted, it defaults\nto `temporary`.\n\n- If a permanent application terminates, all other applications and the entire\n Erlang node are also terminated.\n- If a transient application terminates:\n - with `Reason == normal`, this is reported but no other applications are\n terminated.\n - abnormally, all other applications and the entire Erlang node are also\n terminated.\n- If a temporary application terminates, this is reported but no other\n applications are terminated.\n\nNotice that an application can always be stopped explicitly by calling\n[`stop/1`](`stop/1`). Regardless of the type of the application, no other\napplications are affected.\n\nNotice also that the transient type is of little practical use, because when a\nsupervision tree terminates, the reason is set to `shutdown`, not `normal`.","title":"application.start/2","ref":"application.html#start/2"},{"type":"callback","doc":"This function is called whenever an application is started using `start/1,2`,\nand is to start the processes of the application. If the application is\nstructured according to the OTP design principles as a supervision tree, this\nmeans starting the top supervisor of the tree.\n\n`StartType`{: #start_type } defines the type of start:\n\n- `normal` if it is a normal startup.\n- `normal` also if the application is distributed and started at the current\n node because of a failover from another node, and the application\n specification key `start_phases == undefined`.\n- `{takeover,Node}` if the application is distributed and started at the current\n node because of a takeover from `Node`, either because\n [`takeover/2`](`takeover/2`) has been called or because the current node has\n higher priority than `Node`.\n- `{failover,Node}` if the application is distributed and started at the current\n node because of a failover from `Node`, and the application specification key\n `start_phases /= undefined`.\n\n`StartArgs` is the `StartArgs` argument defined by the application specification\nkey `mod`.\n\nThe function is to return `{ok,Pid}` or `{ok,Pid,State}`, where `Pid` is the pid\nof the top supervisor and `State` is any term. If omitted, `State` defaults to\n`[]`. If the application is stopped later, `State` is passed to\n[`Module:prep_stop/1`](`c:prep_stop/1`).","title":"application.start/2","ref":"application.html#c:start/2"},{"type":"callback","doc":"Starts an application with included applications, when synchronization is needed\nbetween processes in the different applications during startup.\n\nThe start phases are defined by the application specification key\n`start_phases == [{Phase,PhaseArgs}]`. For included applications, the set of\nphases must be a subset of the set of phases defined for the including\napplication.\n\nThe function is called for each start phase (as defined for the primary\napplication) for the primary application and all included applications, for\nwhich the start phase is defined.\n\nFor a description of `StartType`, see [`Module:start/2`](`c:start/2`).","title":"application.start_phase/3","ref":"application.html#c:start_phase/3"},{"type":"function","doc":"This function is intended to be called by a process belonging to an application,\nwhen the application is started, to determine the start type, which is\n`StartType` or `local`.\n\nFor a description of `StartType`, see\n[`Module:start/2`](`m:application#start_type`).\n\n`local` is returned if only parts of the application are restarted (by a\nsupervisor), or if the function is called outside a startup.\n\nIf the process executing the call does not belong to any application, the\nfunction returns `undefined`.","title":"application.start_type/0","ref":"application.html#start_type/0"},{"type":"function","doc":"Stops `Application`. The application master calls\n[`Module:prep_stop/1`](`c:prep_stop/1`), if such a function is defined, and then\ntells the top supervisor of the application to shut down (see `m:supervisor`).\n\nThis means that the entire supervision tree, including included applications, is\nterminated in reversed start order. After the shutdown, the application master\ncalls [`Module:stop/1`](`c:stop/1`). `Module` is the callback module as defined\nby the application specification key `mod`.\n\nLast, the application master terminates. Notice that all processes with the\napplication master as group leader, that is, processes spawned from a process\nbelonging to the application, are also terminated.\n\nWhen stopped, the application is still loaded.\n\nTo stop a distributed application, [`stop/1`](`stop/1`) must be called on all\nnodes where it can execute (that is, on all nodes where it has been started).\nThe call to [`stop/1`](`stop/1`) on the node where the application currently\nexecutes stops its execution. The application is not moved between nodes, as\n[`stop/1`](`stop/1`) is called on the node where the application currently\nexecutes before [`stop/1`](`stop/1`) is called on the other nodes.","title":"application.stop/1","ref":"application.html#stop/1"},{"type":"callback","doc":"This function is called whenever an application has stopped. It is intended to\nbe the opposite of [`Module:start/2`](`c:start/2`) and is to do any necessary\ncleaning up. The return value is ignored.\n\n`State` is the return value of [`Module:prep_stop/1`](`c:prep_stop/1`), if such\na function exists. Otherwise `State` is taken from the return value of\n[`Module:start/2`](`c:start/2`).","title":"application.stop/1","ref":"application.html#c:stop/1"},{"type":"function","doc":"Takes over the distributed application `Application`, which executes at another\nnode `Node`.\n\nAt the current node, the application is restarted by calling\n[`Module:start({takeover,Node},StartArgs)`](`c:start/2`). `Module` and\n`StartArgs` are retrieved from the loaded application specification. The\napplication at the other node is not stopped until the startup is completed,\nthat is, when [`Module:start/2`](`c:start/2`) and any calls to\n[`Module:start_phase/3`](`c:start_phase/3`) have returned.\n\nThus, two instances of the application run simultaneously during the takeover,\nso that data can be transferred from the old to the new instance. If this is not\nan acceptable behavior, parts of the old instance can be shut down when the new\ninstance is started. However, the application cannot be stopped entirely, at\nleast the top supervisor must remain alive.\n\nFor a description of `Type`, see [`start/1,2`](`start/1`).","title":"application.takeover/2","ref":"application.html#takeover/2"},{"type":"function","doc":"Unloads the application specification for `Application` from the application\ncontroller. It also unloads the application specifications for any included\napplications. Notice that the function does not purge the Erlang object code.","title":"application.unload/1","ref":"application.html#unload/1"},{"type":"function","doc":"","title":"application.unset_env/2","ref":"application.html#unset_env/2"},{"type":"function","doc":"Removes the configuration parameter `Par` and its value for `Application`.\n\n[`unset_env/3`](`unset_env/3`) uses the standard `gen_server` time-out value\n(5000 ms). Option `timeout` can be specified if another time-out value is\nuseful, for example, in situations where the application controller is heavily\nloaded.\n\n[`unset_env/3`](`unset_env/3`) also allows the persistent option to be passed\n(see `set_env/4`).\n\n> #### Warning {: .warning }\n>\n> Use this function only if you know what you are doing, that is, on your own\n> applications. It is very application-dependent and configuration\n> parameter-dependent when and how often the value is read by the application.\n> Careless use of this function can put the application in a weird,\n> inconsistent, and malfunctioning state.","title":"application.unset_env/3","ref":"application.html#unset_env/3"},{"type":"function","doc":"","title":"application.which_applications/0","ref":"application.html#which_applications/0"},{"type":"function","doc":"Returns a list with information about the applications that are currently\nrunning.\n\n`Application` is the application name. `Description` and `Vsn` are the\nvalues of their `description` and `vsn` application specification keys,\nrespectively.\n\nA `Timeout` argument can be specified in situations where the application\ncontroller is heavily loaded.","title":"application.which_applications/1","ref":"application.html#which_applications/1"},{"type":"type","doc":"The built-in options available to an application.\n\nSee [app](app.md) for descriptions of the options.","title":"application.application_opt/0","ref":"application.html#t:application_opt/0"},{"type":"type","doc":"An application specification.","title":"application.application_spec/0","ref":"application.html#t:application_spec/0"},{"type":"type","doc":"The type of restart behaviour an application should have.","title":"application.restart_type/0","ref":"application.html#t:restart_type/0"},{"type":"type","doc":"The reason for the application to be started on the current node.","title":"application.start_type/0","ref":"application.html#t:start_type/0"},{"type":"type","doc":"A tuple where the elements are of type `T`.","title":"application.tuple_of/1","ref":"application.html#t:tuple_of/1"},{"type":"module","doc":"Interface to the Erlang code server process.\n\nThis module contains the interface to the Erlang _code server_, which deals with\nthe loading of compiled code into a running Erlang runtime system.\n\nThe runtime system can be started in _interactive_ or _embedded_ mode. Which one\nis decided by the command-line flag `-mode`:\n\n```bash\n% erl -mode embedded\n```\n\nThe modes are as follows:\n\n- In _interactive_ mode, which is default, only the modules needed by\n the runtime system are loaded during system startup. Other code is\n dynamically loaded when first referenced. When a call to a function\n in a certain module is made, and that module is not loaded, the code\n server searches for and tries to load that module.\n\n- In _embedded_ mode, modules are not auto-loaded. Trying to use a\n module that has not been loaded results in an error. This mode is\n recommended when the boot script loads all modules, as it is\n typically done in OTP releases. (Code can still be loaded later by\n explicitly ordering the code server to do so).\n\nTo prevent accidentally reloading of modules affecting the Erlang runtime\nsystem, directories `kernel`, `stdlib`, and `compiler` are considered _sticky_.\nThis means that the system issues a warning and rejects the request if a user\ntries to reload a module residing in any of them. The feature can be disabled by\nusing command-line flag `-nostick`.","title":"code","ref":"code.html"},{"type":"module","doc":"In interactive mode, the code server maintains a _code path_,\nconsisting of a list of directories, which it searches sequentially\nwhen trying to load a module.\n\nInitially, the code path consists of the current working directory and all\nErlang object code directories under library directory `$OTPROOT/lib`, where\n`$OTPROOT` is the installation directory of Erlang/OTP, `code:root_dir()`.\nDirectories can be named `Name[-Vsn]` and the code server, by default, chooses\nthe directory with the highest version number among those having the same\n`Name`. Suffix `-Vsn` is optional. If an `ebin` directory exists under\n`Name[-Vsn]`, this directory is added to the code path.\n\nEnvironment variable `ERL_LIBS` (defined in the operating system) can be used to\ndefine more library directories to be handled in the same way as the standard\nOTP library directory described above, except that directories without an `ebin`\ndirectory are ignored.\n\nAll application directories found in the additional directories appear before\nthe standard OTP applications, except for the Kernel and STDLIB applications,\nwhich are placed before any additional applications. In other words, modules\nfound in any of the additional library directories override modules with the\nsame name in OTP, except for modules in Kernel and STDLIB.\n\nEnvironment variable `ERL_LIBS` (if defined) is to contain a colon-separated\n(for Unix-like systems) or semicolon-separated (for Windows) list of additional\nlibraries.\n\n_Example:_\n\nOn a Unix-like system, `ERL_LIBS` can be set to the following:\n\n```text\n/usr/local/jungerl:/home/some_user/my_erlang_lib\n```\n\nThe code paths specified by `$OTPROOT`, `ERL_LIBS`, and boot scripts have their\nlistings cached by default (except for `\".\"`) The code server will\nlookup the contents in their directories once and avoid future file system\ntraversals. Therefore, modules added to such directories after the Erlang VM\nboots will not be picked up. This behaviour can be disabled by setting\n`-cache_boot_paths false` or by calling `code:set_path(code:get_path())`.\n\n> #### Change {: .info }\n>\n> The support for caching directories in the code path was added\n> in Erlang/OTP 26.\n\nDirectories given by the command line options `-pa` and `-pz` are not\ncached by default. Many of the functions that manipulate the code path\naccept the `cache` atom as an optional argument to enable caching\nselectively.","title":"Code Path - code","ref":"code.html#module-code-path"},{"type":"module","doc":"> #### Change {: .info }\n>\n> The existing experimental support for archive files will be changed\n> in a future release. As of Erlang/OTP 27, the function `code:lib_dir/2`,\n> the `-code_path_choice` flag, and using `m:erl_prim_loader` for\n> reading files from an archive are deprecated.\n>\n> `escript` scripts that use archive files should use\n> `escript:extract/2` to read data files from its archive instead of using\n> `code:lib_dir/2` and `m:erl_prim_loader`.\n\nThe Erlang archives are `ZIP` files with extension `.ez`. Erlang archives can\nalso be [enclosed in `escript`](`m:escript`) files whose file extension is arbitrary.\n\nErlang archive files can contain entire Erlang applications or parts of\napplications. The structure in an archive file is the same as the directory\nstructure for an application. If you, for example, create an archive of\n`mnesia-4.4.7`, the archive file must be named `mnesia-4.4.7.ez` and it must\ncontain a top directory named `mnesia-4.4.7`. If the version part of the name is\nomitted, it must also be omitted in the archive. That is, a `mnesia.ez` archive\nmust contain a `mnesia` top directory.\n\nAn archive file for an application can, for example, be created like this:\n\n```erlang\nzip:create(\"mnesia-4.4.7.ez\",\n\t[\"mnesia-4.4.7\"],\n\t[{cwd, code:lib_dir()},\n\t {compress, all},\n\t {uncompress,[\".beam\",\".app\"]}]).\n```\n\nAny file in the archive can be compressed, but to speed up the access of\nfrequently read files, it can be a good idea to store `beam` and `app` files\nuncompressed in the archive.\n\nNormally the top directory of an application is located in library directory\n`$OTPROOT/lib` or in a directory referred to by environment variable `ERL_LIBS`.\nAt startup, when the initial code path is computed, the code server also looks\nfor archive files in these directories and possibly adds `ebin` directories in\narchives to the code path. The code path then contains paths to directories that\nlook like `$OTPROOT/lib/mnesia.ez/mnesia/ebin` or\n`$OTPROOT/lib/mnesia-4.4.7.ez/mnesia-4.4.7/ebin`.\n\nThe code server uses module `erl_prim_loader` in ERTS (possibly through\n`erl_boot_server`) to read code files from archives. However, the functions in\n`erl_prim_loader` can also be used by other applications to read files from\narchives. For example, the call\n`erl_prim_loader:list_dir( \"/otp/root/lib/mnesia-4.4.7.ez/mnesia-4.4.7/examples/bench)\"`\nwould list the contents of a directory inside an archive. See\n`m:erl_prim_loader`.\n\nAn application archive file and a regular application directory can coexist.\nThis can be useful when it is needed to have parts of the application as regular\nfiles. A typical case is the `priv` directory, which must reside as a regular\ndirectory to link in drivers dynamically and start port programs. For other\napplications that do not need this, directory `priv` can reside in the archive\nand the files under the directory `priv` can be read through `erl_prim_loader`.\n\nWhen a directory is added to the code path and when the entire code path is\n(re)set, the code server decides which subdirectories in an application that are\nto be read from the archive and which that are to be read as regular files. If\ndirectories are added or removed afterwards, the file access can fail if the\ncode path is not updated (possibly to the same path as before, to trigger the\ndirectory resolution update).\n\nFor each directory on the second level in the application archive (`ebin`,\n`priv`, `src`, and so on), the code server first chooses the regular directory\nif it exists and second from the archive. Function `code:lib_dir/2` returns the\npath to the subdirectory. For example, `code:lib_dir(megaco, ebin)` can return\n`/otp/root/lib/megaco-3.9.1.1.ez/megaco-3.9.1.1/ebin` while\n`code:lib_dir(megaco, priv)` can return `/otp/root/lib/megaco-3.9.1.1/priv`.\n\nWhen an `escript` file contains an archive, there are no restrictions on the\nname of the `escript` and no restrictions on how many applications that can be\nstored in the embedded archive. Single Beam files can also reside on the top\nlevel in the archive. At startup, the top directory in the embedded archive and\nall (second level) `ebin` directories in the embedded archive are added to the\ncode path. See [`escript`](`e:erts:escript_cmd.md`).\n\nA future-proof way for `escript` scripts to read data files from the archive is\nto use the `escript:extract/2` function.\n\nWhen the choice of directories in the code path is `strict` (which is\nthe default as of Erlang/OTP 27), the directory that ends up in the\ncode path is exactly the stated one. This means that if, for example,\nthe directory `$OTPROOT/lib/mnesia-4.4.7/ebin` is explicitly added to\nthe code path, the code server does not load files from\n`$OTPROOT/lib/mnesia-4.4.7.ez/mnesia-4.4.7/ebin`.\n\nThis behavior can be controlled through command-line flag\n`-code_path_choice Choice`. If the flag is set to `relaxed`, the code server\ninstead chooses a suitable directory depending on the actual file structure. If\na regular application `ebin` directory exists, it is chosen. Otherwise, the\ndirectory `ebin` in the archive is chosen if it exists. If neither of them\nexists, the original directory is chosen.\n\nCommand-line flag `-code_path_choice Choice` also affects how module `init`\ninterprets the `boot script`. The interpretation of the explicit code paths in\nthe `boot script` can be `strict` or `relaxed`. It is particularly useful to set\nthe flag to `relaxed` when elaborating with code loading from archives without\nediting the `boot script`. The default has changed to `strict` in OTP 27 and the\noption is scheduled for removal in OTP 28. See module `m:init` in the\nErts application.","title":"Loading of Code From Archive Files - code","ref":"code.html#module-loading-of-code-from-archive-files"},{"type":"module","doc":"The code for a module can exist in two variants in a system: _current code_ and\n_old code_. When a module is loaded into the system for the first time, the\nmodule code becomes *current* and the global _export table_ is updated with\nreferences to all functions exported from the module.\n\nWhen a new instance of the module is loaded, the code of the previous\ninstance becomes *old*, and all export entries referring to the\nprevious instance are removed. After that, the new instance is loaded\nas for the first time, and becomes current.\n\nBoth old and current code for a module are valid, and can even be executed\nconcurrently. The difference is that exported functions in old code are\nunavailable. Hence, a global call cannot be made to an exported function in old\ncode, but old code can still be executed because of processes lingering in it.\n\nIf a third instance of the module is loaded, the code server removes (purges)\nthe old code and any processes lingering in it are terminated. Then the third\ninstance becomes current and the previously current code becomes old.\n\nFor more information about old and current code, and how to make a process\nswitch from old to current code, see section Compilation and Code Loading in the\n[Erlang Reference Manual](`e:system:code_loading.md`).","title":"Current and Old Code - code","ref":"code.html#module-current-and-old-code"},{"type":"module","doc":"In runtime systems that use the JIT, native coverage is a light-weight\nway to find out which functions or lines that have been executed, or\nhow many times each function or line has been executed.\n\n> #### Change {: .info }\n>\n> The support for native coverage was added in Erlang/OTP 27.\n\nNative coverage works by instrumenting code at load-time. When a\nmodule has been instrumented for native coverage collection it is not\npossible to later disable the coverage collection, except by reloading\nthe module. However, the overhead for keeping coverage collection\nrunning is often neligible, especially for [coverage\nmode](`t:coverage_mode/0`) `function` that only keeps track of which\nfunctions that have been executed.\n\nThe `m:cover` tool in the Tools application will automatically use the\nnative coverage support if the runtime system supports it.\n\nIt is only necessary to use the functionality described next if\n`m:cover` is not sufficient, for example:\n\n* If one wants to collect coverage information for the code that runs\n when the runtime system is starting (module `m:init` and so on).\n `m:cover` can only be used when the Erlang system has started, and\n it will reload every module that is to be analyzed.\n\n* If it is necessary to collect coverage information with the absolute\n minimum disturbance of the test system. `m:cover` always counts how\n many times each line is executed (coverage mode `line_counters`),\n but by using native coverage one can use a less expensive coverage\n mode such as `function`, which has almost negligible overhead.","title":"Native Coverage Support - code","ref":"code.html#module-native-coverage-support"},{"type":"module","doc":"If the `line` or `line_counters` coverage mode is to be used,\nthe code to be tested must be compiled with option\n[`line_coverage`](`e:compiler:compile#line_coverage`).\n\nUse [set_coverage_mode(Mode)](`set_coverage_mode/1`) to set a\n[coverage mode](`t:coverage_mode/0`) for all code subsequently\nloaded, or set it with option [\\+JPcover](`e:erts:erl_cmd.md#%2BJPcover`)\nfor `erl`.\n\nOptionally reset coverage information for all\nmodules that are to be tested by calling\n[reset_coverage(Module)](`reset_coverage/1`).\n\nRun the code whose coverage information is to be collected.\n\nRead out the counters for all interesting modules by calling\n[get_coverage(Level, Module)](`get_coverage/2`), where `Level`\nis either `function` or `line`.","title":"Short summary of using native coverage - code","ref":"code.html#module-short-summary-of-using-native-coverage"},{"type":"module","doc":"The following BIFs are sometimes useful, for example to fail gracefully\nif the runtime system does not support native coverage:\n\n* [coverage_support()](`coverage_support/0`) - check whether\n the runtime system supports native coverage\n\n* [get_coverage_mode()](`get_coverage_mode/0`) - get the current\n coverage mode\n\n* [get_coverage_mode(Module)](`get_coverage_mode/1`) - get the coverage\n mode for module `Module`","title":"The other native coverage BIFs - code","ref":"code.html#module-the-other-native-coverage-bifs"},{"type":"module","doc":"Module and application names are atoms, while file and directory names are\nstrings. For backward compatibility reasons, some functions accept both strings\nand atoms, but a future release will probably only allow the arguments that are\ndocumented.\n\nFunctions in this module generally fail with an exception if they are passed an\nincorrect type (for example, an integer or a tuple where an atom is expected).\nAn error tuple is returned if the argument type is correct, but there are some\nother errors (for example, a non-existing directory is specified to\n[`set_path/1`](`set_path/1`)).\n\n[](){: #error_reasons }","title":"Argument Types and Invalid Arguments - code","ref":"code.html#module-argument-types-and-invalid-arguments"},{"type":"module","doc":"Functions that load code (such as [`load_file/1`](`load_file/1`)) will return\n`{error,Reason}` if the load operation fails. Here follows a description of the\ncommon reasons.\n\n- **`badfile`** - The object code has an incorrect format or the module name in\n the object code is not the expected module name.\n\n- **`nofile`** - No file with object code was found.\n\n- **`not_purged`** - The object code could not be loaded because an old version\n of the code already existed.\n\n- **`on_load_failure`** - The module has an\n [\\-on_load function](`e:system:code_loading.md#on_load`) that failed when it\n was called.\n\n- **`sticky_directory`** - The object code resides in a sticky directory.","title":"Error Reasons for Code-Loading Functions - code","ref":"code.html#module-error-reasons-for-code-loading-functions"},{"type":"function","doc":"","title":"code.add_path/1","ref":"code.html#add_path/1"},{"type":"function","doc":"","title":"code.add_path/2","ref":"code.html#add_path/2"},{"type":"function","doc":"","title":"code.add_patha/1","ref":"code.html#add_patha/1"},{"type":"function","doc":"Adds `Dir` to the beginning of the code path.\n\nIf `Dir` exists, it is removed from the old position in the code path.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns `true` if successful, or `{error, bad_directory}` if `Dir` is\nnot the name of a directory.","title":"code.add_patha/2","ref":"code.html#add_patha/2"},{"type":"function","doc":"","title":"code.add_paths/1","ref":"code.html#add_paths/1"},{"type":"function","doc":"","title":"code.add_paths/2","ref":"code.html#add_paths/2"},{"type":"function","doc":"","title":"code.add_pathsa/1","ref":"code.html#add_pathsa/1"},{"type":"function","doc":"Traverses `Dirs` and adds each `Dir` to the beginning of the code path.\n\nThis means that the order of `Dirs` is reversed in the resulting code\npath. For example, if `Dirs` is `[Dir1,Dir2]`, the resulting path will\nbe `[Dir2,Dir1|OldCodePath]`.\n\nIf a `Dir` already exists in the code path, it is removed from the old position.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nAlways returns `ok`, regardless of the validity of each individual `Dir`.","title":"code.add_pathsa/2","ref":"code.html#add_pathsa/2"},{"type":"function","doc":"","title":"code.add_pathsz/1","ref":"code.html#add_pathsz/1"},{"type":"function","doc":"Adds the directories in `Dirs` to the end of the code path.\n\nDirectories that are already present in the path will not be added.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nAlways returns `ok`, regardless of the validity of each individual `Dir`.","title":"code.add_pathsz/2","ref":"code.html#add_pathsz/2"},{"type":"function","doc":"","title":"code.add_pathz/1","ref":"code.html#add_pathz/1"},{"type":"function","doc":"Adds `Dir` as the directory last in the code path.\n\nIf `Dir` already exists in the path, it is not added.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns `true` if successful, or `{error, bad_directory}` if `Dir` is\nnot the name of a directory.","title":"code.add_pathz/2","ref":"code.html#add_pathz/2"},{"type":"function","doc":"Returns a list of tuples `{Module, Filename, Loaded}` for all available modules.\n\nA module is considered to be available if it either is loaded or would be loaded\nif called. `Filename` is normally the absolute filename, as described for\n`is_loaded/1`.","title":"code.all_available/0","ref":"code.html#all_available/0"},{"type":"function","doc":"Returns a list of tuples `{Module, Loaded}` for all loaded modules.\n\n`Loaded` is normally the absolute filename, as described for `is_loaded/1`.","title":"code.all_loaded/0","ref":"code.html#all_loaded/0"},{"type":"function","doc":"Tries to load all of the modules in the list `Modules` atomically.\n\nThat means that either all modules are loaded at the same time, or\nnone of the modules are loaded if there is a problem with any of the\nmodules.\n\nLoading can fail for one the following reasons:\n\n- **`badfile`** - The object code has an incorrect format or the module name in\n the object code is not the expected module name.\n\n- **`nofile`** - No file with object code exists.\n\n- **`on_load_not_allowed`** - A module contains an\n [\\-on_load function](`e:system:code_loading.md#on_load`).\n\n- **`duplicated`** - A module is included more than once in `Modules`.\n\n- **`not_purged`** - The object code cannot be loaded because an old version of\n the code already exists.\n\n- **`sticky_directory`** - The object code resides in a sticky directory.\n\n- **`pending_on_load`** - A previously loaded module contains an `-on_load`\n function that never finished.\n\nIf it is important to minimize the time that an application is inactive while\nchanging code, use `prepare_loading/1` and `finish_loading/1` instead of\n[`atomic_load/1`](`atomic_load/1`). Here is an example:\n\n```erlang\n{ok,Prepared} = code:prepare_loading(Modules),\n%% Put the application into an inactive state or do any\n%% other preparation needed before changing the code.\nok = code:finish_loading(Prepared),\n%% Resume the application.\n```","title":"code.atomic_load/1","ref":"code.html#atomic_load/1"},{"type":"function","doc":"Searches all directories in the code path for module names with identical names\nand writes a report to `stdout`.","title":"code.clash/0","ref":"code.html#clash/0"},{"type":"function","doc":"Clears the code path cache.\n\nIf a directory is cached, its cache is cleared once and then it will\nbe recalculated and cached once more in a future traversal.\n\nTo clear the cache for a single path, either re-add it to the code\npath (with [`add_path/2`](`add_path/2`)) or replace it (with\n[`replace_path/3`](`replace_path/3`)). To disable all caching, reset\nthe code path with `code:set_path(code:get_path())`.\n\nAlways returns `ok`.","title":"code.clear_cache/0","ref":"code.html#clear_cache/0"},{"type":"function","doc":"Returns the compiler library directory.\n\nEquivalent to [`code:lib_dir(compiler)`](`code:lib_dir/1`).","title":"code.compiler_dir/0","ref":"code.html#compiler_dir/0"},{"type":"function","doc":"Returns `true` if the system supports coverage and `false` otherwise.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","title":"code.coverage_support/0","ref":"code.html#coverage_support/0"},{"type":"function","doc":"Deletes a directory from the code path.\n\nThe argument can be an atom `Name`, in which case the directory with\nthe name `.../Name[-Vsn][/ebin]` is deleted from the code path. Also,\nthe complete directory name `Dir` can be specified as argument.\n\nReturns:\n\n- **`true`** - If successful\n\n- **`false`** - If the directory is not found\n\n- **`{error, bad_name}`** - If the argument is invalid","title":"code.del_path/1","ref":"code.html#del_path/1"},{"type":"function","doc":"Deletes directories from the code path.\n\nThe argument is a list of either atoms or complete directory names. If\n`Name` is an atom, the directory with the name `.../Name[-Vsn][/ebin]` is\ndeleted from the code path.\n\nAlways returns `ok`, regardless of the validity of each individual\n`NamesOrDirs`.","title":"code.del_paths/1","ref":"code.html#del_paths/1"},{"type":"function","doc":"Removes the current code for `Module`, that is, the current code for `Module` is\nmade old.\n\nThis means that processes can continue to execute the code in the\nmodule, but no external function calls can be made to it.\n\nReturns `true` if successful, or `false` if there is old code for `Module` that\nmust be purged first, or if `Module` is not a (loaded) module.","title":"code.delete/1","ref":"code.html#delete/1"},{"type":"function","doc":"Tries to load a module in the same way as `load_file/1`, unless the module is\nalready loaded.\n\nIf called concurrently, this function ensures that only one process\nattempts to load said module at a given time.\n\nIn embedded mode, it does not load a module that is not already loaded, but\nreturns `{error, embedded}` instead. See\n[Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of other possible error reasons.","title":"code.ensure_loaded/1","ref":"code.html#ensure_loaded/1"},{"type":"function","doc":"Tries to load any modules not already loaded in the list `Modules` in the same\nway as `load_file/1`.\n\nUnlike `ensure_loaded/1`, modules are loaded even in `embedded` mode.\n\nReturns `ok` if successful, or `{error,[{Module,Reason}]}` if loading of some\nmodules fails. See\n[Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of other possible error reasons.","title":"code.ensure_modules_loaded/1","ref":"code.html#ensure_modules_loaded/1"},{"type":"function","doc":"Tries to load code for all modules that have been previously prepared by\n`prepare_loading/1`.\n\nThe loading occurs atomically, meaning that either all modules are\nloaded at the same time, or none of the modules are loaded.\n\nThis function can fail with one of the following error reasons:\n\n- **`not_purged`** - The object code cannot be loaded because an old version of\n the code already exists.\n\n- **`sticky_directory`** - The object code resides in a sticky directory.\n\n- **`pending_on_load`** - A previously loaded module contains an `-on_load`\n function that never finished.","title":"code.finish_loading/1","ref":"code.html#finish_loading/1"},{"type":"function","doc":"Return either `function` or `line` coverage data for module `Module`.\n\nIf Level is `function`, returns function coverage for the given module\naccording to its [coverage mode](`t:coverage_mode/0`):\n\n- **`function`** - For each function in module Module, a boolean indicating\n whether that function has been executed at least once is returned.\n\n- **`function_counters`** - For each function in module Module, an integer\n giving the number of times that line has been executed is returned.\n\n- **`line`** - For each function in module Module, a boolean indicating whether\n that function has been executed at least once is returned.\n\n- **`line_counters`** - For each function in module Module, a boolean indicating\n whether that function has been executed at least once is returned (note that\n in this mode, counters for the number of times each function has been executed\n **cannot** be retrieved).\n\nIf Level is `line`, returns line coverage for the given module according to its\ncoverage mode:\n\n- **`line`** - For each executable line in the module, a boolean indicating\n whether that line has been executed at least once is returned.\n\n- **`line_counters`** - For each executable line in the module, an integer\n giving the number of times that line was executed is returned.\n\nLevel `cover_id_line` is used by the `m:cover` tool.\n\nFailures:\n\n- **`badarg`** - If `Level` is not `function` or `line`.\n\n- **`badarg`** - If `Module` is not an atom.\n\n- **`badarg`** - If `Module` does not refer to a loaded module.\n\n- **`badarg`** - If `Module` was not loaded in another coverage mode than\n `none`.\n\n- **`badarg`** - If Level is `line` and `Module` has not been loaded with either\n `line` or `line_counters` enabled.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","title":"code.get_coverage/2","ref":"code.html#get_coverage/2"},{"type":"function","doc":"Returns the coverage mode as set by option\n[\\+JPcover](`e:erts:erl_cmd.md#%2BJPcover`) for `erl` or `set_coverage_mode/1`.\n\nFailure:\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","title":"code.get_coverage_mode/0","ref":"code.html#get_coverage_mode/0"},{"type":"function","doc":"Get coverage mode for the given module.\n\nFailures:\n\n- **`badarg`** - If `Module` is not an atom.\n\n- **`badarg`** - If `Module` does not refer to a loaded module.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","title":"code.get_coverage_mode/1","ref":"code.html#get_coverage_mode/1"},{"type":"function","doc":"Returns [EEP 48](https://www.erlang.org/eeps/eep-0048.html) style\ndocumentation for `Module` if available.\n\nIf `Module` is not found in the code path, this function returns\n`{error,non_existing}`.\n\nIf no documentation can be found this function attempts to generate\ndocumentation from the debug information in the module. If no debug\ninformation is available, this function returns `{error,missing}`.\n\nFor more information about the documentation chunk see\n[Documentation Storage and Format](eep48_chapter.md) in\nKernel's User's Guide.","title":"code.get_doc/1","ref":"code.html#get_doc/1"},{"type":"function","doc":"Returns an atom describing the mode of the code server: `interactive` or\n`embedded`.\n\nThis information is useful when an external entity (for example, an IDE)\nprovides additional code for a running node. If the code server is in\ninteractive mode, it only has to add the path to the code. If the code server is\nin embedded mode, the code must be loaded with `load_binary/3`.","title":"code.get_mode/0","ref":"code.html#get_mode/0"},{"type":"function","doc":"Returns the object code for module `Module` if found in the code path.\n\nReturns `{Module, Binary, Filename}` if successful, otherwise\n`error`. `Binary` is a binary data object, which contains the object\ncode for the module. This is useful if code is to be loaded on a\nremote node in a distributed system. For example, loading module\n`Module` on a node `Node` is done as follows:\n\n```erlang\n...\n{_Module, Binary, Filename} = code:get_object_code(Module),\nerpc:call(Node, code, load_binary, [Module, Filename, Binary]),\n...\n```","title":"code.get_object_code/1","ref":"code.html#get_object_code/1"},{"type":"function","doc":"Returns the code path.","title":"code.get_path/0","ref":"code.html#get_path/0"},{"type":"function","doc":"Checks whether `Module` is loaded.\n\nIf it is, `{file, Loaded}` is returned, otherwise `false`.\n\nNormally, `Loaded` is the absolute filename `Filename` from which the code is\nobtained. If the module is preloaded (see [`script(4)`](`e:sasl:script.md`)),\n`Loaded =:= preloaded`. If the module is Cover-compiled (see `m:cover`),\n`Loaded =:= cover_compiled`.","title":"code.is_loaded/1","ref":"code.html#is_loaded/1"},{"type":"function","doc":"Returns `true` if `Module` is the name of a module that has been loaded from a\nsticky directory (in other words: an attempt to reload the module will fail), or\n`false` if `Module` is not a loaded module or is not sticky.","title":"code.is_sticky/1","ref":"code.html#is_sticky/1"},{"type":"function","doc":"Returns the library directory, `$OTPROOT/lib`, where `$OTPROOT` is the root\ndirectory of Erlang/OTP.\n\n_Example:_\n\n```erlang\n1> code:lib_dir().\n\"/usr/local/otp/lib\"\n```","title":"code.lib_dir/0","ref":"code.html#lib_dir/0"},{"type":"function","doc":"Returns the path for the *library directory*, the top directory, for an\napplication `Name` located under `$OTPROOT/lib` or in a directory referred to\nwith environment variable `ERL_LIBS`.\n\nIf a regular directory called `Name` or `Name-Vsn` exists in the code path with\nan `ebin` subdirectory, the path to this directory is returned (not the `ebin`\ndirectory).\n\nIf the directory refers to a directory in an archive, the archive name is\nstripped away before the path is returned. For example, if directory\n`/usr/local/otp/lib/mnesia-4.2.2.ez/mnesia-4.2.2/ebin` is in the path,\n`/usr/local/otp/lib/mnesia-4.2.2/ebin` is returned. This means that the library\ndirectory for an application is the same, regardless if the application resides\nin an archive or not.\n\n> #### Warning {: .info }\n>\n> Archives are experimental. In a future release, they can be removed or\n> their behavior can change.\n\n_Example:_\n\n```erlang\n> code:lib_dir(mnesia).\n\"/usr/local/otp/lib/mnesia-4.23\"\n```\n\nReturns `{error, bad_name}` if `Name` is not the name of an application under\n`$OTPROOT/lib` or on a directory referred to through environment variable\n`ERL_LIBS`. Fails with an exception if `Name` has the wrong type.\n\n> #### Warning {: .warning }\n>\n> For backward compatibility, `Name` is also allowed to be a string. That will\n> probably change in a future release.","title":"code.lib_dir/1","ref":"code.html#lib_dir/1"},{"type":"function","doc":"Returns the path to a subdirectory directly under the top directory of an\napplication.\n\n> #### Change {: .info }\n>\n> This function is part of the archive support, which is an experimental\n> feature that will be changed or removed in a future release.\n\nNormally the subdirectories reside under the top directory for the\napplication, but when applications at least partly reside in an archive, the\nsituation is different. Some of the subdirectories can reside as regular\ndirectories while others reside in an archive file. It is not checked whether\nthis directory exists.\n\nInstead of using this function, use [`code:lib_dir/1`](`code:lib_dir/1`)\nand `filename:join/2`.\n\n_Example:_\n\n```erlang\n1> filename:join(code:lib_dir(megaco), \"priv\").\n\"/usr/local/otp/lib/megaco-3.9.1.1/priv\"\n```\n\nFails with an exception if `Name` or `SubDir` has the wrong type.","title":"code.lib_dir/2","ref":"code.html#lib_dir/2"},{"type":"function","doc":"Equivalent to [`load_file(Module)`](`load_file/1`), except that `Filename` is\nan absolute or relative filename.\n\nThe code path is not searched. It returns a value in the same way as\n`load_file/1`. Notice that `Filename` must not contain the extension\n(for example, `.beam`) because [`load_abs/1`](`load_abs/1`) adds the\ncorrect extension.","title":"code.load_abs/1","ref":"code.html#load_abs/1"},{"type":"function","doc":"Loads object code from a binary.\n\nThis function can be used to load object code on remote Erlang nodes. Argument\n`Binary` must contain object code for `Module`. `Filename` is only used by the\ncode server to keep a record of from which file the object code for `Module`\noriginates. Thus, `Filename` is not opened and read by the code server.\n\nReturns `{module, Module}` if successful, or `{error, Reason}` if loading fails.\nSee [Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of the possible error reasons.","title":"code.load_binary/3","ref":"code.html#load_binary/3"},{"type":"function","doc":"Tries to load the Erlang module `Module` using the code path.\n\nIt looks for the object code file with an extension corresponding to\nthe Erlang machine used, for example, `Module.beam`. The loading fails\nif the module name found in the object code differs from the name\n`Module`. Use `load_binary/3` to load object code with a module name\nthat is different from the file name.\n\nReturns `{module, Module}` if successful, or `{error, Reason}` if loading fails.\nSee [Error Reasons for Code-Loading Functions](`m:code#error_reasons`) for a\ndescription of the possible error reasons.","title":"code.load_file/1","ref":"code.html#load_file/1"},{"type":"function","doc":"Returns the list of all currently loaded modules for which `module_status/1`\nreturns `modified`.\n\nSee also `all_loaded/0`.","title":"code.modified_modules/0","ref":"code.html#modified_modules/0"},{"type":"function","doc":"See `module_status/1` and `all_loaded/0` for details.","title":"code.module_status/0","ref":"code.html#module_status/0"},{"type":"function","doc":"Returns the status of `Module` in relation to object file on disk.\n\nThe status of a module can be one of:\n\n- **`not_loaded`** - If `Module` is not currently loaded.\n\n- **`loaded`** - If `Module` is loaded, and the object file exists and contains\n the same code.\n\n- **`removed`** - If `Module` is loaded, but no corresponding object file can be\n found in the code path.\n\n- **`modified`** - If `Module` is loaded, but the object file contains code with\n a different MD5 checksum.\n\nPreloaded modules are always reported as `loaded`, without inspecting the\ncontents on disk. Cover-compiled modules will always be reported as `modified`\nif an object file exists, or as `removed` otherwise. Modules whose load path is\nan empty string (which is the convention for auto-generated code) will only be\nreported as `loaded` or `not_loaded`.\n\nSee also `modified_modules/0`.","title":"code.module_status/1","ref":"code.html#module_status/1"},{"type":"function","doc":"Returns the object code file extension corresponding to the Erlang machine used.\n\nFor the official Erlang/OTP release, the return value is always `.beam`.","title":"code.objfile_extension/0","ref":"code.html#objfile_extension/0"},{"type":"function","doc":"Prepares to load the modules in the list `Modules`.\n\nFinish the loading by calling\n[finish_loading(Prepared)](`finish_loading/1`).\n\nThis function can fail with one of the following error reasons:\n\n- **`badfile`** - The object code has an incorrect format or the module name in\n the object code is not the expected module name.\n\n- **`nofile`** - No file with object code exists.\n\n- **`on_load_not_allowed`** - A module contains an\n [\\-on_load function](`e:system:code_loading.md#on_load`).\n\n- **`duplicated`** - A module is included more than once in `Modules`.","title":"code.prepare_loading/1","ref":"code.html#prepare_loading/1"},{"type":"function","doc":"Returns the path to the `priv` directory in an application.\n\n> #### Warning {: .warning }\n>\n> For backward compatibility, `Name` is also allowed to be a string. That will\n> probably change in a future release.","title":"code.priv_dir/1","ref":"code.html#priv_dir/1"},{"type":"function","doc":"Purges the code for `Module`, that is, removes code marked as old.\n\nIf some processes still linger in the old code, these processes are\nkilled before the code is removed.\n\n> #### Change {: .info }\n>\n> As of Erlang/OTP 20.0, a process is only considered to be lingering in the\n> code if it has direct references to the code. For more information see\n> documentation of `erlang:check_process_code/3`, which is used in order to\n> determine whether a process is lingering.\n\nReturns `true` if successful and any process is needed to be killed, otherwise\n`false`.","title":"code.purge/1","ref":"code.html#purge/1"},{"type":"function","doc":"","title":"code.replace_path/2","ref":"code.html#replace_path/2"},{"type":"function","doc":"Replaces an old occurrence of a directory named `.../Name[-Vsn][/ebin]` in the\ncode path, with `Dir`.\n\nIf `Name` does not exist, it adds the new directory `Dir` last in the\ncode path. The new directory must also be named\n`.../Name[-Vsn][/ebin]`. This function is to be used if a new version\nof the directory (library) is added to a running system.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns:\n\n- **`true`** - If successful\n\n- **`{error, bad_name}`** - If `Name` is not found\n\n- **`{error, bad_directory}`** - If `Dir` does not exist\n\n- **`{error, {badarg, [Name, Dir]}}`** - If `Name` or `Dir` is invalid","title":"code.replace_path/3","ref":"code.html#replace_path/3"},{"type":"function","doc":"Resets coverage information for module `Module`.\n\nIf the [coverage mode](`t:coverage_mode/0`) is either `function` or\n`line`, all booleans for `Module` keeping track of executed functions\nor lines are set to `false`.\n\nIf the coverage mode is either `function_counters` or\n`line_counters`, all counters for `Module` are reset to zero.\n\nFailures:\n\n- **`badarg`** - If `Module` is not an atom.\n\n- **`badarg`** - If `Module` does not refer to a loaded module.\n\n- **`badarg`** - If `Module` was not loaded with coverage enabled.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","title":"code.reset_coverage/1","ref":"code.html#reset_coverage/1"},{"type":"function","doc":"Returns the root directory of Erlang/OTP, which is the directory where it is\ninstalled.\n\n_Example:_\n\n```erlang\n1> code:root_dir().\n\"/usr/local/otp\"\n```","title":"code.root_dir/0","ref":"code.html#root_dir/0"},{"type":"function","doc":"Sets the coverage mode for modules that are subsequently loaded, similar to\noption [\\+JPcover](`e:erts:erl_cmd.md#%2BJPcover`) for `erl`.\n\nThe coverage mode will have the following effect on code that is\nloaded following this call:\n\n- **`function`** - All modules that are loaded will be instrumented to keep\n track of which functions are executed. Information about which functions that\n have been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`).\n\n- **`function_counters`** - All modules that are loaded will be instrumented to\n count how many times each function is executed. Information about how many\n times each function has been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`).\n\n- **`line`** - When modules that have been compiled with the\n [`line_coverage`](`m:compile#line_coverage`) option are loaded, they will be\n instrumented to keep track of which lines have been executed. Information\n about which lines have been executed can be retrieved by calling\n [`get_coverage(line, Module)`](`get_coverage/2`), and information about which\n functions that have been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`).\n\n- **`line_counters`** - When modules that have been compiled with the\n [`line_coverage`](`m:compile#line_coverage`) option are loaded, they will be\n instrumented to count the number of times each line is executed. Information\n about how many times each line has been executed can be retrieved by calling\n [`get_coverage(line, Module)`](`get_coverage/2`), and information about which\n functions that have been executed can be retrieved by calling\n [`get_coverage(function, Module)`](`get_coverage/2`) (note that in this mode,\n counters for the number of times each function has been executed **cannot** be\n retrieved).\n\n- **`none`** - Modules will be loaded without coverage instrumentation.\n\nReturns the previous coverage mode.\n\nFailures:\n\n- **`badarg`** - If `Mode` is not a valid coverage mode.\n\n- **`badarg`** - If the runtime system does not support coverage.\n\n_See also:_ [Native Coverage Support](#module-native-coverage-support)","title":"code.set_coverage_mode/1","ref":"code.html#set_coverage_mode/1"},{"type":"function","doc":"","title":"code.set_path/1","ref":"code.html#set_path/1"},{"type":"function","doc":"Sets the code path to the list of directories `Path`.\n\nArgument `Cache` controls whether the content of the directory\nshould be cached on first traversal. If `Cache` is `cache` the directory\ncontents will be cached; if `Cache` is `nocache` it will not be cached.\n\nReturns:\n\n- **`true`** - If successful\n\n- **`{error, bad_directory}`** - If any `Dir` is not a directory name","title":"code.set_path/2","ref":"code.html#set_path/2"},{"type":"function","doc":"Purges the code for `Module`, that is, removes code marked as old, but only if\nno processes linger in it.\n\n> #### Change {: .info }\n>\n> As of Erlang/OTP 20.0, a process is only considered to be lingering in the\n> code if it has direct references to the code. For more information see\n> documentation of `erlang:check_process_code/3`, which is used in order to\n> determine whether a process is lingering.\n\nReturns `false` if the module cannot be purged because of processes lingering in\nold code, otherwise `true`.","title":"code.soft_purge/1","ref":"code.html#soft_purge/1"},{"type":"function","doc":"Marks `Dir` as sticky.\n\nReturns `ok` if successful, otherwise `error`.","title":"code.stick_dir/1","ref":"code.html#stick_dir/1"},{"type":"function","doc":"Unsticks a directory that is marked as sticky.\n\nReturns `ok` if successful, otherwise `error`.","title":"code.unstick_dir/1","ref":"code.html#unstick_dir/1"},{"type":"function","doc":"Searches the code path for `Filename`, which is a file of arbitrary type.\n\nIf found, the full name is returned. `non_existing` is returned if the\nfile cannot be found. The function can be useful, for example, to\nlocate application resource files.","title":"code.where_is_file/1","ref":"code.html#where_is_file/1"},{"type":"function","doc":"If the module is not loaded, this function searches the code path for the first\nfile containing object code for `Module` and returns the absolute filename.\n\n- If the module is loaded, it returns the name of the file containing the loaded\n object code.\n\n- If the module is preloaded, `preloaded` is returned.\n\n- If the module is Cover-compiled, `cover_compiled` is returned.\n\n- If the module cannot be found, `non_existing` is returned.","title":"code.which/1","ref":"code.html#which/1"},{"type":"type","doc":"","title":"code.add_path_ret/0","ref":"code.html#t:add_path_ret/0"},{"type":"type","doc":"","title":"code.cache/0","ref":"code.html#t:cache/0"},{"type":"type","doc":"","title":"code.coverage_mode/0","ref":"code.html#t:coverage_mode/0"},{"type":"type","doc":"","title":"code.load_error_rsn/0","ref":"code.html#t:load_error_rsn/0"},{"type":"type","doc":"","title":"code.load_ret/0","ref":"code.html#t:load_ret/0"},{"type":"type","doc":"","title":"code.loaded_filename/0","ref":"code.html#t:loaded_filename/0"},{"type":"type","doc":"","title":"code.loaded_ret_atoms/0","ref":"code.html#t:loaded_ret_atoms/0"},{"type":"type","doc":"","title":"code.module_status/0","ref":"code.html#t:module_status/0"},{"type":"opaque","doc":"An opaque term holding prepared code.","title":"code.prepared_code/0","ref":"code.html#t:prepared_code/0"},{"type":"type","doc":"","title":"code.replace_path_ret/0","ref":"code.html#t:replace_path_ret/0"},{"type":"type","doc":"","title":"code.set_path_ret/0","ref":"code.html#t:set_path_ret/0"},{"type":"module","doc":"Dynamic driver loader and linker.\n\nThis module provides an interface for loading and unloading _Erlang linked-in\ndrivers_ in runtime.\n\n> #### Note {: .info }\n>\n> This is a large reference document. For casual use of this module, and for\n> most real world applications, the descriptions of functions `load/2` and\n> `unload/1` are enough to getting started.\n\nThe driver is to be provided as a dynamically linked library in an object code\nformat specific for the platform in use, that is, `.so` files on most Unix\nsystems and `.ddl` files on Windows. An Erlang linked-in driver must provide\nspecific interfaces to the emulator, so this module is not designed for loading\narbitrary dynamic libraries. For more information about Erlang drivers, see\n[`erl_driver`](`e:erts:erl_driver.md`) .\n\n[](){: #users }\n\nWhen describing a set of functions (that is, a module, a part of a module, or an\napplication), executing in a process and wanting to use a ddll-driver, we use\nthe term _user_. A process can have many users (different modules needing the\nsame driver) and many processes running the same code, making up many _users_ of\na driver.\n\nIn the basic scenario, each user loads the driver before starting to use it and\nunloads the driver when done. The reference counting keeps track of processes\nand the number of loads by each process. This way the driver is only unloaded\nwhen no one wants it (it has no user). The driver also keeps track of ports that\nare opened to it. This enables delay of unloading until all ports are closed, or\nkilling of all ports that use the driver when it is unloaded.\n\n[](){: #scenarios }\n\nThe interface supports two basic scenarios of loading and unloading. Each\nscenario can also have the option of either killing ports when the driver is\nunloading, or waiting for the ports to close themselves. The scenarios are as\nfollows:\n\n- **_Load and Unload on a \"When Needed Basis\"_** - This (most common) scenario\n simply supports that each [user](`m:erl_ddll#users`) of the driver loads it\n when needed and unloads it when no longer needed. The driver is always\n reference counted and as long as a process keeping the driver loaded is still\n alive, the driver is present in the system.\n\n Each [user](`m:erl_ddll#users`) of the driver use _literally_ the same\n pathname for the driver when demanding load, but the\n [users](`m:erl_ddll#users`) are not concerned with if the driver is already\n loaded from the file system or if the object code must be loaded from file\n system.\n\n The following two pairs of functions support this scenario:\n\n - **_load/2 and unload/1_** - When using the `load/unload` interfaces, the\n driver is not unloaded until the _last port_ using the driver is closed.\n Function [`unload/1`](`unload/1`) can return immediately, as the\n [users](`m:erl_ddll#users`) have no interest in when the unloading occurs.\n The driver is unloaded when no one needs it any longer.\n\n If a process having the driver loaded dies, it has the same effect as if\n unloading is done.\n\n When loading, function [`load/2`](`load/2`) returns `ok` when any instance\n of the driver is present. Thus, if a driver is waiting to get unloaded\n (because of open ports), it simply changes state to no longer need\n unloading.\n\n - **_load_driver/2 and unload_driver/1_** - These interfaces are intended to\n be used when it is considered an error that ports are open to a driver that\n no [user](`m:erl_ddll#users`) has loaded. The ports that are still open when\n the last [user](`m:erl_ddll#users`) calls\n [`unload_driver/1`](`unload_driver/1`) or when the last process having the\n driver loaded dies, are killed with reason `driver_unloaded`.\n\n The function names `load_driver` and `unload_driver` are kept for backward\n compatibility.\n\n- **_Loading and Reloading for Code Replacement_** - This scenario can occur if\n the driver code needs replacement during operation of the Erlang emulator.\n Implementing driver code replacement is a little more tedious than Beam code\n replacement, as one driver cannot be loaded as both \"old\" and \"new\" code. All\n [users](`m:erl_ddll#users`) of a driver must have it closed (no open ports)\n before the old code can be unloaded and the new code can be loaded.\n\n The unloading/loading is done as one atomic operation, blocking all processes\n in the system from using the driver in question while in progress.\n\n The preferred way to do driver code replacement is to let _one single process_\n keep track of the driver. When the process starts, the driver is loaded. When\n replacement is required, the driver is reloaded. Unload is probably never\n done, or done when the process exits. If more than one\n [user](`m:erl_ddll#users`) has a driver loaded when code replacement is\n demanded, the replacement cannot occur until the last \"other\"\n [user](`m:erl_ddll#users`) has unloaded the driver.\n\n Demanding reload when a reload is already in progress is always an error.\n Using the high-level functions, it is also an error to demand reloading when\n more than one [user](`m:erl_ddll#users`) has the driver loaded.\n\n To simplify driver replacement, avoid designing your system so that more than\n one [user](`m:erl_ddll#users`) has the driver loaded.\n\n The two functions for reloading drivers are to be used together with\n corresponding load functions to support the two different behaviors concerning\n open ports:\n\n - **_load/2 and reload/2_** - This pair of functions is used when reloading is\n to be done after the last open port to the driver is closed.\n\n As [`reload/2`](`reload/2`) waits for the reloading to occur, a misbehaving\n process keeping open ports to the driver (or keeping the driver loaded) can\n cause infinite waiting for reload. Time-outs must be provided outside of the\n process demanding the reload or by using the low-level interface\n `try_load/3` in combination with driver monitors.\n\n - **_load_driver/2 and reload_driver/2_** - This pair of functions are used\n when open ports to the driver are to be killed with reason `driver_unloaded`\n to allow for new driver code to get loaded.\n\n However, if another process has the driver loaded, calling `reload_driver`\n returns error code `pending_process`. As stated earlier, the recommended\n design is to not allow other [users](`m:erl_ddll#users`) than the \"driver\n reloader\" to demand loading of the driver in question.","title":"erl_ddll","ref":"erl_ddll.html"},{"type":"module","doc":"[`erl_driver(4)`](`e:erts:erl_driver.md`), [`driver_entry(4)`](`e:erts:driver_entry.md`)","title":"See Also - erl_ddll","ref":"erl_ddll.html#module-see-also"},{"type":"function","doc":"Removes a driver monitor in much the same way as `erlang:demonitor/1` in ERTS\ndoes with process monitors.\n\nFor details about how to create driver monitors, see `monitor/2`,\n`try_load/3`, and `try_unload/2`.\n\nThe function throws a `badarg` exception if the parameter is not a\n`t:reference/0`.","title":"erl_ddll.demonitor/1","ref":"erl_ddll.html#demonitor/1"},{"type":"function","doc":"Takes an `ErrorDesc` returned by load, unload, or reload functions and returns a\nstring that describes the error or warning.\n\n> #### Note {: .info }\n>\n> Because of peculiarities in the dynamic loading interfaces on different\n> platforms, the returned string is only guaranteed to describe the correct\n> error _if format_error/1 is called in the same instance of the Erlang virtual\n> machine as the error appeared in_ (meaning the same operating system process).","title":"erl_ddll.format_error/1","ref":"erl_ddll.html#format_error/1"},{"type":"function","doc":"Returns a list of tuples `{DriverName, InfoList}`, where `InfoList` is the\nresult of calling `info/1` for that `DriverName`. Only dynamically linked-in\ndrivers are included in the list.","title":"erl_ddll.info/0","ref":"erl_ddll.html#info/0"},{"type":"function","doc":"Returns a list of tuples `{Tag, Value}`, where `Tag` is the information item and\n`Value` is the result of calling `info/2` with this driver name and this tag.\nThe result is a tuple list containing all information available about a driver.\n\nThe following tags appears in the list:\n\n- `processes`\n- `driver_options`\n- `port_count`\n- `linked_in_driver`\n- `permanent`\n- `awaiting_load`\n- `awaiting_unload`\n\nFor a detailed description of each value, see `info/2`.\n\nThe function throws a `badarg` exception if the driver is not present in the\nsystem.","title":"erl_ddll.info/1","ref":"erl_ddll.html#info/1"},{"type":"function","doc":"Returns specific information about one aspect of a driver. Parameter `Tag`\nspecifies which aspect to get information about. The return `Value` differs\nbetween different tags:\n\n- **`processes`** - Returns all processes containing [users](`m:erl_ddll#users`)\n of the specific drivers as a list of tuples `{pid(),integer() >= 0}`, where\n `t:integer/0` denotes the number of users in process `t:pid/0`.\n\n- **`driver_options`** - Returns a list of the driver options provided when\n loading, and any options set by the driver during initialization. The only\n valid option is `kill_ports`.\n\n- **`port_count`** - Returns the number of ports (an `integer() >= 0`) using the\n driver.\n\n- **`linked_in_driver`** - Returns a `t:boolean/0`, which is `true` if the\n driver is a statically linked-in one, otherwise `false`.\n\n- **`permanent`** - Returns a `t:boolean/0`, which is `true` if the driver has\n made itself permanent (and is _not_ a statically linked-in driver), otherwise\n `false`.\n\n- **`awaiting_load`** - Returns a list of all processes having monitors for\n `loading` active. Each process is returned as `{pid(),integer() >= 0}`, where\n `t:integer/0` is the number of monitors held by process `t:pid/0`.\n\n- **`awaiting_unload`** - Returns a list of all processes having monitors for\n `unloading` active. Each process is returned as `{pid(),integer() >= 0}`,\n where `t:integer/0` is the number of monitors held by process `t:pid/0`.\n\nIf option `linked_in_driver` or `permanent` returns `true`, all other options\nreturn `linked_in_driver` or `permanent`, respectively.\n\nThe function throws a `badarg` exception if the driver is not present in the\nsystem or if the tag is not supported.","title":"erl_ddll.info/2","ref":"erl_ddll.html#info/2"},{"type":"function","doc":"Loads and links the dynamic driver `Name`. `Path` is a file path to the\ndirectory containing the driver. `Name` must be a shareable object/dynamic\nlibrary. Two drivers with different `Path` parameters cannot be loaded under the\nsame name. `Name` is a string or atom containing at least one character.\n\nThe `Name` specified is to correspond to the filename of the dynamically\nloadable object file residing in the directory specified as `Path`, but\n_without_ the extension (that is, `.so`). The driver name provided in the driver\ninitialization routine must correspond with the filename, in much the same way\nas Erlang module names correspond to the names of the `.beam` files.\n\nIf the driver was previously unloaded, but is still present because of open\nports to it, a call to [`load/2`](`load/2`) stops the unloading and keeps the\ndriver (as long as `Path` is the same), and `ok` is returned. If you really want\nthe object code to be reloaded, use `reload/2` or the low-level interface\n`try_load/3` instead. See also the description of\n[`different scenarios`](`m:erl_ddll#scenarios`) for loading/unloading in the\nintroduction.\n\nIf more than one process tries to load an already loaded driver with the same\n`Path`, or if the same process tries to load it many times, the function returns\n`ok`. The emulator keeps track of the [`load/2`](`load/2`) calls, so that a\ncorresponding number of `unload/2` calls must be done from the same process\nbefore the driver gets unloaded. It is therefore safe for an application to load\na driver that is shared between processes or applications when needed. It can\nsafely be unloaded without causing trouble for other parts of the system.\n\nIt is not allowed to load multiple drivers with the same name but with different\n`Path` parameters.\n\n> #### Note {: .info }\n>\n> `Path` is interpreted literally, so that all loaders of the same driver must\n> specify the same _literal_ `Path` string, although different paths can point\n> out the same directory in the file system (because of use of relative paths\n> and links).\n\nOn success, the function returns `ok`. On failure, the return value is\n`{error,ErrorDesc}`, where `ErrorDesc` is an opaque term to be translated into\nhuman readable form by function `format_error/1`.\n\nFor more control over the error handling, use the `try_load/3` interface\ninstead.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.load/2","ref":"erl_ddll.html#load/2"},{"type":"function","doc":"Works essentially as [`load/2`](`load/2`), but loads the driver with other\noptions. All ports using the driver are killed with reason `driver_unloaded`\nwhen the driver is to be unloaded.\n\nThe number of loads and unloads by different [users](`m:erl_ddll#users`)\ninfluences the loading and unloading of a driver file. The port killing\ntherefore only occurs when the _last_ [user](`m:erl_ddll#users`) unloads the\ndriver, or when the last process having loaded the driver exits.\n\nThis interface (or at least the name of the functions) is kept for backward\ncompatibility. Using `try_load/3` with `{driver_options,[kill_ports]}` in the\noption list gives the same effect regarding the port killing.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.load_driver/2","ref":"erl_ddll.html#load_driver/2"},{"type":"function","doc":"Returns a list of all the available drivers, both (statically) linked-in and\ndynamically loaded ones.\n\nThe driver names are returned as a list of strings rather than a list of atoms\nfor historical reasons.\n\nFor more information about drivers, see [`info`](`info/0`).","title":"erl_ddll.loaded_drivers/0","ref":"erl_ddll.html#loaded_drivers/0"},{"type":"function","doc":"Creates a driver monitor and works in many ways as `erlang:monitor/2` in ERTS,\ndoes for processes. When a driver changes state, the monitor results in a\nmonitor message that is sent to the calling process. `MonitorRef` returned by\nthis function is included in the message sent.\n\nAs with process monitors, each driver monitor set only generates _one single\nmessage_. The monitor is \"destroyed\" after the message is sent, so it is then\nnot needed to call `demonitor/1`.\n\n`MonitorRef` can also be used in subsequent calls to `demonitor/1` to remove a\nmonitor.\n\nThe function accepts the following parameters:\n\n- **`Tag`** - The monitor tag is always `driver`, as this function can only be\n used to create driver monitors. In the future, driver monitors will be\n integrated with process monitors, why this parameter has to be specified for\n consistence.\n\n- **`Item`** - Parameter `Item` specifies which driver to monitor (the driver\n name) and which state change to monitor. The parameter is a tuple of arity two\n whose first element is the driver name and second element is one of the\n following:\n\n - **`loaded`** - Notifies when the driver is reloaded (or loaded if loading is\n underway). It only makes sense to monitor drivers that are in the process of\n being loaded or reloaded. A future driver name for loading cannot be\n monitored. That only results in a `DOWN` message sent immediately.\n Monitoring for loading is therefore most useful when triggered by function\n `try_load/3`, where the monitor is created _because_ the driver is in such a\n pending state.\n\n Setting a driver monitor for `loading` eventually leads to one of the\n following messages being sent:\n\n - **`{'UP', reference(), driver, Name, loaded}`** - This message is sent\n either immediately if the driver is already loaded and no reloading is\n pending, or when reloading is executed if reloading is pending.\n\n The [user](`m:erl_ddll#users`) is expected to know if reloading is\n demanded before creating a monitor for loading.\n\n - **`{'UP', reference(), driver, Name, permanent}`** - This message is sent\n if reloading was expected, but the (old) driver made itself permanent\n before reloading. It is also sent if the driver was permanent or\n statically linked-in when trying to create the monitor.\n\n - **`{'DOWN', reference(), driver, Name, load_cancelled}`** - This message\n arrives if reloading was underway, but the requesting\n [user](`m:erl_ddll#users`) cancelled it by dying or calling `try_unload/2`\n (or [`unload/1`](`unload/1`)/[`unload_driver/1`](`unload_driver/1`)) again\n before it was reloaded.\n\n - **`{'DOWN', reference(), driver, Name, {load_failure, Failure}}`** - This\n message arrives if reloading was underway but the loading for some reason\n failed. The `Failure` term is one of the errors that can be returned from\n `try_load/3`. The error term can be passed to `format_error/1` for\n translation into human readable form. Notice that the translation must be\n done in the same running Erlang virtual machine as the error was detected\n in.\n\n - **`unloaded`** - Monitors when a driver gets unloaded. If one monitors a\n driver that is not present in the system, one immediately gets notified that\n the driver got unloaded. There is no guarantee that the driver was ever\n loaded.\n\n A driver monitor for unload eventually results in one of the following\n messages being sent:\n\n - **`{'DOWN', reference(), driver, Name, unloaded}`** - The monitored driver\n instance is now unloaded. As the unload can be a result of a\n [`reload/2`](`reload/2`) request, the driver can once again have been\n loaded when this message arrives.\n\n - **`{'UP', reference(), driver, Name, unload_cancelled}`** - This message\n is sent if unloading was expected, but while the driver was waiting for\n all ports to get closed, a new [user](`m:erl_ddll#users`) of the driver\n appeared, and the unloading was cancelled.\n\n This message appears if `{ok, pending_driver}` was returned from\n `try_unload/2` for the last [user](`m:erl_ddll#users`) of the driver, and\n then `{ok, already_loaded}` is returned from a call to `try_load/3`.\n\n If one _really_ wants to monitor when the driver gets unloaded, this\n message distorts the picture, because no unloading was done. Option\n `unloaded_only` creates a monitor similar to an `unloaded` monitor, but\n never results in this message.\n\n - **`{'UP', reference(), driver, Name, permanent}`** - This message is sent\n if unloading was expected, but the driver made itself permanent before\n unloading. It is also sent if trying to monitor a permanent or statically\n linked-in driver.\n\n - **`unloaded_only`** - A monitor created as `unloaded_only` behaves exactly\n as one created as `unloaded` except that the\n `{'UP', reference(), driver, Name, unload_cancelled}` message is never sent,\n but the monitor instead persists until the driver _really_ gets unloaded.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.monitor/2","ref":"erl_ddll.html#monitor/2"},{"type":"function","doc":"Reloads the driver named `Name` from a possibly different `Path` than previously\nused. This function is used in the code change\n[`scenario`](`m:erl_ddll#scenarios`) described in the introduction.\n\nIf there are other [users](`m:erl_ddll#users`) of this driver, the function\nreturns `{error, pending_process}`, but if there are no other users, the\nfunction call hangs until all open ports are closed.\n\n> #### Note {: .info }\n>\n> Avoid mixing multiple [users](`m:erl_ddll#users`) with driver reload requests.\n\nTo avoid hanging on open ports, use function `try_load/3` instead.\n\nThe `Name` and `Path` parameters have exactly the same meaning as when calling\nthe plain function `load/2`.\n\nOn success, the function returns `ok`. On failure, the function returns an\nopaque error, except the `pending_process` error described earlier. The opaque\nerrors are to be translated into human readable form by function\n`format_error/1`.\n\nFor more control over the error handling, use the `try_load/3` interface\ninstead.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.reload/2","ref":"erl_ddll.html#reload/2"},{"type":"function","doc":"Works exactly as `reload/2`, but for drivers loaded with the `load_driver/2`\ninterface.\n\nAs this interface implies that ports are killed when the last user disappears,\nthe function does not hang waiting for ports to get closed.\n\nFor more details, see [`scenarios`](`m:erl_ddll#scenarios`) in this module\ndescription and the function description for `reload/2`.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.reload_driver/2","ref":"erl_ddll.html#reload_driver/2"},{"type":"function","doc":"Provides more control than the [`load/2`](`load/2`)/[`reload/2`](`reload/2`) and\n[`load_driver/2`](`load_driver/2`)/[`reload_driver/2`](`reload_driver/2`)\ninterfaces. It never waits for completion of other operations related to the\ndriver, but immediately returns the status of the driver as one of the\nfollowing:\n\n- **`{ok, loaded}`** - The driver was loaded and is immediately usable.\n\n- **`{ok, already_loaded}`** - The driver was already loaded by another process\n or is in use by a living port, or both. The load by you is registered and a\n corresponding `try_unload` is expected sometime in the future.\n\n- **`{ok, pending_driver}`or `{ok, pending_driver, reference()}`** - The load\n request is registered, but the loading is delayed because an earlier instance\n of the driver is still waiting to get unloaded (open ports use it). Still,\n unload is expected when you are done with the driver. This return value\n _mostly_ occurs when options `{reload,pending_driver}` or `{reload,pending}`\n are used, but _can_ occur when another [user](`m:erl_ddll#users`) is unloading\n a driver in parallel and driver option `kill_ports` is set. In other words,\n this return value always needs to be handled.\n\n- **`{ok, pending_process}`or `{ok, pending_process, reference()}`** - The load\n request is registered, but the loading is delayed because an earlier instance\n of the driver is still waiting to get unloaded by another\n [user](`m:erl_ddll#users`) (not only by a port, in which case\n `{ok,pending_driver}` would have been returned). Still, unload is expected\n when you are done with the driver. This return value _only_ occurs when option\n `{reload,pending}` is used.\n\nWhen the function returns `{ok, pending_driver}` or `{ok, pending_process}`, one\ncan get information about when the driver is _actually_ loaded by using option\n`{monitor, MonitorOption}`.\n\nWhen monitoring is requested, and a corresponding `{ok, pending_driver}` or\n`{ok, pending_process}` would be returned, the function instead returns a tuple\n`{ok, PendingStatus, reference()}` and the process then gets a monitor message\nlater, when the driver gets loaded. The monitor message to expect is described\nin the function description of `monitor/2`.\n\n> #### Note {: .info }\n>\n> In case of loading, monitoring can _not_ only get triggered by using option\n> `{reload, ReloadOption}`, but also in special cases where the load error is\n> transient. Thus, `{monitor, pending_driver}` is to be used under basically\n> _all_ real world circumstances.\n\nThe function accepts the following parameters:\n\n- **`Path`** - The file system path to the directory where the driver object\n file is located. The filename of the object file (minus extension) must\n correspond to the driver name (used in parameter `Name`) and the driver must\n identify itself with the same name. `Path` can be provided as an _iolist()_,\n meaning it can be a list of other `t:iolist/0`s, characters (8-bit integers),\n or binaries, all to be flattened into a sequence of characters.\n\n The (possibly flattened) `Path` parameter must be consistent throughout the\n system. A driver is to, by all [users](`m:erl_ddll#users`), be loaded using\n the same _literal_ `Path`. The exception is when _reloading_ is requested, in\n which case `Path` can be specified differently. Notice that all\n [users](`m:erl_ddll#users`) trying to load the driver later need to use the\n _new_ `Path` if `Path` is changed using a `reload` option. This is yet another\n reason to have _only one loader_ of a driver one wants to upgrade in a running\n system.\n\n- **`Name`** - This parameter is the name of the driver to be used in subsequent\n calls to function [`erlang:open_port`](`erlang:open_port/2`) in ERTS. The name\n can be specified as an `t:iolist/0` or an `t:atom/0`. The name specified when\n loading is used to find the object file (with the help of `Path` and the\n system-implied extension suffix, that is, `.so`). The name by which the driver\n identifies itself must also be consistent with this `Name` parameter, much as\n the module name of a Beam file much corresponds to its filename.\n\n- **`OptionList`** - Some options can be specified to control the loading\n operation. The options are specified as a list of two-tuples. The tuples have\n the following values and meanings:\n\n - **`{driver_options, DriverOptionList}`** - This is to provide options that\n changes its general behavior and \"sticks\" to the driver throughout its\n lifespan.\n\n The driver options for a specified driver name need always to be consistent,\n _even when the driver is reloaded_, meaning that they are as much a part of\n the driver as the name.\n\n The only allowed driver option is `kill_ports`, which means that all ports\n opened to the driver are killed with exit reason `driver_unloaded` when no\n process any longer has the driver loaded. This situation arises either when\n the last [user](`m:erl_ddll#users`) calls `try_unload/2`, or when the last\n process having loaded the driver exits.\n\n - **`{monitor, MonitorOption}`** - A `MonitorOption` tells\n [`try_load/3`](`try_load/3`) to trigger a driver monitor under certain\n conditions. When the monitor is triggered, the function returns a\n three-tuple `{ok, PendingStatus, reference()}`, where `t:reference/0` is the\n monitor reference for the driver monitor.\n\n Only one `MonitorOption` can be specified. It is one of the following:\n\n - The atom `pending`, which means that a monitor is to be created whenever a\n load operation is delayed,\n - The atom `pending_driver`, in which a monitor is created whenever the\n operation is delayed because of open ports to an otherwise unused driver.\n\n Option `pending_driver` is of little use, but is present for completeness,\n as it is well defined which reload options that can give rise to which\n delays. However, it can be a good idea to use the same `MonitorOption` as\n the `ReloadOption`, if present.\n\n If reloading is not requested, it can still be useful to specify option\n `monitor`, as forced unloads (driver option `kill_ports` or option\n `kill_ports` to `try_unload/2`) trigger a transient state where driver\n loading cannot be performed until all closing ports are closed. Thus, as\n `try_unload` can, in almost all situations, return `{ok, pending_driver}`,\n always specify at least `{monitor, pending_driver}` in production code (see\n the monitor discussion earlier).\n\n - **`{reload, ReloadOption}`** - This option is used to _reload_ a driver from\n disk, most often in a code upgrade scenario. Having a `reload` option also\n implies that parameter `Path` does _not_ need to be consistent with earlier\n loads of the driver.\n\n To reload a driver, the process must have loaded the driver before, that is,\n there must be an active [user](`m:erl_ddll#users`) of the driver in the\n process.\n\n The `reload` option can be either of the following:\n\n - **`pending`** - With the atom `pending`, reloading is requested for any\n driver and is effectuated when _all_ ports opened to the driver are\n closed. The driver replacement in this case takes place regardless if\n there are still pending [users](`m:erl_ddll#users`) having the driver\n loaded.\n\n The option also triggers port-killing (if driver option `kill_ports` is\n used) although there are pending users, making it usable for forced driver\n replacement, but laying much responsibility on the driver\n [users](`m:erl_ddll#users`). The pending option is seldom used as one does\n not want other [users](`m:erl_ddll#users`) to have loaded the driver when\n code change is underway.\n\n - **`pending_driver`** - This option is more useful. Here, reloading is\n queued if the driver is _not_ loaded by any other\n [users](`m:erl_ddll#users`), but the driver has opened ports, in which\n case `{ok, pending_driver}` is returned (a `monitor` option is\n recommended).\n\n If the driver is unloaded (not present in the system), error code\n `not_loaded` is returned. Option `reload` is intended for when the user has\n already loaded the driver in advance.\n\nThe function can return numerous errors, some can only be returned given a\ncertain combination of options.\n\nSome errors are opaque and can only be interpreted by passing them to function\n`format_error/1`, but some can be interpreted directly:\n\n- **`{error,linked_in_driver}`** - The driver with the specified name is an\n Erlang statically linked-in driver, which cannot be manipulated with this API.\n\n- **`{error,inconsistent}`** - The driver is already loaded with other\n `DriverOptionList` or a different _literal_ `Path` argument.\n\n This can occur even if a `reload` option is specified, if `DriverOptionList`\n differs from the current.\n\n- **`{error, permanent}`** - The driver has requested itself to be permanent,\n making it behave like an Erlang linked-in driver and can no longer be\n manipulated with this API.\n\n- **`{error, pending_process}`** - The driver is loaded by other\n [users](`m:erl_ddll#users`) when option `{reload, pending_driver}` was\n specified.\n\n- **`{error, pending_reload}`** - Driver reload is already requested by another\n [user](`m:erl_ddll#users`) when option `{reload, ReloadOption}` was specified.\n\n- **`{error, not_loaded_by_this_process}`** - Appears when option `reload` is\n specified. The driver `Name` is present in the system, but there is no\n [user](`m:erl_ddll#users`) of it in this process.\n\n- **`{error, not_loaded}`** - Appears when option `reload` is specified. The\n driver `Name` is not in the system. Only drivers loaded by this process can be\n reloaded.\n\nAll other error codes are to be translated by function `format_error/1`. Notice\nthat calls to `format_error` are to be performed from the same running instance\nof the Erlang virtual machine as the error is detected in, because of\nsystem-dependent behavior concerning error values.\n\nIf the arguments or options are malformed, the function throws a `badarg`\nexception.","title":"erl_ddll.try_load/3","ref":"erl_ddll.html#try_load/3"},{"type":"function","doc":"This is the low-level function to unload (or decrement reference counts of) a\ndriver. It can be used to force port killing, in much the same way as the driver\noption `kill_ports` implicitly does. Also, it can trigger a monitor either\nbecause other [users](`m:erl_ddll#users`) still have the driver loaded or\nbecause open ports use the driver.\n\nUnloading can be described as the process of telling the emulator that this\nparticular part of the code in this particular process (that is, this\n[user](`m:erl_ddll#users`)) no longer needs the driver. That can, if there are\nno other users, trigger unloading of the driver, in which case the driver name\ndisappears from the system and (if possible) the memory occupied by the driver\nexecutable code is reclaimed.\n\nIf the driver has option `kill_ports` set, or if `kill_ports` is specified as an\noption to this function, all pending ports using this driver are killed when\nunloading is done by the last [user](`m:erl_ddll#users`). If no port-killing is\ninvolved and there are open ports, the unloading is delayed until no more open\nports use the driver. If, in this case, another [user](`m:erl_ddll#users`) (or\neven this user) loads the driver again before the driver is unloaded, the\nunloading never takes place.\n\nTo allow the [user](`m:erl_ddll#users`) to _request unloading_ to wait for\n_actual unloading_, `monitor` triggers can be specified in much the same way as\nwhen loading. However, as [users](`m:erl_ddll#users`) of this function seldom\nare interested in more than decrementing the reference counts, monitoring is\nseldom needed.\n\n> #### Note {: .info }\n>\n> If option `kill_ports` is used, monitor trigging is crucial, as the ports are\n> not guaranteed to be killed until the driver is unloaded. Thus, a monitor must\n> be triggered for at least the `pending_driver` case.\n\nThe possible monitor messages to expect are the same as when using option\n`unloaded` to function `monitor/2`.\n\nThe function returns one of the following statuses upon success:\n\n- **`{ok, unloaded}`** - The driver was immediately unloaded, meaning that the\n driver name is now free to use by other drivers and, if the underlying OS\n permits it, the memory occupied by the driver object code is now reclaimed.\n\n The driver can only be unloaded when there are no open ports using it and no\n more [users](`m:erl_ddll#users`) require it to be loaded.\n\n- **`{ok, pending_driver}`or `{ok, pending_driver, reference()}`** - Indicates\n that this call removed the last [user](`m:erl_ddll#users`) from the driver,\n but there are still open ports using it. When all ports are closed and no new\n [users](`m:erl_ddll#users`) have arrived, the driver is reloaded and the name\n and memory reclaimed.\n\n This return value is valid even if option `kill_ports` was used, as killing\n ports can be a process that does not complete immediately. However, the\n condition is in that case transient. Monitors are always useful to detect when\n the driver is really unloaded.\n\n- **`{ok, pending_process}`or `{ok, pending_process, reference()}`** - The\n unload request is registered, but other [users](`m:erl_ddll#users`) still hold\n the driver. Notice that the term `pending_process` can refer to the running\n process; there can be more than one [user](`m:erl_ddll#users`) in the same\n process.\n\n This is a normal, healthy, return value if the call was just placed to inform\n the emulator that you have no further use of the driver. It is the most common\n return value in the most common [`scenario`](`m:erl_ddll#scenarios`) described\n in the introduction.\n\nThe function accepts the following parameters:\n\n- **`Name`** - `Name` is the name of the driver to be unloaded. The name can be\n specified as an `t:iolist/0` or as an `t:atom/0`.\n\n- **`OptionList`** - Argument `OptionList` can be used to specify certain\n behavior regarding ports and triggering monitors under certain conditions:\n\n - **`kill_ports`** - Forces killing of all ports opened using this driver,\n with exit reason `driver_unloaded`, if you are the _last_\n [user](`m:erl_ddll#users`) of the driver.\n\n If other [users](`m:erl_ddll#users`) have the driver loaded, this option has\n no effect.\n\n To get the consistent behavior of killing ports when the last\n [user](`m:erl_ddll#users`) unloads, use driver option `kill_ports` when\n loading the driver instead.\n\n - **`{monitor, MonitorOption}`** - Creates a driver monitor if the condition\n specified in `MonitorOption` is true. The valid options are:\n\n - **`pending_driver`** - Creates a driver monitor if the return value is to\n be `{ok, pending_driver}`.\n\n - **`pending`** - Creates a monitor if the return value is\n `{ok, pending_driver}` or `{ok, pending_process}`.\n\n The `pending_driver` `MonitorOption` is by far the most useful. It must be\n used to ensure that the driver really is unloaded and the ports closed\n whenever option `kill_ports` is used, or the driver can have been loaded\n with driver option `kill_ports`.\n\n Using the monitor triggers in the call to `try_unload` ensures that the\n monitor is added before the unloading is executed, meaning that the monitor\n is always properly triggered, which is not the case if\n [`monitor/2`](`monitor/2`) is called separately.\n\nThe function can return the following error conditions, all well specified (no\nopaque values):\n\n- **`{error, linked_in_driver}`** - You were trying to unload an Erlang\n statically linked-in driver, which cannot be manipulated with this interface\n (and cannot be unloaded at all).\n\n- **`{error, not_loaded}`** - The driver `Name` is not present in the system.\n\n- **`{error, not_loaded_by_this_process}`** - The driver `Name` is present in\n the system, but there is no [user](`m:erl_ddll#users`) of it in this process.\n\n As a special case, drivers can be unloaded from processes that have done no\n corresponding call to [`try_load/3`](`try_load/3`) if, and only if, there are\n _no users of the driver at all_, which can occur if the process containing the\n last user dies.\n\n- **`{error, permanent}`** - The driver has made itself permanent, in which case\n it can no longer be manipulated by this interface (much like a statically\n linked-in driver).\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.try_unload/2","ref":"erl_ddll.html#try_unload/2"},{"type":"function","doc":"Unloads, or at least dereferences the driver named `Name`. If the caller is the\nlast [user](`m:erl_ddll#users`) of the driver, and no more open ports use the\ndriver, the driver gets unloaded. Otherwise, unloading is delayed until all\nports are closed and no [users](`m:erl_ddll#users`) remain.\n\nIf there are other [users](`m:erl_ddll#users`) of the driver, the reference\ncounts of the driver is merely decreased, so that the caller is no longer\nconsidered a [user](`m:erl_ddll#users`) of the driver. For use scenarios, see\nthe [`description`](`m:erl_ddll#scenarios`) in the beginning of this module.\n\nThe `ErrorDesc` returned is an opaque value to be passed further on to function\n`format_error/1`. For more control over the operation, use the `try_unload/2`\ninterface.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.unload/1","ref":"erl_ddll.html#unload/1"},{"type":"function","doc":"Unloads, or at least dereferences the driver named `Name`. If the caller is the\nlast [user](`m:erl_ddll#users`) of the driver, all remaining open ports using\nthe driver are killed with reason `driver_unloaded` and the driver eventually\ngets unloaded.\n\nIf there are other [users](`m:erl_ddll#users`) of the driver, the reference\ncounts of the driver is merely decreased, so that the caller is no longer\nconsidered a [user](`m:erl_ddll#users`). For use scenarios, see the\n[`description`](`m:erl_ddll#scenarios`) in the beginning of this module.\n\nThe `ErrorDesc` returned is an opaque value to be passed further on to function\n`format_error/1`. For more control over the operation, use the `try_unload/2`\ninterface.\n\nThe function throws a `badarg` exception if the parameters are not specified as\ndescribed here.","title":"erl_ddll.unload_driver/1","ref":"erl_ddll.html#unload_driver/1"},{"type":"type","doc":"","title":"erl_ddll.driver/0","ref":"erl_ddll.html#t:driver/0"},{"type":"type","doc":"","title":"erl_ddll.path/0","ref":"erl_ddll.html#t:path/0"},{"type":"module","doc":"Default system error handler.\n\nThis module defines what happens when certain types of errors occur.\n\nYou can change the error handler of a process by calling\n[`erlang:process_flag(error_handler, NewErrorHandler)`](`erlang#process_flag_error_handler`).","title":"error_handler","ref":"error_handler.html"},{"type":"module","doc":"The code in `error_handler` is complex. Do not change it without fully\nunderstanding the interaction between the error handler, the `init` process of\nthe code server, and the I/O mechanism of the code.\n\nCode changes that seem small can cause a deadlock, as unforeseen consequences\ncan occur. The use of `input` is dangerous in this type of code.","title":"Notes - error_handler","ref":"error_handler.html#module-notes"},{"type":"function","doc":"Raises an `undef` exception with a stacktrace, indicating that\n`Module:Function/N` is undefined.","title":"error_handler.raise_undef_exception/3","ref":"error_handler.html#raise_undef_exception/3"},{"type":"function","doc":"This function is called by the runtime system if a call is made to\n`Module:Function(Arg1,.., ArgN)` and `Module:Function/N` is undefined. Notice\nthat this function is evaluated inside the process making the original call.\n\nThis function first attempts to autoload `Module`. If that is not possible, an\n`undef` exception is raised.\n\nIf it is possible to load `Module` and function `Function/N` is exported, it is\ncalled.\n\nOtherwise, if function `'$handle_undefined_function'/2` is exported, it is\ncalled as `'$handle_undefined_function'(`Function, Args).\n\n> #### Warning {: .warning }\n>\n> Defining `'$handle_undefined_function'/2` in ordinary application code is\n> highly discouraged. It is very easy to make subtle errors that can take a long\n> time to debug. Furthermore, none of the tools for static code analysis (such\n> as Dialyzer and Xref) supports the use of `'$handle_undefined_function'/2` and\n> no such support will be added. Only use this function after having carefully\n> considered other, less dangerous, solutions. One example of potential\n> legitimate use is creating stubs for other sub-systems during testing and\n> debugging.\n\nOtherwise an `undef` exception is raised.","title":"error_handler.undefined_function/3","ref":"error_handler.html#undefined_function/3"},{"type":"function","doc":"This function is evaluated if a call is made to `Fun(Arg1,.., ArgN)` when the\nmodule defining the fun is not loaded. The function is evaluated inside the\nprocess making the original call.\n\nIf `Module` is interpreted, the interpreter is invoked and the return value of\nthe interpreted `Fun(Arg1,.., ArgN)` call is returned.\n\nOtherwise, it returns, if possible, the value of [`apply(Fun, Args)`](`apply/2`)\nafter an attempt is made to autoload `Module`. If this is not possible, the call\nfails with exit reason `undef`.","title":"error_handler.undefined_lambda/3","ref":"error_handler.html#undefined_lambda/3"},{"type":"module","doc":"Heartbeat monitoring of an Erlang runtime system.\n\nThis modules contains the interface to the `heart` process. `heart` sends\nperiodic heartbeats to an external port program, which is also named `heart`.\nThe purpose of the `heart` port program is to check that the Erlang runtime\nsystem it is supervising is still running. If the port program has not received\nany heartbeats within `HEART_BEAT_TIMEOUT` seconds (defaults to 60 seconds), the\nsystem can be rebooted.\n\nAn Erlang runtime system to be monitored by a heart program is to be started\nwith command-line flag `-heart` (see also [`erl(1)`](`e:erts:erl_cmd.md`)). The\n`heart` process is then started automatically:\n\n```text\n% erl -heart ...\n```\n\nIf the system is to be rebooted because of missing heartbeats, or a terminated\nErlang runtime system, environment variable `HEART_COMMAND` must be set before\nthe system is started. If this variable is not set, a warning text is printed\nbut the system does not reboot.\n\nTo reboot on Windows, `HEART_COMMAND` can be set to `heart -shutdown` (included\nin the Erlang delivery) or to any other suitable program that can activate a\nreboot.\n\nThe environment variable `HEART_BEAT_TIMEOUT` can be used to configure the heart\ntime-outs; it can be set in the operating system shell before Erlang is started\nor be specified at the command line:\n\n```text\n% erl -heart -env HEART_BEAT_TIMEOUT 30 ...\n```\n\nThe value (in seconds) must be in the range `10 < X <= 65535`.\n\nWhen running on OSs lacking support for monotonic time, `heart` is susceptible\nto system clock adjustments of more than `HEART_BEAT_TIMEOUT` seconds. When this\nhappens, `heart` times out and tries to reboot the system. This can occur, for\nexample, if the system clock is adjusted automatically by use of the Network\nTime Protocol (NTP).\n\nIf a crash occurs, an `erl_crash.dump` is _not_ written unless environment\nvariable `ERL_CRASH_DUMP_SECONDS` is set:\n\n```text\n% erl -heart -env ERL_CRASH_DUMP_SECONDS 10 ...\n```\n\nIf a regular core dump is wanted, let `heart` know by setting the kill signal to\nabort using environment variable `HEART_KILL_SIGNAL=SIGABRT`. If unset, or not\nset to `SIGABRT`, the default behavior is a kill signal using `SIGKILL`:\n\n```text\n% erl -heart -env HEART_KILL_SIGNAL SIGABRT ...\n```\n\nIf heart should _not_ kill the Erlang runtime system, this can be indicated\nusing the environment variable `HEART_NO_KILL=TRUE`. This can be useful if the\ncommand executed by heart takes care of this, for example as part of a specific\ncleanup sequence. If unset, or not set to `TRUE`, the default behaviour will be\nto kill as described above.\n\n```text\n% erl -heart -env HEART_NO_KILL 1 ...\n```\n\nFurthermore, `ERL_CRASH_DUMP_SECONDS` has the following behavior on `heart`:\n\n- **`ERL_CRASH_DUMP_SECONDS=0`** - Suppresses the writing of a crash dump file\n entirely, thus rebooting the runtime system immediately. This is the same as\n not setting the environment variable.\n\n- **`ERL_CRASH_DUMP_SECONDS=-1`** - Setting the environment variable to a\n negative value does not reboot the runtime system until the crash dump file is\n completely written.\n\n- **`ERL_CRASH_DUMP_SECONDS=S`** - `heart` waits for `S` seconds to let the\n crash dump file be written. After `S` seconds, `heart` reboots the runtime\n system, whether the crash dump file is written or not.\n\nIn the following descriptions, all functions fail with reason `badarg` if\n`heart` is not started.","title":"heart","ref":"heart.html"},{"type":"function","doc":"Removes the validation callback call before heartbeats.","title":"heart.clear_callback/0","ref":"heart.html#clear_callback/0"},{"type":"function","doc":"Clears the temporary boot command. If the system terminates, the normal\n`HEART_COMMAND` is used to reboot.","title":"heart.clear_cmd/0","ref":"heart.html#clear_cmd/0"},{"type":"function","doc":"Get the validation callback. If the callback is cleared, `none` will be\nreturned.","title":"heart.get_callback/0","ref":"heart.html#get_callback/0"},{"type":"function","doc":"Gets the temporary reboot command. If the command is cleared, the empty string\nis returned.","title":"heart.get_cmd/0","ref":"heart.html#get_cmd/0"},{"type":"function","doc":"Returns `{ok, Options}` where `Options` is a list of current options enabled for\nheart. If the callback is cleared, `none` will be returned.","title":"heart.get_options/0","ref":"heart.html#get_options/0"},{"type":"function","doc":"This validation callback will be executed before any heartbeat is sent to the\nport program. For the validation to succeed it needs to return with the value\n`ok`.\n\nAn exception within the callback will be treated as a validation failure.\n\nThe callback will be removed if the system reboots.","title":"heart.set_callback/2","ref":"heart.html#set_callback/2"},{"type":"function","doc":"Sets a temporary reboot command. This command is used if a `HEART_COMMAND` other\nthan the one specified with the environment variable is to be used to reboot the\nsystem. The new Erlang runtime system uses (if it misbehaves) environment\nvariable `HEART_COMMAND` to reboot.\n\nLimitations: Command string `Cmd` is sent to the `heart` program as an ISO\nLatin-1 or UTF-8 encoded binary, depending on the filename encoding mode of the\nemulator (see `file:native_name_encoding/0`). The size of the encoded binary\nmust be less than 2047 bytes.","title":"heart.set_cmd/1","ref":"heart.html#set_cmd/1"},{"type":"function","doc":"Valid options `set_options` are:\n\n- **`check_schedulers`** - If enabled, a signal will be sent to each scheduler\n to check its responsiveness. The system check occurs before any heartbeat sent\n to the port program. If any scheduler is not responsive enough the heart\n program will not receive its heartbeat and thus eventually terminate the node.\n\nReturns with the value `ok` if the options are valid.","title":"heart.set_options/1","ref":"heart.html#set_options/1"},{"type":"type","doc":"","title":"heart.heart_option/0","ref":"heart.html#t:heart_option/0"},{"type":"module","doc":"Operating system-specific functions.\n\nThe functions in this module are operating system-specific. Careless use of\nthese functions results in programs that will only run on a specific platform.\nOn the other hand, with careful use, these functions can be of help in enabling\na program to run on most platforms.\n\n> #### Note {: .info }\n>\n> The functions in this module will raise a `badarg` exception if their\n> arguments contain invalid characters according to the description in the \"Data\n> Types\" section.","title":"os","ref":"os.html"},{"type":"function","doc":"","title":"os.cmd/1","ref":"os.html#cmd/1"},{"type":"function","doc":"Executes `Command` in a command shell of the target OS, captures the standard\noutput and standard error of the command, and returns this result as a string.\n\nThe command shell can be set using the\n[kernel configuration parameter](kernel_app.md#os_cmd_shell), by default the\nshell is detected upon system startup.\n\n_Examples:_\n\n```erlang\nLsOut = os:cmd(\"ls\"), % on unix platform\nDirOut = os:cmd(\"dir\"), % on Win32 platform\n```\n\nNotice that in some cases, standard output of a command when called from another\nprogram can differ, compared with the standard output of the command when called\ndirectly from an OS command shell.\n\nThe possible options are:\n\n- **`max_size`** - The maximum size of the data returned by the `os:cmd` call.\n This option is a safety feature that should be used when the command executed\n can return a very large, possibly infinite, result.\n\n ```erlang\n > os:cmd(\"cat /dev/zero\", #{ max_size => 20 }).\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\n ```","title":"os.cmd/2","ref":"os.html#cmd/2"},{"type":"function","doc":"Returns a list of all environment variables. Each environment variable is\nexpressed as a tuple `{VarName,Value}`, where `VarName` is the name of the\nvariable and `Value` its value.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings can\ncontain characters with codepoints > 255.","title":"os.env/0","ref":"os.html#env/0"},{"type":"function","doc":"Equivalent to [`find_executable(Name, Path)`](`find_executable/2`) where\n`Path` is the current execution path (that is, the environment variable `PATH`\non Unix and Windows).","title":"os.find_executable/1","ref":"os.html#find_executable/1"},{"type":"function","doc":"Look up an executable program, with the specified name and a search path, in the\nsame way as the underlying OS.\n\n`Path` is to conform to the syntax of execution paths on the OS.\nReturns the absolute filename of the executable program `Name`, or `false` if\nthe program is not found.","title":"os.find_executable/2","ref":"os.html#find_executable/2"},{"type":"function","doc":"Returns a list of all environment variables. Each environment variable is\nexpressed as a single string on the format `\"VarName=Value\"`, where `VarName` is\nthe name of the variable and `Value` its value.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings can\ncontain characters with codepoints > 255.\n\nConsider using `env/0` for a nicer 2-tuple format.","title":"os.getenv/0","ref":"os.html#getenv/0"},{"type":"function","doc":"Returns the `Value` of the environment variable `VarName`, or `false` if the\nenvironment variable is undefined.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings\n`VarName` and `Value` can contain characters with codepoints > 255.","title":"os.getenv/1","ref":"os.html#getenv/1"},{"type":"function","doc":"Returns the `Value` of the environment variable `VarName`, or `DefaultValue` if\nthe environment variable is undefined.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings\n`VarName` and `Value` can contain characters with codepoints > 255.","title":"os.getenv/2","ref":"os.html#getenv/2"},{"type":"function","doc":"Returns the process identifier of the current Erlang emulator in the format most\ncommonly used by the OS environment.\n\nReturns `Value` as a string containing the (usually) numerical identifier for a process.\n\n- On Unix, this is typically the return value of the `getpid/0` system call.\n- On Windows, the process id as returned by the `GetCurrentProcessId()` system call\n is used.","title":"os.getpid/0","ref":"os.html#getpid/0"},{"type":"function","doc":"Returns the current performance counter value in `perf_counter`\n[time unit](`t:erlang:time_unit/0`). This is a highly optimized call that\nmight not be traceable.","title":"os.perf_counter/0","ref":"os.html#perf_counter/0"},{"type":"function","doc":"Returns a performance counter that can be used as a very fast and high\nresolution timestamp.\n\nThis counter is read directly from the hardware or operating system with the\nsame guarantees. This means that two consecutive calls to the function are not\nguaranteed to be monotonic, though it most likely will be. The performance\ncounter will be converted to the resolution passed as an argument.\n\n```erlang\n1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).\n176525861\n2> T2 - T1.\n10004\n```","title":"os.perf_counter/1","ref":"os.html#perf_counter/1"},{"type":"function","doc":"Sets a new `Value` for environment variable `VarName`.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the strings\n`VarName` and `Value` can contain characters with codepoints > 255.\n\nOn Unix platforms, the environment is set using UTF-8 encoding if Unicode\nfilename translation is in effect. On Windows, the environment is set using wide\ncharacter interfaces.","title":"os.putenv/2","ref":"os.html#putenv/2"},{"type":"function","doc":"Enables or disables OS signals.\n\nEach signal my be set to one of the following options:\n\n- **`ignore`** - This signal will be ignored.\n\n- **`default`** - This signal will use the default signal handler for the\n operating system.\n\n- **`handle`** - This signal will notify\n [`erl_signal_server`](kernel_app.md#erl_signal_server) when it is received by\n the Erlang runtime system.","title":"os.set_signal/2","ref":"os.html#set_signal/2"},{"type":"function","doc":"Returns the current [OS system time](`e:erts:time_correction.md#os-system-time`)\nin `native` [time unit](`t:erlang:time_unit/0`).\n\n> #### Note {: .info }\n>\n> This time is _not_ a monotonically increasing time.","title":"os.system_time/0","ref":"os.html#system_time/0"},{"type":"function","doc":"Returns the current [OS system time](`e:erts:time_correction.md#os-system-time`)\nconverted into the `Unit` passed as argument.\n\nCalling `os:system_time(Unit)` is equivalent to\n[`erlang:convert_time_unit`](`erlang:convert_time_unit/3`)([`os:system_time()`](`system_time/0`)`, native, Unit)`.\n\n> #### Note {: .info }\n>\n> This time is _not_ a monotonically increasing time.","title":"os.system_time/1","ref":"os.html#system_time/1"},{"type":"function","doc":"Returns the current [OS system time](`e:erts:time_correction.md#os-system-time`)\nin the same format as `erlang:timestamp/0`.\n\nThe tuple can be used together with function `calendar:now_to_universal_time/1`\nor `calendar:now_to_local_time/1` to get calendar time. Using the calendar time,\ntogether with the `MicroSecs` part of the return tuple from this function,\nallows you to log time stamps in high resolution and consistent with the time in\n the rest of the OS.\n\nExample of code formatting a string in format \"DD Mon YYYY HH:MM:SS.mmmmmm\",\nwhere DD is the day of month, Mon is the textual month name, YYYY is the year,\nHH:MM:SS is the time, and mmmmmm is the microseconds in six positions:\n\n```erlang\n-module(print_time).\n-export([format_utc_timestamp/0]).\nformat_utc_timestamp() ->\n TS = {_,_,Micro} = os:timestamp(),\n {{Year,Month,Day},{Hour,Minute,Second}} =\ncalendar:now_to_universal_time(TS),\n Mstr = element(Month,{\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\n \"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"}),\n io_lib:format(\"~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w\",\n [Day,Mstr,Year,Hour,Minute,Second,Micro]).\n```\n\nThis module can be used as follows:\n\n```erlang\n1> io:format(\"~s~n\",[print_time:format_utc_timestamp()]).\n29 Apr 2009 9:55:30.051711\n```\n\nOS system time can also be retrieved by `system_time/0` and `system_time/1`.","title":"os.timestamp/0","ref":"os.html#timestamp/0"},{"type":"function","doc":"Returns the `Osfamily` and, in some cases, the `Osname` of the current OS.\n\nOn Unix, `Osname` has the same value as `uname -s` returns, but in lower case.\nFor example, on Solaris 1 and 2, it is `sunos`.\n\nOn Windows, `Osname` is `nt`.\n\n> #### Note {: .info }\n>\n> Think twice before using this function. Use module `m:filename` if you want to\n> inspect or build filenames in a portable way. Avoid matching on atom `Osname`.","title":"os.type/0","ref":"os.html#type/0"},{"type":"function","doc":"Deletes the environment variable `VarName`.\n\nIf Unicode filename encoding is in effect (see the\n[`erl` manual page](`e:erts:erl_cmd.md#file_name_encoding`)), the string\n`VarName` can contain characters with codepoints > 255.","title":"os.unsetenv/1","ref":"os.html#unsetenv/1"},{"type":"function","doc":"Returns the OS version. On most systems, this function returns a tuple, but a\nstring is returned instead if the system has versions that cannot be expressed\nas three numbers.\n\n> #### Note {: .info }\n>\n> Think twice before using this function. If you still need to use it, always\n> `call os:type()` first.","title":"os.version/0","ref":"os.html#version/0"},{"type":"type","doc":"A string containing valid characters on the specific OS for environment variable\nnames using [`file:native_name_encoding()`](`file:native_name_encoding/0`)\nencoding.\n\nNull characters (integer value zero) are not allowed. On Unix, `=`\ncharacters are not allowed. On Windows, a `=` character is only allowed as the\nvery first character in the string.","title":"os.env_var_name/0","ref":"os.html#t:env_var_name/0"},{"type":"type","doc":"Assuming that environment variables has been correctly set, a strings containing\nvalid characters on the specific OS for environment variable names and values\nusing [`file:native_name_encoding()`](`file:native_name_encoding/0`) encoding.\n\nThe first `=` characters appearing in the string separates environment variable\nname (on the left) from environment variable value (on the right).","title":"os.env_var_name_value/0","ref":"os.html#t:env_var_name_value/0"},{"type":"type","doc":"A string containing valid characters on the specific OS for environment variable\nvalues using [`file:native_name_encoding()`](`file:native_name_encoding/0`)\nencoding.\n\nNull characters (integer value zero) are not allowed.","title":"os.env_var_value/0","ref":"os.html#t:env_var_value/0"},{"type":"type","doc":"All characters needs to be valid characters on the specific OS using\n[`file:native_name_encoding()`](`file:native_name_encoding/0`) encoding. Null\ncharacters (integer value zero) are not allowed.","title":"os.os_command/0","ref":"os.html#t:os_command/0"},{"type":"type","doc":"Options for [`os:cmd/2`](`cmd/2`).\n\n- **`max_size`** - The maximum size of the data returned by the `os:cmd/2` call.\n See the [`os:cmd/2`](`cmd/2`) documentation for more details.","title":"os.os_command_opts/0","ref":"os.html#t:os_command_opts/0"},{"type":"module","doc":"Erlang network authentication server.\n\nFor a description of the Magic Cookie system, refer\nto [Distributed Erlang](`e:system:distributed.md`) in the Erlang Reference\nManual.","title":"auth","ref":"auth.html"},{"type":"function","doc":"Use [`erlang:get_cookie()`](`erlang:get_cookie/0`) in ERTS instead.","title":"auth.cookie/0","ref":"auth.html#cookie/0"},{"type":"function","doc":"Use [`erlang:set_cookie(node(), Cookie)` in ERTS](`erlang:set_cookie/2`)\ninstead.","title":"auth.cookie/1","ref":"auth.html#cookie/1"},{"type":"function","doc":"Returns `yes` if communication with `Node` is authorized.\n\nUse [`net_adm:ping(Node)`](`net_adm:ping/1`) instead.\n\nNotice that a connection to `Node` is established in this case. Returns `no` if\n`Node` does not exist or communication is not authorized (it has another cookie\nthan `auth` thinks it has).","title":"auth.is_auth/1","ref":"auth.html#is_auth/1"},{"type":"function","doc":"Equivalent to [`node_cookie(Node, Cookie)`](`node_cookie/2`).","title":"auth.node_cookie/1","ref":"auth.html#node_cookie/1"},{"type":"function","doc":"Sets the magic cookie of `Node` to `Cookie` and verifies the status of the\nauthorization.\n\nEquivalent to calling [`erlang:set_cookie(Node, Cookie)`](`erlang:set_cookie/2`),\nfollowed by [`auth:is_auth(Node)`](`is_auth/1`).","title":"auth.node_cookie/2","ref":"auth.html#node_cookie/2"},{"type":"type","doc":"","title":"auth.cookie/0","ref":"auth.html#t:cookie/0"},{"type":"module","doc":"Boot server for other Erlang machines.\n\nThis server is used to assist diskless Erlang nodes that fetch all Erlang code\nfrom another machine.\n\nThis server is used to fetch all code, including the start script, if an Erlang\nruntime system is started with command-line flag `-loader inet`. All hosts\nspecified with command-line flag `-hosts Host` must have one instance of this\nserver running.\n\nThis server can be started with the Kernel configuration parameter\n`start_boot_server`.\n\nThe `erl_boot_server` can read regular files and files in archives. See `m:code`\nand `m:erl_prim_loader` in ERTS.\n\n> #### Warning {: .warning }\n>\n> The support for loading code from archive files is experimental. It is\n> released before it is ready to obtain early feedback. The file format,\n> semantics, interfaces, and so on, can be changed in a future release.","title":"erl_boot_server","ref":"erl_boot_server.html"},{"type":"module","doc":"[`erts:init`](`m:init`), [`erts:erl_prim_loader`](`m:erl_prim_loader`)","title":"SEE ALSO - erl_boot_server","ref":"erl_boot_server.html#module-see-also"},{"type":"function","doc":"Adds a `Slave` node to the list of allowed slave hosts.","title":"erl_boot_server.add_slave/1","ref":"erl_boot_server.html#add_slave/1"},{"type":"function","doc":"Deletes a `Slave` node from the list of allowed slave hosts.","title":"erl_boot_server.delete_slave/1","ref":"erl_boot_server.html#delete_slave/1"},{"type":"function","doc":"Starts the boot server. `Slaves` is a list of IP addresses for hosts, which are\nallowed to use this server as a boot server.","title":"erl_boot_server.start/1","ref":"erl_boot_server.html#start/1"},{"type":"function","doc":"Starts the boot server and links to the caller. This function is used to start\nthe server if it is included in a supervision tree.","title":"erl_boot_server.start_link/1","ref":"erl_boot_server.html#start_link/1"},{"type":"function","doc":"Returns the current list of allowed slave hosts.","title":"erl_boot_server.which_slaves/0","ref":"erl_boot_server.html#which_slaves/0"},{"type":"module","doc":"Erlang interface towards epmd\n\nThis module communicates with the EPMD daemon, see [epmd](`e:erts:epmd_cmd.md`).\nTo implement your own epmd module please see\n[ERTS User's Guide: How to Implement an Alternative Node Discovery for Erlang Distribution](`e:erts:alt_disco.md`)","title":"erl_epmd","ref":"erl_epmd.html"},{"type":"function","doc":"Called by the distribution module to resolves the `Host` to an IP address of a\nremote node.\n\nAs an optimization this function may also return the port and version of the\nremote node. If port and version are returned `port_please/3` will not be\ncalled.","title":"erl_epmd.address_please/3","ref":"erl_epmd.html#address_please/3"},{"type":"function","doc":"Called by the distribution module to get which port the local node should listen\nto when accepting new distribution requests.","title":"erl_epmd.listen_port_please/2","ref":"erl_epmd.html#listen_port_please/2"},{"type":"function","doc":"Called by [`net_adm:names/0`](`m:net_adm`). `Host` defaults to the localhost.\nReturns the names and associated port numbers of the Erlang nodes that `epmd`\nregistered at the specified host. Returns `{error, address}` if `epmd` is not\noperational.\n\n_Example:_\n\n```erlang\n(arne@dunn)1> erl_epmd:names(localhost).\n{ok,[{\"arne\",40262}]}\n```","title":"erl_epmd.names/1","ref":"erl_epmd.html#names/1"},{"type":"function","doc":"","title":"erl_epmd.port_please/2","ref":"erl_epmd.html#port_please/2"},{"type":"function","doc":"Requests the distribution port for the given node of an EPMD instance. Together\nwith the port it returns a distribution protocol version which has been 5 since\nErlang/OTP R6.","title":"erl_epmd.port_please/3","ref":"erl_epmd.html#port_please/3"},{"type":"function","doc":"","title":"erl_epmd.register_node/2","ref":"erl_epmd.html#register_node/2"},{"type":"function","doc":"Registers the node with `epmd` and tells epmd what port will be used for the\ncurrent node. It returns a creation number. This number is incremented on each\nregister to help differentiate a new node instance connecting to epmd with the\nsame name.\n\nAfter the node has successfully registered with epmd it will automatically\nattempt reconnect to the daemon if the connection is broken.","title":"erl_epmd.register_node/3","ref":"erl_epmd.html#register_node/3"},{"type":"function","doc":"This function is invoked as this module is added as a child of the\n`erl_distribution` supervisor.","title":"erl_epmd.start_link/0","ref":"erl_epmd.html#start_link/0"},{"type":"module","doc":"Enhanced Remote Procedure Call\n\nThis module provide services similar to Remote Procedure Calls. A remote\nprocedure call is a method to call a function on a remote node and collect the\nanswer. It is used for collecting information on a remote node, or for running a\nfunction with some specific side effects on the remote node.\n\nThis is an enhanced subset of the operations provided by the `m:rpc` module.\nEnhanced in the sense that it makes it possible to distinguish between returned\nvalue, raised exceptions, and other errors. `erpc` also has better performance\nand scalability than the original `rpc` implementation. However, current `rpc`\nmodule will utilize `erpc` in order to also provide these properties when\npossible.\n\nIn order for an `erpc` operation to succeed, the remote node also needs to\nsupport `erpc`. Typically only ordinary Erlang nodes as of OTP 23 have `erpc`\nsupport.\n\nNote that it is up to the user to ensure that correct code to execute via `erpc`\nis available on the involved nodes.\n\n> #### Note {: .info }\n>\n> For some important information about distributed signals, see the\n> [Blocking Signaling Over Distribution](`e:system:ref_man_processes.md#blocking-signaling-over-distribution`)\n> section in the _Processes_ chapter of the _Erlang Reference Manual_. Blocking\n> signaling can, for example, cause timeouts in `erpc` to be significantly\n> delayed.","title":"erpc","ref":"erpc.html"},{"type":"function","doc":"","title":"erpc.call/2","ref":"erpc.html#call/2"},{"type":"function","doc":"Equivalent to\n[`erpc:call(Node, erlang, apply, [Fun,[]], Timeout)`](`call/5`).\n\nMay raise all the same exceptions as [`call/5`](`call/5`) plus an `{erpc, badarg}`\n`error` exception if `Fun` is not a fun of zero arity.","title":"erpc.call/3","ref":"erpc.html#call/3"},{"type":"function","doc":"","title":"erpc.call/4","ref":"erpc.html#call/4"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node` and\nreturns the corresponding value `Result`. `Timeout` sets an upper time limit for\nthe `call` operation to complete.\n\nThe `call()` function only returns if the applied function successfully returned\nwithout raising any uncaught exceptions, the operation did not time out, and no\nfailures occurred. In all other cases an exception is raised. The following\nexceptions, listed by exception class, can currently be raised by `call()`:\n\n- **`throw`** - The applied function called [`throw(Value)`](`throw/1`) and did\n not catch this exception. The exception reason `Value` equals the argument\n passed to [`throw/1`](`throw/1`).\n\n- **`exit`** - Exception reason:\n\n - **`{exception, ExitReason}`** - The applied function called\n [`exit(ExitReason)`](`exit/1`) and did not catch this exception. The exit\n reason `ExitReason` equals the argument passed to [`exit/1`](`exit/1`).\n\n - **`{signal, ExitReason}`** - The process that applied the function received\n an exit signal and terminated due to this signal. The process terminated\n with exit reason `ExitReason`.\n\n- **`error`** - Exception reason:\n\n - **`{exception, ErrorReason, StackTrace}`** - A runtime error occurred which\n raised an error exception while applying the function, and the applied\n function did not catch the exception. The error reason `ErrorReason`\n indicates the type of error that occurred. `StackTrace` is formatted as when\n caught in a `try/catch` construct. The `StackTrace` is limited to the\n applied function and functions called by it.\n\n - **`{erpc, ERpcErrorReason}`** - The `erpc` operation failed. The following\n `ERpcErrorReason`s are the most common ones:\n\n - **`badarg`** - If any one of these are true:\n\n - `Node` is not an atom.\n - `Module` is not an atom.\n - `Function` is not an atom.\n - `Args` is not a list. Note that the list is not verified to be a proper\n list at the client side.\n - `Timeout` is invalid.\n\n - **`noconnection`** - The connection to `Node` was lost or could not be\n established. The function may or may not be applied.\n\n - **`system_limit`** - The `erpc` operation failed due to some system limit\n being reached. This typically due to failure to create a process on the\n remote node `Node`, but can be other things as well.\n\n - **`timeout`** - The `erpc` operation timed out. The function may or may\n not be applied.\n\n - **`notsup`** - The remote node `Node` does not support this `erpc`\n operation.\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a timeout or a connection loss), the caller will not receive\nany further information about the result if/when the applied function completes.\nIf the applied function explicitly communicates with the calling process, such\ncommunication may, of course, reach the calling process.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, a server, or a freshly\n> spawned process.","title":"erpc.call/5","ref":"erpc.html#call/5"},{"type":"function","doc":"Equivalent to [`erpc:cast(Node,erlang,apply,[Fun,[]])`](`cast/4`).\n\n[`cast/2`](`cast/2`) fails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Fun` is not a a fun of zero arity.","title":"erpc.cast/2","ref":"erpc.html#cast/2"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node`. No\nresponse is delivered to the calling process. `cast()` returns immediately after\nthe cast request has been sent. Any failures beside bad arguments are silently\nignored.\n\n[`cast/4`](`cast/4`) fails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","title":"erpc.cast/4","ref":"erpc.html#cast/4"},{"type":"function","doc":"Check if a message is a response to a `call` request previously made by the\ncalling process using `send_request/4`.\n\n`RequestId` should be the value returned from the previously made\n[`send_request/4`](`send_request/4`) call, and the\ncorresponding response should not already have been received and handled to\ncompletion by [`check_response/2`](`check_response/2`), `receive_response/2`, or\n`wait_response/2`. `Message` is the message to check.\n\nIf `Message` does not correspond to the response, the atom `no_response` is\nreturned. If `Message` corresponds to the response, the `call` operation is\ncompleted and either the result is returned as `{response, Result}` where\n`Result` corresponds to the value returned from the applied function or an\nexception is raised. The exceptions that can be raised corresponds to the same\nexceptions as can be raised by `call/4`. That is, no `{erpc, timeout}` `error`\nexception can be raised. `check_response()` will fail with an `{erpc, badarg}`\nexception if/when an invalid `RequestId` is detected.\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a connection loss), the caller will not receive any further\ninformation about the result if/when the applied function completes. If the\napplied function explicitly communicates with the calling process, such\ncommunication may, of course, reach the calling process.","title":"erpc.check_response/2","ref":"erpc.html#check_response/2"},{"type":"function","doc":"Check if a message is a response to a `call` request corresponding to a request\nidentifier saved in `RequestIdCollection`. All request identifiers of\n`RequestIdCollection` must correspond to requests that have been made using\n`send_request/4` or `send_request/6`, and all requests must have been made by\nthe process calling this function.\n\n`Label` is the label associated with the request identifier of the request that\nthe response corresponds to. A request identifier is associated with a label\nwhen [adding a request identifier](`reqids_add/3`) in a\n[request identifier collection](`t:request_id_collection/0`), or when sending\nthe request using `send_request/6`.\n\nCompared to `check_response/2`, the returned result associated with a specific\nrequest identifier or an exception associated with a specific request identifier\nwill be wrapped in a 3-tuple. The first element of this tuple equals the value\nthat would have been produced by [`check_response/2`](`check_response/2`), the\nsecond element equals the `Label` associated with the specific request\nidentifier, and the third element `NewRequestIdCollection` is a possibly\nmodified request identifier collection. The `error` exception `{erpc, badarg}`\nis not associated with any specific request identifier, and will hence not be\nwrapped.\n\nIf `RequestIdCollection` is empty, the atom `no_request` will be returned. If\n`Message` does not correspond to any of the request identifiers in\n`RequestIdCollection`, the atom `no_response` is returned.\n\nIf `Delete` equals `true`, the association with `Label` will have been deleted\nfrom `RequestIdCollection` in the resulting `NewRequestIdCollection`. If\n`Delete` equals `false`, `NewRequestIdCollection` will equal\n`RequestIdCollection`. Note that deleting an association is not for free and\nthat a collection containing already handled requests can still be used by\nsubsequent calls to [`check_response/3`](`check_response/3`),\n`receive_response/3`, and `wait_response/3`. However, without deleting handled\nassociations, the above calls will not be able to detect when there are no more\noutstanding requests to handle, so you will have to keep track of this some\nother way than relying on a `no_request` return. Note that if you pass a\ncollection only containing associations of already handled or abandoned requests\nto [`check_response/3`](`check_response/3`), it will always return\n`no_response`.\n\nNote that a response might have been consumed uppon an `{erpc, badarg}`\nexception and if so, will be lost for ever.","title":"erpc.check_response/3","ref":"erpc.html#check_response/3"},{"type":"function","doc":"","title":"erpc.multicall/2","ref":"erpc.html#multicall/2"},{"type":"function","doc":"Equivalent to\n[`erpc:multicall(Nodes, erlang, apply, [Fun,[]], Timeout)`](`multicall/5`).\n\nMay raise all the same exceptions as [`multicall/5`](`multicall/5`) plus an\n`{erpc, badarg}` `error` exception if `Fun` is not a fun of zero arity.","title":"erpc.multicall/3","ref":"erpc.html#multicall/3"},{"type":"function","doc":"","title":"erpc.multicall/4","ref":"erpc.html#multicall/4"},{"type":"function","doc":"Performs multiple `call` operations in parallel on multiple nodes.\n\nThat is, evaluates [`apply(Module, Function, Args)`](`apply/3`) on the nodes `Nodes` in\nparallel. `Timeout` sets an upper time limit for all `call` operations to\ncomplete. The result is returned as a list where the result from each node is\nplaced at the same position as the node name is placed in `Nodes`. Each item in\nthe resulting list is formatted as either:\n\n- **`{ok, Result}`** - The `call` operation for this specific node returned\n `Result`.\n\n- **`{Class, ExceptionReason}`** - The `call` operation for this specific node\n raised an exception of class `Class` with exception reason `ExceptionReason`.\n These correspond to the exceptions that `call/5` can raise.\n\n[`multicall/5`](`multicall/5`) fails with an `{erpc, badarg}` `error` exception\nif:\n\n- `Nodes` is not a proper list of atoms. Note that some requests may already\n have been sent when the failure occurs. That is, the function may or may not\n be applied on some nodes.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\nThe call `erpc:multicall(Nodes, Module, Function, Args)` is equivalent to the\ncall `erpc:multicall(Nodes, Module, Function, Args, infinity)`. These calls are\nalso equivalent to calling `my_multicall(Nodes, Module, Function, Args)` below\nif one disregard performance and failure behavior. `multicall()` can utilize a\nselective receive optimization which removes the need to scan the message queue\nfrom the beginning in order to find a matching message. The\n`send_request()/receive_response()` combination can, however, not utilize this\noptimization.\n\n```erlang\nmy_multicall(Nodes, Module, Function, Args) ->\n ReqIds = lists:map(fun (Node) ->\n erpc:send_request(Node, Module, Function, Args)\n end,\n Nodes),\n lists:map(fun (ReqId) ->\n try\n {ok, erpc:receive_response(ReqId, infinity)}\n catch\n Class:Reason ->\n {Class, Reason}\n end\n end,\n ReqIds).\n```\n\nIf an `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a timeout, connection loss, or an improper `Nodes` list), the\ncaller will not receive any further information about the result if/when the\napplied function completes. If the applied function communicates with the\ncalling process, such communication may, of course, reach the calling process.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, a server, or a freshly\n> spawned process.","title":"erpc.multicall/5","ref":"erpc.html#multicall/5"},{"type":"function","doc":"Equivalent to\n[`erpc:multicast(Nodes,erlang,apply,[Fun,[]])`](`multicast/4`).\n\n[`multicast/2`](`multicast/2`) fails with an `{erpc, badarg}` `error` exception\nif:\n\n- `Nodes` is not a proper list of atoms.\n- `Fun` is not a a fun of zero arity.","title":"erpc.multicast/2","ref":"erpc.html#multicast/2"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the nodes `Nodes`. No\nresponse is delivered to the calling process. `multicast()` returns immediately\nafter the cast requests have been sent. Any failures beside bad arguments are\nsilently ignored.\n\n[`multicast/4`](`multicast/4`) fails with an `{erpc, badarg}` `error` exception\nif:\n\n- `Nodes` is not a proper list of atoms. Note that some requests may already\n have been sent when the failure occurs. That is, the function may or may not\n be applied on some nodes.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","title":"erpc.multicast/4","ref":"erpc.html#multicast/4"},{"type":"function","doc":"","title":"erpc.receive_response/1","ref":"erpc.html#receive_response/1"},{"type":"function","doc":"Receive a response to a `call` request previously made by the calling process\nusing `send_request/4`.\n\n`RequestId` should be the value returned from the\npreviously made [`send_request/4`](`send_request/4`) call, and the corresponding\nresponse should not already have been received and handled to completion by\n`receive_response()`, [`check_response/4`](`check_response/2`), or\n[`wait_response/4`](`wait_response/2`).\n\n`Timeout` sets an upper time limit on how long to wait for a response. If the\noperation times out, the request identified by `RequestId` will be abandoned,\nthen an `{erpc, timeout}` `error` exception will be raised. That is, no response\ncorresponding to the request will ever be received after a timeout. If a\nresponse is received, the `call` operation is completed and either the result is\nreturned or an exception is raised. The exceptions that can be raised\ncorresponds to the same exceptions as can be raised by `call/5`.\n[`receive_response/2`](`receive_response/2`) will fail with an `{erpc, badarg}`\nexception if/when an invalid `RequestId` is detected or if an invalid `Timeout`\nis passed.\n\nA call to the function `my_call(Node, Module, Function, Args, Timeout)` below is\nequivalent to the call\n[`erpc:call(Node, Module, Function, Args, Timeout)`](`call/5`) if one disregards\nperformance. `call()` can utilize a selective receive optimization which removes\nthe need to scan the message queue from the beginning in order to find a\nmatching message. The `send_request()/receive_response()` combination can,\nhowever, not utilize this optimization.\n\n```erlang\nmy_call(Node, Module, Function, Args, Timeout) ->\n RequestId = erpc:send_request(Node, Module, Function, Args),\n erpc:receive_response(RequestId, Timeout).\n```\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a timeout, or a connection loss), the caller will not receive\nany further information about the result if/when the applied function completes.\nIf the applied function explicitly communicates with the calling process, such\ncommunication may, of course, reach the calling process.","title":"erpc.receive_response/2","ref":"erpc.html#receive_response/2"},{"type":"function","doc":"Receive a response to a `call` request corresponding to a request identifier\nsaved in `RequestIdCollection`. All request identifiers of `RequestIdCollection`\nmust correspond to requests that have been made using `send_request/4` or\n`send_request/6`, and all requests must have been made by the process calling\nthis function.\n\n`Label` is the label associated with the request identifier of the request that\nthe response corresponds to. A request identifier is associated with a label\nwhen [adding a request identifier](`reqids_add/3`) in a\n[request identifier collection](`t:request_id_collection/0`), or when sending\nthe request using `send_request/6`.\n\nCompared to `receive_response/2`, the returned result associated with a specific\nrequest identifier or an exception associated with a specific request identifier\nwill be wrapped in a 3-tuple. The first element of this tuple equals the value\nthat would have been produced by [`receive_response/2`](`receive_response/2`),\nthe second element equals the `Label` associated with the specific request\nidentifier, and the third element `NewRequestIdCollection` is a possibly\nmodified request identifier collection. The `error` exceptions `{erpc, badarg}`\nand `{erpc, timeout}` are not associated with any specific request identifiers,\nand will hence not be wrapped.\n\nIf `RequestIdCollection` is empty, the atom `no_request` will be returned.\n\nIf the operation times out, all requests identified by `RequestIdCollection`\nwill be abandoned, then an `{erpc, timeout}` `error` exception will be raised.\nThat is, no responses corresponding to any of the request identifiers in\n`RequestIdCollection` will ever be received after a timeout. The difference\nbetween [`receive_response/3`](`receive_response/3`) and `wait_response/3` is\nthat [`receive_response/3`](`receive_response/3`) abandons the requests at\ntimeout so that any potential future responses are ignored, while\n[`wait_response/3`](`wait_response/3`) does not.\n\nIf `Delete` equals `true`, the association with `Label` will have been deleted\nfrom `RequestIdCollection` in the resulting `NewRequestIdCollection`. If\n`Delete` equals `false`, `NewRequestIdCollection` will equal\n`RequestIdCollection`. Note that deleting an association is not for free and\nthat a collection containing already handled requests can still be used by\nsubsequent calls to [`receive_response/3`](`receive_response/3`),\n`check_response/3`, and `wait_response/3`. However, without deleting handled\nassociations, the above calls will not be able to detect when there are no more\noutstanding requests to handle, so you will have to keep track of this some\nother way than relying on a `no_request` return. Note that if you pass a\ncollection only containing associations of already handled or abandoned requests\nto [`receive_response/3`](`receive_response/3`), it will always block until a\ntimeout determined by `Timeout` is triggered.\n\nNote that a response might have been consumed uppon an `{erpc, badarg}`\nexception and if so, will be lost for ever.","title":"erpc.receive_response/3","ref":"erpc.html#receive_response/3"},{"type":"function","doc":"Saves `RequestId` and associates a `Label` with the request identifier by adding\nthis information to `RequestIdCollection` and returning the resulting request\nidentifier collection.","title":"erpc.reqids_add/3","ref":"erpc.html#reqids_add/3"},{"type":"function","doc":"Returns a new empty request identifier collection. A request identifier\ncollection can be utilized in order the handle multiple outstanding requests.\n\nRequest identifiers of requests made by `send_request/4` can be saved in a\nrequest identifier collection using `reqids_add/3`. Such a collection of request\nidentifiers can later be used in order to get one response corresponding to a\nrequest in the collection by passing the collection as argument to\n`check_response/3`, `receive_response/3`, and `wait_response/3`.\n\n`reqids_size/1` can be used to determine the amount of request identifiers in a\nrequest identifier collection.","title":"erpc.reqids_new/0","ref":"erpc.html#reqids_new/0"},{"type":"function","doc":"Returns the amount of request identifiers saved in `RequestIdCollection`.","title":"erpc.reqids_size/1","ref":"erpc.html#reqids_size/1"},{"type":"function","doc":"Returns a list of `{RequestId, Label}` tuples which corresponds to all request\nidentifiers with their associated labels present in the `RequestIdCollection`\ncollection.","title":"erpc.reqids_to_list/1","ref":"erpc.html#reqids_to_list/1"},{"type":"function","doc":"Equivalent to\n[`erpc:send_request(Node, erlang, apply, [Fun, []])`](`send_request/4`).\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Fun` is not a fun of zero arity.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","title":"erpc.send_request/2","ref":"erpc.html#send_request/2"},{"type":"function","doc":"Send an asynchronous `call` request to the node `Node`.\n\n[`send_request/4`](`send_request/4`) returns a request identifier that later is\nto be passed to either `receive_response/2`, `wait_response/2`, or,\n`check_response/2` in order to get the response of the call request. Besides\npassing the request identifier directly to these functions, it can also be added\nin a request identifier collection using `reqids_add/3`. Such a collection of\nrequest identifiers can later be used in order to get one response corresponding\nto a request in the collection by passing the collection as argument to\n`receive_response/3`, `wait_response/3`, or, `check_response/3`. If you are\nabout to save the request identifier in a request identifier collection, you may\nwant to consider using `send_request/6` instead.\n\nA call to the function `my_call(Node, Module, Function, Args, Timeout)` below is\nequivalent to the call\n[`erpc:call(Node, Module, Function, Args, Timeout)`](`call/5`) if one disregards\nperformance. `call()` can utilize a selective receive optimization which removes\nthe need to scan the message queue from the beginning in order to find a\nmatching message. The `send_request()/receive_response()` combination can,\nhowever, not utilize this optimization.\n\n```erlang\nmy_call(Node, Module, Function, Args, Timeout) ->\n RequestId = erpc:send_request(Node, Module, Function, Args),\n erpc:receive_response(RequestId, Timeout).\n```\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.\n\nEquivalent to\n[`erpc:send_request(Node, erlang, apply, [Fun,[]]), Label, RequestIdCollection)`](`send_request/6`).\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Fun` is not a fun of zero arity.\n- `RequestIdCollection` is detected not to be request identifier collection.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","title":"erpc.send_request/4","ref":"erpc.html#send_request/4"},{"type":"function","doc":"Send an asynchronous `call` request to the node `Node`. The `Label` will be\nassociated with the request identifier of the operation and added to the\nreturned request identifier collection `NewRequestIdCollection`. The collection\ncan later be used in order to get one response corresponding to a request in the\ncollection by passing the collection as argument to `receive_response/3`,\n`wait_response/3`, or, `check_response/3`.\n\nEquivalent to\n[`erpc:reqids_add`](`reqids_add/3`)([`erpc:send_request`](`send_request/4`)`(Node, Module, Function, Args), Label, RequestIdCollection)`,\nbut calling [`send_request/6`](`send_request/6`) is slightly more efficient.\n\nFails with an `{erpc, badarg}` `error` exception if:\n\n- `Node` is not an atom.\n- `Module` is not an atom.\n- `Function` is not an atom.\n- `Args` is not a list. Note that the list is not verified to be a proper list\n at the client side.\n- `RequestIdCollection` is detected not to be request identifier collection.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be a server, or a freshly spawned process.","title":"erpc.send_request/6","ref":"erpc.html#send_request/6"},{"type":"function","doc":"Equivalent to [`erpc:wait_response(RequestId, 0)`](`wait_response/2`).\nThat is, poll for a response message to a `call` request previously made by the\ncalling process.","title":"erpc.wait_response/1","ref":"erpc.html#wait_response/1"},{"type":"function","doc":"Wait or poll for a response message to a `call` request previously made by the\ncalling process using `send_request/4`.\n\n`RequestId` should be the value returned from the previously made `send_request()`\ncall, and the corresponding response should not already have been received and\nhandled to completion by `check_response/2`, `receive_response/2`, or `wait_response()`.\n\n`WaitTime` sets an upper time limit on how long to wait for a response. If no\nresponse is received before the `WaitTime` timeout has triggered, the atom\n`no_response` is returned. It is valid to continue waiting for a response as\nmany times as needed up until a response has been received and completed by\n`check_response()`, `receive_response()`, or `wait_response()`. If a response is\nreceived, the `call` operation is completed and either the result is returned as\n`{response, Result}` where `Result` corresponds to the value returned from the\napplied function or an exception is raised. The exceptions that can be raised\ncorresponds to the same exceptions as can be raised by `call/4`. That is, no\n`{erpc, timeout}` `error` exception can be raised.\n[`wait_response/2`](`wait_response/2`) will fail with an `{erpc, badarg}`\nexception if/when an invalid `RequestId` is detected or if an invalid `WaitTime`\nis passed.\n\nIf the `erpc` operation fails, but it is unknown if the function is/will be\napplied (that is, a too large wait time value, or a connection loss), the caller\nwill not receive any further information about the result if/when the applied\nfunction completes. If the applied function explicitly communicates with the\ncalling process, such communication may, of course, reach the calling process.","title":"erpc.wait_response/2","ref":"erpc.html#wait_response/2"},{"type":"function","doc":"Wait or poll for a response to a `call` request corresponding to a request\nidentifier saved in `RequestIdCollection`. All request identifiers of\n`RequestIdCollection` must correspond to requests that have been made using\n`send_request/4` or `send_request/6`, and all requests must have been made by\nthe process calling this function.\n\n`Label` is the label associated with the request identifier of the request that\nthe response corresponds to. A request identifier is associated with a label\nwhen [adding a request identifier](`reqids_add/3`) in a\n[request identifier collection](`t:request_id_collection/0`), or when sending\nthe request using `send_request/6`.\n\nCompared to `wait_response/2`, the returned result associated with a specific\nrequest identifier or an exception associated with a specific request identifier\nwill be wrapped in a 3-tuple. The first element of this tuple equals the value\nthat would have been produced by [`wait_response/2`](`wait_response/2`), the\nsecond element equals the `Label` associated with the specific request\nidentifier, and the third element `NewRequestIdCollection` is a possibly\nmodified request identifier collection. The `error` exception `{erpc, badarg}`\nis not associated with any specific request identifier, and will hence not be\nwrapped.\n\nIf `RequestIdCollection` is empty, `no_request` will be returned. If no response\nis received before the `WaitTime` timeout has triggered, the atom `no_response`\nis returned. It is valid to continue waiting for a response as many times as\nneeded up until a response has been received and completed by\n`check_response()`, `receive_response()`, or `wait_response()`. The difference\nbetween `receive_response/3` and [`wait_response/3`](`wait_response/3`) is that\n[`receive_response/3`](`receive_response/3`) abandons requests at timeout so\nthat any potential future responses are ignored, while\n[`wait_response/3`](`wait_response/3`) does not.\n\nIf `Delete` equals `true`, the association with `Label` will have been deleted\nfrom `RequestIdCollection` in the resulting `NewRequestIdCollection`. If\n`Delete` equals `false`, `NewRequestIdCollection` will equal\n`RequestIdCollection`. Note that deleting an association is not for free and\nthat a collection containing already handled requests can still be used by\nsubsequent calls to [`wait_response/3`](`wait_response/3`), `check_response/3`,\nand `receive_response/3`. However, without deleting handled associations, the\nabove calls will not be able to detect when there are no more outstanding\nrequests to handle, so you will have to keep track of this some other way than\nrelying on a `no_request` return. Note that if you pass a collection only\ncontaining associations of already handled or abandoned requests to\n[`wait_response/3`](`wait_response/3`), it will always block until a timeout\ndetermined by `WaitTime` is triggered and then return `no_response`.\n\nNote that a response might have been consumed uppon an `{erpc, badarg}`\nexception and if so, will be lost for ever.","title":"erpc.wait_response/3","ref":"erpc.html#wait_response/3"},{"type":"type","doc":"","title":"erpc.caught_call_exception/0","ref":"erpc.html#t:caught_call_exception/0"},{"type":"opaque","doc":"An opaque request identifier. For more information see `send_request/4`.","title":"erpc.request_id/0","ref":"erpc.html#t:request_id/0"},{"type":"opaque","doc":"An opaque collection of request identifiers (`t:request_id/0`) where each\nrequest identifier can be associated with a label chosen by the user. For more\ninformation see `reqids_new/0`.","title":"erpc.request_id_collection/0","ref":"erpc.html#t:request_id_collection/0"},{"type":"type","doc":"","title":"erpc.stack_item/0","ref":"erpc.html#t:stack_item/0"},{"type":"type","doc":"The timeout time used by erpc functions.\n\nThe value can be:\n\n- **`0..4294967295`** - Timeout relative to current time in milliseconds.\n\n- **`infinity`** - Infinite timeout. That is, the operation will never time out.\n\n- **`{abs, Timeout}`** - An absolute\n [Erlang monotonic time](`erlang:monotonic_time/1`) timeout in milliseconds.\n That is, the operation will time out when\n [`erlang:monotonic_time(millisecond)`](`erlang:monotonic_time/1`) returns a\n value larger than or equal to `Timeout`. `Timeout` is not allowed to identify\n a time further into the future than `4294967295` milliseconds. Identifying the\n timeout using an absolute timeout value is especially handy when you have a\n deadline for responses corresponding to a complete collection of requests\n (`t:request_id_collection/0`) , since you do not have to recalculate the\n relative time until the deadline over and over again.","title":"erpc.timeout_time/0","ref":"erpc.html#t:timeout_time/0"},{"type":"module","doc":"A global name registration facility.\n\nThis module consists of the following services:\n\n- Registration of global names\n- Global locks\n- Maintenance of the fully connected network\n\n[](){: #prevent_overlapping_partitions }\n\nAs of OTP 25, `global` will by default prevent overlapping partitions due to\nnetwork issues by actively disconnecting from nodes that reports that they have\nlost connections to other nodes. This will cause fully connected partitions to\nform instead of leaving the network in a state with overlapping partitions.\n\n> #### Warning {: .warning }\n>\n> Prevention of overlapping partitions can be disabled using the\n> [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n> Kernel parameter, making `global` behave like it used to do. This is,\n> however, problematic for all applications expecting a fully connected network\n> to be provided, such as for example `mnesia`, but also for `global` itself. A\n> network of overlapping partitions might cause the internal state of `global`\n> to become inconsistent. Such an inconsistency can remain even after such\n> partitions have been brought together to form a fully connected network again.\n> The effect on other applications that expects that a fully connected network\n> is maintained may vary, but they might misbehave in very subtle hard to detect\n> ways during such a partitioning. Since you might get hard to detect issues\n> without this fix, you are _strongly_ advised _not_ to disable this fix. Also\n> note that this fix _has_ to be enabled on _all_ nodes in the network in order\n> to work properly.\n\n> #### Note {: .info }\n>\n> None of the above services will be reliably delivered unless both of the\n> kernel parameters [`connect_all`](kernel_app.md#connect_all) and\n> [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n> are enabled. Calls to the `global` API will, however, _not_ fail even though\n> one or both of them are disabled. You will just get unreliable results.\n\nThese services are controlled through the process `global_name_server` that\nexists on every node. The global name server starts automatically when a node is\nstarted. With the term _global_ is meant over a system consisting of many Erlang\nnodes.\n\nThe ability to globally register names is a central concept in the programming\nof distributed Erlang systems. In this module, the equivalent of the\n[`register/2`](`register/2`) and [`whereis/1`](`whereis/1`) BIFs (for local name\nregistration) are provided, but for a network of Erlang nodes. A registered name\nis an alias for a process identifier (pid). The global name server monitors\nglobally registered pids. If a process terminates, the name is also globally\nunregistered.\n\nThe registered names are stored in replica global name tables on every node.\nThere is no central storage point. Thus, the translation of a name to a pid is\nfast, as it is always done locally. For any action resulting in a change to the\nglobal name table, all tables on other nodes are automatically updated.\n\nGlobal locks have lock identities and are set on a specific resource. For\nexample, the specified resource can be a pid. When a global lock is set, access\nto the locked resource is denied for all resources other than the lock\nrequester.\n\nBoth the registration and lock services are atomic. All nodes involved in these\nactions have the same view of the information.\n\nThe global name server also performs the critical task of continuously\nmonitoring changes in node configuration. If a node that runs a globally\nregistered process goes down, the name is globally unregistered. To this end,\nthe global name server subscribes to `nodeup` and `nodedown` messages sent from\nmodule `net_kernel`. Relevant Kernel application variables in this context are\n[`net_setuptime`](kernel_app.md#net_setuptime), [`net_ticktime`](kernel_app.md#net_ticktime),\nand [`dist_auto_connect`](kernel_app.md#dist_auto_connect).\n\nThe name server also maintains a fully connected network. For example, if node\n`N1` connects to node `N2` (which is already connected to `N3`), the global name\nservers on the nodes `N1` and `N3` ensure that also `N1` and `N3` are connected.\nIn this case, the name registration service cannot be used, but the lock\nmechanism still works.\n\nIf the global name server fails to connect nodes (`N1` and `N3` in the example),\na warning event is sent to the error logger. The presence of such an event does\nnot exclude the nodes to connect later (you can, for example, try command\n`rpc:call(N1, net_adm, ping, [N2])` in the Erlang shell), but it indicates a\nnetwork problem.\n\n> #### Note {: .info }\n>\n> If the fully connected network is not set up properly, try first to increase\n> the value of `net_setuptime`.","title":"global","ref":"global.html"},{"type":"module","doc":"`m:global_group`, `m:net_kernel`","title":"See Also - global","ref":"global.html#module-see-also"},{"type":"function","doc":"","title":"global.del_lock/1","ref":"global.html#del_lock/1"},{"type":"function","doc":"Deletes the lock `Id` synchronously.","title":"global.del_lock/2","ref":"global.html#del_lock/2"},{"type":"function","doc":"Disconnect from all other nodes known to `global`.\n\nA list of node names (in an unspecified order) is returned which corresponds to\nthe nodes that were disconnected. All disconnect operations performed have completed when\n`global:disconnect/0` returns.\n\nThe disconnects will be made in such a way that only the current node will be\nremoved from the cluster of `global` nodes. If\n[`prevent_overlapping_partitions`] is\nenabled and you disconnect, from other nodes in the cluster of `global` nodes,\nby other means, `global` on the other nodes may partition the remaining nodes in\norder to ensure that no overlapping partitions appear. Even if\n[`prevent_overlapping_partitions`] is disabled, you should preferably use\n`global:disconnect/0` in order to remove current node from a cluster of `global`\nnodes, since you otherwise likely _will_ create overlapping partitions which\nmight [cause problems](`m:global#prevent_overlapping_partitions`).\n\nNote that if the node is going to be halted, there is _no_ need to remove it\nfrom a cluster of `global` nodes explicitly by calling `global:disconnect/0`\nbefore halting it. The removal from the cluster is taken care of automatically\nwhen the node halts regardless of whether [`prevent_overlapping_partitions`] is\nenabled or not.\n\nIf current node has been configured to be part of a\n[_global group_](`m:global_group`), only connected and/or synchronized nodes in\nthat group are known to `global`, so `global:disconnect/0` will _only_\ndisconnect from those nodes. If current node is _not_ part of a _global group_,\nall [connected visible nodes](`erlang:nodes/0`) will be known to `global`, so\n`global:disconnect/0` will disconnect from all those nodes.\n\nNote that information about connected nodes does not instantaneously reach\n`global`, so the caller might see a node part of the result returned by\n[`nodes()`](`erlang:nodes/0`) while it still is not known to `global`. The\ndisconnect operation will, however, still not cause any overlapping partitions\nwhen [`prevent_overlapping_partitions`] is enabled. If\n[`prevent_overlapping_partitions`] is disabled, overlapping partitions might form\nin this case.\n\nNote that when [`prevent_overlapping_partitions`] is enabled, you may see warning\nreports on other nodes when they detect that current node has disconnected.\nThese are in this case completely harmless and can be ignored.\n\n[`prevent_overlapping_partitions`]: kernel_app.md#prevent_overlapping_partitions","title":"global.disconnect/0","ref":"global.html#disconnect/0"},{"type":"function","doc":"The function unregisters both pids and sends the message\n`{global_name_conflict, Name, OtherPid}` to both processes.\n\nCan be used as a name resolving function for `register_name/3` and\n`re_register_name/3`.","title":"global.notify_all_name/3","ref":"global.html#notify_all_name/3"},{"type":"function","doc":"The function randomly selects one of the pids for registration and kills the\nother one.\n\nCan be used as a name resolving function for `register_name/3` and\n`re_register_name/3`.","title":"global.random_exit_name/3","ref":"global.html#random_exit_name/3"},{"type":"function","doc":"The function randomly selects one of the pids for registration, and sends the\nmessage `{global_name_conflict, Name}` to the other pid.\n\nCan be used as a name resolving function for `register_name/3` and\n`re_register_name/3`.","title":"global.random_notify_name/3","ref":"global.html#random_notify_name/3"},{"type":"function","doc":"","title":"global.re_register_name/2","ref":"global.html#re_register_name/2"},{"type":"function","doc":"Atomically changes the registered name `Name` on all nodes to refer to `Pid`.\n\nFunction `Resolve` has the same behavior as in\n[`register_name/2,3`](`register_name/2`).","title":"global.re_register_name/3","ref":"global.html#re_register_name/3"},{"type":"function","doc":"","title":"global.register_name/2","ref":"global.html#register_name/2"},{"type":"function","doc":"Globally associates name `Name` with a pid, that is, globally notifies all nodes\nof a new global name in a network of Erlang nodes.\n\nWhen new nodes are added to the network, they are informed of the globally\nregistered names that already exist. The network is also informed of any global\nnames in newly connected nodes. If any name clashes are discovered, function\n`Resolve` is called. Its purpose is to decide which pid is correct. If the\nfunction crashes, or returns anything other than one of the pids, the name is\nunregistered. This function is called once for each name clash.\n\n> #### Warning {: .warning }\n>\n> If you plan to change code without restarting your system, you must use an\n> external fun (`fun Module:Function/Arity`) as function `Resolve`. If you use a\n> local fun, you can never replace the code for the module that the fun belongs\n> to.\n\nThree predefined resolve functions exist:\n[`random_exit_name/3`](`random_exit_name/3`),\n[`random_notify_name/3`](`random_notify_name/3`), and\n[`notify_all_name/3`](`notify_all_name/3`).\n\nThis function is completely synchronous, that is, when this function returns,\nthe name is either registered on all nodes or none.\n\nThe function returns `yes` if successful, `no` if it fails. For example, `no` is\nreturned if an attempt is made to register an already registered process or to\nregister a process with a name that is already in use.\n\n> #### Note {: .info }\n>\n> Releases up to and including Erlang/OTP R10 did not check if the process was\n> already registered. The global name table could therefore become inconsistent.\n> The old (buggy) behavior can be chosen by giving the Kernel application\n> variable `global_multi_name_action` the value `allow`.\n\nIf a process with a registered name dies, or the node goes down, the name is\nunregistered on all nodes.","title":"global.register_name/3","ref":"global.html#register_name/3"},{"type":"function","doc":"Returns a list of all globally registered names.","title":"global.registered_names/0","ref":"global.html#registered_names/0"},{"type":"function","doc":"Sends message `Msg` to the pid globally registered as `Name`.\n\nIf `Name` is not a globally registered name, the calling function exits with\nreason `{badarg, {Name, Msg}}`.","title":"global.send/2","ref":"global.html#send/2"},{"type":"function","doc":"","title":"global.set_lock/1","ref":"global.html#set_lock/1"},{"type":"function","doc":"","title":"global.set_lock/2","ref":"global.html#set_lock/2"},{"type":"function","doc":"Sets a lock on the specified nodes on using `t:id/0`.\n\nIf a lock already exists on `ResourceId` for another requester than `LockRequesterId`,\nand `Retries` is not equal to `0`, the process sleeps for a while and tries to\nexecute the action later. When `Retries` attempts have been made, `false` is\nreturned, otherwise `true`. If `Retries` is `infinity`, `true` is eventually\nreturned (unless the lock is never released).\n\nThis function is completely synchronous.\n\nIf a process that holds a lock dies, or the node goes down, the locks held by\nthe process are deleted.\n\nThe global name server keeps track of all processes sharing the same lock, that\nis, if two processes set the same lock, both processes must delete the lock.\n\nThis function does not address the problem of a deadlock. A deadlock can never\noccur as long as processes only lock one resource at a time. A deadlock can\noccur if some processes try to lock two or more resources. It is up to the\napplication to detect and rectify a deadlock.\n\n> #### Note {: .info }\n>\n> Avoid the following values of `ResourceId`, otherwise Erlang/OTP does not work\n> properly:\n>\n> - `dist_ac`\n> - `global`\n> - `mnesia_adjust_log_writes`\n> - `mnesia_table_lock`","title":"global.set_lock/3","ref":"global.html#set_lock/3"},{"type":"function","doc":"Synchronizes the global name server with all nodes known to this node.\n\nThese are the nodes that are returned from [`nodes()`](`erlang:nodes/0`). When\nthis function returns, the global name server receives global information from\nall nodes. This function can be called when new nodes are added to the network.\n\nThe only possible error reason `Reason` is\n`{\"global_groups definition error\", Error}`.","title":"global.sync/0","ref":"global.html#sync/0"},{"type":"function","doc":"","title":"global.trans/2","ref":"global.html#trans/2"},{"type":"function","doc":"","title":"global.trans/3","ref":"global.html#trans/3"},{"type":"function","doc":"Sets a lock on `Id` (using `set_lock/3`).\n\nIf this succeeds, `Fun()` is evaluated and the result `Res` is returned.\nReturns `aborted` if the lock attempt fails. If `Retries` is set to `infinity`,\nthe transaction does not abort.\n\n`infinity` is the default setting and is used if no value is specified for\n`Retries`.","title":"global.trans/4","ref":"global.html#trans/4"},{"type":"function","doc":"Removes the globally registered name `Name` from the network of Erlang nodes.","title":"global.unregister_name/1","ref":"global.html#unregister_name/1"},{"type":"function","doc":"Returns the pid with the globally registered name `Name`. Returns `undefined` if\nthe name is not globally registered.","title":"global.whereis_name/1","ref":"global.html#whereis_name/1"},{"type":"type","doc":"A lock id used to set or delete lock `ResourceId` on behalf of `LockRequesterId`.","title":"global.id/0","ref":"global.html#t:id/0"},{"type":"type","doc":"","title":"global.method/0","ref":"global.html#t:method/0"},{"type":"type","doc":"","title":"global.retries/0","ref":"global.html#t:retries/0"},{"type":"type","doc":"","title":"global.trans_fun/0","ref":"global.html#t:trans_fun/0"},{"type":"module","doc":"Grouping nodes to global name registration groups.\n\nThis module makes it possible to partition the nodes of a system into _global\ngroups_. Each global group has its own global namespace, see `m:global`.\n\nThe main advantage of dividing systems into global groups is that the background\nload decreases while the number of nodes to be updated is reduced when\nmanipulating globally registered names.\n\nThe Kernel configuration parameter [`global_groups`](kernel_app.md#global_groups)\ndefines the global groups:\n\n```erlang\n{global_groups, [GroupTuple :: group_tuple()]}\n```\n\nFor the processes and nodes to run smoothly using the global group\nfunctionality, the following criteria must be met:\n\n- An instance of the global group server, `global_group`, must be running on\n each node. The processes are automatically started and synchronized when a\n node is started.\n- All involved nodes must agree on the global group definition, otherwise the\n behavior of the system is undefined.\n- _All_ nodes in the system must belong to exactly one global group.\n\nIn the following descriptions, a _group node_ is a node belonging to the same\nglobal group as the local node.","title":"global_group","ref":"global_group.html"},{"type":"module","doc":"- In the situation where a node has lost its connections to other nodes in its\n global group, but has connections to nodes in other global groups, a request\n from another global group can produce an incorrect or misleading result. For\n example, the isolated node can have inaccurate information about registered\n names in its global group.\n- Function [`send/2,3`](`send/2`) is not secure.\n- Distribution of applications is highly dependent of the global group\n definitions. It is not recommended that an application is distributed over\n many global groups, as the registered names can be moved to another global\n group at failover/takeover. Nothing prevents this to be done, but the\n application code must then handle the situation.","title":"Notes - global_group","ref":"global_group.html#module-notes"},{"type":"module","doc":"`m:global`, [`erl`](`e:erts:erl_cmd.md`)","title":"See Also - global_group","ref":"global_group.html#module-see-also"},{"type":"function","doc":"Returns a tuple containing the name of the global group that the local node\nbelongs to, and the list of all other known group names.\n\nReturns `undefined` if no global groups are defined.","title":"global_group.global_groups/0","ref":"global_group.html#global_groups/0"},{"type":"function","doc":"Returns a list containing information about the global groups. Each list element\nis a tuple. The order of the tuples is undefined.\n\n- **`{state, State}`** - If the local node is part of a global group, `State` is\n equal to `synced`. If no global groups are defined, `State` is equal to\n `no_conf`.\n\n- **`{own_group_name, GroupName}`** - The name (atom) of the group that the\n local node belongs to.\n\n- **`{own_group_nodes, Nodes}`** - A list of node names (atoms), the group\n nodes.\n\n- **`{synced_nodes, Nodes}`** - A list of node names, the group nodes currently\n synchronized with the local node.\n\n- **`{sync_error, Nodes}`** - A list of node names, the group nodes with which\n the local node has failed to synchronize.\n\n- **`{no_contact, Nodes}`** - A list of node names, the group nodes to which\n there are currently no connections.\n\n- **`{other_groups, Groups}`** - `Groups` is a list of tuples\n `{GroupName, Nodes}`, specifying the name and nodes of the other global\n groups.\n\n- **`{monitoring, Pids}`** - A list of pids, specifying the processes that have\n subscribed to `nodeup` and `nodedown` messages.","title":"global_group.info/0","ref":"global_group.html#info/0"},{"type":"function","doc":"Alter the calling process' subscription of node status change messages.\n\nIf `Flag` is equal to `true` the calling process starts subscribing to\nnode status change messages. If equal to `false` it stops subscribing.\n\nA process that has subscribed receives the messages `{nodeup, Node}` and\n`{nodedown, Node}` when a group node connects or disconnects, respectively.","title":"global_group.monitor_nodes/1","ref":"global_group.html#monitor_nodes/1"},{"type":"function","doc":"Returns the names of all group nodes, regardless of their current status.","title":"global_group.own_nodes/0","ref":"global_group.html#own_nodes/0"},{"type":"function","doc":"Returns a list of all names that are globally registered on the specified node\nor in the specified global group.","title":"global_group.registered_names/1","ref":"global_group.html#registered_names/1"},{"type":"function","doc":"Sends `Msg` to the pid represented by the globally registered name `Name`.\n\n`send/2` searches for `Name` any any global group. The global groups are searched\nin the order that they appear in the value of configuration parameter\n[`global_groups`](kernel_app.md#global_groups).\n\nIf `Name` is found, message `Msg` is sent to the corresponding pid. The pid is\nalso the return value of the function. If the name is not found, the function\nreturns `{badarg, {Name, Msg}}`.","title":"global_group.send/2","ref":"global_group.html#send/2"},{"type":"function","doc":"Equivalent to [`send(Name, Msg)`](`send/2`) except that he search is limited\nto the node or global group specified by `Where`.","title":"global_group.send/3","ref":"global_group.html#send/3"},{"type":"function","doc":"Synchronizes the group nodes, that is, the global name servers on the group\nnodes. Also checks the names globally registered in the current global group and\nunregisters them on any known node not part of the group.\n\nIf synchronization is not possible, an error report is sent to the error logger\n(see also `m:error_logger`.\n\nReturns `{error, {'invalid global_groups definition', Bad}}` if configuration\nparameter `global_groups` has an invalid value `Bad`.","title":"global_group.sync/0","ref":"global_group.html#sync/0"},{"type":"function","doc":"Searched for `Name` in any global group.\n\nThe global groups are searched in the order that they appear in the value\nof configuration parameter `global_groups`.\n\nIf `Name` is found, the corresponding pid is returned. If the name is not found,\nthe function returns `undefined`.","title":"global_group.whereis_name/1","ref":"global_group.html#whereis_name/1"},{"type":"function","doc":"Equivalent to [`whereis_name(Name)`](`whereis_name/1`) except that he search is limited\nto the node or global group specified by `Where`.","title":"global_group.whereis_name/2","ref":"global_group.html#whereis_name/2"},{"type":"type","doc":"","title":"global_group.group_name/0","ref":"global_group.html#t:group_name/0"},{"type":"type","doc":"A `GroupTuple` without `PublishType` is the same as a `GroupTuple` with\n`PublishType` equal to `normal`.","title":"global_group.group_tuple/0","ref":"global_group.html#t:group_tuple/0"},{"type":"type","doc":"","title":"global_group.info_item/0","ref":"global_group.html#t:info_item/0"},{"type":"type","doc":"A registered name.","title":"global_group.name/0","ref":"global_group.html#t:name/0"},{"type":"type","doc":"A node started with command-line flag `-hidden` (see\n[`erl`](`e:erts:erl_cmd.md`)) is said to be a _hidden_ node. A hidden node\nestablishes hidden connections to nodes not part of the same global group, but\nnormal (visible) connections to nodes part of the same global group.\n\nA global group defined with `PublishType` equal to `hidden` is said to be a\nhidden global group. All nodes in a hidden global group are hidden nodes,\nwhether they are started with command-line flag `-hidden` or not.","title":"global_group.publish_type/0","ref":"global_group.html#t:publish_type/0"},{"type":"type","doc":"","title":"global_group.sync_state/0","ref":"global_group.html#t:sync_state/0"},{"type":"type","doc":"","title":"global_group.where/0","ref":"global_group.html#t:where/0"},{"type":"module","doc":"Various Erlang net administration routines.\n\nThis module contains various network utility functions.","title":"net_adm","ref":"net_adm.html"},{"type":"module","doc":"File `.hosts.erlang` consists of a number of host names written as Erlang terms.\nIt is looked for in the current work directory, the user's home directory, and\n`$OTPROOT` (the root directory of Erlang/OTP), in that order.\n\nThe format of file `.hosts.erlang` must be one host name per line. The host\nnames must be within quotes.\n\n_Example:_\n\n```text\n'super.eua.ericsson.se'.\n'renat.eua.ericsson.se'.\n'grouse.eua.ericsson.se'.\n'gauffin1.eua.ericsson.se'.\n^ (new line)\n```","title":"Files - net_adm","ref":"net_adm.html#module-files"},{"type":"function","doc":"Returns the official name of `Host`, or `{error, Host}` if no such name is\nfound. See also `m:inet`.","title":"net_adm.dns_hostname/1","ref":"net_adm.html#dns_hostname/1"},{"type":"function","doc":"Reads file `.hosts.erlang`, see section [Files](`m:net_adm#module-files`). Returns the\nhosts in this file as a list. Returns `{error, Reason}` if the file cannot be\nread or the Erlang terms on the file cannot be interpreted.","title":"net_adm.host_file/0","ref":"net_adm.html#host_file/0"},{"type":"function","doc":"Returns the name of the local host. If Erlang was started with command-line flag\n`-name`, `Name` is the fully qualified name.","title":"net_adm.localhost/0","ref":"net_adm.html#localhost/0"},{"type":"function","doc":"","title":"net_adm.names/0","ref":"net_adm.html#names/0"},{"type":"function","doc":"Returns the names and associated port numbers of the Erlang nodes that `epmd`\nregistered at the specified host.\n\nSimilar to `epmd -names`, see [`erts:epmd`](`e:erts:epmd_cmd.md`).\n\nReturns `{error, address}` if `epmd` is not operational.\n\n_Example:_\n\n```erlang\n(arne@dunn)1> net_adm:names().\n{ok,[{\"arne\",40262}]}\n```","title":"net_adm.names/1","ref":"net_adm.html#names/1"},{"type":"function","doc":"Sets up a connection to `Node`. Returns `pong` if it is successful, otherwise\n`pang`.","title":"net_adm.ping/1","ref":"net_adm.html#ping/1"},{"type":"function","doc":"","title":"net_adm.world/0","ref":"net_adm.html#world/0"},{"type":"function","doc":"Calls [`names(Host)`](`names/1`) for all hosts that are specified in the Erlang\nhost file `.hosts.erlang`, collects the replies, and then evaluates\n[`ping(Node)`](`ping/1`) on all those nodes. Returns the list of all nodes that\nare successfully pinged.\n\nIf `Arg == verbose`, the function writes information about which nodes it is\npinging to `stdout`.\n\nThis function can be useful when a node is started, and the names of the other\nnetwork nodes are not initially known.\n\nReturns `{error, Reason}` if `host_file/0` returns `{error, Reason}`.","title":"net_adm.world/1","ref":"net_adm.html#world/1"},{"type":"function","doc":"","title":"net_adm.world_list/1","ref":"net_adm.html#world_list/1"},{"type":"function","doc":"Same as [`world/0,1`](`world/1`), but the hosts are specified as argument\ninstead of being read from `.hosts.erlang`.","title":"net_adm.world_list/2","ref":"net_adm.html#world_list/2"},{"type":"type","doc":"","title":"net_adm.verbosity/0","ref":"net_adm.html#t:verbosity/0"},{"type":"module","doc":"Erlang networking kernel.\n\nThe net kernel is a system process, registered as `net_kernel`, which must be\noperational for distributed Erlang to work. The purpose of this process is to\nimplement parts of the BIFs [`spawn/4`](`spawn/4`) and\n[`spawn_link/4`](`spawn_link/4`), and to provide monitoring of the network.\n\nAn Erlang node is started using command-line flag `-name` or `-sname`:\n\n```text\n$ erl -sname foobar\n```\n\nIt is also possible to call [`net_kernel:start(foobar, #{})`](`start/2`)\ndirectly from the normal Erlang shell prompt:\n\n```erlang\n1> net_kernel:start(foobar, #{name_domain => shortnames}).\n{ok,<0.64.0>}\n(foobar@gringotts)2>\n```\n\nIf the node is started with command-line flag `-sname`, the node name is\n`foobar@Host`, where `Host` is the short name of the host (not the fully\nqualified domain name). If started with flag `-name`, the node name is\n`foobar@Host`, where `Host` is the fully qualified domain name. For more\ninformation, see [`erl`](`e:erts:erl_cmd.md`).\n\nNormally, connections are established automatically when another node is\nreferenced. This functionality can be disabled by setting Kernel configuration\nparameter `dist_auto_connect` to `never`, see [`kernel(6)`](kernel_app.md). In\nthis case, connections must be established explicitly by calling\n`connect_node/1`.\n\nWhich nodes that are allowed to communicate with each other is handled by the\nmagic cookie system, see section [Distributed Erlang](`e:system:distributed.md`)\nin the Erlang Reference Manual.\n\n> #### Warning {: .warning }\n>\n> Starting a distributed node without also specifying\n> [`-proto_dist inet_tls`](`e:erts:erl_cmd.md#proto_dist`) will expose the node\n> to attacks that may give the attacker complete access to the node and in\n> extension the cluster. When using un-secure distributed nodes, make sure that\n> the network is configured to keep potential attackers out. See the\n> [Using SSL for Erlang Distribution](`e:ssl:ssl_distribution.md`) User's Guide\n> for details on how to setup a secure distributed node.","title":"net_kernel","ref":"net_kernel.html"},{"type":"function","doc":"Permits access to the specified set of nodes.\n\nBefore the first call to [`allow/1`](`allow/1`), any node with the correct\ncookie can be connected. When [`allow/1`](`allow/1`) is called, a list of\nallowed nodes is established. Any access attempts made from (or to) nodes not in\nthat list will be rejected.\n\nSubsequent calls to [`allow/1`](`allow/1`) will add the specified nodes to the\nlist of allowed nodes. It is not possible to remove nodes from the list.\n\nReturns `error` if any element in `Nodes` is not an atom.","title":"net_kernel.allow/1","ref":"net_kernel.html#allow/1"},{"type":"function","doc":"Establishes a connection to `Node`.\n\nReturns `true` if a connection was established or was already established or if\n`Node` is the local node itself. Returns `false` if the connection attempt failed,\nand `ignored` if the local node is not alive.","title":"net_kernel.connect_node/1","ref":"net_kernel.html#connect_node/1"},{"type":"function","doc":"Returns currently used net tick time in seconds.\n\nFor more information see the [`net_ticktime`](kernel_app.md#net_ticktime)\n`Kernel` parameter.\n\nDefined return values (`Res`):\n\n- **`NetTicktime`** - `net_ticktime` is `NetTicktime` seconds.\n\n- **`{ongoing_change_to, NetTicktime}`** - `net_kernel` is currently changing\n `net_ticktime` to `NetTicktime` seconds.\n\n- **`ignored`** - The local node is not alive.","title":"net_kernel.get_net_ticktime/0","ref":"net_kernel.html#get_net_ticktime/0"},{"type":"function","doc":"Get the current state of the distribution for the local node.\n\nReturns a map with (at least) the following key-value pairs:\n\n- **`started => Started`** - Valid values for `Started`:\n\n - **`no`** - The distribution is not started. In this state none of the other\n keys below are present in the map.\n\n - **`static`** - The distribution was started with command line arguments\n [`-name`](`e:erts:erl_cmd.md#name`) or\n [`-sname`](`e:erts:erl_cmd.md#sname`).\n\n - **`dynamic`** - The distribution was started with\n [`net_kernel:start/1`](`start/1`) and can be stopped with\n [`net_kernel:stop/0`](`start/1`).\n\n- **`name => Name`** - The name of the node. Same as returned by `erlang:node/0`\n except when `name_type` is `dynamic` in which case `Name` may be `undefined`\n (instead of `nonode@nohost`).\n\n- **`name_type => NameType`** - Valid values for `NameType`:\n\n - **`static`** - The node has a static node name set by the node itself.\n\n - **`dynamic`** - The distribution was started in\n [dynamic node name](`e:system:distributed.md#dyn_node_name`) mode, and will\n get its node name assigned from the first node it connects to. If key `name`\n has value `undefined` that has not happened yet.\n\n- **`name_domain => NameDomain`** - Valid values for `NameDomain`:\n\n - **`shortnames`** - The distribution was started to use node names with a\n short host portion (not fully qualified).\n\n - **`longnames`** - The distribution was started to use node names with a long\n fully qualified host portion.","title":"net_kernel.get_state/0","ref":"net_kernel.html#get_state/0"},{"type":"function","doc":"Get one or more options for the distribution socket connected to `Node`.\n\nIf `Node` is a connected node the return value is the same as from\n[`inet:getopts(Sock, Options)`](`inet:getopts/2`) where `Sock` is the\ndistribution socket for `Node`.\n\nReturns `ignored` if the local node is not alive or `{error, noconnection}` if\n`Node` is not connected.","title":"net_kernel.getopts/2","ref":"net_kernel.html#getopts/2"},{"type":"function","doc":"","title":"net_kernel.monitor_nodes/1","ref":"net_kernel.html#monitor_nodes/1"},{"type":"function","doc":"The calling process subscribes or unsubscribes to node status change messages. A\n`nodeup` message is delivered to all subscribing processes when a new node is\nconnected, and a `nodedown` message is delivered when a node is disconnected.\n\nIf `Flag` is `true`, a new subscription is started. If `Flag` is `false`, all\nprevious subscriptions started with the same `Options` are stopped. Two option\nlists are considered the same if they contain the same set of options.\n\nDelivery guarantees of `nodeup`/`nodedown` messages:\n\n- `nodeup` messages are delivered before delivery of any signals from the remote\n node through the newly established connection.\n- `nodedown` messages are delivered after all the signals from the remote node\n over the connection have been delivered.\n- `nodeup` messages are delivered after the corresponding node appears in\n results from `erlang:nodes()`.\n- `nodedown` messages are delivered after the corresponding node has disappeared\n in results from `erlang:nodes()`.\n- As of OTP 23.0, a `nodedown` message for a connection being taken down will be\n delivered before a `nodeup` message due to a new connection to the same node.\n Prior to OTP 23.0, this was not guaranteed to be the case.\n\nThe format of the node status change messages depends on `Options`. If `Options`\nis the empty list or if `net_kernel:monitor_nodes/1` is called, the format is as\nfollows:\n\n```erlang\n{nodeup, Node} | {nodedown, Node}\n Node = node()\n```\n\nWhen `Options` is the empty map or empty list, the caller will only subscribe\nfor status change messages for visible nodes. That is, only nodes that appear in\nthe result of `erlang:nodes/0`.\n\nIf `Options` equals anything other than the empty list, the format of the status\nchange messages is as follows:\n\n```erlang\n{nodeup, Node, Info} | {nodedown, Node, Info}\n Node = node()\n Info = #{Tag => Val} | [{Tag, Val}]\n```\n\n`Info` is either a map or a list of 2-tuples. Its content depends on `Options`.\nIf `Options` is a map, `Info` will also be a map. If `Options` is a list, `Info`\nwill also be a list.\n\nWhen `Options` is a map, currently the following associations are allowed:\n\n- **`connection_id => boolean()`** - If the value of the association equals\n `true`, a `connection_id => ConnectionId` association will be included in the\n `Info` map where `ConnectionId` is the connection identifier of the connection\n coming up or going down. For more info about this connection identifier see\n the documentation of [erlang:nodes/2](`m:erlang#connection_id`).\n\n- **`node_type => NodeType`** - Valid values for `NodeType`:\n\n - **`visible`** - Subscribe to node status change messages for visible nodes\n only. The association `node_type => visible` will be included in the `Info`\n map.\n\n - **`hidden`** - Subscribe to node status change messages for hidden nodes\n only. The association `node_type => hidden` will be included in the `Info`\n map.\n\n - **`all`** - Subscribe to node status change messages for both visible and\n hidden nodes. The association `node_type => visible | hidden` will be\n included in the `Info` map.\n\n If no `node_type => NodeType` association is included in the `Options` map,\n the caller will subscribe for status change messages for visible nodes only,\n but _no_ `node_type => visible` association will be included in the `Info`\n map.\n\n- **`nodedown_reason => boolean()`** - If the value of the association equals\n `true`, a `nodedown_reason => Reason` association will be included in the\n `Info` map for `nodedown` messages.\n\n [](){: #nodedown_reasons } `Reason` can, depending on which distribution\n module or process that is used, be any term, but for the standard TCP\n distribution module it is one of the following:\n\n - **`connection_setup_failed`** - The connection setup failed (after `nodeup`\n messages were sent).\n\n - **`no_network`** - No network is available.\n\n - **`net_kernel_terminated`** - The `net_kernel` process terminated.\n\n - **`shutdown`** - Unspecified connection shutdown.\n\n - **`connection_closed`** - The connection was closed.\n\n - **`disconnect`** - The connection was disconnected (forced from the current\n node).\n\n - **`net_tick_timeout`** - Net tick time-out.\n\n - **`send_net_tick_failed`** - Failed to send net tick over the connection.\n\n - **`get_status_failed`** - Status information retrieval from the `Port`\n holding the connection failed.\n\nWhen `Options` is a list, currently `ListOption` can be one of the following:\n\n- **`connection_id`** - A `{connection_id, ConnectionId}` tuple will be included\n in `Info` where `ConnectionId` is the connection identifier of the connection\n coming up or going down. For more info about this connection identifier see\n the documentation of [erlang:nodes/2](`m:erlang#connection_id`).\n\n- **`{node_type, NodeType}`** - Valid values for `NodeType`:\n\n - **`visible`** - Subscribe to node status change messages for visible nodes\n only. The tuple `{node_type, visible}` will be included in the `Info` list.\n\n - **`hidden`** - Subscribe to node status change messages for hidden nodes\n only. The tuple `{node_type, hidden}` will be included in the `Info` list.\n\n - **`all`** - Subscribe to node status change messages for both visible and\n hidden nodes. The tuple `{node_type, visible | hidden}` will be included in\n the `Info` list.\n\n If no `{node_type, NodeType}` option has been given. The caller will subscribe\n for status change messages for visible nodes only, but _no_\n `{node_type, visible}` tuple will be included in the `Info` list.\n\n- **`nodedown_reason`** - The tuple `{nodedown_reason, Reason}` will be included\n in the `Info` list for `nodedown` messages.\n\n See the documentation of the\n [`nodedown_reason => boolean()`](`m:net_kernel#nodedown_reasons`) association\n above for information about possible `Reason` values.\n\nExample:\n\n```erlang\n(a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).\nok\n(a@localhost)2> flush().\nShell got {nodeup,b@localhost,\n #{connection_id => 3067552,node_type => visible}}\nShell got {nodeup,c@localhost,\n #{connection_id => 13892107,node_type => hidden}}\nShell got {nodedown,b@localhost,\n #{connection_id => 3067552,node_type => visible,\n nodedown_reason => connection_closed}}\nShell got {nodedown,c@localhost,\n #{connection_id => 13892107,node_type => hidden,\n nodedown_reason => net_tick_timeout}}\nShell got {nodeup,b@localhost,\n #{connection_id => 3067553,node_type => visible}}\nok\n(a@localhost)3>\n```","title":"net_kernel.monitor_nodes/2","ref":"net_kernel.html#monitor_nodes/2"},{"type":"function","doc":"","title":"net_kernel.set_net_ticktime/1","ref":"net_kernel.html#set_net_ticktime/1"},{"type":"function","doc":"Sets `net_ticktime` (see [`kernel(6)`](kernel_app.md)) to `NetTicktime` seconds.\n`TransitionPeriod` defaults to `60`.\n\nSome definitions:\n\n- **Minimum transition traffic interval (`MTTI`)** -\n `minimum(NetTicktime, PreviousNetTicktime)*1000 div 4` milliseconds.\n\n- **Transition period** - The time of the least number of consecutive `MTTI`s to\n cover `TransitionPeriod` seconds following the call to\n [`set_net_ticktime/2`](`set_net_ticktime/2`) (that is,\n ((`TransitionPeriod*1000 - 1) div MTTI + 1)*MTTI` milliseconds).\n\nIf `NetTicktime #### Note {: .info }\n>\n> The `net_ticktime` changes must be initiated on all nodes in the network (with\n> the same `NetTicktime`) before the end of any transition period on any node;\n> otherwise connections can erroneously be disconnected.\n\nReturns one of the following:\n\n- **`unchanged`** - `net_ticktime` already has the value of `NetTicktime` and is\n left unchanged.\n\n- **`change_initiated`** - `net_kernel` initiated the change of `net_ticktime`\n to `NetTicktime` seconds.\n\n- **`{ongoing_change_to, NewNetTicktime}`** - The request is _ignored_ because\n `net_kernel` is busy changing `net_ticktime` to `NewNetTicktime` seconds.","title":"net_kernel.set_net_ticktime/2","ref":"net_kernel.html#set_net_ticktime/2"},{"type":"function","doc":"Set one or more options for distribution sockets. Argument `Node` can be either\none node name or the atom `new` to affect the distribution sockets of all future\nconnected nodes.\n\nThe return value is the same as from `inet:setopts/2` or `{error, noconnection}`\nif `Node` is not a connected node or `new`.\n\nIf `Node` is `new` the `Options` will then also be added to kernel configuration\nparameters [inet_dist_listen_options](kernel_app.md#inet_dist_listen_options)\nand [inet_dist_connect_options](kernel_app.md#inet_dist_connect_options).\n\nReturns `ignored` if the local node is not alive.","title":"net_kernel.setopts/2","ref":"net_kernel.html#setopts/2"},{"type":"function","doc":"Turns a non-distributed node into a distributed node by starting `net_kernel`\nand other necessary processes.\n\n`Options` list can only be exactly one of the following lists (order is\nimporant):\n\n- **`[Name]`** - The same as `net_kernel:start([Name, longnames, 15000])`.\n\n- **`[Name, NameDomain]`** - The same as\n `net_kernel:start([Name, NameDomain, 15000])`.\n\n- **`[Name, NameDomain, TickTime]`** - The same as\n [`net_kernel:start(Name, #{name_domain => NameDomain, net_ticktime => ((TickTime*4-1) div 1000) + 1, net_tickintensity => 4})`](`start/2`).\n Note that `TickTime` is _not_ the same as net tick time expressed in\n milliseconds. `TickTime` is the time between ticks when net tick intensity\n equals `4`.","title":"net_kernel.start/1","ref":"net_kernel.html#start/1"},{"type":"function","doc":"Turns a non-distributed node into a distributed node by starting `net_kernel`\nand other necessary processes.\n\nIf `Name` is set to _`undefined`_ the distribution will be started to request a\ndynamic node name from the first node it connects to. See\n[Dynamic Node Name](`e:system:distributed.md#dyn_node_name`). Setting `Name` to\n`undefined` implies options `dist_listen => false` and `hidden => true`.\n\nCurrently supported options:\n\n- **`name_domain => NameDomain`** - Determines the host name part of the node\n name. If `NameDomain` equals `longnames`, fully qualified domain names will be\n used which also is the default. If `NameDomain` equals `shortnames`, only the\n short name of the host will be used.\n\n- **`net_ticktime => NetTickTime`** - _Net tick time_ to use in seconds.\n Defaults to the value of the [`net_ticktime`](kernel_app.md#net_ticktime)\n `kernel(6)` parameter. For more information about _net tick time_, see the\n `kernel` parameter. However, note that if the value of the `kernel` parameter\n is invalid, it will silently be replaced by a valid value, but if an invalid\n `NetTickTime` value is passed as option value to this function, the call will\n fail.\n\n- **`net_tickintensity => NetTickIntensity`** - _Net tick intensity_ to use.\n Defaults to the value of the\n [`net_tickintensity`](kernel_app.md#net_tickintensity) `kernel(6)` parameter.\n For more information about _net tick intensity_, see the `kernel` parameter.\n However, note that if the value of the `kernel` parameter is invalid, it will\n silently be replaced by a valid value, but if an invalid `NetTickIntensity`\n value is passed as option value to this function, the call will fail.\n\n- **`dist_listen => boolean()`** - Enable or disable listening for incoming\n connections. Defaults to the value of the\n [`-dist_listen`](`e:erts:erl_cmd.md#dist_listen`) `erl` command line argument.\n Note that `dist_listen => false` implies `hidden => true`.\n\n If `undefined` has been passed as `Name`, the `dist_listen` option will be\n overridden with `dist_listen => false`.\n\n- **`hidden => boolean()`** - Enable or disable hidden node. Defaults to `true`\n if the [`-hidden`](`e:erts:erl_cmd.md#hidden`) `erl` command line argument has\n been passed; otherwise `false`.\n\n If `undefined` has been passed as `Name`, or the option `dist_listen` equals\n `false`, the `hidden` option will be overridden with `hidden => true`.","title":"net_kernel.start/2","ref":"net_kernel.html#start/2"},{"type":"function","doc":"Turns a distributed node into a non-distributed node.\n\nFor other nodes in the network, this is the same as the node going down.\nOnly possible when the net kernel was started using `start/2`, otherwise\n`{error, not_allowed}` is returned. Returns `{error, not_found}` if the local\nnode is not alive.","title":"net_kernel.stop/0","ref":"net_kernel.html#stop/0"},{"type":"type","doc":"","title":"net_kernel.connection_state/0","ref":"net_kernel.html#t:connection_state/0"},{"type":"type","doc":"","title":"net_kernel.connection_type/0","ref":"net_kernel.html#t:connection_type/0"},{"type":"module","doc":"Distributed named process groups.\n\nThis module implements process groups. A message can be sent to one, some, or\nall group members.\n\nUp until OTP 17 there used to exist an experimental `pg` module in `stdlib`.\nThis `pg` module is not the same module as that experimental `pg` module, and\nonly share the same module name.\n\nA group of processes can be accessed by a common name. For example, if there is\na group named `foobar`, there can be a set of processes (which can be located on\ndifferent nodes) that are all members of the group `foobar`. There are no\nspecial functions for sending a message to the group. Instead, client functions\nare to be written with the functions `get_members/1` and `get_local_members/1`\nto determine which processes are members of the group. Then the message can be\nsent to one or more group members.\n\nIf a member terminates, it is automatically removed from the group.\n\nA process may join multiple groups. It may join the same group multiple times.\nIt is only allowed to join processes running on local node.\n\nProcess Groups implement strong eventual consistency. Process Groups membership\nview may temporarily diverge. For example, when processes on `node1` and `node2`\njoin concurrently, `node3` and `node4` may receive updates in a different order.\n\nMembership view is not transitive. If `node1` is not directly connected to\n`node2`, they will not see each other groups. But if both are connected to\n`node3`, `node3` will have the full view.\n\nGroups are automatically created when any process joins, and are removed when\nall processes leave the group. Non-existing group is considered empty\n(containing no processes).\n\nProcess groups can be organised into multiple scopes. Scopes are completely\nindependent of each other. A process may join any number of groups in any number\nof scopes. Scopes are designed to decouple single mesh into a set of overlay\nnetworks, reducing amount of traffic required to propagate group membership\ninformation. Default scope `pg` is started automatically when\n[Kernel](kernel_app.md#start_pg) is configured to do so.\n\n> #### Note {: .info }\n>\n> Scope name is used to register process locally, and to name an ETS table. If\n> there is another process registered under this name, or another ETS table\n> exists, scope fails to start.\n>\n> Local membership is not preserved if scope process exits and restarts.\n>\n> A scope can be kept local-only by using a scope name that is unique\n> cluster-wide, e.g. the node name: `pg:start_link(node()).`","title":"pg","ref":"pg.html"},{"type":"module","doc":"[Kernel](kernel_app.md)","title":"See Also - pg","ref":"pg.html#module-see-also"},{"type":"function","doc":"","title":"pg.demonitor/1","ref":"pg.html#demonitor/1"},{"type":"function","doc":"Unsubscribes the caller from updates (scope or group). Flushes all outstanding\nupdates that were already in the message queue of the calling process.","title":"pg.demonitor/2","ref":"pg.html#demonitor/2"},{"type":"function","doc":"","title":"pg.get_local_members/1","ref":"pg.html#get_local_members/1"},{"type":"function","doc":"Returns all processes running on the local node in the group `Group`. Processes\nare returned in no specific order. This function is optimised for speed.","title":"pg.get_local_members/2","ref":"pg.html#get_local_members/2"},{"type":"function","doc":"","title":"pg.get_members/1","ref":"pg.html#get_members/1"},{"type":"function","doc":"Returns all processes in the group `Group`. Processes are returned in no\nspecific order. This function is optimised for speed.","title":"pg.get_members/2","ref":"pg.html#get_members/2"},{"type":"function","doc":"","title":"pg.join/2","ref":"pg.html#join/2"},{"type":"function","doc":"Joins single process or multiple processes to the group `Group`. A process can\njoin a group many times and must then leave the group the same number of times.\n\n`PidOrPids` may contain the same process multiple times.","title":"pg.join/3","ref":"pg.html#join/3"},{"type":"function","doc":"","title":"pg.leave/2","ref":"pg.html#leave/2"},{"type":"function","doc":"Makes the process `PidOrPids` leave the group `Group`. If the process is not a\nmember of the group, `not_joined` is returned.\n\nWhen list of processes is passed as `PidOrPids`, function returns `not_joined`\nonly when all processes of the list are not joined.","title":"pg.leave/3","ref":"pg.html#leave/3"},{"type":"function","doc":"","title":"pg.monitor/1","ref":"pg.html#monitor/1"},{"type":"function","doc":"Subscribes the caller to updates for the specified group.\n\nReturns list of processes currently in the group, and a reference to match the\nupcoming notifications.\n\nSee `monitor_scope/0` for the update message structure.","title":"pg.monitor/2","ref":"pg.html#monitor/2"},{"type":"function","doc":"","title":"pg.monitor_scope/0","ref":"pg.html#monitor_scope/0"},{"type":"function","doc":"Subscribes the caller to updates from the specified scope.\n\nReturns content of the entire scope and a reference to match the upcoming\nnotifications.\n\nWhenever any group membership changes, an update message is sent to the\nsubscriber:\n\n```erlang\n{Ref, join, Group, [JoinPid1, JoinPid2]}\n```\n\n```erlang\n{Ref, leave, Group, [LeavePid1]}\n```","title":"pg.monitor_scope/1","ref":"pg.html#monitor_scope/1"},{"type":"function","doc":"Starts additional scope.","title":"pg.start/1","ref":"pg.html#start/1"},{"type":"function","doc":"Starts the default `pg` scope within supervision tree.\n\nKernel may be configured to do it automatically by setting\nthe Kernel configuration parameter [`start_pg`](kernel_app.md#start_pg).","title":"pg.start_link/0","ref":"pg.html#start_link/0"},{"type":"function","doc":"Equivalent to [`start(Scope)`](`start/1`), except that it also creates\na `link/1` with the calling process.","title":"pg.start_link/1","ref":"pg.html#start_link/1"},{"type":"function","doc":"","title":"pg.which_groups/0","ref":"pg.html#which_groups/0"},{"type":"function","doc":"Returns a list of all known groups.","title":"pg.which_groups/1","ref":"pg.html#which_groups/1"},{"type":"type","doc":"The identifier of a process group.","title":"pg.group/0","ref":"pg.html#t:group/0"},{"type":"module","doc":"Remote Procedure Call services.\n\nThis module contains services similar to Remote Procedure Calls. It also\ncontains broadcast facilities and parallel evaluators. A remote procedure call\nis a method to call a function on a remote node and collect the answer. It is\nused for collecting information on a remote node, or for running a function with\nsome specific side effects on the remote node.\n\n> #### Note {: .info }\n>\n> `rpc:call/4` and friends makes it quite hard to distinguish between successful\n> results, raised exceptions, and other errors. This cannot be changed due to\n> compatibility reasons. As of OTP 23, a new module `m:erpc` was introduced in\n> order to provide an API that makes it possible to distinguish between the\n> different results. The `erpc` module provides a subset (however, the central\n> subset) of the functionality available in the `rpc` module. The `erpc`\n> implementation also provides a more scalable implementation with better\n> performance than the original `rpc` implementation. However, since the\n> introduction of `erpc`, the `rpc` module implements large parts of its central\n> functionality using `erpc`, so the `rpc` module won't not suffer scalability\n> wise and performance wise compared to `erpc`.\n\n> #### Note {: .info }\n>\n> For some important information about distributed signals, see the\n> [Blocking Signaling Over Distribution](`e:system:ref_man_processes.md#blocking-signaling-over-distribution`)\n> section in the _Processes_ chapter of the _Erlang Reference Manual_. Blocking\n> signaling can, for example, cause timeouts in `rpc` to be significantly\n> delayed.","title":"rpc","ref":"rpc.html"},{"type":"function","doc":"Equivalent to [`abcast([node()|nodes()], Name, Msg)`](`abcast/3`).","title":"rpc.abcast/2","ref":"rpc.html#abcast/2"},{"type":"function","doc":"Broadcasts the message `Msg` asynchronously to the registered process `Name` on\nthe specified nodes.","title":"rpc.abcast/3","ref":"rpc.html#abcast/3"},{"type":"function","doc":"Implements _call streams with promises_, a type of RPC that does not suspend the\ncaller until the result is finished. Instead, a key is returned, which can be\nused later to collect the value. The key can be viewed as a promise to deliver\nthe answer.\n\nIn this case, the key `Key` is returned, which can be used in a subsequent call\nto `yield/1` or [`nb_yield/1,2`](`nb_yield/1`) to retrieve the value of\nevaluating [`apply(Module, Function, Args)`](`apply/3`) on node `Node`.\n\n> #### Note {: .info }\n>\n> If you want the ability to distinguish between results, you may want to\n> consider using the [`erpc:send_request()`](`erpc:send_request/4`) function\n> from the `erpc` module instead. This also gives you the ability retrieve the\n> results in other useful ways.\n\n> #### Note {: .info }\n>\n> `yield/1` and [`nb_yield/1,2`](`nb_yield/1`) must be called by the same\n> process from which this function was made otherwise they will never yield\n> correctly.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be an `rpc` server, another server, or a freshly spawned\n> process.","title":"rpc.async_call/4","ref":"rpc.html#async_call/4"},{"type":"function","doc":"The same as calling\n[`rpc:block_call(Node, Module, Function, Args, infinity)`](`block_call/5`).","title":"rpc.block_call/4","ref":"rpc.html#block_call/4"},{"type":"function","doc":"The same as calling\n[`rpc:call(Node, Module, Function, Args, Timeout)`](`call/5`) with the exception\nthat it also blocks other `rpc:block_call/5` operations from executing\nconcurrently on the node `Node`.\n\n> #### Warning {: .warning }\n>\n> Note that it also blocks other operations than just `rpc:block_call/5`\n> operations, so use it with care.","title":"rpc.block_call/5","ref":"rpc.html#block_call/5"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node` and\nreturns the corresponding value `Res`, or `{badrpc, Reason}` if the call fails.\nThe same as calling\n[`rpc:call(Node, Module, Function, Args, infinity)`](`call/5`).","title":"rpc.call/4","ref":"rpc.html#call/4"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node` and\nreturns the corresponding value `Res`, or `{badrpc, Reason}` if the call fails.\n`Timeout` is a time-out value in milliseconds. If the call times out, `Reason`\nis `timeout`.\n\nIf the reply arrives after the call times out, no message contaminates the\ncaller's message queue.\n\n> #### Note {: .info }\n>\n> If you want the ability to distinguish between results, you may want to\n> consider using the [`erpc:call()`](`erpc:call/4`) function from the `erpc`\n> module instead.\n\n> #### Note {: .info }\n>\n> Here follows the details of what exactly is returned.\n>\n> `{badrpc, Reason}` will be returned in the following circumstances:\n>\n> - The called function fails with an `exit` exception.\n> - The called function fails with an `error` exception.\n> - The called function returns a term that matches `{'EXIT', _}`.\n> - The called function `throws` a term that matches `{'EXIT', _}`.\n>\n> `Res` is returned in the following circumstances:\n>\n> - The called function returns normally with a term that does **not** match\n> `{'EXIT',_}`.\n> - The called function `throw`s a term that does **not** match `{'EXIT',_}`.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, an `rpc` server, another\n> server, or a freshly spawned process.","title":"rpc.call/5","ref":"rpc.html#call/5"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node`. No\nresponse is delivered and the calling process is not suspended until the\nevaluation is complete, as is the case with [`call/4,5`](`call/4`).\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be an `rpc` server, another server, or a freshly spawned\n> process.","title":"rpc.cast/4","ref":"rpc.html#cast/4"},{"type":"function","doc":"Equivalent to\n[`eval_everywhere([node()|nodes()], Module, Function, Args)`](`eval_everywhere/4`).","title":"rpc.eval_everywhere/3","ref":"rpc.html#eval_everywhere/3"},{"type":"function","doc":"Evaluates [`apply(Module, Function, Args)`](`apply/3`) on the specified nodes.\nNo answers are collected.","title":"rpc.eval_everywhere/4","ref":"rpc.html#eval_everywhere/4"},{"type":"function","doc":"Equivalent to\n[`multi_server_call([node()|nodes()], Name, Msg)`](`multi_server_call/3`).","title":"rpc.multi_server_call/2","ref":"rpc.html#multi_server_call/2"},{"type":"function","doc":"Can be used when interacting with servers called `Name` on the specified nodes.\nIt is assumed that the servers receive messages in the format `{From, Msg}` and\nreply using `From ! {Name, Node, Reply}`, where `Node` is the name of the node\nwhere the server is located. The function returns `{Replies, BadNodes}`, where\n`Replies` is a list of all `Reply` values, and `BadNodes` is one of the\nfollowing:\n\n- A list of the nodes that do not exist\n- A list of the nodes where the server does not exist\n- A list of the nodes where the server terminated before sending any reply.","title":"rpc.multi_server_call/3","ref":"rpc.html#multi_server_call/3"},{"type":"function","doc":"Equivalent to\n[`multicall([node()|nodes()], Module, Function, Args, infinity)`](`multicall/5`).","title":"rpc.multicall/3","ref":"rpc.html#multicall/3"},{"type":"function","doc":"Equivalent to\n[`multicall(Nodes, Module, Function, Args, infinity)`](`multicall/5`).\n\nEquivalent to\n[`multicall([node()|nodes()], Module, Function, Args, Timeout)`](`multicall/5`).","title":"rpc.multicall/4","ref":"rpc.html#multicall/4"},{"type":"function","doc":"In contrast to an RPC, a multicall is an RPC that is sent concurrently from one\nclient to multiple servers. This is useful for collecting information from a set\nof nodes, or for calling a function on a set of nodes to achieve some side\neffects. It is semantically the same as iteratively making a series of RPCs on\nall the nodes, but the multicall is faster, as all the requests are sent at the\nsame time and are collected one by one as they come back.\n\nThe function evaluates [`apply(Module, Function, Args)`](`apply/3`) on the\nspecified nodes and collects the answers. It returns `{ResL, BadNodes}`, where\n`BadNodes` is a list of the nodes that do not exist, and `ResL` is a list of the\nreturn values, or `{badrpc, Reason}` for failing calls. `Timeout` is a time\n(integer) in milliseconds, or `infinity`.\n\nThe following example is useful when new object code is to be loaded on all\nnodes in the network, and indicates some side effects that RPCs can produce:\n\n```erlang\n%% Find object code for module Mod\n{Mod, Bin, File} = code:get_object_code(Mod),\n\n%% and load it on all nodes including this one\n{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),\n\n%% and then maybe check the ResL list.\n```\n\n> #### Note {: .info }\n>\n> If you want the ability to distinguish between results, you may want to\n> consider using the [`erpc:multicall()`](`erpc:multicall/4`) function from the\n> `erpc` module instead.\n\n> #### Note {: .info }\n>\n> You cannot make _any_ assumptions about the process that will perform the\n> `apply()`. It may be the calling process itself, an `rpc` server, another\n> server, or a freshly spawned process.","title":"rpc.multicall/5","ref":"rpc.html#multicall/5"},{"type":"function","doc":"Equivalent to [`nb_yield(Key, 0)`](`nb_yield/2`).","title":"rpc.nb_yield/1","ref":"rpc.html#nb_yield/1"},{"type":"function","doc":"Non-blocking version of `yield/1`. It returns the tuple `{value, Val}` when the\ncomputation is finished, or `timeout` when `Timeout` milliseconds has elapsed.\n\nSee the note in `call/4` for more details of Val.\n\n> #### Note {: .info }\n>\n> This function must be called by the same process from which `async_call/4` was\n> made otherwise it will only return `timeout`.","title":"rpc.nb_yield/2","ref":"rpc.html#nb_yield/2"},{"type":"function","doc":"Evaluates, for every tuple in `FuncCalls`,\n[`apply(Module, Function, Args)`](`apply/3`) on some node in the network.\nReturns the list of return values, in the same order as in `FuncCalls`.","title":"rpc.parallel_eval/1","ref":"rpc.html#parallel_eval/1"},{"type":"function","doc":"Location transparent version of the BIF `erlang:process_info/1` in ERTS.","title":"rpc.pinfo/1","ref":"rpc.html#pinfo/1"},{"type":"function","doc":"Location transparent version of the BIF `erlang:process_info/2` in ERTS.","title":"rpc.pinfo/2","ref":"rpc.html#pinfo/2"},{"type":"function","doc":"Evaluates [`apply(Module, Function, [Elem|ExtraArgs])`](`apply/3`) for every\nelement `Elem` in `List1`, in parallel. Returns the list of return values, in\nthe same order as in `List1`.","title":"rpc.pmap/3","ref":"rpc.html#pmap/3"},{"type":"function","doc":"Equivalent to [`sbcast([node()|nodes()], Name, Msg)`](`sbcast/3`).","title":"rpc.sbcast/2","ref":"rpc.html#sbcast/2"},{"type":"function","doc":"Broadcasts the message `Msg` synchronously to the registered process `Name` on\nthe specified nodes.\n\nReturns `{GoodNodes, BadNodes}`, where `GoodNodes` is the list of nodes that\nhave `Name` as a registered process.\n\nThe function is synchronous in the sense that it is known that all servers have\nreceived the message when the call returns. It is not possible to know that the\nservers have processed the message.\n\nAny further messages sent to the servers, after this function has returned, are\nreceived by all servers after this message.","title":"rpc.sbcast/3","ref":"rpc.html#sbcast/3"},{"type":"function","doc":"Can be used when interacting with a server called `Name` on node `Node`. It is\nassumed that the server receives messages in the format `{From, Msg}` and\nreplies using `From ! {ReplyWrapper, Node, Reply}`. This function makes such a\nserver call and ensures that the entire call is packed into an atomic\ntransaction, which either succeeds or fails. It never hangs, unless the server\nitself hangs.\n\nThe function returns the answer `Reply` as produced by the server `Name`, or\n`{error, Reason}`.","title":"rpc.server_call/4","ref":"rpc.html#server_call/4"},{"type":"function","doc":"Returns the promised answer from a previous `async_call/4`. If the answer is\navailable, it is returned immediately. Otherwise, the calling process is\nsuspended until the answer arrives from `Node`.\n\n> #### Note {: .info }\n>\n> This function must be called by the same process from which `async_call/4` was\n> made otherwise it will never return.\n\nSee the note in `call/4` for more details of the return value.","title":"rpc.yield/1","ref":"rpc.html#yield/1"},{"type":"opaque","doc":"Opaque value returned by `async_call/4`.","title":"rpc.key/0","ref":"rpc.html#t:key/0"},{"type":"module","doc":"File interface module.\n\nThis module provides an interface to the file system.\n\n> #### Warning {: .warning }\n>\n> File operations are only guaranteed to appear atomic when going through the\n> same file server. A NIF or other OS process may observe intermediate steps on\n> certain operations on some operating systems, eg. renaming an existing file on\n> Windows, or [`write_file_info/2`](`write_file_info/2`) on any OS at the time\n> of writing.\n\nRegarding filename encoding, the Erlang VM can operate in two modes. The current\nmode can be queried using function `native_name_encoding/0`. It returns `latin1`\nor `utf8`.\n\nIn `latin1` mode, the Erlang VM does not change the encoding of filenames. In\n`utf8` mode, filenames can contain Unicode characters greater than 255 and the\nVM converts filenames back and forth to the native filename encoding (usually\nUTF-8, but UTF-16 on Windows).\n\nThe default mode depends on the operating system. Windows, MacOS X and Android\nenforce consistent filename encoding and therefore the VM uses `utf8` mode.\n\nOn operating systems with transparent naming (for example, all Unix systems\nexcept MacOS X), default is `utf8` if the terminal supports UTF-8, otherwise\n`latin1`. The default can be overridden using `+fnl` (to force `latin1` mode) or\n`+fnu` (to force `utf8` mode) when starting [`erl`](`e:erts:erl_cmd.md`).\n\nOn operating systems with transparent naming, files can be inconsistently named,\nfor example, some files are encoded in UTF-8 while others are encoded in ISO\nLatin-1. The concept of _raw filenames_ is introduced to handle file systems\nwith inconsistent naming when running in `utf8` mode.\n\nA _raw filename_ is a filename specified as a binary. The Erlang VM does not\ntranslate a filename specified as a binary on systems with transparent naming.\n\nWhen running in `utf8` mode, functions `list_dir/1` and `read_link/1` never\nreturn raw filenames. To return all filenames including raw filenames, use\nfunctions [`list_dir_all/1`](`m:file#list_dir_all`) and\n[`read_link_all/1`](`m:file#read_link_all`).\n\nSee also section\n[Notes About Raw Filenames](`e:stdlib:unicode_usage.md#notes-about-raw-filenames`)\nin the STDLIB User's Guide.\n\n> #### Note {: .info }\n>\n> File operations used to accept filenames containing null characters (integer\n> value zero). This caused the name to be truncated and in some cases arguments\n> to primitive operations to be mixed up. Filenames containing null characters\n> inside the filename are now _rejected_ and will cause primitive file\n> operations fail.","title":"file","ref":"file.html"},{"type":"module","doc":"- `eacces` \\- Permission denied\n- `eagain` \\- Resource temporarily unavailable\n- `ebadf` \\- Bad file number\n- `ebusy` \\- File busy\n- `edquot` \\- Disk quota exceeded\n- `eexist` \\- File already exists\n- `efault` \\- Bad address in system call argument\n- `efbig` \\- File too large\n- `eintr` \\- Interrupted system call\n- `einval` \\- Invalid argument\n- `eio` \\- I/O error\n- `eisdir` \\- Illegal operation on a directory\n- `eloop` \\- Too many levels of symbolic links\n- `emfile` \\- Too many open files\n- `emlink` \\- Too many links\n- `enametoolong` \\- Filename too long\n- `enfile` \\- File table overflow\n- `enodev` \\- No such device\n- `enoent` \\- No such file or directory\n- `enomem` \\- Not enough memory\n- `enospc` \\- No space left on device\n- `enotblk` \\- Block device required\n- `enotdir` \\- Not a directory\n- `enotsup` \\- Operation not supported\n- `enxio` \\- No such device or address\n- `eperm` \\- Not owner\n- `epipe` \\- Broken pipe\n- `erofs` \\- Read-only file system\n- `espipe` \\- Invalid seek\n- `esrch` \\- No such process\n- `estale` \\- Stale remote file handle\n- `exdev` \\- Cross-device link","title":"POSIX Error Codes - file","ref":"file.html#module-posix-error-codes"},{"type":"module","doc":"For increased performance, raw files are recommended.\n\nA normal file is really a process so it can be used as an I/O device (see\n`m:io`). Therefore, when data is written to a normal file, the sending of the\ndata to the file process, copies all data that are not binaries. Opening the\nfile in binary mode and writing binaries is therefore recommended. If the file\nis opened on another node, or if the file server runs as slave to the file\nserver of another node, also binaries are copied.\n\n> #### Note {: .info }\n>\n> Raw files use the file system of the host machine of the node. For normal\n> files (non-raw), the file server is used to find the files, and if the node is\n> running its file server as slave to the file server of another node, and the\n> other node runs on some other host machine, they can have different file\n> systems. However, this is seldom a problem.\n\n`open/2` can be given the options `delayed_write` and `read_ahead` to turn on\ncaching, which will reduce the number of operating system calls and greatly\nimprove performance for small reads and writes. However, the overhead won't\ndisappear completely and it's best to keep the number of file operations to a\nminimum. As a contrived example, the following function writes 4MB in 2.5\nseconds when tested:\n\n```erlang\ncreate_file_slow(Name) ->\n {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),\n create_file_slow_1(Fd, 4 bsl 20),\n file:close(Fd).\n\ncreate_file_slow_1(_Fd, 0) ->\n ok;\ncreate_file_slow_1(Fd, M) ->\n ok = file:write(Fd, <<0>>),\n create_file_slow_1(Fd, M - 1).\n```\n\nThe following functionally equivalent code writes 128 bytes per call to\n`write/2` and so does the same work in 0.08 seconds, which is roughly 30 times\nfaster:\n\n```erlang\ncreate_file(Name) ->\n {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),\n create_file_1(Fd, 4 bsl 20),\n file:close(Fd),\n ok.\n\ncreate_file_1(_Fd, 0) ->\n ok;\ncreate_file_1(Fd, M) when M >= 128 ->\n ok = file:write(Fd, <<0:(128)/unit:8>>),\n create_file_1(Fd, M - 128);\ncreate_file_1(Fd, M) ->\n ok = file:write(Fd, <<0:(M)/unit:8>>),\n create_file_1(Fd, M - 1).\n```\n\nWhen writing data it's generally more efficient to write a list of binaries\nrather than a list of integers. It is not needed to flatten a deep list before\nwriting. On Unix hosts, scatter output, which writes a set of buffers in one\noperation, is used when possible. In this way\n[`write(FD, [Bin1, Bin2 | Bin3])`](`write/2`) writes the contents of the\nbinaries without copying the data at all, except for perhaps deep down in the\noperating system kernel.\n\n> #### Warning {: .warning }\n>\n> If an error occurs when accessing an open file with module `m:io`, the process\n> handling the file exits. The dead file process can hang if a process tries to\n> access it later. This will be fixed in a future release.","title":"Performance - file","ref":"file.html#module-performance"},{"type":"module","doc":"`m:filename`","title":"See Also - file","ref":"file.html#module-see-also"},{"type":"function","doc":"[`advise/4`](`advise/4`) can be used to announce an intention to access file\ndata in a specific pattern in the future, thus allowing the operating system to\nperform appropriate optimizations.\n\nOn some platforms, this function might have no effect.","title":"file.advise/4","ref":"file.html#advise/4"},{"type":"function","doc":"[`allocate/3`](`allocate/3`) can be used to preallocate space for a file.\n\nThis function only succeeds in platforms that provide this feature.","title":"file.allocate/3","ref":"file.html#allocate/3"},{"type":"function","doc":"Changes group of a file. See `write_file_info/2`.","title":"file.change_group/2","ref":"file.html#change_group/2"},{"type":"function","doc":"Changes permissions of a file. See `write_file_info/2`.","title":"file.change_mode/2","ref":"file.html#change_mode/2"},{"type":"function","doc":"Changes owner of a file. See `write_file_info/2`.","title":"file.change_owner/2","ref":"file.html#change_owner/2"},{"type":"function","doc":"Changes owner and group of a file. See `write_file_info/2`.","title":"file.change_owner/3","ref":"file.html#change_owner/3"},{"type":"function","doc":"Changes the modification and access times of a file. See `write_file_info/2`.","title":"file.change_time/2","ref":"file.html#change_time/2"},{"type":"function","doc":"Changes the modification and last access times of a file. See\n`write_file_info/2`.","title":"file.change_time/3","ref":"file.html#change_time/3"},{"type":"function","doc":"Closes the file referenced by `IoDevice`. It mostly returns `ok`, except for\nsome severe errors such as out of memory.\n\nNotice that if option `delayed_write` was used when opening the file,\n[`close/1`](`close/1`) can return an old write error and not even try to close\nthe file. See `open/2`.","title":"file.close/1","ref":"file.html#close/1"},{"type":"function","doc":"Reads Erlang terms, separated by `.`, from `Filename`. Returns one of the\nfollowing:\n\n- **`{ok, Terms}`** - The file was successfully read.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang terms in the file. To convert the three-element tuple to an English\n description of the error, use `format_error/1`.\n\n_Example:_\n\n```text\nf.txt: {person, \"kalle\", 25}.\n {person, \"pelle\", 30}.\n```\n\n```erlang\n1> file:consult(\"f.txt\").\n{ok,[{person,\"kalle\",25},{person,\"pelle\",30}]}\n```\n\nThe encoding of `Filename` can be set by a comment, as described in\n[`epp`](`m:epp#encoding`).","title":"file.consult/1","ref":"file.html#consult/1"},{"type":"function","doc":"","title":"file.copy/2","ref":"file.html#copy/2"},{"type":"function","doc":"Copies `ByteCount` bytes from `Source` to `Destination`. `Source` and\n`Destination` refer to either filenames or IO devices from, for example,\n[`open/2`](`open/2`).\n\nArgument `Modes` is a list of possible modes, see `open/2`, and defaults to\n`[]`.\n\nIf both `Source` and `Destination` refer to filenames, the files are opened with\n`[read, binary]` and `[write, binary]` prepended to their mode lists,\nrespectively, to optimize the copy.\n\nIf `Source` refers to a filename, it is opened with `read` mode prepended to the\nmode list before the copy, and closed when done.\n\nIf `Destination` refers to a filename, it is opened with `write` mode prepended\nto the mode list before the copy, and closed when done.\n\nReturns `{ok, BytesCopied}`, where `BytesCopied` is the number of bytes that was\ncopied, which can be less than `ByteCount` if end of file was encountered on the\nsource. If the operation fails, `{error, Reason}` is returned.\n\nTypical error reasons: as for `open/2` if a file had to be opened, and as for\n`read/2` and `write/2`.","title":"file.copy/3","ref":"file.html#copy/3"},{"type":"function","doc":"Ensures that any buffers kept by the operating system (not by the Erlang runtime\nsystem) are written to disk. In many ways it resembles `fsync` but it does not\nupdate some of the metadata of the file, such as the access time. On some\nplatforms this function has no effect.\n\nApplications that access databases or log files often write a tiny data fragment\n(for example, one line in a log file) and then call `fsync()` immediately to\nensure that the written data is physically stored on the hard disk.\nUnfortunately, `fsync()` always initiates two write operations: one for the\nnewly written data and another one to update the modification time stored in the\n`inode`. If the modification time is not a part of the transaction concept,\n`fdatasync()` can be used to avoid unnecessary `inode` disk write operations.\n\nAvailable only in some POSIX systems, this call results in a call to `fsync()`,\nor has no effect in systems not providing the `fdatasync()` syscall.","title":"file.datasync/1","ref":"file.html#datasync/1"},{"type":"function","doc":"Tries to delete directory `Dir`. The directory must be empty before it can be\ndeleted. Returns `ok` if successful.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for the parent directories\n of `Dir`.\n\n- **`eexist`** - The directory is not empty.\n\n- **`enoent`** - The directory does not exist.\n\n- **`enotdir`** - A component of `Dir` is not a directory. On some platforms,\n `enoent` is returned instead.\n\n- **`einval`** - Attempt to delete the current directory. On some platforms,\n `eacces` is returned instead.","title":"file.del_dir/1","ref":"file.html#del_dir/1"},{"type":"function","doc":"Deletes file or directory `File`. If `File` is a directory, its contents is\nfirst recursively deleted. Returns:\n\n- **`ok`** - The operation completed without errors.\n\n- **`{error, posix()}`** - An error occurred when accessing or deleting `File`.\n If some file or directory under `File` could not be deleted, `File` cannot be\n deleted as it is non-empty, and `{error, eexist}` is returned.","title":"file.del_dir_r/1","ref":"file.html#del_dir_r/1"},{"type":"function","doc":"","title":"file.delete/1","ref":"file.html#delete/1"},{"type":"function","doc":"Tries to delete file `Filename`. Returns `ok` if successful.\n\nIf the option `raw` is set, the file server is not called. This can be useful in\nparticular during the early boot stage when the file server is not yet\nregistered, to still be able to delete local files.\n\nTypical error reasons:\n\n- **`enoent`** - The file does not exist.\n\n- **`eacces`** - Missing permission for the file or one of its parents.\n\n- **`eperm`** - The file is a directory and the user is not superuser.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.\n\n- **`einval`** - `Filename` has an improper type, such as tuple.\n\n> #### Warning {: .warning }\n>\n> In a future release, a bad type for argument `Filename` will probably generate\n> an exception.","title":"file.delete/2","ref":"file.html#delete/2"},{"type":"function","doc":"Reads and evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression) from `Filename`. The result of the evaluation\nis not returned; any expression sequence in the file must be there for its side\neffect.\n\nReturns one of the following:\n\n- **`ok`** - The file was read and evaluated.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. To convert the three-element tuple to an\n English description of the error, use `format_error/1`.\n\nThe encoding of `Filename` can be set by a comment, as described in\n[`epp`](`m:epp#encoding`).","title":"file.eval/1","ref":"file.html#eval/1"},{"type":"function","doc":"The same as [`eval/1`](`eval/1`), but the variable bindings `Bindings` are used\nin the evaluation. For information about the variable bindings, see\n`m:erl_eval`.","title":"file.eval/2","ref":"file.html#eval/2"},{"type":"function","doc":"Given the error reason returned by any function in this module, returns a\ndescriptive string of the error in English.","title":"file.format_error/1","ref":"file.html#format_error/1"},{"type":"function","doc":"Returns `{ok, Dir}`, where `Dir` is the current working directory of the file\nserver.\n\n> #### Note {: .info }\n>\n> In rare circumstances, this function can fail on Unix. It can occur if read\n> permission does not exist for the parent directories of the current directory.\n\nA typical error reason:\n\n- **`eacces`** - Missing read permission for one of the parents of the current\n directory.","title":"file.get_cwd/0","ref":"file.html#get_cwd/0"},{"type":"function","doc":"Returns `{ok, Dir}` or `{error, Reason}`, where `Dir` is the current working\ndirectory of the specified drive.\n\n`Drive` is to be of the form `Letter:`, for example, `c:`.\n\nReturns `{error, enotsup}` on platforms that have no concept of current drive\n(Unix, for example).\n\nTypical error reasons:\n\n- **`enotsup`** - The operating system has no concept of drives.\n\n- **`eacces`** - The drive does not exist.\n\n- **`einval`** - The format of `Drive` is invalid.","title":"file.get_cwd/1","ref":"file.html#get_cwd/1"},{"type":"function","doc":"Lists all files in a directory, _except_ files with raw filenames. Returns\n`{ok, Filenames}` if successful, otherwise `{error, Reason}`. `Filenames` is a\nlist of the names of all the files in the directory. The names are not sorted.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for `Dir` or one of its\n parent directories.\n\n- **`enoent`** - The directory does not exist.\n\n- **`{no_translation, Filename}`** - `Filename` is a `t:binary/0` with\n characters coded in ISO Latin-1 and the VM was started with parameter `+fnue`.","title":"file.list_dir/1","ref":"file.html#list_dir/1"},{"type":"function","doc":"[](){: #list_dir_all } Lists all the files in a directory, including files with\nraw filenames. Returns `{ok, Filenames}` if successful, otherwise\n`{error, Reason}`. `Filenames` is a list of the names of all the files in the\ndirectory. The names are not sorted.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for `Dir` or one of its\n parent directories.\n\n- **`enoent`** - The directory does not exist.","title":"file.list_dir_all/1","ref":"file.html#list_dir_all/1"},{"type":"function","doc":"Tries to create directory `Dir`. Missing parent directories are _not_ created.\nReturns `ok` if successful.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search or write permissions for the parent directories\n of `Dir`.\n\n- **`eexist`** - A file or directory named `Dir` exists already.\n\n- **`enoent`** - A component of `Dir` does not exist.\n\n- **`enospc`** - No space is left on the device.\n\n- **`enotdir`** - A component of `Dir` is not a directory. On some platforms,\n `enoent` is returned instead.","title":"file.make_dir/1","ref":"file.html#make_dir/1"},{"type":"function","doc":"Makes a hard link from `Existing` to `New` on platforms supporting links (Unix\nand Windows). This function returns `ok` if the link was successfully created,\notherwise `{error, Reason}`. On platforms not supporting links,\n`{error,enotsup}` is returned.\n\nTypical error reasons:\n\n- **`eacces`** - Missing read or write permissions for the parent directories of\n `Existing` or `New`.\n\n- **`eexist`** - `New` already exists.\n\n- **`enotsup`** - Hard links are not supported on this platform.","title":"file.make_link/2","ref":"file.html#make_link/2"},{"type":"function","doc":"Creates a symbolic link `New` to the file or directory `Existing` on platforms\nsupporting symbolic links (most Unix systems and Windows, beginning with Vista).\n`Existing` does not need to exist. Returns `ok` if the link is successfully\ncreated, otherwise `{error, Reason}`. On platforms not supporting symbolic\nlinks, `{error, enotsup}` is returned.\n\nTypical error reasons:\n\n- **`eacces`** - Missing read or write permissions for the parent directories of\n `Existing` or `New`.\n\n- **`eexist`** - `New` already exists.\n\n- **`enotsup`** - Symbolic links are not supported on this platform.\n\n- **`eperm`** - User does not have privileges to create symbolic links\n (`SeCreateSymbolicLinkPrivilege` on Windows).","title":"file.make_symlink/2","ref":"file.html#make_symlink/2"},{"type":"function","doc":"[](){: #native_name_encoding } Returns the filename encoding mode. If it is\n`latin1`, the system translates no filenames. If it is `utf8`, filenames are\nconverted back and forth to the native filename encoding (usually UTF-8, but\nUTF-16 on Windows).","title":"file.native_name_encoding/0","ref":"file.html#native_name_encoding/0"},{"type":"function","doc":"Opens file `File` in the mode determined by `Modes`, which can contain one or\nmore of the following options:\n\n- **`read`** - The file, which must exist, is opened for reading.\n\n- **`write`** - The file is opened for writing. It is created if it does not\n exist. If the file exists and `write` is not combined with `read`, the file is\n truncated.\n\n- **`append`** - The file is opened for writing. It is created if it does not\n exist. Every write operation to a file opened with `append` takes place at the\n end of the file.\n\n- **`exclusive`** - The file is opened for writing. It is created if it does not\n exist. If the file exists, `{error, eexist}` is returned.\n\n > #### Warning {: .warning }\n >\n > This option does not guarantee exclusiveness on file systems not supporting\n > `O_EXCL` properly, such as NFS. Do not depend on this option unless you know\n > that the file system supports it (in general, local file systems are safe).\n\n- **`raw`** - [](){: #raw } Allows faster access to a file, as no Erlang process\n is needed to handle the file. However, a file opened in this way has the\n following limitations:\n\n - The functions in the `io` module cannot be used, as they can only talk to an\n Erlang process. Instead, use functions `read/2`, `read_line/1`, and\n `write/2`.\n - Especially if [`read_line/1`](`read_line/1`) is to be used on a `raw` file,\n it is recommended to combine this option with option `{read_ahead, Size}` as\n line-oriented I/O is inefficient without buffering.\n - Only the Erlang process that opened the file can use it.\n - A remote Erlang file server cannot be used. The computer on which the Erlang\n node is running must have access to the file system (directly or through\n NFS).\n\n- **`binary`** - Read operations on the file return binaries rather than lists.\n\n- **`{delayed_write, Size, Delay}`** - Data in subsequent [`write/2`](`write/2`)\n calls is buffered until at least `Size` bytes are buffered, or until the\n oldest buffered data is `Delay` milliseconds old. Then all buffered data is\n written in one operating system call. The buffered data is also flushed before\n some other file operation than [`write/2`](`write/2`) is executed.\n\n The purpose of this option is to increase performance by reducing the number\n of operating system calls. Thus, the [`write/2`](`write/2`) calls must be for\n sizes significantly less than `Size`, and not interspersed by too many other\n file operations.\n\n When this option is used, the result of [`write/2`](`write/2`) calls can\n prematurely be reported as successful, and if a write error occurs, the error\n is reported as the result of the next file operation, which is not executed.\n\n For example, when `delayed_write` is used, after a number of\n [`write/2`](`write/2`) calls, [`close/1`](`close/1`) can return\n `{error, enospc}`, as there is not enough space on the disc for previously\n written data. [`close/1`](`close/1`) must probably be called again, as the\n file is still open.\n\n- **`delayed_write`** - The same as `{delayed_write, Size, Delay}` with\n reasonable default values for `Size` and `Delay` (roughly some 64 KB, 2\n seconds).\n\n- **`{read_ahead, Size}`** - Activates read data buffering. If\n [`read/2`](`read/2`) calls are for significantly less than `Size` bytes, read\n operations to the operating system are still performed for blocks of `Size`\n bytes. The extra data is buffered and returned in subsequent\n [`read/2`](`read/2`) calls, giving a performance gain as the number of\n operating system calls is reduced.\n\n The `read_ahead` buffer is also highly used by function\n [`read_line/1`](`read_line/1`) in `raw` mode, therefore this option is\n recommended (for performance reasons) when accessing raw files using that\n function.\n\n If [`read/2`](`read/2`) calls are for sizes not significantly less than, or\n even greater than `Size` bytes, no performance gain can be expected.\n\n- **`read_ahead`** - The same as `{read_ahead, Size}` with a reasonable default\n value for `Size` (roughly some 64 KB).\n\n- **`compressed`** - Makes it possible to read or write gzip compressed files.\n Option `compressed` must be combined with `read` or `write`, but not both.\n Notice that the file size obtained with `read_file_info/1` does probably not\n match the number of bytes that can be read from a compressed file.\n\n- **`compressed_one`** - Read one member of a gzip compressed file. Option\n `compressed_one` can only be combined with `read`.\n\n- **`{encoding, Encoding}`** - Makes the file perform automatic translation of\n characters to and from a specific (Unicode) encoding. Notice that the data\n supplied to `write/2` or returned by `read/2` still is byte-oriented; this\n option denotes only how data is stored in the disk file.\n\n Depending on the encoding, different methods of reading and writing data is\n preferred. The default encoding of `latin1` implies using this module (`file`)\n for reading and writing data as the interfaces provided here work with\n byte-oriented data. Using other (Unicode) encodings makes the `m:io` functions\n `get_chars`, `get_line`, and `put_chars` more suitable, as they can work with\n the full Unicode range.\n\n If data is sent to an `t:io_device/0` in a format that cannot be converted to\n the specified encoding, or if data is read by a function that returns data in\n a format that cannot cope with the character range of the data, an error\n occurs and the file is closed.\n\n Allowed values for `Encoding`:\n\n - **`latin1`** - The default encoding. Bytes supplied to the file, that is,\n `write/2` are written \"as is\" on the file. Likewise, bytes read from the\n file, that is, `read/2` are returned \"as is\". If module `m:io` is used for\n writing, the file can only cope with Unicode characters up to code point 255\n (the ISO Latin-1 range).\n\n - **`unicode or utf8`** - Characters are translated to and from UTF-8 encoding\n before they are written to or read from the file. A file opened in this way\n can be readable using function `read/2`, as long as no data stored on the\n file lies beyond the ISO Latin-1 range (0..255), but failure occurs if the\n data contains Unicode code points beyond that range. The file is best read\n with the functions in the Unicode aware module `m:io`.\n\n Bytes written to the file by any means are translated to UTF-8 encoding\n before being stored on the disk file.\n\n - **`utf16 or {utf16,big}`** - Works like `unicode`, but translation is done\n to and from big endian UTF-16 instead of UTF-8.\n\n - **`{utf16,little}`** - Works like `unicode`, but translation is done to and\n from little endian UTF-16 instead of UTF-8.\n\n - **`utf32 or {utf32,big}`** - Works like `unicode`, but translation is done\n to and from big endian UTF-32 instead of UTF-8.\n\n - **`{utf32,little}`** - Works like `unicode`, but translation is done to and\n from little endian UTF-32 instead of UTF-8.\n\n The Encoding can be changed for a file \"on the fly\" by using function\n `io:setopts/2`. So a file can be analyzed in latin1 encoding for, for example,\n a BOM, positioned beyond the BOM and then be set for the right encoding before\n further reading. For functions identifying BOMs, see module `m:unicode`.\n\n This option is not allowed on `raw` files.\n\n- **`ram`** - `File` must be `t:iodata/0`. Returns an `t:fd/0`, which lets\n module `file` operate on the data in-memory as if it is a file.\n\n- **`sync`** - On platforms supporting it, enables the POSIX `O_SYNC`\n synchronous I/O flag or its platform-dependent equivalent (for example,\n `FILE_FLAG_WRITE_THROUGH` on Windows) so that writes to the file block until\n the data is physically written to disk. However, be aware that the exact\n semantics of this flag differ from platform to platform. For example, none of\n Linux or Windows guarantees that all file metadata are also written before the\n call returns. For precise semantics, check the details of your platform\n documentation. On platforms with no support for POSIX `O_SYNC` or equivalent,\n use of the `sync` flag causes `open` to return `{error, enotsup}`.\n\n- **`directory`** - Allows `open` to work on directories.\n\nReturns:\n\n- **`{ok, IoDevice}`** - The file is opened in the requested mode. `IoDevice` is\n a reference to the file.\n\n- **`{error, Reason}`** - The file cannot be opened.\n\n`IoDevice` is really the pid of the process that handles the file. This process\nmonitors the process that originally opened the file (the owner process). If the\nowner process terminates, the file is closed and the process itself terminates\ntoo. An `IoDevice` returned from this call can be used as an argument to the I/O\nfunctions (see `m:io`).\n\n> #### Warning {: .warning }\n>\n> While this function can be used to open any file, we recommend against using\n> it for NFS-mounted files, FIFOs, devices, or similar since they can cause IO\n> threads to hang forever.\n>\n> If your application needs to interact with these kinds of files we recommend\n> breaking out those parts to a port program instead.\n\n> #### Note {: .info }\n>\n> In previous versions of `file`, modes were specified as one of the atoms\n> `read`, `write`, or `read_write` instead of a list. This is still allowed for\n> reasons of backwards compatibility, but is not to be used for new code. Also\n> note that `read_write` is not allowed in a mode list.\n\nTypical error reasons:\n\n- **`enoent`** - The file does not exist.\n\n- **`eacces`** - Missing permission for reading the file or searching one of the\n parent directories.\n\n- **`eisdir`** - The named file is a directory.\n\n- **`enotdir`** - A component of the filename is not a directory, or the\n filename itself is not a directory if `directory` mode was specified. On some\n platforms, `enoent` is returned instead.\n\n- **`enospc`** - There is no space left on the device (if `write` access was\n specified).","title":"file.open/2","ref":"file.html#open/2"},{"type":"function","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then reads\nErlang terms, separated by `.`, from the file.\n\nReturns one of the following:\n\n- **`{ok, Terms, FullName}`** - The file is successfully read. `FullName` is the\n full name of the file.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang terms in the file. Use `format_error/1` to convert the three-element\n tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","title":"file.path_consult/2","ref":"file.html#path_consult/2"},{"type":"function","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then reads\nand evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression), from the file. The result of evaluation is\nnot returned; any expression sequence in the file must be there for its side\neffect.\n\nReturns one of the following:\n\n- **`{ok, FullName}`** - The file is read and evaluated. `FullName` is the full\n name of the file.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. Use `format_error/1` to convert the\n three-element tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","title":"file.path_eval/2","ref":"file.html#path_eval/2"},{"type":"function","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then opens\nthe file in the mode determined by `Modes`.\n\nReturns one of the following:\n\n- **`{ok, IoDevice, FullName}`** - The file is opened in the requested mode.\n `IoDevice` is a reference to the file and `FullName` is the full name of the\n file.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - The file cannot be opened.","title":"file.path_open/3","ref":"file.html#path_open/3"},{"type":"function","doc":"Searches the path `Path` (a list of directory names) until the file `Filename`\nis found. If `Filename` is an absolute filename, `Path` is ignored. Then reads\nand evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression), from the file.\n\nReturns one of the following:\n\n- **`{ok, Value, FullName}`** - The file is read and evaluated. `FullName` is\n the full name of the file and `Value` the value of the last expression.\n\n- **`{error, enoent}`** - The file cannot be found in any of the directories in\n `Path`.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. Use `format_error/1` to convert the\n three-element tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","title":"file.path_script/2","ref":"file.html#path_script/2"},{"type":"function","doc":"The same as [`path_script/2`](`path_script/2`) but the variable bindings\n`Bindings` are used in the evaluation. See `m:erl_eval` about variable bindings.","title":"file.path_script/3","ref":"file.html#path_script/3"},{"type":"function","doc":"Sets the position of the file referenced by `IoDevice` to `Location`. Returns\n`{ok, NewPosition}` (as absolute offset) if successful, otherwise\n`{error, Reason}`. `Location` is one of the following:\n\n- **`Offset`** - The same as `{bof, Offset}`.\n\n- **`{bof, Offset}`** - Absolute offset.\n\n- **`{cur, Offset}`** - Offset from the current position.\n\n- **`{eof, Offset}`** - Offset from the end of file.\n\n- **`bof | cur | eof`** - The same as above with `Offset` 0.\n\nNotice that offsets are counted in bytes, not in characters. If the file is\nopened using some other `encoding` than `latin1`, one byte does not correspond\nto one character. Positioning in such a file can only be done to known character\nboundaries. That is, to a position earlier retrieved by getting a current\nposition, to the beginning/end of the file or to some other position _known_ to\nbe on a correct character boundary by some other means (typically beyond a byte\norder mark in the file, which has a known byte-size).\n\nA typical error reason is:\n\n- **`einval`** - Either `Location` is illegal, or it is evaluated to a negative\n offset in the file. Notice that if the resulting position is a negative value,\n the result is an error, and after the call the file position is undefined.","title":"file.position/2","ref":"file.html#position/2"},{"type":"function","doc":"Performs a sequence of [`pread/3`](`pread/3`) in one operation, which is more\nefficient than calling them one at a time. Returns `{ok, [Data, ...]}` or\n`{error, Reason}`, where each `Data`, the result of the corresponding `pread`,\nis either a list or a binary depending on the mode of the file, or `eof` if the\nrequested position is beyond end of file.\n\nAs the position is specified as a byte-offset, take special caution when working\nwith files where `encoding` is set to something else than `latin1`, as not every\nbyte position is a valid character boundary on such a file.","title":"file.pread/2","ref":"file.html#pread/2"},{"type":"function","doc":"Combines [`position/2`](`position/2`) and [`read/2`](`read/2`) in one operation,\nwhich is more efficient than calling them one at a time.\n\n`Location` is only allowed to be an integer for `raw` and `ram` modes.\n\nThe current position of the file after the operation is undefined for `raw` mode\nand unchanged for `ram` mode.\n\nAs the position is specified as a byte-offset, take special caution when working\nwith files where `encoding` is set to something else than `latin1`, as not every\nbyte position is a valid character boundary on such a file.","title":"file.pread/3","ref":"file.html#pread/3"},{"type":"function","doc":"Performs a sequence of [`pwrite/3`](`pwrite/3`) in one operation, which is more\nefficient than calling them one at a time. Returns `ok` or\n`{error, {N, Reason}}`, where `N` is the number of successful writes done before\nthe failure.\n\nWhen positioning in a file with other `encoding` than `latin1`, caution must be\ntaken to set the position on a correct character boundary. For details, see\n`position/2`.","title":"file.pwrite/2","ref":"file.html#pwrite/2"},{"type":"function","doc":"Combines [`position/2`](`position/2`) and [`write/2`](`write/2`) in one\noperation, which is more efficient than calling them one at a time.\n\n`Location` is only allowed to be an integer for `raw` and `ram` modes.\n\nThe current position of the file after the operation is undefined for `raw` mode\nand unchanged for `ram` mode.\n\nWhen positioning in a file with other `encoding` than `latin1`, caution must be\ntaken to set the position on a correct character boundary. For details, see\n`position/2`.","title":"file.pwrite/3","ref":"file.html#pwrite/3"},{"type":"function","doc":"Reads `Number` bytes/characters from the file referenced by `IoDevice`.\n\nThe functions `read/2`, `pread/3`, and `read_line/1` are the only ways to read from\na file opened in `raw` mode (although they work for normally opened files, too).\n\nFor files where `encoding` is set to something else than `latin1`, one character\ncan be represented by more than one byte on the file. The parameter `Number`\nalways denotes the number of _characters_ read from the file, while the position\nin the file can be moved much more than this number when reading a Unicode file.\n\nAlso, if `encoding` is set to something else than `latin1`, the\n[`read/2`](`read/2`) call fails if the data contains characters larger than 255,\nwhich is why `io:get_chars/3` is to be preferred when reading such a file.\n\nThe function returns:\n\n- **`{ok, Data}`** - If the file was opened in binary mode, the read bytes are\n returned in a binary, otherwise in a list. The list or binary is shorter than\n the number of bytes requested if end of file was reached.\n\n- **`eof`** - Returned if `Number>0` and end of file was reached before anything\n at all could be read.\n\n- **`{error, Reason}`** - An error occurred.\n\nTypical error reasons:\n\n- **`ebadf`** - The file is not opened for reading.\n\n- **`{no_translation, unicode, latin1}`** - The file is opened with another\n `encoding` than `latin1` and the data in the file cannot be translated to the\n byte-oriented data that this function returns.","title":"file.read/2","ref":"file.html#read/2"},{"type":"function","doc":"","title":"file.read_file/1","ref":"file.html#read_file/1"},{"type":"function","doc":"Returns `{ok, Binary}`, where `Binary` is a binary data object that contains the\ncontents of `Filename`, or `{error, Reason}` if an error occurs.\n\nIf the option `raw` is set, the file server is not called.\n\nTypical error reasons:\n\n- **`enoent`** - The file does not exist.\n\n- **`eacces`** - Missing permission for reading the file, or for searching one\n of the parent directories.\n\n- **`eisdir`** - The named file is a directory.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.\n\n- **`enomem`** - There is not enough memory for the contents of the file.","title":"file.read_file/2","ref":"file.html#read_file/2"},{"type":"function","doc":"","title":"file.read_file_info/1","ref":"file.html#read_file_info/1"},{"type":"function","doc":"Retrieves information about a file. Returns `{ok, FileInfo}` if successful,\notherwise `{error, Reason}`.\n\n`FileInfo` is a record `file_info`, defined in the Kernel include file `file.hrl`.\nInclude the following directive in the module from which the function is called:\n\n```erlang\n-include_lib(\"kernel/include/file.hrl\").\n```\n\nThe time type returned in `atime`, `mtime`, and `ctime` is dependent on the time\ntype set in `Opts :: {time, Type}` as follows:\n\n- **`local`** - Returns local time.\n\n- **`universal`** - Returns universal time.\n\n- **`posix`** - Returns seconds since or before Unix time epoch, which is\n 1970-01-01 00:00 UTC.\n\nDefault is `{time, local}`.\n\nIf the option `raw` is set, the file server is not called and only information\nabout local files is returned. Note that this will break this module's atomicity\nguarantees as it can race with a concurrent call to\n[`write_file_info/1,2` ](`write_file_info/2`).\n\nThis option has no effect when the function is given an I/O device instead of a\nfile name. Use `open/2` with the `raw` mode to obtain a file descriptor first.\n\n> #### Note {: .info }\n>\n> As file times are stored in POSIX time on most OS, it is faster to query file\n> information with option `posix`.\n\nThe record `file_info` contains the following fields:\n\n- **`size = ` `t:non_neg_integer/0`** - Size of file in bytes.\n\n- **`type = device | directory | other | regular`** - The type of the file. Can\n also contain `symlink` when returned from\n [read_link_info/1,2](`read_link_info/1`).\n\n- **`access = read | write | read_write | none`** - The current system access to\n the file.\n\n- **`atime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n read.\n\n- **`mtime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n written.\n\n- **`ctime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The interpretation of this\n time field depends on the operating system. On Unix, it is the last time the\n file or the `inode` was changed. In Windows, it is the create time.\n\n- **`mode = ` `t:non_neg_integer/0`** - The file permissions as the sum of the following\n bit values:\n\n - **`8#00400`** - read permission: owner\n\n - **`8#00200`** - write permission: owner\n\n - **`8#00100`** - execute permission: owner\n\n - **`8#00040`** - read permission: group\n\n - **`8#00020`** - write permission: group\n\n - **`8#00010`** - execute permission: group\n\n - **`8#00004`** - read permission: other\n\n - **`8#00002`** - write permission: other\n\n - **`8#00001`** - execute permission: other\n\n - **`16#800`** - set user id on execution\n\n - **`16#400`** - set group id on execution\n\n On Unix platforms, other bits than those listed above may be set.\n\n- **`links = ` `t:non_neg_integer/0`** - Number of links to the file (this is always 1\n for file systems that have no concept of links).\n\n- **`major_device = ` `t:non_neg_integer/0`** - Identifies the file system where the\n file is located. In Windows, the number indicates a drive as follows: 0 means\n A:, 1 means B:, and so on.\n\n- **`minor_device = ` `t:non_neg_integer/0`** - Only valid for character devices on\n Unix. In all other cases, this field is zero.\n\n- **`inode = ` `t:non_neg_integer/0`** - Gives the `inode` number. On non-Unix file\n systems, this field is zero.\n\n- **`uid = ` `t:non_neg_integer/0`** - Indicates the owner of the file. On non-Unix file\n systems, this field is zero.\n\n- **`gid = ` `t:non_neg_integer/0`** - Gives the group that the owner of the file\n belongs to. On non-Unix file systems, this field is zero.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search permission for one of the parent directories of\n the file.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.","title":"file.read_file_info/2","ref":"file.html#read_file_info/2"},{"type":"function","doc":"Reads a line of bytes/characters from the file referenced by `IoDevice`.\n\nLines are defined to be delimited by the linefeed (LF, `\\n`) character, but any\ncarriage return (CR, `\\r`) followed by a newline is also treated as a single LF\ncharacter (the carriage return is silently ignored). The line is returned\n_including_ the LF, but excluding any CR immediately followed by an LF. This\nbehaviour is consistent with the behaviour of `io:get_line/2`. If end of file is\nreached without any LF ending the last line, a line with no trailing LF is\nreturned.\n\nThe function can be used on files opened in `raw` mode. However, it is\ninefficient to use it on `raw` files if the file is not opened with option\n`{read_ahead, Size}` specified. Thus, combining `raw` and `{read_ahead, Size}`\nis highly recommended when opening a text file for raw line-oriented reading.\n\nIf `encoding` is set to something else than `latin1`, the\n[`read_line/1`](`read_line/1`) call fails if the data contains characters larger\nthan 255, why `io:get_line/2` is to be preferred when reading such a file.\n\nThe function returns:\n\n- **`{ok, Data}`** - One line from the file is returned, including the trailing\n LF, but with CRLF sequences replaced by a single LF (see above).\n\n If the file is opened in binary mode, the read bytes are returned in a binary,\n otherwise in a list.\n\n- **`eof`** - Returned if end of file was reached before anything at all could\n be read.\n\n- **`{error, Reason}`** - An error occurred.\n\nTypical error reasons:\n\n- **`ebadf`** - The file is not opened for reading.\n\n- **`{no_translation, unicode, latin1}`** - The file is opened with another\n `encoding` than `latin1` and the data on the file cannot be translated to the\n byte-oriented data that this function returns.","title":"file.read_line/1","ref":"file.html#read_line/1"},{"type":"function","doc":"[](){: #read_link_all } Returns `{ok, Filename}` if `Name` refers to a symbolic\nlink that is not a raw filename, or `{error, Reason}` otherwise. On platforms\nthat do not support symbolic links, the return value is `{error,enotsup}`.\n\nTypical error reasons:\n\n- **`einval`** - `Name` does not refer to a symbolic link or the name of the\n file that it refers to does not conform to the expected encoding.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotsup`** - Symbolic links are not supported on this platform.","title":"file.read_link/1","ref":"file.html#read_link/1"},{"type":"function","doc":"Returns `{ok, Filename}` if `Name` refers to a symbolic link or\n`{error, Reason}` otherwise. On platforms that do not support symbolic links,\nthe return value is `{error,enotsup}`.\n\nNotice that `Filename` can be either a list or a binary.\n\nTypical error reasons:\n\n- **`einval`** - `Name` does not refer to a symbolic link.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotsup`** - Symbolic links are not supported on this platform.","title":"file.read_link_all/1","ref":"file.html#read_link_all/1"},{"type":"function","doc":"","title":"file.read_link_info/1","ref":"file.html#read_link_info/1"},{"type":"function","doc":"Works like [`read_file_info/1,2`](`read_file_info/2`) except that if `Name` is a\nsymbolic link, information about the link is returned in the `file_info` record\nand the `type` field of the record is set to `symlink`.\n\nIf the option `raw` is set, the file server is not called and only information\nabout local files is returned. Note that this will break this module's atomicity\nguarantees as it can race with a concurrent call to\n[`write_file_info/1,2`](`write_file_info/2`)\n\nIf `Name` is not a symbolic link, this function returns the same result as\n[`read_file_info/1`](`read_file_info/1`). On platforms that do not support\nsymbolic links, this function is always equivalent to\n[`read_file_info/1`](`read_file_info/1`).","title":"file.read_link_info/2","ref":"file.html#read_link_info/2"},{"type":"function","doc":"Tries to rename the file `Source` to `Destination`. It can be used to move files\n(and directories) between directories, but it is not sufficient to specify the\ndestination only. The destination filename must also be specified. For example,\nif `bar` is a normal file and `foo` and `baz` are directories,\n[`rename(\"foo/bar\", \"baz\")`](`rename/2`) returns an error, but\n[`rename(\"foo/bar\", \"baz/bar\")`](`rename/2`) succeeds. Returns `ok` if it is\nsuccessful.\n\n> #### Note {: .info }\n>\n> Renaming of open files is not allowed on most platforms (see `eacces` below).\n\nTypical error reasons:\n\n- **`eacces`** - Missing read or write permissions for the parent directories of\n `Source` or `Destination`. On some platforms, this error is given if either\n `Source` or `Destination` is open.\n\n- **`eexist`** - `Destination` is not an empty directory. On some platforms,\n also given when `Source` and `Destination` are not of the same type.\n\n- **`einval`** - `Source` is a root directory, or `Destination` is a\n subdirectory of `Source`.\n\n- **`eisdir`** - `Destination` is a directory, but `Source` is not.\n\n- **`enoent`** - `Source` does not exist.\n\n- **`enotdir`** - `Source` is a directory, but `Destination` is not.\n\n- **`exdev`** - `Source` and `Destination` are on different file systems.","title":"file.rename/2","ref":"file.html#rename/2"},{"type":"function","doc":"Reads and evaluates Erlang expressions, separated by `.` (or `,`, a sequence of\nexpressions is also an expression), from the file.\n\nReturns one of the following:\n\n- **`{ok, Value}`** - The file is read and evaluated. `Value` is the value of\n the last expression.\n\n- **`{error, atom()}`** - An error occurred when opening the file or reading it.\n For a list of typical error codes, see `open/2`.\n\n- **`{error, {Line, Mod, Term}}`** - An error occurred when interpreting the\n Erlang expressions in the file. Use `format_error/1` to convert the\n three-element tuple to an English description of the error.\n\nThe encoding of `Filename` can be set by a comment as described in\n[`epp`](`m:epp#encoding`).","title":"file.script/1","ref":"file.html#script/1"},{"type":"function","doc":"The same as [`script/1`](`script/1`) but the variable bindings `Bindings` are\nused in the evaluation. See `m:erl_eval` about variable bindings.","title":"file.script/2","ref":"file.html#script/2"},{"type":"function","doc":"Sends the file `Filename` to `Socket`. Returns `{ok, BytesSent}` if successful,\notherwise `{error, Reason}`.","title":"file.sendfile/2","ref":"file.html#sendfile/2"},{"type":"function","doc":"Sends `Bytes` from the file referenced by `RawFile` beginning at `Offset` to\n`Socket`. Returns `{ok, BytesSent}` if successful, otherwise `{error, Reason}`.\nIf `Bytes` is set to `0` all data after the specified `Offset` is sent.\n\nThe file used must be opened using the `raw` flag, and the process calling\n`sendfile` must be the controlling process of the socket. See\n`gen_tcp:controlling_process/2` or module [`socket`'s](`socket:setopt/3`)\n[level `otp` socket option ](`t:socket:otp_socket_option/0`)`controlling_process`.\n\nIf the OS used does not support non-blocking `sendfile`, an Erlang fallback\nusing `read/2` and `gen_tcp:send/2` is used.\n\nThe option list can contain the following options:\n\n- **`chunk_size`** - The chunk size used by the Erlang fallback to send data. If\n using the fallback, set this to a value that comfortably fits in the systems\n memory. Default is 20 MB.","title":"file.sendfile/5","ref":"file.html#sendfile/5"},{"type":"function","doc":"Sets the current working directory of the file server to `Dir`. Returns `ok` if\nsuccessful.\n\nThe functions in the module `file` usually treat binaries as raw filenames, that\nis, they are passed \"as is\" even when the encoding of the binary does not agree\nwith [`native_name_encoding()`](`native_name_encoding/0`). However, this\nfunction expects binaries to be encoded according to the value returned by\n`native_name_encoding/0`.\n\nTypical error reasons are:\n\n- **`enoent`** - The directory does not exist.\n\n- **`enotdir`** - A component of `Dir` is not a directory. On some platforms,\n `enoent` is returned.\n\n- **`eacces`** - Missing permission for the directory or one of its parents.\n\n- **`badarg`** - `Dir` has an improper type, such as tuple.\n\n- **`no_translation`** - `Dir` is a `t:binary/0` with characters coded in\n ISO-latin-1 and the VM is operating with unicode filename encoding.\n\n> #### Warning {: .warning }\n>\n> In a future release, a bad type for argument `Dir` will probably generate an\n> exception.","title":"file.set_cwd/1","ref":"file.html#set_cwd/1"},{"type":"function","doc":"Ensures that any buffers kept by the operating system (not by the Erlang runtime\nsystem) are written to disk. On some platforms, this function might have no\neffect.\n\nA typical error reason is:\n\n- **`enospc`** - Not enough space left to write the file.","title":"file.sync/1","ref":"file.html#sync/1"},{"type":"function","doc":"Truncates the file referenced by `IoDevice` at the current position. Returns\n`ok` if successful, otherwise `{error, Reason}`.","title":"file.truncate/1","ref":"file.html#truncate/1"},{"type":"function","doc":"Writes `Bytes` to the file referenced by `IoDevice`. This function is the only\nway to write to a file opened in `raw` mode (although it works for normally\nopened files too). Returns `ok` if successful, and `{error, Reason}` otherwise.\n\nIf the file is opened with `encoding` set to something else than `latin1`, each\nbyte written can result in many bytes being written to the file, as the byte\nrange 0..255 can represent anything between one and four bytes depending on\nvalue and UTF encoding type. If you want to write `t:unicode:chardata/0` to the\n`IoDevice` you should use `io:put_chars/2` instead.\n\nTypical error reasons:\n\n- **`ebadf`** - The file is not opened for writing.\n\n- **`enospc`** - No space is left on the device.","title":"file.write/2","ref":"file.html#write/2"},{"type":"function","doc":"Writes the contents of the `iodata` term `Bytes` to file `Filename`. The file is\ncreated if it does not exist. If it exists, the previous contents are\noverwritten. Returns `ok` if successful, otherwise `{error, Reason}`.\n\nTypical error reasons:\n\n- **`enoent`** - A component of the filename does not exist.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.\n\n- **`enospc`** - No space is left on the device.\n\n- **`eacces`** - Missing permission for writing the file or searching one of the\n parent directories.\n\n- **`eisdir`** - The named file is a directory.","title":"file.write_file/2","ref":"file.html#write_file/2"},{"type":"function","doc":"Same as [`write_file/2`](`write_file/2`), but takes a third argument `Modes`, a\nlist of possible modes, see `open/2`. The mode flags `binary` and `write` are\nimplicit, so they are not to be used.","title":"file.write_file/3","ref":"file.html#write_file/3"},{"type":"function","doc":"","title":"file.write_file_info/2","ref":"file.html#write_file_info/2"},{"type":"function","doc":"Changes file information. Returns `ok` if successful, otherwise\n`{error, Reason}`.\n\n`FileInfo` is a record `file_info`, defined in the Kernel\ninclude file `file.hrl`. Include the following directive in the module from\nwhich the function is called:\n\n```erlang\n-include_lib(\"kernel/include/file.hrl\").\n```\n\nThe time type set in `atime`, `mtime`, and `ctime` depends on the time type set\nin `Opts :: {time, Type}` as follows:\n\n- **`local`** - Interprets the time set as local.\n\n- **`universal`** - Interprets it as universal time.\n\n- **`posix`** - Must be seconds since or before Unix time epoch, which is\n 1970-01-01 00:00 UTC.\n\nDefault is `{time, local}`.\n\nIf the option `raw` is set, the file server is not called and only information\nabout local files is returned.\n\nThe following fields are used from the record, if they are specified:\n\n- **`atime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n read.\n\n- **`mtime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - The last time the file was\n written.\n\n- **`ctime = ` `t:date_time/0` ` | ` `t:non_neg_integer/0`** - On Unix, any value\n specified for this field is ignored (the \"ctime\" for the file is set to the\n current time). On Windows, this field is the new creation time to set for the\n file.\n\n- **`mode = ` `t:non_neg_integer/0`** - The file permissions as the sum of the following\n bit values:\n\n - **`8#00400`** - Read permission: owner\n\n - **`8#00200`** - Write permission: owner\n\n - **`8#00100`** - Execute permission: owner\n\n - **`8#00040`** - Read permission: group\n\n - **`8#00020`** - Write permission: group\n\n - **`8#00010`** - Execute permission: group\n\n - **`8#00004`** - Read permission: other\n\n - **`8#00002`** - Write permission: other\n\n - **`8#00001`** - Execute permission: other\n\n - **`16#800`** - Set user id on execution\n\n - **`16#400`** - Set group id on execution\n\n On Unix platforms, other bits than those listed above may be set.\n\n- **`uid = ` `t:non_neg_integer/0`** - Indicates the file owner. Ignored for non-Unix\n file systems.\n\n- **`gid = ` `t:non_neg_integer/0`** - Gives the group that the file owner belongs to.\n Ignored for non-Unix file systems.\n\nTypical error reasons:\n\n- **`eacces`** - Missing search permission for one of the parent directories of\n the file.\n\n- **`enoent`** - The file does not exist.\n\n- **`enotdir`** - A component of the filename is not a directory. On some\n platforms, `enoent` is returned instead.","title":"file.write_file_info/3","ref":"file.html#write_file_info/3"},{"type":"type","doc":"Must denote a valid date and time.","title":"file.date_time/0","ref":"file.html#t:date_time/0"},{"type":"type","doc":"","title":"file.deep_list/0","ref":"file.html#t:deep_list/0"},{"type":"type","doc":"","title":"file.delete_option/0","ref":"file.html#t:delete_option/0"},{"type":"type","doc":"A file descriptor representing a file opened in [`raw`](`m:file#raw`) mode.","title":"file.fd/0","ref":"file.html#t:fd/0"},{"type":"type","doc":"","title":"file.file_info/0","ref":"file.html#t:file_info/0"},{"type":"type","doc":"","title":"file.file_info_option/0","ref":"file.html#t:file_info_option/0"},{"type":"type","doc":"A file name as returned from `m:file` API functions.\n\nSee the documentation of the `t:name_all/0` type.","title":"file.filename/0","ref":"file.html#t:filename/0"},{"type":"type","doc":"A file name as returned from `m:file` API functions.\n\nSee the documentation of the `t:name_all/0` type.","title":"file.filename_all/0","ref":"file.html#t:filename_all/0"},{"type":"type","doc":"An IO device as returned by `open/2`.\n\n`t:io_server/0` is returned by default and `t:fd/0` is returned if the `raw` option is given.","title":"file.io_device/0","ref":"file.html#t:io_device/0"},{"type":"type","doc":"A process handling the I/O protocol.","title":"file.io_server/0","ref":"file.html#t:io_server/0"},{"type":"type","doc":"","title":"file.location/0","ref":"file.html#t:location/0"},{"type":"type","doc":"","title":"file.mode/0","ref":"file.html#t:mode/0"},{"type":"type","doc":"A restricted file name used as input into `m:file` API functions.\n\nIf VM is in Unicode filename mode, `t:string/0` and `t:char/0` are allowed to\nbe > 255. See also the documentation of the `t:name_all/0` type.","title":"file.name/0","ref":"file.html#t:name/0"},{"type":"type","doc":"A file name used as input into `m:file` API functions.\n\nIf VM is in Unicode filename mode, characters are allowed to be > 255.\n`RawFilename` is a filename not subject to Unicode translation, meaning that it\ncan contain characters not conforming to the Unicode encoding expected from the\nfile system (that is, non-UTF-8 characters although the VM is started in Unicode\nfilename mode). Null characters (integer value zero) are _not_ allowed in\nfilenames (not even at the end).","title":"file.name_all/0","ref":"file.html#t:name_all/0"},{"type":"type","doc":"An atom that is named from the POSIX error codes used in Unix, and in the\nruntime libraries of most C compilers.","title":"file.posix/0","ref":"file.html#t:posix/0"},{"type":"type","doc":"","title":"file.posix_file_advise/0","ref":"file.html#t:posix_file_advise/0"},{"type":"type","doc":"","title":"file.read_file_option/0","ref":"file.html#t:read_file_option/0"},{"type":"type","doc":"","title":"file.sendfile_option/0","ref":"file.html#t:sendfile_option/0"},{"type":"module","doc":"Interface to SCTP sockets.\n\nThis module provides functions for communicating over SCTP sockets.\nThe implementation assumes that the OS kernel supports SCTP\n[(RFC 2960)](http://www.rfc-archive.org/getrfc.php?rfc=2960)\nthrough the user-level\n[Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\nDuring development, this implementation was tested on:\n\n- Linux Fedora Core 5.0 (kernel 2.6.15-2054 or later is needed)\n- Solaris 10, 11\n\nDuring OTP adaptation it was tested on:\n\n- SUSE Linux Enterprise Server 10 (x86_64) kernel 2.6.16.27-0.6-smp, with\n lksctp-tools-1.0.6\n- Briefly on Solaris 10\n- SUSE Linux Enterprise Server 10 Service Pack 1 (x86_64) kernel\n 2.6.16.54-0.2.3-smp with lksctp-tools-1.0.7\n- FreeBSD 8.2\n\nThis module was written for one-to-many style sockets (type `seqpacket`).\nWith the addition of `peeloff/2`, one-to-one style sockets (type `stream`)\nwere introduced.\n\nRecord definitions for this module can be found using:\n\n```erlang\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n```\n\nThese record definitions use the \"new\" spelling 'adaptation',\nnot the deprecated 'adaption', regardless of which spelling\nthe underlying C API uses.\n\n[](){: #options } SCTP Socket Options\n-------------------------------------\n\nThe set of admissible SCTP socket options is by construction orthogonal\nto the sets of TCP, UDP, and generic `inet` options. Here are only\noptions listed that are allowed for SCTP sockets.\n\nOptions can be set on the socket when calling [`open/1,2`](`open/1`),\nand changed when calling [`connect/4,5`](`connect/4`) or\nby calling `inet:setopts/2`. They can be retrieved using `inet:getopts/2`.\n\n- **`{mode, list|binary} | list | binary`** [](){: #option-binary } [](){: #option-list } -\n Determines the type of data returned from [`recv/1,2`](`recv/1`)\n or in _active mode_ data messages.\n\n- **`{active, false|true|once|N}`** [](){: #option-active }\n\n - If `false` (_passive mode_, the default), the caller must do an explicit\n [`recv`](`recv/1`) call to retrieve the available data from the socket.\n\n - If `true|once|N` (_active modes_) received data or events are sent\n to the owning process. See [`open/0..2`](`open/0`) for the message format.\n\n - If `true` (fully _active mode_) there is no flow control.\n\n > #### Note {: .info }\n >\n > Note that this can cause the message queue to overflow\n > causing for example the virtual machine to run out of memory and crash.\n\n - If `once`, only one message is automatically placed in the message queue,\n and the mode resets to passive. This provides flow control\n and the possibility for the receiver to listen for incoming\n SCTP data interleaved with other inter-process messages.\n\n - If `active` is specified as an integer `N` in the range -32768 to 32767\n (inclusive), that number is added to the socket's data messages counter.\n If the result of the addition is negative, the counter is set to `0`.\n Once the counter reaches `0`, either through the delivery of messages\n or by being explicitly set with `inet:setopts/2`, the socket mode\n resets to passive (`{active, false}`). When a socket in `{active, N}`\n mode transitions to passive mode, the message `{sctp_passive, Socket}`\n is sent to the controlling process to notify that if it wants to receive\n more data messages from the socket, it must call `inet:setopts/2`\n to set the socket back into an active mode.\n\n- **`{tos, integer()}`** - Sets the Type-Of-Service field on the IP datagrams\n that are sent, to the specified value. This effectively determines a\n prioritization policy for the outbound packets. The acceptable values are\n system-dependent.\n\n- **`{priority, integer()}`** - A protocol-independent equivalent of `tos`\n above. Setting priority implies setting `tos` as well.\n\n- **`{dontroute, true|false}`** - Defaults to `false`.\n If `true`, the kernel does not send packets through any gateway,\n but only sends them to directly connected hosts.\n\n- **`{reuseaddr, true|false}`** - Defaults to `false`.\n If `true`, the local binding address `{IP,Port}` of the socket can be\n reused immediately. No waiting in state `CLOSE_WAIT` is performed\n (can be required for some types of servers).\n\n- **`{sndbuf, integer()}`** - The size, in bytes, of the OS kernel send buffer\n for this socket. Sending errors would occur for datagrams larger than\n `val(sndbuf)`. Setting this option also adjusts the size of\n the driver buffer (see `buffer` above).\n\n- **`{recbuf, integer()}`** - The size, in bytes, of the OS kernel receive\n buffer for this socket. Sending errors would occur for datagrams\n larger than `val(recbuf)`. Setting this option also adjusts the size\n of the driver buffer (see `buffer` above).\n\n### [](){: #option_non_block_send }\n\n- **`{non_block_send, boolean()}`** - A send call that would otherwise block (hang),\n will instead immediately return with e.g. `{error, eagain}`\n *if* this option has been set to `true`.\n Defaults to `false`.\n\n- **`{sctp_module, module()}`** - Overrides which callback module is used.\nDefaults to `inet_sctp` for IPv4 and `inet6_sctp` for IPv6.\n\n- **`{sctp_rtoinfo, #sctp_rtoinfo{}}`**\n\n ```erlang\n #sctp_rtoinfo{\n assoc_id = assoc_id(),\n initial = integer(),\n max = integer(),\n min = integer()\n }\n ```\n\n Determines retransmission time-out parameters, in milliseconds, for the\n association(s) specified by `assoc_id`.\n\n `assoc_id = 0` (default) indicates the whole endpoint. See\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\n for the exact semantics of the field values.\n\n- **`{sctp_associnfo, #sctp_assocparams{}}`**\n\n ```erlang\n #sctp_assocparams{\n assoc_id = assoc_id(),\n asocmaxrxt = integer(),\n number_peer_destinations = integer(),\n peer_rwnd = integer(),\n local_rwnd = integer(),\n cookie_life = integer()\n }\n ```\n\n Determines association parameters for the association(s) specified by\n `assoc_id`.\n\n `assoc_id = 0` (default) indicates the whole endpoint. See\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\n for the discussion of their semantics. Rarely used.\n\n- **`{sctp_initmsg, #sctp_initmsg{}}`**\n\n ```erlang\n #sctp_initmsg{\n num_ostreams = integer(),\n max_instreams = integer(),\n max_attempts = integer(),\n max_init_timeo = integer()\n }\n ```\n\n Determines the default parameters that this socket tries to negotiate\n with its peer while establishing an association with it. Is to be set after\n [`open/*`](`open/1`) but before the first [`connect/*`](`connect/4`).\n `#sctp_initmsg{}` can also be used as ancillary data with the first call of\n [`send/*`](`send/3`) to a new peer (when a new association is created).\n\n - **`num_ostreams`** - Number of outbound streams\n\n - **`max_instreams`** - Maximum number of inbound streams\n\n - **`max_attempts`** - Maximum retransmissions while establishing an\n association\n\n - **`max_init_timeo`** - Time-out, in milliseconds, for establishing an\n association\n\n- **`{sctp_autoclose, integer() >= 0}`** - Determines the time, in seconds,\n after which an idle association is automatically closed. `0` means that the\n association is never automatically closed.\n\n- **`{sctp_nodelay, true|false}`** - Turns on|off the Nagle algorithm for\n merging small packets into larger ones. This improves throughput at the\n expense of latency.\n\n- **`{sctp_disable_fragments, true|false}`** - If `true`, induces an error on an\n attempt to send a message larger than the current PMTU size (which would\n require fragmentation/reassembling). Notice that message fragmentation does\n not affect the logical atomicity of its delivery; this option is provided for\n performance reasons only.\n\n- **`{sctp_i_want_mapped_v4_addr, true|false}`** - Turns on|off automatic\n mapping of IPv4 addresses into IPv6 ones (if the socket address family is\n `AF_INET6`).\n\n- **`{sctp_maxseg, integer()}`** - Determines the maximum chunk size if message\n fragmentation is used. If `0`, the chunk size is limited by the Path MTU only.\n\n- **`{sctp_primary_addr, #sctp_prim{}}`**\n\n ```erlang\n #sctp_prim{\n assoc_id = assoc_id(),\n addr = {IP, Port}\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n For the association specified by `assoc_id`, `{IP,Port}` must be one of the\n peer addresses. This option determines that the specified address is treated\n by the local SCTP stack as the primary address of the peer.\n\n- **`{sctp_set_peer_primary_addr, #sctp_setpeerprim{}}`**\n\n ```erlang\n #sctp_setpeerprim{\n assoc_id = assoc_id(),\n addr = {IP, Port}\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n When set, informs the peer to use `{IP, Port}` as the primary address of the\n local endpoint for the association specified by `assoc_id`.\n\n\n- **`{sctp_adaptation_layer, #sctp_setadaptation{}}`** [](){: #option-sctp_adaptation_layer }\n\n ```erlang\n #sctp_setadaptation{\n adaptation_ind = integer()\n }\n ```\n\n When set, requests that the local endpoint uses the value specified by\n `adaptation_ind` as the Adaptation Indication parameter for establishing\n new associations. For details, see\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\n- **`{sctp_peer_addr_params, #sctp_paddrparams{}}`**\n\n ```erlang\n #sctp_paddrparams{\n assoc_id = assoc_id(),\n address = {IP, Port},\n hbinterval = integer(),\n pathmaxrxt = integer(),\n pathmtu = integer(),\n sackdelay = integer(),\n flags = list()\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n Determines various per-address parameters for the association specified by\n `assoc_id` and the peer address `address` (the SCTP protocol supports\n multi-homing, so more than one address can correspond to a specified\n association).\n\n - **`hbinterval`** - Heartbeat interval, in milliseconds\n\n - **`pathmaxrxt`** - Maximum number of retransmissions before this address is\n considered unreachable (and an alternative address is selected)\n\n - **`pathmtu`** - Fixed Path MTU, if automatic discovery is disabled (see\n `flags` below)\n\n - **`sackdelay`** - Delay, in milliseconds, for SAC messages (if the delay is\n enabled, see `flags` below)\n\n - **`flags`** - The following flags are available:\n\n - **`hb_enable`** - Enables heartbeat\n\n - **`hb_disable`** - Disables heartbeat\n\n - **`hb_demand`** - Initiates heartbeat immediately\n\n - **`pmtud_enable`** - Enables automatic Path MTU discovery\n\n - **`pmtud_disable`** - Disables automatic Path MTU discovery\n\n - **`sackdelay_enable`** - Enables SAC delay\n\n - **`sackdelay_disable`** - Disables SAC delay\n\n- **`{sctp_default_send_param, #sctp_sndrcvinfo{}}`**\n\n [](){: #record-sctp_sndrcvinfo }\n ```erlang\n #sctp_sndrcvinfo{\n stream = integer(),\n ssn = integer(),\n flags = list(),\n ppid = integer(),\n context = integer(),\n timetolive = integer(),\n tsn = integer(),\n cumtsn = integer(),\n assoc_id = assoc_id()\n }\n ```\n\n `#sctp_sndrcvinfo{}` is used both in this socket option, and as\n ancillary data while sending or receiving SCTP messages. When set\n as an option, it provides default values for subsequent\n [`send`](`send/3`) calls on the association specified by `assoc_id`.\n\n `assoc_id = 0` (default) indicates the whole endpoint.\n\n The following fields typically must be specified by the sender:\n\n - **`sinfo_stream`** - Stream number (0-base) within the association to send\n the messages through;\n\n - **`sinfo_flags`** - The following flags are recognised:\n\n - **`unordered`** - The message is to be sent unordered\n\n - **`addr_over`** - The address specified in [`send`](`send/3`) overwrites\n the primary peer address\n\n - **`abort`** - Aborts the current association without flushing any unsent\n data\n\n - **`eof`** - Gracefully shuts down the current association, with flushing\n of unsent data\n\n Other fields are rarely used. For complete information, see\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\n- **`{sctp_events, #sctp_event_subscribe{}}`** [](){: #option-sctp_events }\n\n ```erlang\n #sctp_event_subscribe{\n data_io_event = true | false,\n association_event = true | false,\n address_event = true | false,\n send_failure_event = true | false,\n peer_error_event = true | false,\n shutdown_event = true | false,\n partial_delivery_event = true | false,\n adaptation_layer_event = true | false\n }\n ```\n\n This option determines which [SCTP Events](#sctp-events) that are to be\n received (through [`recv/*`](`recv/1`)) along with the data. The only\n exception is `data_io_event`, which enables or disables receiving of\n [`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) ancillary data,\n not events. By default, all flags except `adaptation_layer_event` are enabled,\n although `sctp_data_io_event` and `association_event` are used by the driver\n itself and not exported to the user level.\n\n- **`{sctp_delayed_ack_time, #sctp_assoc_value{}}`**\n\n ```erlang\n #sctp_assoc_value{\n assoc_id = assoc_id(),\n assoc_value = integer()\n }\n ```\n\n Rarely used. Determines the ACK time (specified by `assoc_value`, in\n milliseconds) for the specified association or the whole endpoint if\n `assoc_value = 0` (default).\n\n- **`{sctp_status, #sctp_status{}}`**\n\n ```erlang\n #sctp_status{\n assoc_id = assoc_id(),\n state = atom(),\n rwnd = integer(),\n unackdata = integer(),\n penddata = integer(),\n instrms = integer(),\n outstrms = integer(),\n fragmentation_point = integer(),\n primary = #sctp_paddrinfo{}\n }\n ```\n\n This option is read-only. It determines the status of the SCTP association\n specified by `assoc_id`. The following are the possible values of `state`\n (the state designations are mostly self-explanatory):\n\n - **`sctp_state_empty`** - Default. Means that no other state is active.\n\n - **`sctp_state_closed`**\n\n - **`sctp_state_cookie_wait`**\n\n - **`sctp_state_cookie_echoed`**\n\n - **`sctp_state_established`**\n\n - **`sctp_state_shutdown_pending`**\n\n - **`sctp_state_shutdown_sent`**\n\n - **`sctp_state_shutdown_received`**\n\n - **`sctp_state_shutdown_ack_sent`**\n\n Semantics of the other fields:\n\n - **`sstat_rwnd`** - Current receiver window size of the association\n\n - **`sstat_unackdata`** - Number of unacked data chunks\n\n - **`sstat_penddata`** - Number of data chunks pending receipt\n\n - **`sstat_instrms`** - Number of inbound streams\n\n - **`sstat_outstrms`** - Number of outbound streams\n\n - **`sstat_fragmentation_point`** - Message size at which SCTP fragmentation\n occurs\n\n - **`sstat_primary`** - Information on the current primary peer address (see\n below for the format of `#sctp_paddrinfo{}`)\n\n\n- **`{sctp_get_peer_addr_info, #sctp_paddrinfo{}}`** [](){: #option-sctp_get_peer_addr_info }\n\n ```erlang\n #sctp_paddrinfo{\n assoc_id = assoc_id(),\n address = {IP, Port},\n state = inactive | active | unconfirmed,\n cwnd = integer(),\n srtt = integer(),\n rto = integer(),\n mtu = integer()\n }\n IP = ip_address()\n Port = port_number()\n ```\n\n This option is read-only. It determines the parameters specific to\n the peer address specified by `address` within the association specified\n by `assoc_id`. Field `address` fmust be set by the caller; all other fields\n are filled in on return. If `assoc_id = 0` (default), the `address`\n is automatically translated into the corresponding association ID.\n This option is rarely used. For the semantics of all fields, see\n [RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) and\n [Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).\n\n[](){: #examples } SCTP Examples\n--------------------------------\n\nExample of an Erlang SCTP server that receives SCTP messages\nand prints them on the standard output:\n\n```erlang\n-module(sctp_server).\n\n-export([server/0,server/1,server/2]).\n-include_lib(\"kernel/include/inet.hrl\").\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n\nserver() ->\n server(any, 2006).\n\nserver([Host,Port]) when is_list(Host), is_list(Port) ->\n {ok, #hostent{h_addr_list = [IP|_]}} = inet:gethostbyname(Host),\n io:format(\"~w -> ~w~n\", [Host, IP]),\n server([IP, list_to_integer(Port)]).\n\nserver(IP, Port) when is_tuple(IP) orelse IP == any orelse IP == loopback,\n is_integer(Port) ->\n {ok,S} = gen_sctp:open(Port, [{recbuf,65536}, {ip,IP}]),\n io:format(\"Listening on ~w:~w. ~w~n\", [IP,Port,S]),\n ok = gen_sctp:listen(S, true),\n server_loop(S).\n\nserver_loop(S) ->\n case gen_sctp:recv(S) of\n {error, Error} ->\n io:format(\"SCTP RECV ERROR: ~p~n\", [Error]);\n Data ->\n io:format(\"Received: ~p~n\", [Data])\n end,\n server_loop(S).\n```\n\nExample of an Erlang SCTP client interacting with the above server.\nNote that in this example the client creates an association with\nthe server with 5 outbound streams. Therefore, sending of `\"Test 0\"`\nover stream 0 succeeds, but sending of `\"Test 5\"` over stream 5 fails.\nThe client then `abort`s the association, which results in that\nthe corresponding event is received on the server side.\n\n```erlang\n-module(sctp_client).\n\n-export([client/0, client/1, client/2]).\n-include_lib(\"kernel/include/inet.hrl\").\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n\nclient() ->\n client([localhost]).\n\nclient([Host]) ->\n client(Host, 2006);\n\nclient([Host, Port]) when is_list(Host), is_list(Port) ->\n client(Host,list_to_integer(Port)),\n init:stop().\n\nclient(Host, Port) when is_integer(Port) ->\n {ok,S} = gen_sctp:open(),\n {ok,Assoc} = gen_sctp:connect\n (S, Host, Port, [{sctp_initmsg,#sctp_initmsg{num_ostreams=5}}]),\n io:format(\"Connection Successful, Assoc=~p~n\", [Assoc]),\n\n io:write(gen_sctp:send(S, Assoc, 0, <<\"Test 0\">>)),\n io:nl(),\n timer:sleep(10000),\n io:write(gen_sctp:send(S, Assoc, 5, <<\"Test 5\">>)),\n io:nl(),\n timer:sleep(10000),\n io:write(gen_sctp:abort(S, Assoc)),\n io:nl(),\n\n timer:sleep(1000),\n gen_sctp:close(S).\n```\n\nA simple Erlang SCTP client that uses the `connect_init` API:\n\n```erlang\n-module(ex3).\n\n-export([client/4]).\n-include_lib(\"kernel/include/inet.hrl\").\n-include_lib(\"kernel/include/inet_sctp.hrl\").\n\nclient(Peer1, Port1, Peer2, Port2)\n when is_tuple(Peer1), is_integer(Port1), is_tuple(Peer2), is_integer(Port2) ->\n {ok,S} = gen_sctp:open(),\n SctpInitMsgOpt = {sctp_initmsg,#sctp_initmsg{num_ostreams=5}},\n ActiveOpt = {active, true},\n Opts = [SctpInitMsgOpt, ActiveOpt],\n ok = gen_sctp:connect(S, Peer1, Port1, Opts),\n ok = gen_sctp:connect(S, Peer2, Port2, Opts),\n io:format(\"Connections initiated~n\", []),\n client_loop(S, Peer1, Port1, undefined, Peer2, Port2, undefined).\n\nclient_loop(S, Peer1, Port1, AssocId1, Peer2, Port2, AssocId2) ->\n receive\n {sctp, S, Peer1, Port1, {_Anc, SAC}}\n when is_record(SAC, sctp_assoc_change), AssocId1 == undefined ->\n io:format(\"Association 1 connect result: ~p. AssocId: ~p~n\",\n [SAC#sctp_assoc_change.state,\n SAC#sctp_assoc_change.assoc_id]),\n client_loop(S, Peer1, Port1, SAC#sctp_assoc_change.assoc_id,\n Peer2, Port2, AssocId2);\n\n {sctp, S, Peer2, Port2, {_Anc, SAC}}\n when is_record(SAC, sctp_assoc_change), AssocId2 == undefined ->\n io:format(\"Association 2 connect result: ~p. AssocId: ~p~n\",\n [SAC#sctp_assoc_change.state, SAC#sctp_assoc_change.assoc_id]),\n client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2,\n SAC#sctp_assoc_change.assoc_id);\n\n {sctp, S, Peer1, Port1, Data} ->\n io:format(\"Association 1: received ~p~n\", [Data]),\n client_loop(S, Peer1, Port1, AssocId1,\n Peer2, Port2, AssocId2);\n\n {sctp, S, Peer2, Port2, Data} ->\n io:format(\"Association 2: received ~p~n\", [Data]),\n client_loop(S, Peer1, Port1, AssocId1,\n Peer2, Port2, AssocId2);\n\n Other ->\n io:format(\"Other ~p~n\", [Other]),\n client_loop(S, Peer1, Port1, AssocId1,\n Peer2, Port2, AssocId2)\n\n after 5000 ->\n ok\n end.\n```\n\n[](){: #seealso } See Also\n--------------------------\n\n`m:gen_tcp`, `m:gen_udp`, `m:inet`,\n[RFC 2960](http://www.rfc-archive.org/getrfc.php?rfc=2960) (Stream Control\nTransmission Protocol),\n[Sockets API Extensions for SCTP](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)","title":"gen_sctp","ref":"gen_sctp.html"},{"type":"function","doc":"Abort an association.\n\nAbnormally terminates the association specified by `Assoc`,\nwithout flushing unsent data. The socket itself remains open.\nOther associations opened on this socket are still valid,\nand the socket can be used in new associations.","title":"gen_sctp.abort/2","ref":"gen_sctp.html#abort/2"},{"type":"function","doc":"Close an SCTP socket.\n\nCloses the socket and all associations on it. The unsent data is flushed\nas for `eof/2`. The [`close/1`](`close/1`) call is blocking\ndepending of the value of the [`linger`](`m:inet#option-linger`)\nsocket [option]. If it is `false` or the linger time-out expires,\nthe call returns and unsent data is flushed in the background.","title":"gen_sctp.close/1","ref":"gen_sctp.html#close/1"},{"type":"function","doc":"","title":"gen_sctp.connect/3","ref":"gen_sctp.html#connect/3"},{"type":"function","doc":"Establish an association with a peer.\n\nWith arguments `Addr` and `Port`, equivalent to\n[`connect(Socket, Addr, Port, Opts, infinity)`](`connect/5`).\n\nWith arguments `SockAddr` and `Opts` _(since OTP 24.3)_, equivalent to\n[`connect(Socket, Addr, Port, Opts, Timeout)`](`connect/5`)\nwhere `Addr` and `Port` are extracted from `SockAddr`.","title":"gen_sctp.connect/4","ref":"gen_sctp.html#connect/4"},{"type":"function","doc":"Establish an association with a peer.\n\nEstablishes a new association for socket `Socket`, with the peer\n(SCTP server socket) specified by `Addr` and `Port`.\n`Timeout`, is expressed in milliseconds.\nA socket can be associated with multiple peers.\nThe socket has to be of type `seqpacket`.\n\n> #### Warning {: .warning }\n>\n> Using a value of `Timeout` less than the maximum time taken by the OS to\n> establish an association (around 4.5 minutes if the default values from\n> [RFC 4960](https://tools.ietf.org/html/rfc4960) are used), can result in\n> inconsistent or incorrect return values. This is especially relevant for\n> associations sharing the same `Socket` (that is, source address and port), as\n> the controlling process blocks until `connect/*` returns.\n> [`connect_init/*`](`connect_init/4`) provides an alternative without this\n> limitation.\n\n### [](){: #record-sctp_assoc_change } `#sctp_assoc_change{}`\n\nThe result of `connect/*` is an `#sctp_assoc_change{}` event that contains,\nin particular, the new [Association ID](`t:assoc_id/0`):\nl\n```erlang\n#sctp_assoc_change{\n state = atom(),\n error = integer(),\n outbound_streams = integer(),\n inbound_streams = integer(),\n assoc_id = assoc_id()\n}\n```\n\nThe number of outbound and inbound streams for the association\ncan be set by giving an `sctp_initmsg` option to `connect` as in:\n\n```erlang\nconnect(Socket, Ip, Port>,\n [{sctp_initmsg,#sctp_initmsg{num_ostreams=OutStreams,\n max_instreams=MaxInStreams}}])\n```\n\nAll options `Opt` are set on the socket before the association is attempted.\nIf an option record has undefined field values, the options record\nis first read from the socket for those values. In effect,\n`Opt` option records only need to define field values to change\nbefore connecting.\n\nThe returned `outbound_streams` and `inbound_streams` are the number of\nstream on the socket. These can be different from the requested values\n(`OutStreams` and `MaxInStreams`, respectively), if the peer\nrequires lower values.\n\n`state` can have the following values:\n\n- **`comm_up`** - Association is successfully established. This indicates\n a successful completion of `connect`.\n\n- **`cant_assoc`** - The association cannot be established\n (`connect/*` failure).\n\nOther states do not normally occur in the output from `connect/*`.\nRather, they can occur in `#sctp_assoc_change{}` events received\ninstead of data from [`recv/*`](`recv/1`) calls or socket messages.\nAll of them indicate losing the association because of various\nerror conditions, and are listed here for the sake of completeness:\n\n- **`comm_lost`**\n\n- **`restart`**\n\n- **`shutdown_comp`**\n\nThe field `error` can provide more detailed diagnostics. Its value\ncan be converted into a string using `error_string/1`.","title":"gen_sctp.connect/5","ref":"gen_sctp.html#connect/5"},{"type":"function","doc":"","title":"gen_sctp.connect_init/3","ref":"gen_sctp.html#connect_init/3"},{"type":"function","doc":"Start establishing an association with a peer.\n\nWith arguments `Addr` and `Port`, equivalent to\n[`connect_init(Socket, Addr, Port, Opts, infinity)`](`connect/5`).\n\nWith arguments `SockAddr` and `Opts` _(since OTP 24.3)_, equivalent to\n[`connect_init(Socket, Addr, Port, Opts, Timeout)`](`connect/5`)\nwhere `Addr` and `Port` are extracted from `SockAddr`.","title":"gen_sctp.connect_init/4","ref":"gen_sctp.html#connect_init/4"},{"type":"function","doc":"Start establishing an association with a peer.\n\nInitiates a new association for socket `Socket`, with the peer\n(SCTP server socket) specified by `Addr` and `Port`.\n\nThe fundamental difference between this API and `connect/*` is that\nthe return value is that of the underlying OS `connect(2)` system call.\nIf `ok` is returned, the operation has been succesfully initiated,\nand the final result result of the association establishment\nis sent to the socket owner (controlling process) as an\n[`#sctp_assoc_change{}`](#record-sctp_assoc_change) event.\nThe socket owner must be prepared to receive this, the\n[`recv/*`](`recv/1`) call has to be polled, depending on the value\nof the [active option](#option-active).\n\nThe parameters are as described for [`connect/*`](`connect/5`),\nexcept the `Timeout` value since for this function, the time-out only\napplies to the name resolving of `Addr` when it is a `t:inet:hostname/0`.","title":"gen_sctp.connect_init/5","ref":"gen_sctp.html#connect_init/5"},{"type":"function","doc":"Start establishing an association with a peer (multiple addresses).\n\nSimilar to `connectx_init/5` except using socket addresses, and not having a\n`Timeout`. Since the addresses do not need lookup and the connect is\nnon-blocking this call returns immediately.\n\nThe value of each socket address `port` must be the same or zero.\nAt least one socket address must have a non-zero `port`","title":"gen_sctp.connectx_init/3","ref":"gen_sctp.html#connectx_init/3"},{"type":"function","doc":"","title":"gen_sctp.connectx_init/4","ref":"gen_sctp.html#connectx_init/4"},{"type":"function","doc":"Start establishing an association with a peer (multiple addresses).\n\nInitiates a new association for socket `Socket`, with the peer\n(SCTP server socket) specified by `Addrs` and `Port`.\n\nThis API is similar to `connect_init/*` except the underlying OS\n`sctp_connectx(3)` system call is used, that accepts multiple\ndestination addresses.\n\nIf successful, the association ID is returned which will be received in a\nsubsequent [`#sctp_assoc_change{}`](#record-sctp_assoc_change)\nevent.\n\nThe parameters are as described in `connect_init/5`\n\n> #### Note {: .info }\n> This API allows the OS to use all Addrs when establishing an association,\n> but does not guarantee it will. Therefore, if the connection fails,\n> the user may want to rotate the order of addresses for a subsequent call.","title":"gen_sctp.connectx_init/5","ref":"gen_sctp.html#connectx_init/5"},{"type":"function","doc":"Change the controlling process (owner) of a socket.\n\nAssigns a new controlling process `Pid` to `Socket`.\nSee `gen_udp:controlling_process/2`.","title":"gen_sctp.controlling_process/2","ref":"gen_sctp.html#controlling_process/2"},{"type":"function","doc":"Terminate an association gracefully.\n\nGracefully terminates the association specified by `Assoc`, flushing\nall unsent data. The socket itself remains open. Other associations\nopened on this socket are still valid. The socket can be used\nin new associations.","title":"gen_sctp.eof/2","ref":"gen_sctp.html#eof/2"},{"type":"function","doc":"Translate an error number into a string or atom.\n\nTranslates an SCTP error number from, for example, `#sctp_remote_error{}`\nor `#sctp_send_failed{}` into an explanatory string, or into\none of the atoms `ok` for no error, or `unknown_error`\nfor an unrecognized integer.","title":"gen_sctp.error_string/1","ref":"gen_sctp.html#error_string/1"},{"type":"function","doc":"Make an SCTP socket listen to incoming associations.\n\nThe socket will listen on the IP address(es) and port number it is bound to.\n\nFor type `seqpacket`, sockets (the default), the argument`IsServer`\nmust be a `t:boolean/0`. In contrast to `stream` sockets, there is\nno listening queue length. If `IsServer` is `true`, the socket accepts\nnew associations, that is, it becomes an SCTP server socket.\n\nFor type `stream` sockets, the argument `Backlog` sets\nthe backlog queue length just like for TCP.","title":"gen_sctp.listen/2","ref":"gen_sctp.html#listen/2"},{"type":"function","doc":"","title":"gen_sctp.open/0","ref":"gen_sctp.html#open/0"},{"type":"function","doc":"Create an SCTP socket.\n\nWith argument [`Port`](`t:inet:port_number/0`),\nequivalent to`open([{port, Port}]`.\n\nCreates an SCTP socket and binds it to the local addresses specified by all\n`{ip,IP}` (or synonymously `{ifaddr,IP}`) options (this feature is called\nSCTP multi-homing). The default `IP` and `Port` are `any` and `0`,\nmeaning bind to all local addresses on any free port.\n\nIt is also possible to use `{ifaddr, SockAddr}`, in which case it takes\nprecedence over the `ip` and `port` options. These options can however\nbe used to update the address and port of ifaddr (if they occur\nafter ifaddr in the options list), although this is not recommended.\n\nOther options:\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`inet`** - Sets up the socket for IPv4. This is the default.\n\nA default set of socket [options](#options) is used.\nIn particular, the socket is opened in [binary](#option-binary)\nand [passive](#option-active) mode, with SockType `seqpacket`,\nand with reasonably large [kernel](`m:inet#option-sndbuf`) and driver\n[buffers](`m:inet#option-buffer`).\n\nWhen the socket is in [passive](#option-active) mode,\ndata can be received through the [`recv/1,2`](`recv/1`) calls.\n\nWhen the socket is in [active](#option-active) mode,\ndata received data is delivered to the controlling process as messages:\n\n```erlang\n{sctp, Socket, FromIP, FromPort, {AncData, Data}}\n```\n\nSee [`recv/1,2`](`recv/1`) for a description of the message fields.\n\n> #### Note {: .info }\n>\n> This message format unfortunately differs slightly from the\n> [`gen_udp`](`gen_udp:open/1`) message format with ancillary data,\n> and from the [`recv/1,2`](`recv/1`) return tuple format.","title":"gen_sctp.open/1","ref":"gen_sctp.html#open/1"},{"type":"function","doc":"","title":"gen_sctp.open/2","ref":"gen_sctp.html#open/2"},{"type":"function","doc":"Branch off an association into a new socket of type `stream`.\n\nThe existing association `Assoc` in the socket `Socket` (that has to\nbe of type `seqpacket`; one-to-many style) is branched off into\na new socket `NewSocket` of type `stream` (one-to-one style).\n\nThe existing association argument `Assoc` can be a\n[`#sctp_assoc_change{}`](#record-sctp_assoc_change) record as\nreturned from, for example, [`recv/*`](`recv/2`), [`connect/*`](`connect/5`),\nor from a listening socket in active mode.\nIt can also be just the field `assoc_id` `t:integer/0` from such a record.","title":"gen_sctp.peeloff/2","ref":"gen_sctp.html#peeloff/2"},{"type":"function","doc":"","title":"gen_sctp.recv/1","ref":"gen_sctp.html#recv/1"},{"type":"function","doc":"Receive a `Data` message.\n\nReceives the `Data` message from any association of the socket.\nIf the receive times out, `{error,timeout}` is returned. The default\ntime-out is `infinity`. `FromIP` and `FromPort` indicate the address\nof the sender.\n\n`AncData` is a list of ancillary data items received with the main `Data`.\nThis list can be empty, or contain a single\n[`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) record,\nif receiving ancillary data is enabled\n(see option [`sctp_events`](#option-sctp_events)).\nPer default, it is enabled, as such ancillary data provides an easy way\nto determine the association and stream over which the message was received.\n(An alternative way is to get the association ID from `FromIP` and `FromPort`\nusing socket option\n[`sctp_get_peer_addr_info`](#option-sctp_get_peer_addr_info),\nbut this does still not give the stream number).\n\n`AncData` may also contain [ancillary data](`t:inet:ancillary_data/0`)\nfrom the socket [options](#options)\n[`recvtos`](`m:inet#option-recvtos`),\n[`recvtclass`](`m:inet#option-recvtclass`) or\n[`recvttl`](`m:inet#option-recvttl`), if that is supported for the socket\nby the platform.\n\nThe `Data` received can, depending on the socket [mode](#option-binary)\nbe a `t:binary/0` or a `t:list/0` of bytes (integers in the range\n`0` through `255`), or it can be an SCTP event.\n\n### [](){: #sctp-events } Possible SCTP events\n\n- [`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo)\n- [`#sctp_assoc_change{}`](#record-sctp_assoc_change)\n- ```erlang\n #sctp_paddr_change{\n addr = {ip_address(),port()},\n state = atom(),\n error = integer(),\n assoc_id = assoc_id()\n }\n ```\n\n Indicates change of the status of the IP address of the peer specified by\n `addr` within association `assoc_id`. Possible values of `state` (mostly\n self-explanatory) include:\n\n - **`addr_unreachable`**\n\n - **`addr_available`**\n\n - **`addr_removed`**\n\n - **`addr_added`**\n\n - **`addr_made_prim`**\n\n - **`addr_confirmed`**\n\n In case of an error (for example, `addr_unreachable`), the field `error`\n provides more diagnostics. In such cases, event `#sctp_paddr_change{}`\n is automatically converted into an `error` term returned by\n [`recv`](`recv/1`). The `error` field value can be converted\n into a string using `error_string/1`.\n\n- ```erlang\n #sctp_send_failed{\n flags = true | false,\n error = integer(),\n info = #sctp_sndrcvinfo{},\n assoc_id = assoc_id()\n data = binary()\n }\n ```\n\n The sender can receive this event if a send operation fails.\n\n - **`flags`** - A Boolean specifying if the data has been transmitted\n over the wire.\n\n - **`error`** - Provides extended diagnostics, use\n [`error_string/1`.](`error_string/1`)\n\n - **`info`** - The original\n [`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) record\n used in the failed [`send/*`.](`send/3`)\n\n - **`data`** - The whole original data chunk attempted to be sent.\n\n In the current implementation of the Erlang/SCTP binding, this event is\n internally converted into an `error` term returned by [`recv/*`](`recv/1`).\n\n- ```erlang\n #sctp_adaptation_event{\n adaptation_ind = integer(),\n assoc_id = assoc_id()\n }\n ```\n\n Delivered when a peer sends an adaptation layer indication parameter\n (configured through option\n [`sctp_adaptation_layer`](#option-sctp_adaptation_layer)).\n Notie that with the current implementation of the Erlang/SCTP binding,\n this event is disabled by default.\n\n- ```erlang\n #sctp_pdapi_event{\n indication = sctp_partial_delivery_aborted,\n assoc_id = assoc_id()\n }\n ```\n\n A partial delivery failure. In the current implementation\n of the Erlang/SCTP binding, this event is internally converted\n into an `error` term returned by [`recv/*`](`recv/1`).","title":"gen_sctp.recv/2","ref":"gen_sctp.html#recv/2"},{"type":"function","doc":"Send a `Data` message, full-featured.\n\nSends the `Data` message with all sending parameters from a\n[`#sctp_sndrcvinfo{}`](#record-sctp_sndrcvinfo) record.\nThis way, the user can specify the PPID (passed to the remote end)\nand context (passed to the local SCTP layer), which can be used,\nfor example, for error identification. However, such a fine grained\nuser control is rarely required. The function [`send/4`](`send/4`)\nis sufficient for most applications.\n\n> #### Note {: .info }\n>\n> Send is normally blocking, but if the socket option\n> [`non_block_send`](#option_non_block_send) is set to true,\n> the function will return with e.g. {error, eagain}\n> in the case when the function would otherwise block.\n> It is then up to the user to try again later.","title":"gen_sctp.send/3","ref":"gen_sctp.html#send/3"},{"type":"function","doc":"Send a data message.\n\nSends a `Data` message on the association `Assoc` and `Stream`.\n\n`Assoc` can be specified with a\n[`#sctp_assoc_change{}`](#record-sctp_assoc_change) record\nfrom an association establishment, or as the `t:assoc_id/0`\n`t:integer/0` field value.\n\n> #### Note {: .info }\n>\n> Send is normally blocking, but if the socket option\n> [`non_block_send`](#option_non_block_send) is set to true,\n> the function will return with e.g. {error, eagain}\n> in the case when the function would otherwise block.\n> It is then up to the user to try again later.","title":"gen_sctp.send/4","ref":"gen_sctp.html#send/4"},{"type":"type","doc":"Association ID.\n\nAn opaque term returned in, for example, `#sctp_paddr_change{}`, which\nidentifies an association for an SCTP socket. The term is opaque except for the\nspecial value `0`, which has a meaning such as \"the whole endpoint\" or \"all\nfuture associations\".","title":"gen_sctp.assoc_id/0","ref":"gen_sctp.html#t:assoc_id/0"},{"type":"type","doc":"","title":"gen_sctp.elementary_option/0","ref":"gen_sctp.html#t:elementary_option/0"},{"type":"type","doc":"","title":"gen_sctp.elementary_option_name/0","ref":"gen_sctp.html#t:elementary_option_name/0"},{"type":"type","doc":"[SCTP Socket Option](#options) name and value, to set.","title":"gen_sctp.option/0","ref":"gen_sctp.html#t:option/0"},{"type":"type","doc":"[SCTP Socket Option](#options) name, to get.","title":"gen_sctp.option_name/0","ref":"gen_sctp.html#t:option_name/0"},{"type":"type","doc":"[SCTP Socket Option](#options) name and value, what you get.","title":"gen_sctp.option_value/0","ref":"gen_sctp.html#t:option_value/0"},{"type":"type","doc":"","title":"gen_sctp.record_option/0","ref":"gen_sctp.html#t:record_option/0"},{"type":"type","doc":"","title":"gen_sctp.ro_option/0","ref":"gen_sctp.html#t:ro_option/0"},{"type":"type","doc":"Socket identifier returned from [`open/*`](`open/0`).","title":"gen_sctp.sctp_socket/0","ref":"gen_sctp.html#t:sctp_socket/0"},{"type":"module","doc":"Interface to TCP/IP sockets.\n\nThis module provides functions for communicating over TCP/IP\nprotocol sockets.\n\nThe following code fragment is a simple example of a client connecting to a\nserver at port 5678, transferring a binary, and closing the connection:\n\n```erlang\nclient() ->\n SomeHostInNet = \"localhost\", % to make it runnable on one machine\n {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,\n [binary, {packet, 0}]),\n ok = gen_tcp:send(Sock, \"Some Data\"),\n ok = gen_tcp:close(Sock).\n```\n\nAt the other end, a server is listening on port 5678, accepts the connection,\nand receives the binary:\n\n```erlang\nserver() ->\n {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},\n {active, false}]),\n {ok, Sock} = gen_tcp:accept(LSock),\n {ok, Bin} = do_recv(Sock, []),\n ok = gen_tcp:close(Sock),\n ok = gen_tcp:close(LSock),\n Bin.\n\ndo_recv(Sock, Bs) ->\n case gen_tcp:recv(Sock, 0) of\n {ok, B} ->\n do_recv(Sock, [Bs, B]);\n {error, closed} ->\n {ok, list_to_binary(Bs)}\n end.\n```\n\nFor more examples, see section [Examples](#module-examples).\n\n> #### Note {: .info }\n>\n> Functions that create sockets can take an optional option;\n> `{inet_backend, Backend}` that, if specified, has to be the first option. This\n> selects the implementation backend towards the platform's socket API.\n>\n> This is a _temporary_ option that will be ignored in a future release.\n>\n> The default is `Backend = inet` that selects the traditional `inet_drv.c`\n> driver. The other choice is `Backend = socket` that selects the new `m:socket`\n> module and its NIF implementation.\n>\n> The system default can be changed when the node is started with the\n> application `kernel`'s configuration variable `inet_backend`.\n>\n> For `gen_tcp` with `inet_backend = socket` we have tried to be as \"compatible\"\n> as possible which has sometimes been impossible. Here is a list of cases when\n> the behaviour of inet-backend `inet` (default) and `socket` are different:\n>\n> - [Non-blocking send](#non_blocking_send)\n>\n> If a user calling [`gen_tcp:send/2`](`send/2`) with `inet_backend = inet`,\n> tries to send more data than there is room for in the OS buffers, the \"rest\n> data\" is buffered by the inet driver (and later sent in the background). The\n> effect for the user is that the call is non-blocking.\n>\n> This is _not_ the effect when `inet_backend = socket`, since there is no\n> buffering. Instead the user hangs either until all data has been sent or the\n> `send_timeout` timeout has been reached.\n>\n> - `shutdown/2` may hide errors\n>\n> The call does not involve the receive process state, and is done\n> right on the underlying socket. On for example Linux, it is a known\n> misbehaviour that it skips some checks so doing shutdown on a\n> listen socket returns `ok` while the logical result should have been\n> `{error, enotconn}`. The `inet_drv.c` driver did an extra check\n> and simulated the correct error, but with `Backend = socket`\n> it would introduce overhead to involve the receive process.\n>\n> - The option [nodelay](`m:inet#option-nodelay`) is a TCP specific option that\n> is _not_ compatible with `domain = local`.\n>\n> When using `inet_backend = socket`, trying to create a socket (via listen or\n> connect) with `domain = local` (for example with option \\{ifaddr,\n> \\{local,\"/tmp/test\"\\}\\}) _will fail_ with `{error, enotsup}`.\n>\n> This does not actually work for `inet_backend = inet` either, but in that\n> case the error is simply _ignored_, which is a _bad_ idea. We have chosen to\n> _not_ ignore this error for `inet_backend = socket`.\n>\n> - [Async shutdown write](#async_shutdown_write)\n>\n> Calling [gen_tcp:shutdown(Socket, write | read_write)](`shutdown/2`) on a\n> socket created with `inet_backend = socket` will take _immediate_ effect,\n> unlike for a socket created with `inet_backend = inet`.\n>\n> See [async shutdown write](#async_shutdown_write) for more info.\n>\n> - Windows require sockets (domain = `inet | inet6`) to be bound.\n>\n> _Currently_ all sockets created on Windows with `inet_backend = socket` will\n> be bound. If the user does not provide an address, gen_tcp will try to\n> 'figure out' an address itself.","title":"gen_tcp","ref":"gen_tcp.html"},{"type":"module","doc":"The following example illustrates use of option `{active,once}` and multiple\naccepts by implementing a server as a number of worker processes doing accept on\na single listening socket. Function `start/2` takes the number of worker\nprocesses and the port number on which to listen for incoming connections. If\n`LPort` is specified as `0`, an ephemeral port number is used, which is why the\nstart function returns the actual port number allocated:\n\n```erlang\nstart(Num,LPort) ->\n case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of\n {ok, ListenSock} ->\n start_servers(Num,ListenSock),\n {ok, Port} = inet:port(ListenSock),\n Port;\n {error,Reason} ->\n {error,Reason}\n end.\n\nstart_servers(0,_) ->\n ok;\nstart_servers(Num,LS) ->\n spawn(?MODULE,server,[LS]),\n start_servers(Num-1,LS).\n\nserver(LS) ->\n case gen_tcp:accept(LS) of\n {ok,S} ->\n loop(S),\n server(LS);\n Other ->\n io:format(\"accept returned ~w - goodbye!~n\",[Other]),\n ok\n end.\n\nloop(S) ->\n inet:setopts(S,[{active,once}]),\n receive\n {tcp,S,Data} ->\n Answer = process(Data), % Not implemented in this example\n gen_tcp:send(S,Answer),\n loop(S);\n {tcp_closed,S} ->\n io:format(\"Socket ~w closed [~w]~n\",[S,self()]),\n ok\n end.\n```\n\nExample of a simple client:\n\n```erlang\nclient(PortNo,Message) ->\n {ok,Sock} = gen_tcp:connect(\"localhost\",PortNo,[{active,false},\n {packet,2}]),\n gen_tcp:send(Sock,Message),\n A = gen_tcp:recv(Sock,0),\n gen_tcp:close(Sock),\n A.\n```\n\nThe `send` call does not accept a time-out option because time-outs on send is\nhandled through socket option `send_timeout`. The behavior of a send operation\nwith no receiver is mainly defined by the underlying TCP stack and the network\ninfrastructure. To write code that handles a hanging receiver that can\neventually cause the sender to hang on a `send` do like the following.\n\nConsider a process that receives data from a client process to be forwarded to a\nserver on the network. The process is connected to the server through TCP/IP and\ndoes not get any acknowledge for each message it sends, but has to rely on the\nsend time-out option to detect that the other end is unresponsive. Option\n`send_timeout` can be used when connecting:\n\n```erlang\n...\n{ok,Sock} = gen_tcp:connect(HostAddress, Port,\n [{active,false},\n {send_timeout, 5000},\n {packet,2}]),\n loop(Sock), % See below\n...\n```\n\nIn the loop where requests are handled, send time-outs can now be detected:\n\n```erlang\nloop(Sock) ->\n receive\n {Client, send_data, Binary} ->\n case gen_tcp:send(Sock,[Binary]) of\n {error, timeout} ->\n io:format(\"Send timeout, closing!~n\",\n []),\n handle_send_timeout(), % Not implemented here\n Client ! {self(),{error_sending, timeout}},\n %% Usually, it's a good idea to give up in case of a\n %% send timeout, as you never know how much actually\n %% reached the server, maybe only a packet header?!\n gen_tcp:close(Sock);\n {error, OtherSendError} ->\n io:format(\"Some other error on socket (~p), closing\",\n [OtherSendError]),\n Client ! {self(),{error_sending, OtherSendError}},\n gen_tcp:close(Sock);\n ok ->\n Client ! {self(), data_sent},\n loop(Sock)\n end\n end.\n```\n\nUsually it suffices to detect time-outs on receive, as most protocols include\nsome sort of acknowledgment from the server, but if the protocol is strictly one\nway, option `send_timeout` comes in handy.","title":"Examples - gen_tcp","ref":"gen_tcp.html#module-examples"},{"type":"function","doc":"","title":"gen_tcp.accept/1","ref":"gen_tcp.html#accept/1"},{"type":"function","doc":"Accept an incoming connection request on a listen socket.\n\n`Socket` must be a socket returned from `listen/2`. `Timeout` specifies\na time-out value in milliseconds. Defaults to `infinity`.\n\nReturns:\n\n- `{ok, Socket}` if a connection is established\n- `{error, closed}` if `ListenSocket` is closed\n- `{error, timeout}` if no connection is established within `Timeout`\n- `{error, system_limit}` if all available ports in the Erlang emulator\n are in use\n- A POSIX error value if something else goes wrong, see `m:inet`\n about possible values\n\nTo send packets (outbound) on the returned `Socket`, use `send/2`.\nPackets sent from the peer (inbound) are delivered as messages\nto the socket owner; the process that created the socket.\nUnless `{active, false}` is specified in the option list when creating\nthe [listening socket](`listen/2`).\n\nSee `connect/4` about _active mode_ socket messages and _passive mode_.\n\n> #### Note {: .info }\n>\n> The `accept` call _doesn't have to be_ issued from the socket owner process.\n> Using version 5.5.3 and higher of the emulator, multiple simultaneous accept\n> calls can be issued from different processes, which allows for a pool of\n> acceptor processes handling incoming connections.","title":"gen_tcp.accept/2","ref":"gen_tcp.html#accept/2"},{"type":"function","doc":"Close a TCP socket.\n\nNote that in most implementations of TCP, doing a `close` does not guarantee\nthat the data sent is delivered to the recipient. It is guaranteed that\nthe recepient will see all sent data before getting the close, but the\nsender gets no indication of that.\n\nIf the sender needs to know that the recepient has received all data\nthere are two common ways to achieve this:\n\n1. Use [`gen_tcp:shutdown(Sock, write)`](`shutdown/2`) to signal that no more\n data is to be sent and wait for the other side to acknowledge seeing\n its read side being closed, by closing its write side, which shows\n as a socket close on this side.\n2. Implement an acknowledgement in the protocol on top of TCP\n that both connection ends adhere to, indicating that all data\n has been seen. The socket option [`{packet, N}`](`m:inet#option-packet`)\n may be useful.","title":"gen_tcp.close/1","ref":"gen_tcp.html#close/1"},{"type":"function","doc":"Equivalent to [`connect(SockAddr, Opts, infinity)`](`connect/3`).","title":"gen_tcp.connect/2","ref":"gen_tcp.html#connect/2"},{"type":"function","doc":"Create a socket connected to the specified address.","title":"gen_tcp.connect/3","ref":"gen_tcp.html#connect/3"},{"type":"function","doc":"Equivalent to [`connect(Address, Port, Opts, infinity)`](`connect/4`).","title":"With arguments `Address` and `Port` - gen_tcp.connect/3","ref":"gen_tcp.html#connect/3-with-arguments-address-and-port"},{"type":"function","doc":"Connects to a remote listen socket specified by `SockAddr`\nwhere `t:socket:sockaddr_in6/0` for example allows specifying\nthe `scope_id` for link local IPv6 addresses.\n\n[IPv4 addresses](`t:socket:sockaddr_in/0`) on the same\n`t:map/0` format is also allowed.\n\nEquivalent to `connect/4`, besides the format of the destination address.","title":"With argument `SockAddr` **(since OTP 24.3)** - gen_tcp.connect/3","ref":"gen_tcp.html#connect/3-with-argument-sockaddr-since-otp-24-3"},{"type":"function","doc":"Create a socket connected to the specified address.\n\nCreates a socket and connects it to a server on TCP port `Port`\non the host with IP address `Address`, that may also be a hostname.\n\n### `Opts` (connect options)\n\n- **`{ip, Address}`** - If the local host has many IP addresses,\n this option specifies which one to use.\n\n- **`{ifaddr, Address}`** - Same as `{ip, Address}`.\n\n However, if `Address` instead is a `t:socket:sockaddr_in/0` or\n `t:socket:sockaddr_in6/0` this takes precedence over any value\n previously set with the `ip` and `port` options. If these options\n (`ip` or/and `port`) however comes _after_ this option,\n they may be used to _update_ the corresponding fields of this option\n (for `ip`, the `addr` field, and for `port`, the `port` field).\n\n- **`{fd, integer() >= 0}`** - If a socket has somehow been connected without\n using `gen_tcp`, use this option to pass the file descriptor for it.\n If `{ip, Address}` and/or `{port, port_number()}` is combined\n with this option, the `fd` is bound to the specified interface\n and port before connecting. If these options are not specified,\n it is assumed that the `fd` is already bound appropriately.\n\n- **`inet`** - Sets up the socket for IPv4.\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`local`** - Sets up a Unix Domain Socket. See `t:inet:local_address/0`\n\n- **`{port, Port}`** - Specifies which local port number to use.\n\n- **`{tcp_module, module()}`** - Overrides which callback module is used.\n Defaults to `inet_tcp` for IPv4 and `inet6_tcp` for IPv6.\n\n- **`t:option/0`** - See `inet:setopts/2`.","title":"gen_tcp.connect/4","ref":"gen_tcp.html#connect/4"},{"type":"function","doc":"Packets can be sent to the peer (outbound) with\n[`send(Socket, Packet)`](`send/2`). Packets sent from the peer\n(inbound) are delivered as messages to the socket owner;\nthe process that created the socket, unless `{active, false}`\nis specified in the `Options` list.\n\n#### Active mode socket messages\n\n- **`{tcp, Socket, Data}`** - Inbound data from the socket.\n\n- **`{tcp_passive, Socket}`** -\n The socket was in `{active, N}` mode (see `inet:setopts/2` for details)\n and its message counter reached `0`, indicating that\n the socket has transitioned to passive (`{active, false}`) mode.\n\n\n- **`{tcp_closed, Socket}`** - The socket was closed.\n\n- **`{tcp_error, Socket, Reason}`** A socket error occurred.\n\n#### Passive mode\n\nIf `{active, false}` is specified in the option list for the socket,\npackets and errors are retrieved by calling [`recv/2,3`](`recv/3`)\n(`send/2` may also return errors).\n\n#### Timeout\n\nThe optional `Timeout` parameter specifies a connect time-out in milliseconds.\nDefaults to `infinity`.\n\n> #### Note {: .info }\n>\n> Keep in mind that if the underlying OS `connect()` call returns a timeout,\n> `gen_tcp:connect` will also return a timeout (i.e. `{error, etimedout}`),\n> even if a larger `Timeout` was specified (for example `infinity`).\n\n> #### Note {: .info }\n>\n> The default values for options specified to `connect` can be affected by the\n> Kernel configuration parameter `inet_default_connect_options`.\n> For details, see `m:inet`.","title":"Socket Data - gen_tcp.connect/4","ref":"gen_tcp.html#connect/4-socket-data"},{"type":"function","doc":"Change the controlling process (owner) of a socket.\n\nAssigns a new controlling process `Pid` to `Socket`. The controlling process\nis the process that the socket sends messages to. If this function\nis called from any other process than the current controlling process,\n`{error, not_owner}` is returned.\n\nIf the process identified by `Pid` is not an existing local `t:pid/0`,\n`{error, badarg}` is returned. `{error, badarg}` may also be returned\nin some cases when `Socket` is closed during the execution of this function.\n\nIf the socket is in _active mode_, this function will transfer any messages\nfrom the socket in the mailbox of the caller to the new controlling process.\n\nIf any other process is interacting with the socket during the transfer,\nit may not work correctly and messages may remain in the caller's mailbox.\nFor instance, changing the sockets active mode during the transfer\ncould cause this.","title":"gen_tcp.controlling_process/2","ref":"gen_tcp.html#controlling_process/2"},{"type":"function","doc":"Create a listen socket.\n\nCreates a socket and sets it to listen on port `Port` on the local host.\n\nIf `Port == 0`, the underlying OS assigns an available (ephemeral)\nport number, use `inet:port/1` to retrieve it.\n\nThe following options are available:\n\n- **`list`** - Received `Packet`s are delivered as lists of bytes,\n `[`[`byte/0`](`t:byte/0`)`]`.\n\n- **`binary`** - Received `Packet`s are delivered as `t:binary/0`s.\n\n- **`{backlog, B}`** - `B ::` `t:non_neg_integer/0`. The backlog value\n defines the maximum length that the queue of pending connections\n can grow to. Defaults to `5`.\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`inet`** - Sets up the socket for IPv4.\n\n- **`{fd, Fd}`** - If a socket has somehow been created without using\n `gen_tcp`, use this option to pass the file descriptor for it.\n\n- **`{ip, Address}`** - If the host has many IP addresses, this option\n specifies which one to listen on.\n\n- **`{port, Port}`** - Specifies which local port number to use.\n\n- **`{ifaddr, Address}`** - Same as `{ip, Address}`.\n\n However, if this instead is an `t:socket:sockaddr_in/0` or\n `t:socket:sockaddr_in6/0` this takes precedence over any value\n previously set with the `ip` and `port` options. If these options\n (`ip` or/and `port`) however comes _after_ this option,\n they may be used to _update_ their corresponding fields of this option\n (for `ip`, the `addr` field, and for `port`, the `port` field).\n\n- **`{tcp_module, module()}`** - Overrides which callback module is used.\n Defaults to `inet_tcp` for IPv4 and `inet6_tcp` for IPv6.\n\n- **`t:option/0`** - See `inet:setopts/2`.\n\nThe returned socket `ListenSocket` should be used when calling\n[`accept/1,2`](`accept/1`) to accept an incoming connection request.\n\n> #### Note {: .info }\n>\n> The default values for options specified to `listen` can be affected by the\n> Kernel configuration parameter `inet_default_listen_options`. For details, see\n> `m:inet`.","title":"gen_tcp.listen/2","ref":"gen_tcp.html#listen/2"},{"type":"function","doc":"","title":"gen_tcp.recv/2","ref":"gen_tcp.html#recv/2"},{"type":"function","doc":"Receive a packet, from a socket in _passive mode_.\n\nA closed socket is indicated by the return value `{error, closed}`.\nIf the socket is not in passive mode, the return value is `{error, einval}`.\n\nArgument `Length` is only meaningful when the socket is in `raw` mode and\ndenotes the number of bytes to read. If `Length` is `0`, all available\nbytes are returned. If `Length > 0`, exactly `Length` bytes are returned,\nor an error; except if the socket is closed from the other side,\nthen the last read before the one returning `{error, closed}`\nmay return less than `Length` bytes of data.\n\nThe optional `Timeout` parameter specifies a time-out in milliseconds.\nDefaults to `infinity`.\n\nAny process can receive data from a passive socket, even if that process is not\nthe controlling process of the socket. However, only one process can call this\nfunction on a socket at any given time. Using simultaneous calls to `recv` is\nnot recommended as the behavior depends on the socket implementation,\nand could return errors such as `{error, ealready}`.","title":"gen_tcp.recv/3","ref":"gen_tcp.html#recv/3"},{"type":"function","doc":"Send a packet on a socket.\n\nThere is no `send/2` call with a time-out option; use socket option\n`send_timeout` if time-outs are desired. See section\n[Examples](#module-examples).\n\nThe return value `{error, {timeout, RestData}}` can only be returned when\n`inet_backend = socket`.\n\n[](){: #non_blocking_send }\n\n> #### Note {: .info }\n>\n> #### Non-blocking send.\n>\n> If the user tries to send more data than there is room for in the OS send\n> buffers, the 'rest data' is stored in (inet driver) internal buffers and later\n> sent in the background. The function immediately returns ok (_not_ informing\n> the caller that some date isn'nt sent yet). Any issue while\n> sending the 'rest data' may be returned later.\n>\n> When using `inet_backend = socket`, the behaviour is different. There is\n> _no_ buffering, instead the caller will \"hang\" until all of the data\n> has been sent or the send timeout (as specified by the `send_timeout`\n> option) expires (the function can \"hang\" even when using the `inet`\n> backend if the internal buffers are full).\n>\n> If this happens when using `packet =/= raw`, a partial package has been\n> written. A new package therefore _mustn't_ be written at this point,\n> as there is no way for the peer to distinguish this from data in\n> the current package. Instead, set package to raw, send the rest data\n> (as raw data) and then set package to the correct package type again.","title":"gen_tcp.send/2","ref":"gen_tcp.html#send/2"},{"type":"function","doc":"Close the socket in one or both directions.\n\n`How == write` means closing the socket for writing, reading from it is still\npossible.\n\nIf `How == read` or there is no outgoing data buffered in the `Socket` port, the\nshutdown is performed immediately and any error encountered is returned in\n`Reason`.\n\nIf there is data buffered in the socket port, shutdown isn't performed\non the socket until that buffered data has been written to the OS\nprotocol stack. If any errors are encountered, the socket is closed\nand `{error, closed}` is returned by the next `recv/2` or `send/2` call.\n\nOption `{exit_on_close, false}` is useful if the peer performs a shurdown\nof its write side. Then the socket stays open for writing after\nreceive has indicated that the socket was closed.\n\n[](){: #async_shutdown_write }\n\n> #### Note {: .info }\n>\n> Async shutdown write (`How :: write | read_write`).\n>\n> If the shutdown attempt is made while the inet driver is sending\n> buffered data in the background, the shutdown is postponed until\n> all buffered data has been sent. This function immediately returns `ok`,\n> and the caller _isn't_ informed (that the shutdown has been postponed).\n>\n> When using `inet_backend = socket`, the behaviour is different. A shutdown\n> with `How :: write | read_write` will always be performed _immediately_.","title":"gen_tcp.shutdown/2","ref":"gen_tcp.html#shutdown/2"},{"type":"type","doc":"","title":"gen_tcp.connect_option/0","ref":"gen_tcp.html#t:connect_option/0"},{"type":"type","doc":"","title":"gen_tcp.listen_option/0","ref":"gen_tcp.html#t:listen_option/0"},{"type":"type","doc":"","title":"gen_tcp.option/0","ref":"gen_tcp.html#t:option/0"},{"type":"type","doc":"","title":"gen_tcp.option_name/0","ref":"gen_tcp.html#t:option_name/0"},{"type":"type","doc":"Value from socket option [`pktoptions`](`t:option_name/0`).\n\nIf the platform implements the IPv4 option `IP_PKTOPTIONS`,\nor the IPv6 option `IPV6_PKTOPTIONS` or `IPV6_2292PKTOPTIONS` for the socket;\nthis value is returned from `inet:getopts/2` when called with the option name\n[`pktoptions`](`t:option_name/0`).\n\n> #### Note {: .info }\n>\n> This option appears to be VERY Linux specific, and its existence in future\n> Linux kernel versions is also worrying since the option is part of RFC 2292\n> which is since long (2003) obsoleted by RFC 3542 that _explicitly_ removes\n> this possibility to get packet information from a stream socket. For\n> comparison: it has existed in FreeBSD but is now removed, at least since\n> FreeBSD 10.","title":"gen_tcp.pktoptions_value/0","ref":"gen_tcp.html#t:pktoptions_value/0"},{"type":"type","doc":"As returned by [`accept/1,2`](`accept/1`) and [`connect/3,4`](`connect/3`).","title":"gen_tcp.socket/0","ref":"gen_tcp.html#t:socket/0"},{"type":"module","doc":"Interface to UDP sockets.\n\nThis module provides functions for communicating over UDP\nprotocol sockets.\n\n> #### Note {: .info }\n>\n> Functions that create sockets can take an optional option;\n> `{inet_backend, Backend}` that, if specified, has to be the first option. This\n> selects the implementation backend towards the platform's socket API.\n>\n> This is a _temporary_ option that will be ignored in a future release.\n>\n> The default is `Backend = inet` that selects the traditional `inet_drv.c`\n> driver. The other choice is `Backend = socket` that selects the new `m:socket`\n> module and its NIF implementation.\n>\n> The system default can be changed when the node is started with the\n> application `kernel`'s configuration variable `inet_backend`.\n>\n> For `gen_udp` with `inet_backend = socket` we have tried to be as \"compatible\"\n> as possible which has sometimes been impossible. Here is a list of cases when\n> the behaviour of inet-backend `inet` (default) and `socket` are different:\n>\n> - The option [read_packets](`m:inet#option-read_packets`) is currently\n> _ignored_.\n> - Windows require sockets (domain = `inet | inet6`) to be bound.\n>\n> _Currently_ all sockets created on Windows with `inet_backend = socket` will\n> be bound. If the user does not provide an address, gen_udp will try to\n> 'figure out' an address itself.","title":"gen_udp","ref":"gen_udp.html"},{"type":"function","doc":"Closes a UDP socket.","title":"gen_udp.close/1","ref":"gen_udp.html#close/1"},{"type":"function","doc":"Connect a UDP socket.\n\nConnecting a UDP socket only means storing the specified (destination) socket\naddress, as specified by `SockAddr`, so that the system knows where to send\ndata.\n\nWhen the socket is \"connected\" it is not necessary to specify\nthe destination address when sending a datagram.\nThat is; `send/2` may be used.\n\nIt also means that the socket will only receive data from\nthe connected address. Other messages are discarded on arrival\nby the OS protocol stack.","title":"gen_udp.connect/2","ref":"gen_udp.html#connect/2"},{"type":"function","doc":"Connect a UDP socket.\n\nSee `connect/2`.\n\nWith this function the destination is specified\nwith separate `Address` and `Port` arguments where `Address` may be\nan [IP address](`t:inet:socket_address/0`)\nor a [host name](`t:inet:hostname/0`).","title":"gen_udp.connect/3","ref":"gen_udp.html#connect/3"},{"type":"function","doc":"Change the controlling process (owner) of a socket.\n\nAssigns a new controlling process `Pid` to `Socket`. The controlling process\nis the process that the socket sends messages to. If this function\nis called from any other process than the current controlling process,\n`{error, not_owner}` is returned.\n\nIf the process identified by `Pid` is not an existing local `t:pid/0`,\n`{error, badarg}` is returned. `{error, badarg}` may also be returned\nin some cases when `Socket` is closed during the execution of this function.\n\nIf the socket is in _active mode_, this function will transfer any messages\nfrom the socket in the mailbox of the caller to the new controlling process.\n\nIf any other process is interacting with the socket during the transfer,\nit may not work correctly and messages may remain in the caller's mailbox.\nFor instance, changing the sockets active mode during the transfer\ncould cause this.","title":"gen_udp.controlling_process/2","ref":"gen_udp.html#controlling_process/2"},{"type":"function","doc":"","title":"gen_udp.open/1","ref":"gen_udp.html#open/1"},{"type":"function","doc":"Open a UDP socket.\n\nThe created socket is bound to the UDP port number `Port`.\nIf `Port == 0`, the underlying OS assigns a free (ephemeral) UDP port;\nuse `inet:port/1` to retrieve it.\n\nThe process that calls this function becomes the `Socket`'s\ncontrolling process (socket owner).","title":"gen_udp.open/2","ref":"gen_udp.html#open/2"},{"type":"function","doc":"- **`list`** - Received `Packet` is delivered as a list.\n\n- **`binary`** - Received `Packet` is delivered as a binary.\n\n- **`{ip, Address}`** - If the local host has many IP addresses,\n this option specifies which one to use.\n\n- **`{ifaddr, Address}`** - Same as `{ip, Address}`.\n\n However, if this instead is a `t:socket:sockaddr_in/0` or\n `t:socket:sockaddr_in6/0` this takes precedence over any value\n previously set with the `ip` options. If the `ip` option comes\n _after_ the `ifaddr` option, it may be used to _update_ its corresponding\n field of the `ifaddr` option (the `addr` field).\n\n- **`{fd, integer() >= 0}`** - If a socket has somehow been opened without\n using `gen_udp`, use this option to pass the file descriptor for it.\n If `Port` is not set to `0` and/or `{ip, ip_address()}` is combined\n with this option, the `fd` is bound to the specified interface\n and port after it is being opened. If these options are not specified,\n it is assumed that the `fd` is already bound appropriately.\n\n- **`inet6`** - Sets up the socket for IPv6.\n\n- **`inet`** - Sets up the socket for IPv4.\n\n- **`local`** - Sets up a Unix Domain Socket. See `t:inet:local_address/0`\n\n- **`{udp_module, module()}`** - Overrides which callback module is used.\n Defaults to `inet_udp` for IPv4 and `inet6_udp` for IPv6.\n\n- **`{multicast_if, Address}`** - Sets the local device for a multicast socket.\n\n- **`{multicast_loop, true | false}`** - When `true`, sent multicast packets\n are looped back to the local sockets.\n\n- **`{multicast_ttl, Integer}`** - Option `multicast_ttl` changes the\n time-to-live (TTL) for outgoing multicast datagrams to control the scope of\n the multicasts.\n\n Datagrams with a TTL of 1 are not forwarded beyond the local network.\n Defaults to `1`.\n\n- **`{add_membership, {MultiAddress, InterfaceAddress}}`** -\n Joins a multicast group.\n\n- **`{drop_membership, {MultiAddress, InterfaceAddress}}`** -\n Leaves a multicast group.\n\n- **`t:option/0`** - See `inet:setopts/2`.\n\nUDP packets are sent with this socket using [`send(Socket, ...)`](`send/3`).\nWhen UDP packets arrive to the `Socket`'s UDP port, and the socket is in\nan _active mode_, the packets are delivered as messages to the\ncontrolling process (socket owner):\n\n```erlang\n{udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data\n{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data\n```\n\n`PeerIP` and `PeerPort` are the address from which `Packet` was sent.\n`Packet` is a list of bytes (`[`[`byte/0`](`t:byte/0`)`]` if option `list`\nis active and a `t:binary/0` if option `binary`is active\n(they are mutually exclusive).\n\nThe message contains an `AncData` field only if any of the socket\n[options](`t:option/0`) [`recvtos`](`m:inet#option-recvtos`),\n[`recvtclass`](`m:inet#option-recvtclass`) or\n[`recvttl`](`m:inet#option-recvttl`) are active.\n\nWhen a socket in `{active, N}` mode (see `inet:setopts/2` for details),\ntransitions to passive (`{active, false}`) mode (`N` counts down to `0`),\nthe controlling process is notified by a message on this form:\n\n```erlang\n{udp_passive, Socket}\n```\n\nIf the OS protocol stack reports an error for the socket, the following\nmessage is sent to the controlling process:\n\n```erlang\n{udp_error, Socket, Reason}\n```\n`Reason` is mostly a [POSIX Error Code](`m:inet#posix-error-codes`).\n\nIf the socket is in _passive mode_ (not in an _active mode_), received data\ncan be retrieved with the`recv/2,3`](`recv/2`) calls. Note that incoming\nUDP packets that are longer than the receive buffer option specifies\ncan be truncated without warning.\n\nThe default value for the receive buffer option is `{recbuf, 8192}`.","title":"UDP socket options - gen_udp.open/2","ref":"gen_udp.html#open/2-udp-socket-options"},{"type":"function","doc":"","title":"gen_udp.recv/2","ref":"gen_udp.html#recv/2"},{"type":"function","doc":"Receive a packet from a socket in _passive mode_.\n\n`Timeout` specifies a time-out in milliseconds.\n\nIf any of the socket [options](`t:option/0`)\n[`recvtos`](`m:inet#option-recvtos`),\n[`recvtclass`](`m:inet#option-recvtclass`)\nor [`recvttl`](`m:inet#option-recvttl`) are active,\nthe `RecvData` tuple contains an `AncData` field,\notherwise it doesn't.","title":"gen_udp.recv/3","ref":"gen_udp.html#recv/3"},{"type":"function","doc":"Send a packet on a connected UDP socket.\n\nTo connect a UDP socket, use `connect/2` or `connect/3`.","title":"gen_udp.send/2","ref":"gen_udp.html#send/2"},{"type":"function","doc":"Equivalent to [`send(Socket, Destination, [], Packet)`](#send-4-AncData).","title":"gen_udp.send/3","ref":"gen_udp.html#send/3"},{"type":"function","doc":"Send a UDP packet to the specified destination.","title":"gen_udp.send/4","ref":"gen_udp.html#send/4"},{"type":"function","doc":"Argument `Host` can be a hostname or a socket address, and `Port`\ncan be a port number or a service name atom. These are resolved to\na `Destination` and then this function is equivalent to\n[`send(Socket, Destination, [], Packet)`](#send-4-AncData)\njust below.\n\n### [](){: #send-4-AncData } With arguments `Destination` and `AncData` _(since OTP 22.1)_\n\nSends a packet to the specified `Destination` with ancillary data `AncData`.\n\n> #### Note {: .info }\n>\n> The ancillary data `AncData` contains options that for this single message\n> override the default options for the socket, an operation that may not be\n> supported on all platforms, and if so return `{error, einval}`. Using more\n> than one of an ancillary data item type may also not be supported.\n> `AncData =:= []` is always supported.","title":"With arguments `Host` and `Port` - gen_udp.send/4","ref":"gen_udp.html#send/4-with-arguments-host-and-port"},{"type":"function","doc":"Sends a packet to the specified `Destination`. Since `Destination`\nis a complete address, `PortZero` is redundant and has to be `0`.\n\nThis is a legacy clause mostly for `Destination = {local, Binary}`\nwhere `PortZero` is superfluous. Equivalent to\n[`send(Socket, Destination, [], Packet)`](#send-4-AncData), right above here.","title":"With arguments `Destination` and `PortZero` _(since OTP 22.1)_ - gen_udp.send/4","ref":"gen_udp.html#send/4-with-arguments-destination-and-portzero-_-since-otp-22-1-_"},{"type":"function","doc":"Send a packet to the specified destination, with ancillary data.\n\nEquvalent to [`send(Socket, Host, Port, Packet)`](`send/4`)\nregarding `Host` and `Port` and also equivalent to\n[`send(Socket, Destination, AncData, Packet)`](#send-4-AncData)\nregarding the ancillary data: `AncData`.","title":"gen_udp.send/5","ref":"gen_udp.html#send/5"},{"type":"type","doc":"","title":"gen_udp.ip6_membership/0","ref":"gen_udp.html#t:ip6_membership/0"},{"type":"type","doc":"IPv6 this multicast interface index (an integer).","title":"gen_udp.ip6_multicast_if/0","ref":"gen_udp.html#t:ip6_multicast_if/0"},{"type":"type","doc":"IP multicast membership.\n\nThe 3-tuple form _isn't_ supported on all platforms.\n'ifindex' defaults to zero (0) on platforms that supports the 3-tuple variant.","title":"gen_udp.ip_membership/0","ref":"gen_udp.html#t:ip_membership/0"},{"type":"type","doc":"","title":"gen_udp.ip_multicast_if/0","ref":"gen_udp.html#t:ip_multicast_if/0"},{"type":"type","doc":"","title":"gen_udp.membership/0","ref":"gen_udp.html#t:membership/0"},{"type":"type","doc":"","title":"gen_udp.multicast_if/0","ref":"gen_udp.html#t:multicast_if/0"},{"type":"type","doc":"","title":"gen_udp.open_option/0","ref":"gen_udp.html#t:open_option/0"},{"type":"type","doc":"","title":"gen_udp.option/0","ref":"gen_udp.html#t:option/0"},{"type":"type","doc":"","title":"gen_udp.option_name/0","ref":"gen_udp.html#t:option_name/0"},{"type":"type","doc":"A socket as returned by [`open/1,2`](`open/1`).","title":"gen_udp.socket/0","ref":"gen_udp.html#t:socket/0"},{"type":"module","doc":"Access to Network protocols.\n\nThis module, together with `m:gen_tcp`, `m:gen_udp` and `m:gen_sctp`\nprovides access to the Network protocols TCP, SCTP and UDP over IP,\nas well as stream and datagram protocols over the local (unix)\naddress domain / protocol domain.\n\nSee also [ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`)\nor more information about how to configure an Erlang runtime system\nfor IP communication.\n\nThe following two Kernel configuration parameters affect the behavior of all\n`m:gen_tcp` sockets opened on an Erlang node:\n\n- `inet_default_connect_options` can contain a list of\n default options used for all sockets created by\n a `gen_tcp:connect/2,3,4`](`gen_tcp:connect/2`) call.\n- `inet_default_listen_options` can contain a list of default options\n used for sockets created by a `gen_tcp:listen/2` call.\n\nFor the [`gen_tcp:accept/1,2`](`gen_tcp:accept/1`) call,\nthe values of the listening socket options are inherited.\nTherefore there is no corresponding application variable for `accept`.\n\nUsing the Kernel configuration parameters above, one can set default options\nfor all TCP sockets on a node, but use this with care. Options such as\n`{delay_send,true}` can be specified in this way. The following is an example\nof starting an Erlang node with all sockets using delayed send:\n\n```text\n$ erl -sname test -kernel \\\ninet_default_connect_options '[{delay_send,true}]' \\\ninet_default_listen_options '[{delay_send,true}]'\n```\n\n**Please note** that the default option `{active, true}` cannot be changed,\nfor internal implementation reasons.\n\nAddresses as inputs to functions can be either a string or a tuple.\nFor example, the IP address 150.236.20.73 can be passed to\n`gethostbyaddr/1`, either as a string `\"150.236.20.73\"`\nor as a tuple `{150, 236, 20, 73}`.\n\n_IPv4 address examples:_\n\n```text\nAddress ip_address()\n------- ------------\n127.0.0.1 {127,0,0,1}\n192.168.42.2 {192,168,42,2}\n```\n\n_IPv6 address examples:_\n\n```erlang\nAddress ip_address()\n------- ------------\n::1 {0,0,0,0,0,0,0,1}\n::192.168.42.2 {0,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}\n::FFFF:192.168.42.2\n {0,0,0,0,0,16#FFFF,(192 bsl 8) bor 168,(42 bsl 8) bor 2}\n3ffe:b80:1f8d:2:204:acff:fe17:bf38\n {16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}\nfe80::204:acff:fe17:bf38\n {16#fe80,0,0,0,16#204,16#acff,16#fe17,16#bf38}\n```\n\nFunction `parse_address/1` can be useful:\n\n```erlang\n1> inet:parse_address(\"192.168.42.2\").\n{ok,{192,168,42,2}}\n2> inet:parse_address(\"::FFFF:192.168.42.2\").\n{ok,{0,0,0,0,0,65535,49320,10754}}\n```\n\n[](){: #posix-error-codes } POSIX Error Codes\n---------------------------------------------\n\n- `e2big` - Too long argument list\n- `eacces` - Permission denied\n- `eaddrinuse` - Address already in use\n- `eaddrnotavail` - Cannot assign requested address\n- `eadv` - Advertise error\n- `eafnosupport` - Address family not supported by protocol family\n- `eagain` - Resource temporarily unavailable\n- `ealign` - EALIGN\n- `ealready` - Operation already in progress\n- `ebade` - Bad exchange descriptor\n- `ebadf` - Bad file number\n- `ebadfd` - File descriptor in bad state\n- `ebadmsg` - Not a data message\n- `ebadr` - Bad request descriptor\n- `ebadrpc` - Bad RPC structure\n- `ebadrqc` - Bad request code\n- `ebadslt` - Invalid slot\n- `ebfont` - Bad font file format\n- `ebusy` - File busy\n- `echild` - No children\n- `echrng` - Channel number out of range\n- `ecomm` - Communication error on send\n- `econnaborted` - Software caused connection abort\n- `econnrefused` - Connection refused\n- `econnreset` - Connection reset by peer\n- `edeadlk` - Resource deadlock avoided\n- `edeadlock` - Resource deadlock avoided\n- `edestaddrreq` - Destination address required\n- `edirty` - Mounting a dirty fs without force\n- `edom` - Math argument out of range\n- `edotdot` - Cross mount point\n- `edquot` - Disk quota exceeded\n- `eduppkg` - Duplicate package name\n- `eexist` - File already exists\n- `efault` - Bad address in system call argument\n- `efbig` - File too large\n- `ehostdown` - Host is down\n- `ehostunreach` - Host is unreachable\n- `eidrm` - Identifier removed\n- `einit` - Initialization error\n- `einprogress` - Operation now in progress\n- `eintr` - Interrupted system call\n- `einval` - Invalid argument\n- `eio` - I/O error\n- `eisconn` - Socket is already connected\n- `eisdir` - Illegal operation on a directory\n- `eisnam` - Is a named file\n- `el2hlt` - Level 2 halted\n- `el2nsync` - Level 2 not synchronized\n- `el3hlt` - Level 3 halted\n- `el3rst` - Level 3 reset\n- `elbin` - ELBIN\n- `elibacc` - Cannot access a needed shared library\n- `elibbad` - Accessing a corrupted shared library\n- `elibexec` - Cannot exec a shared library directly\n- `elibmax` - Attempting to link in more shared libraries than system limit\n- `elibscn` - `.lib` section in `a.out` corrupted\n- `elnrng` - Link number out of range\n- `eloop` - Too many levels of symbolic links\n- `emfile` - Too many open files\n- `emlink` - Too many links\n- `emsgsize` - Message too long\n- `emultihop` - Multihop attempted\n- `enametoolong` - Filename too long\n- `enavail` - Unavailable\n- `enet` - ENET\n- `enetdown` - Network is down\n- `enetreset` - Network dropped connection on reset\n- `enetunreach` - Network is unreachable\n- `enfile` - File table overflow\n- `enoano` - Anode table overflow\n- `enobufs` - No buffer space available\n- `enocsi` - No CSI structure available\n- `enodata` - No data available\n- `enodev` - No such device\n- `enoent` - No such file or directory\n- `enoexec` - Exec format error\n- `enolck` - No locks available\n- `enolink` - Link has been severed\n- `enomem` - Not enough memory\n- `enomsg` - No message of desired type\n- `enonet` - Machine is not on the network\n- `enopkg` - Package not installed\n- `enoprotoopt` - Bad protocol option\n- `enospc` - No space left on device\n- `enosr` - Out of stream resources or not a stream device\n- `enosym` - Unresolved symbol name\n- `enosys` - Function not implemented\n- `enotblk` - Block device required\n- `enotconn` - Socket is not connected\n- `enotdir` - Not a directory\n- `enotempty` - Directory not empty\n- `enotnam` - Not a named file\n- `enotsock` - Socket operation on non-socket\n- `enotsup` - Operation not supported\n- `enotty` - Inappropriate device for `ioctl`\n- `enotuniq` - Name not unique on network\n- `enxio` - No such device or address\n- `eopnotsupp` - Operation not supported on socket\n- `eperm` - Not owner\n- `epfnosupport` - Protocol family not supported\n- `epipe` - Broken pipe\n- `eproclim` - Too many processes\n- `eprocunavail` - Bad procedure for program\n- `eprogmismatch` - Wrong program version\n- `eprogunavail` - RPC program unavailable\n- `eproto` - Protocol error\n- `eprotonosupport` - Protocol not supported\n- `eprototype` - Wrong protocol type for socket\n- `erange` - Math result unrepresentable\n- `erefused` - EREFUSED\n- `eremchg` - Remote address changed\n- `eremdev` - Remote device\n- `eremote` - Pathname hit remote filesystem\n- `eremoteio` - Remote I/O error\n- `eremoterelease` - EREMOTERELEASE\n- `erofs` - Read-only filesystem\n- `erpcmismatch` - Wrong RPC version\n- `erremote` - Object is remote\n- `eshutdown` - Cannot send after socket shutdown\n- `esocktnosupport` - Socket type not supported\n- `espipe` - Invalid seek\n- `esrch` - No such process\n- `esrmnt` - Srmount error\n- `estale` - Stale remote file handle\n- `esuccess` - Error 0\n- `etime` - Timer expired\n- `etimedout` - Connection timed out\n- `etoomanyrefs` - Too many references\n- `etxtbsy` - Text file or pseudo-device busy\n- `euclean` - Structure needs cleaning\n- `eunatch` - Protocol driver not attached\n- `eusers` - Too many users\n- `eversion` - Version mismatch\n- `ewouldblock` - Operation would block\n- `exdev` - Cross-device link\n- `exfull` - Message tables full\n- `nxdomain` - Hostname or domain name cannot be found","title":"inet","ref":"inet.html"},{"type":"function","doc":"Cancel a socket monitor.\n\nIf `MRef` is a reference that the calling process obtained by calling\n`monitor/1`, this monitor is removed. If the monitoring is already removed,\nnothing happens.\n\nThe returned value is one of the following:\n\n- **`true`** - The monitor was found and removed. In this case, no `'DOWN'`\n message corresponding to this monitor has been delivered and will not be\n delivered.\n\n- **`false`** - The monitor was not found and couldn't be removed.\n Probably because the monitor has already triggered and there is\n a corresponding `'DOWN'` message in the caller message queue.","title":"inet.cancel_monitor/1","ref":"inet.html#cancel_monitor/1"},{"type":"function","doc":"Close a socket of any type.","title":"inet.close/1","ref":"inet.html#close/1"},{"type":"function","doc":"Format an error code into a `t:string/0`.\n\nReturns a diagnostic error string. For possible POSIX values\nand corresponding strings, see section\n[POSIX Error Codes](#posix-error-codes).","title":"inet.format_error/1","ref":"inet.html#format_error/1"},{"type":"function","doc":"Get the `inet` configuration.\n\nReturns the state of the `inet` configuration database in form of\na list of recorded configuration parameters. For more information, see\n[ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`).\n\nOnly actual parameters with other than default values are returned,\nfor example not directives that specify other sources for configuration\nparameters nor directives that clear parameters.","title":"inet.get_rc/0","ref":"inet.html#get_rc/0"},{"type":"function","doc":"Resolve a host to an address, in a specific addresss family.\n\nReturns the [IP address](`t:ip_address/0`) for `Host` as a tuple of integers.\n`Host` can be an [IP address](`t:ip_address/0`), a single `t:hostname/0`,\nor a fully qualified `t:hostname/0`.","title":"inet.getaddr/2","ref":"inet.html#getaddr/2"},{"type":"function","doc":"Resolve a host to a list of addresses, in a specific address family.\n\nReturns a list of all IP addresses for `Host`.\n`Host` can be an [IP address](`t:ip_address/0`),\na single `t:hostname/0`, or a fully qualified `t:hostname/0`.","title":"inet.getaddrs/2","ref":"inet.html#getaddrs/2"},{"type":"function","doc":"Resolve (reverse) an address to a [`#hostent{}`](`t:hostent/0`) record.\n\nReturns a [`#hostent{}`](`t:hostent/0`) record for the host\nwith the specified address.","title":"inet.gethostbyaddr/1","ref":"inet.html#gethostbyaddr/1"},{"type":"function","doc":"Resolve a hostname to a [`#hostent{}`](`t:hostent/0`) record.\n\nReturns a [`#hostent{}`](`t:hostent/0`) record for the host\nwith the specified `Hostname`.\n\nThis function uses the resolver, which is often the native (OS) resolver.\n\nIf resolver option `inet6` is `true`, an IPv6 address is looked up.\n\nSee [ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`) for\ninformation about the resolver configuration.\n\nA quirk of many resolvers is that an integer string is interpreted\nas an IP address. For instance, the integer string \"3232235521\"\nand the string \"192.168.0.1\" are both translated\nto the IP address `{192,168,0,1}`.","title":"inet.gethostbyname/1","ref":"inet.html#gethostbyname/1"},{"type":"function","doc":"Resolve a hostname to a [`#hostent{}`](`t:hostent/0`) record,\nin a specific address family.\n\nReturns a [`#hostent{}`](`t:hostent/0`) record for the host\nwith the specified `Hostname`, restricted to the specified address `Family`.\n\nSee also `gethostbyname/1`.","title":"inet.gethostbyname/2","ref":"inet.html#gethostbyname/2"},{"type":"function","doc":"Get the local hostname.\n\nReturns the local hostname. Never fails.","title":"inet.gethostname/0","ref":"inet.html#gethostname/0"},{"type":"function","doc":"Get interface names and addresses.\n\nReturns a list of 2-tuples containing interface names and the interfaces'\naddresses. `Ifname` is a Unicode string and `Ifopts` is a list of interface\naddress description tuples.\n\nThe interface address description tuples are documented under\nthe type of the [`Ifopts`](`t:getifaddrs_ifopts/0`) value.","title":"inet.getifaddrs/0","ref":"inet.html#getifaddrs/0"},{"type":"function","doc":"Get interface names and addresses, in a specific namespace.\n\nEquivalent to `getifaddrs/0`, but accepts an `Option`\n`{netns, Namespace}` that, on platforms that support the feature (Linux),\nsets a network namespace for the OS call.\nAlso,\nIf the option 'inet_backend' is *first* in the options list,\nthe specified backend will be used (for 'inet', inet and\nfor 'socket' the equivalent net functions will be used).\n \n\nSee the socket option [`{netns, Namespace}`](#option-netns)\nunder `setopts/2`.","title":"inet.getifaddrs/1","ref":"inet.html#getifaddrs/1"},{"type":"function","doc":"Get one or more options for a socket.\n\nGets all options in the list `Options` from `Socket`.\nSee `setopts/2` for a list of available options. See also\nthe descriptions of protocol specific types referenced by\n[`socket_optval()` ](`t:socket_optval/0`).\n\nThe number of elements in the returned `OptionValues` list does not necessarily\ncorrespond to the number of options asked for. If the operating system fails to\nsupport an option, it is left out in the returned list. An error tuple is\nreturned only when getting options for the socket is impossible (that is, the\nsocket is closed or the buffer size in a raw request is too large). This\nbehavior is kept for backward compatibility reasons.\n\nA raw option request `RawOptReq = {raw, Protocol, OptionNum, ValueSpec}` can be\nused to get information about socket options not (explicitly) supported by the\nemulator. The use of raw socket options makes the code non-portable, but allows\nthe Erlang programmer to take advantage of unusual features present on a\nparticular platform.\n\n`RawOptReq` consists of tag `raw` followed by the protocol level, the option\nnumber, and either a binary or the size, in bytes, of the buffer in which the\noption value is to be stored. A binary is to be used when the underlying\n`getsockopt` requires _input_ in the argument field. In this case, the binary\nsize shall correspond to the required buffer size of the return value. The\nsupplied values in a `RawOptReq` correspond to the second, third, and\nfourth/fifth parameters to the `getsockopt` call in the C socket API. The value\nstored in the buffer is returned as a binary `ValueBin`, where all values are\ncoded in native endianness.\n\nAsking for and inspecting raw socket options require low-level information about\nthe current operating system and TCP stack.\n\n_Example:_\n\nConsider a Linux machine where option `TCP_INFO` can be used to collect TCP\nstatistics for a socket. Assume you are interested in field `tcpi_sacked` of\n`struct tcp_info` filled in when asking for `TCP_INFO`. To be able to access\nthis information, you need to know the following:\n\n- The numeric value of protocol level `IPPROTO_TCP`\n- The numeric value of option `TCP_INFO`\n- The size of `struct tcp_info`\n- The size and offset of the specific field\n\nBy inspecting the headers or writing a small C program, it is found that\n`IPPROTO_TCP` is 6, `TCP_INFO` is 11, the structure size is 92 (bytes), the\noffset of `tcpi_sacked` is 28 bytes, and the value is a 32-bit integer. The\nfollowing code can be used to retrieve the value:\n\n```erlang\nget_tcpi_sacked(Sock) ->\n {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),\n <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info,\n TcpiSacked.\n```\n\nPreferably, you would check the machine type, the operating system, and the\nKernel version before executing anything similar to this code.","title":"inet.getopts/2","ref":"inet.html#getopts/2"},{"type":"function","doc":"","title":"inet.getstat/1","ref":"inet.html#getstat/1"},{"type":"function","doc":"Get one or more statistics options for a socket.\n\n[`getstat(Socket)`](`getstat/1`) is equivalent to\n[`getstat(Socket, [recv_avg, recv_cnt, recv_dvi, recv_max, recv_oct, send_avg, send_cnt, send_pend, send_max, send_oct])`](`getstat/2`).\n\nThe following options are available:\n\n- **`recv_avg`** - Average size of packets, in bytes, received by the socket.\n\n- **`recv_cnt`** - Number of packets received by the socket.\n\n- **`recv_dvi`** - Average packet size deviation, in bytes, received by the\n socket.\n\n- **`recv_max`** - Size of the largest packet, in bytes, received by the socket.\n\n- **`recv_oct`** - Number of bytes received by the socket.\n\n- **`send_avg`** - Average size of packets, in bytes, sent from the socket.\n\n- **`send_cnt`** - Number of packets sent from the socket.\n\n- **`send_pend`** - Number of bytes waiting to be sent by the socket.\n\n- **`send_max`** - Size of the largest packet, in bytes, sent from the socket.\n\n- **`send_oct`** - Number of bytes sent from the socket.","title":"inet.getstat/2","ref":"inet.html#getstat/2"},{"type":"function","doc":"Equivalent to `i/1` for the protocols `tcp`, `udp`, and `sctp`","title":"inet.i/0","ref":"inet.html#i/0"},{"type":"function","doc":"List network sockets.\n\nWith argument `Proto` equivalent to [`i(Proto, Options)`](`i/2`)\nwhere `Options` is a list of all `t:atom/0`s in `t:i_option/0`.\n\nWith argument `Options`, equivalent to [`i(Proto, Options)](`i/2`)\nfor `Proto`: `tcp`, `udp`, and `sctp`.\n\nWith argument `show_ports` **(since OTP 27.0)** equivalent to\n[`i(Proto, Options)](`i/2`) where `Option` is a list of all\noptions in `t:i_option/0` with `ShowPorts = true`.","title":"inet.i/1","ref":"inet.html#i/1"},{"type":"function","doc":"List network sockets.\n\nLists all TCP, UDP and SCTP sockets on the terminal, those created by\nthe Erlang runtime system as well as by the application.\n\nThe following options are available:\n\n- **`port`** - An internal index of the port.\n\n- **`module`** - The callback module of the socket.\n\n- **`recv`** - Number of bytes received by the socket.\n\n- **`sent`** - Number of bytes sent from the socket.\n\n- **`owner`** - The socket owner process.\n\n- **`local_address`** - The local address of the socket.\n\n- **`foreign_address`** - The address and port of the other end of the\n connection.\n\n- **`state`** - The connection state.\n\n- **`type`** - STREAM or DGRAM or SEQPACKET.\n\nThe `Options` argument may also be **(since OTP 27.0)**:\n\n- **`show_ports`** - Do *not* translate the port numbers\n (of 'local_address' and 'foreign_address') to service name(s).","title":"inet.i/2","ref":"inet.html#i/2"},{"type":"function","doc":"Get information about a socket.\n\nReturns a term containing miscellaneous information about a socket.","title":"inet.info/1","ref":"inet.html#info/1"},{"type":"function","doc":"Convert between an IPv4 address and an IPv4-mapped IPv6 address.\n\nConvert an IPv4 address to an IPv4-mapped IPv6 address or the reverse.\nWhen converting from an IPv6 address all but the 2 low words are ignored\nso this function also works on some other types of IPv6 addresses\nthan IPv4-mapped.","title":"inet.ipv4_mapped_ipv6_address/1","ref":"inet.html#ipv4_mapped_ipv6_address/1"},{"type":"function","doc":"Test for an IP address.\n\nTests if the argument `IPAddress` is an `t:ip_address/0`\nand if so returns `true`, otherwise `false`.","title":"inet.is_ip_address/1","ref":"inet.html#is_ip_address/1"},{"type":"function","doc":"Test for an IPv4 address.\n\nTests if the argument `IPv4Address` is an `t:ip4_address/0`\nand if so returns `true`, otherwise `false`.","title":"inet.is_ipv4_address/1","ref":"inet.html#is_ipv4_address/1"},{"type":"function","doc":"Test for an IPv6 address.\n\nTests if the argument `IPv6Address` is an `t:ip6_address/0`\nand if so returns `true`, otherwise `false`.","title":"inet.is_ipv6_address/1","ref":"inet.html#is_ipv6_address/1"},{"type":"function","doc":"Start a socket monitor.\n\nIf the `Socket` to monitor doesn't exist or when the monitor is triggered,\na `'DOWN'` message is sent that has the following pattern:\n\n```erlang\n\t {'DOWN', MonitorRef, Type, Object, Info}\n```\n\n- **`MonitorRef`** - The return value from this function.\n\n- **`Type`** - The type of socket, can be one of the following\n `t:atom/0`s: `port` or `socket`.\n\n- **`Object`** - The monitored entity, the socket, which triggered the event.\n\n- **`Info`** - Either the termination reason of the socket or `nosock`\n (the `Socket` did not exist when this function was called).\n\nMaking several calls to `inet:monitor/1` for the same `Socket`\nis not an error; one monitor is created per call.\n\nThe monitor is triggered when the socket is closed in any way such as\nan API call, remote end close, closed by signal when owner exits, ...","title":"inet.monitor/1","ref":"inet.html#monitor/1"},{"type":"function","doc":"Parse an `t:ip_address/0` to an IPv4 or IPv6 address string.","title":"inet.ntoa/1","ref":"inet.html#ntoa/1"},{"type":"function","doc":"Parse an IP address string to an `t:ip_address/0`.\n\nReturns an `t:ip4_address/0` or an `t:ip6_address/0` depending\non which parsing that succeeds.\n\nAccepts a short form IPv4 address string like `parse_ipv4_address/1`.","title":"inet.parse_address/1","ref":"inet.html#parse_address/1"},{"type":"function","doc":"Parse (relaxed) an IPv4 address string to an `t:ip4_address/0`.\n\nAccepts a short form IPv4 address string (less than 4 fields)\nsuch as `\"127.1\"` or `\"0x7f000001\"`.","title":"inet.parse_ipv4_address/1","ref":"inet.html#parse_ipv4_address/1"},{"type":"function","doc":"Parse an IPv4 address string to an `t:ip4_address/0`.\n\nRequires an IPv4 address string containing four fields,\nthat is; _not_ a short form address string.","title":"inet.parse_ipv4strict_address/1","ref":"inet.html#parse_ipv4strict_address/1"},{"type":"function","doc":"Parse (relaxed) an IPv6 address string to an `t:ip6_address/0`.\n\nAlso accepts a (relaxed) IPv4 address string like `parse_ipv4_address/1`\nand returns an IPv4-mapped IPv6 address.","title":"inet.parse_ipv6_address/1","ref":"inet.html#parse_ipv6_address/1"},{"type":"function","doc":"Parse an IPv6 address string to an `t:ip6_address/0`.\n\n_Doesn't_ accept an IPv4 address string. An IPv6 address string, though,\nallows an IPv4 tail like this: `\"::127.0.0.1\"`\n(which is the same as `\"::7f00:0001\"`).","title":"inet.parse_ipv6strict_address/1","ref":"inet.html#parse_ipv6strict_address/1"},{"type":"function","doc":"Parse an IP address string to an `t:ip_address/0`.\n\nLike `parse_address/1` but _doesn't_ accept a short form IPv4 address string.","title":"inet.parse_strict_address/1","ref":"inet.html#parse_strict_address/1"},{"type":"function","doc":"Return the address of the socket's remote end.\n\nReturns the address and port for the other end of a connection.\n\nNotice that for SCTP sockets, this function returns only one of\nthe peer addresses of the socket. Function [`peernames/1,2`](`peernames/1`)\nreturns all.","title":"inet.peername/1","ref":"inet.html#peername/1"},{"type":"function","doc":"Equivalent to [`peernames(Socket, 0)`](`peernames/2`).\n\nNotice that the behavior of this function for an SCTP one-to-many style socket\nis not defined by the\n[SCTP Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13).","title":"inet.peernames/1","ref":"inet.html#peernames/1"},{"type":"function","doc":"Return the addresses of all remote ends of a socket.\n\nReturns a list of all address/port number pairs for the remote end of an\nassociation `Assoc` of a socket.\n\nThis function can return multiple addresses for multihomed sockets,\nsuch as SCTP sockets. For other sockets it returns a one-element list.\n\nNotice that parameter `Assoc` is by the\n[SCTP Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\ndefined to be ignored for one-to-one style sockets.\nWhat the special value `0` means, is unfortunately undefined,\nand hence the behavior for one-to-many style sockets.","title":"inet.peernames/2","ref":"inet.html#peernames/2"},{"type":"function","doc":"Return the local port number for a socket.","title":"inet.port/1","ref":"inet.html#port/1"},{"type":"function","doc":"Set one or more options for a socket.\n\nSets the list of `Options` on `Socket`.\n\nThe following options are available:\n\n- **`{active, true | false | once | N}`** [](){: #option-active } -\n If the value is `true`, which is the default, everything received\n from the socket is sent as messages to the receiving process.\n\n If the value is `false` (passive mode), the process must explicitly receive\n incoming data by calling [`gen_tcp:recv/2,3`](`gen_tcp:recv/2`),\n [`gen_udp:recv/2,3`](`gen_udp:recv/2`), or\n [`gen_sctp:recv/1,2`](`gen_sctp:recv/1`) (depending on the type of socket).\n\n If the value is `once` (`{active, once}`), _one_ data message from the socket\n is sent to the process. To receive one more message,\n [`setopts/2`](`setopts/2`) must be called again with option `{active, once}`.\n\n If the value is an integer `N` in the range -32768 to 32767 (inclusive), the\n value is added to the socket's count of data messages sent to the controlling\n process. A socket's default message count is `0`. If a negative value is\n specified, and its magnitude is equal to or greater than the socket's current\n message count, the socket's message count is set to `0`. Once the socket's\n message count reaches `0`, either because of sending received data messages to\n the process or by being explicitly set, the process is then notified by a\n special message, specific to the type of socket, that the socket has entered\n passive mode. Once the socket enters passive mode, to receive more messages\n [`setopts/2`](`setopts/2`) must be called again to set the socket back into an\n active mode.\n\n When using `{active, once}` or `{active, N}`, the socket changes behavior\n automatically when data is received. This can be confusing in combination with\n connection-oriented sockets (that is, `gen_tcp`), as a socket with\n `{active, false}` behavior reports closing differently than a socket with\n `{active, true}` behavior. To simplify programming, a socket where the peer\n closed, and this is detected while in `{active, false}` mode, still generates\n message `{tcp_closed, Socket}` when set to `{active, once}`, `{active, true}`,\n or `{active, N}` mode. It is therefore safe to assume that message\n `{tcp_closed, Socket}`, possibly followed by socket port termination (depending\n on option `exit_on_close`) eventually appears when a socket changes back and\n forth between `{active, true}` and `{active, false}` mode. However, _when_\n peer closing is detected it is all up to the underlying TCP/IP stack and\n protocol.\n\n Notice that `{active, true}` mode provides no flow control; a fast sender can\n easily overflow the receiver with incoming messages. The same is true for\n `{active, N}` mode, while the message count is greater than zero.\n\n Use active mode only if your high-level protocol provides its own flow control\n (for example, acknowledging received messages) or the amount of data exchanged\n is small. Using `{active, false}` mode, `{active, once}` mode, or\n `{active, N}` mode with values of `N` appropriate for the application to\n provide flow control, ensures the other side cannot send faster than the\n receiver can read.\n\n- **`{broadcast, Boolean}` (UDP sockets)** [](){: #option-broadcast } -\n Enables/disables permission to send broadcasts.\n\n- **`{buffer, Size}`** [](){: #option-buffer } -\n The size of the user-level buffer used by the driver. Not to be confused\n with options `sndbuf` and `recbuf`, which correspond to the\n Kernel socket buffers. For TCP it is recommended to have\n `val(buffer) >= val(recbuf)` to avoid performance issues because of\n unnecessary copying. For UDP the same recommendation applies, but the max\n should not be larger than the MTU of the network path. `val(buffer)` is\n automatically set to the above maximum when `recbuf` is set. However, as the\n size set for `recbuf` usually become larger, you are encouraged to use\n `getopts/2` to analyze the behavior of your operating system.\n\n Note that this is also the maximum amount of data that can be received from a\n single recv call. If you are using higher than normal MTU consider setting\n buffer higher.\n\n- **`{delay_send, Boolean}`** - Normally, when an Erlang process sends to a\n socket, the driver tries to send the data immediately. If that fails, the\n driver uses any means available to queue up the message to be sent whenever\n the operating system says it can handle it. Setting `{delay_send, true}` makes\n _all_ messages queue up. The messages sent to the network are then larger but\n fewer. The option affects the scheduling of send requests versus Erlang\n processes instead of changing any real property of the socket. The option is\n implementation-specific. Defaults to `false`.\n\n- **`{deliver, port | term}`** - When `{active, true}`, data is delivered on the\n form `port` : `{S, {data, [H1,..Hsz | Data]}}`\n or `term` : `{tcp, S, [H1..Hsz | Data]}`.\n\n- **`{dontroute, Boolean}`** - Enables/disables routing bypass for outgoing\n messages.\n\n- **`{exit_on_close, Boolean}`** - This option is set to `true` by default.\n\n The only reason to set it to `false` is if you want to continue sending data\n to the socket after a close is detected, for example, if the peer uses\n `gen_tcp:shutdown/2` to shut down the write side.\n\n- **`{exclusiveaddruse, Boolean}`** [](){: #option-exclusiveaddruse } -\n Enables/disables exclusive address/port usage on Windows. That is, by enabling\n this option you can prevent other sockets from binding to the same\n address/port. By default this option is disabled. That is, other sockets\n may use the same address/port by setting\n [`{reuseaddr, true}`](#option-reuseaddr) in combination with\n [`{reuseport, true}`](#option-reuseport) unless\n `{exclusiveaddruse, true}` has been set on `Socket`. On non-Windows systems\n this option is silently ignored.\n\n > #### Note {: .info }\n >\n > This option is _currently_ not supported for socket created with\n > `inet_backend = socket`\n\n- **`{header, Size}`** - This option is only meaningful if option `binary` was\n specified when the socket was created. If option `header` is specified, the\n first `Size` number bytes of data received from the socket are elements of a\n list, and the remaining data is a binary specified as the tail of the same\n list. For example, if `Size == 2`, the data received matches\n `[Byte1, Byte2 | Binary]`.\n\n- **`{high_msgq_watermark, Size}`** - The socket message queue is set to a busy\n state when the amount of data on the message queue reaches this limit. Notice\n that this limit only concerns data that has not yet reached the ERTS internal\n socket implementation. Defaults to 8 kB.\n\n Senders of data to the socket are suspended if either the socket message queue\n is busy or the socket itself is busy.\n\n For more information, see options `low_msgq_watermark`, `high_watermark`, and\n `low_watermark`.\n\n Notice that distribution sockets disable the use of `high_msgq_watermark` and\n `low_msgq_watermark`. Instead use the\n [distribution buffer busy limit](`m:erlang#system_info_dist_buf_busy_limit`),\n which is a similar feature.\n\n- **`{high_watermark, Size}` (TCP/IP sockets)** - The socket is set to a busy\n state when the amount of data queued internally by the ERTS socket\n implementation reaches this limit. Defaults to 8 kB.\n\n Senders of data to the socket are suspended if either the socket message queue\n is busy or the socket itself is busy.\n\n For more information, see options `low_watermark`, `high_msgq_watermark`, and\n `low_msqg_watermark`.\n\n- **`{ipv6_v6only, Boolean}`** - Restricts the socket to use only IPv6,\n prohibiting any IPv4 connections. This is only applicable for IPv6 sockets\n (option `inet6`).\n\n On most platforms this option must be set on the socket before associating it\n to an address. It is therefore only reasonable to specify it when creating the\n socket and not to use it when calling function (`setopts/2`) containing this\n description.\n\n The behavior of a socket with this option set to `true` is the only portable\n one. The original idea when IPv6 was new of using IPv6 for all traffic is now\n not recommended by FreeBSD (you can use `{ipv6_v6only,false}` to override the\n recommended system default value), forbidden by OpenBSD (the supported GENERIC\n kernel), and impossible on Windows (which has separate IPv4 and IPv6 protocol\n stacks). Most Linux distros still have a system default value of `false`. This\n policy shift among operating systems to separate IPv6 from IPv4 traffic has\n evolved, as it gradually proved hard and complicated to get a dual stack\n implementation correct and secure.\n\n On some platforms, the only allowed value for this option is `true`, for\n example, OpenBSD and Windows. Trying to set this option to `false`, when\n creating the socket, fails in this case.\n\n Setting this option on platforms where it does not exist is ignored. Getting\n this option with `getopts/2` returns no value, that is, the returned list does\n not contain an `{ipv6_v6only,_}` tuple. On Windows, the option does not exist,\n but it is emulated as a read-only option with value `true`.\n\n Therefore, setting this option to `true` when creating a socket never fails,\n except possibly on a platform where you have customized the kernel to only\n allow `false`, which can be doable (but awkward) on, for example, OpenBSD.\n\n If you read back the option value using `getopts/2` and get no value, the\n option does not exist in the host operating system. The behavior of both an\n IPv6 and an IPv4 socket listening on the same port, and for an IPv6 socket\n getting IPv4 traffic is then no longer predictable.\n\n- **`{keepalive, Boolean}` (TCP/IP sockets)** - Enables/disables periodic\n transmission on a connected socket when no other data is exchanged. If the\n other end does not respond, the connection is considered broken and an error\n message is sent to the controlling process. Defaults to `false`.\n\n- **`{linger, {true|false, Seconds}}`** [](){: #option-linger } -\n Determines the time-out, in seconds, for flushing unsent data\n in the [`close/1`](`close/1`) socket call.\n\n The first component is if linger is enabled, the second component is the\n flushing time-out, in seconds. There are 3 alternatives:\n\n - **`{false, _}`** - close/1 or shutdown/2 returns immediately, not waiting\n for data to be flushed, with closing happening in the background.\n\n - **`{true, 0}`** - Aborts the connection when it is closed. Discards any data\n still remaining in the send buffers and sends RST to the peer.\n\n This avoids TCP's TIME_WAIT state, but leaves open the possibility that\n another \"incarnation\" of this connection being created.\n\n - **`{true, Time} when Time > 0`** - close/1 or shutdown/2 will not return\n until all queued messages for the socket have been successfully sent or the\n linger timeout (Time) has been reached.\n\n- **`{low_msgq_watermark, Size}`** - If the socket message queue is in a busy\n state, the socket message queue is set in a not busy state when the amount of\n data queued in the message queue falls below this limit. Notice that this\n limit only concerns data that has not yet reached the ERTS internal socket\n implementation. Defaults to 4 kB.\n\n Senders that are suspended because of either a busy message queue or a busy\n socket are resumed when the socket message queue and the socket are not busy.\n\n For more information, see options `high_msgq_watermark`, `high_watermark`, and\n `low_watermark`.\n\n Notice that distribution sockets disable the use of `high_msgq_watermark` and\n `low_msgq_watermark`. Instead they use the\n [distribution buffer busy limit](`m:erlang#system_info_dist_buf_busy_limit`),\n which is a similar feature.\n\n- **`{low_watermark, Size}` (TCP/IP sockets)** - If the socket is in a busy\n state, the socket is set in a not busy state when the amount of data queued\n internally by the ERTS socket implementation falls below this limit. Defaults\n to 4 kB.\n\n Senders that are suspended because of a busy message queue or a busy socket\n are resumed when the socket message queue and the socket are not busy.\n\n For more information, see options `high_watermark`, `high_msgq_watermark`, and\n `low_msgq_watermark`.\n\n- **`{mode, Mode :: binary | list}`** - Received `Packet` is delivered as\n defined by `Mode`.\n\n- **`{netns, Namespace :: file:filename_all()}`{: #option-netns }** - Sets a\n network namespace for the socket. Parameter `Namespace` is a filename defining\n the namespace, for example, `\"/var/run/netns/example\"`, typically created by\n command `ip netns add example`. This option must be used in a function call\n that creates a socket, that is, [`gen_tcp:connect/3,4`](`gen_tcp:connect/3`),\n `gen_tcp:listen/2`, [`gen_udp:open/1,2`](`gen_udp:open/1`) or\n [`gen_sctp:open/0,1,2`](`gen_sctp:open/0`), and also `getifaddrs/1`.\n\n This option uses the Linux-specific syscall `setns()`, such as in Linux kernel\n 3.0 or later, and therefore only exists when the runtime system is compiled\n for such an operating system.\n\n The virtual machine also needs elevated privileges, either running as\n superuser or (for Linux) having capability `CAP_SYS_ADMIN` according to the\n documentation for `setns(2)`. However, during testing also `CAP_SYS_PTRACE`\n and `CAP_DAC_READ_SEARCH` have proven to be necessary.\n\n _Example:_\n\n ```text\n setcap cap_sys_admin,cap_sys_ptrace,cap_dac_read_search+epi beam.smp\n ```\n\n Notice that the filesystem containing the virtual machine executable\n (`beam.smp` in the example) must be local, mounted without flag `nosetuid`,\n support extended attributes, and the kernel must support file capabilities.\n All this runs out of the box on at least Ubuntu 12.04 LTS, except that SCTP\n sockets appear to not support network namespaces.\n\n `Namespace` is a filename and is encoded and decoded as discussed in module\n `m:file`, with the following exceptions:\n\n - Emulator flag `+fnu` is ignored.\n - `getopts/2` for this option returns a binary for the filename if the stored\n filename cannot be decoded. This is only to occur if you set the option\n using a binary that cannot be decoded with the emulator's filename encoding:\n `file:native_name_encoding/0`.\n\n- **`{bind_to_device, Ifname :: binary()}`** - Binds a socket to a specific\n network interface. This option must be used in a function call that creates a\n socket, that is, [`gen_tcp:connect/3,4`](`gen_tcp:connect/3`),\n `gen_tcp:listen/2`, [`gen_udp:open/1,2`](`gen_udp:open/1`), or\n [`gen_sctp:open/0,1,2`](`gen_sctp:open/0`).\n\n Unlike `getifaddrs/0`, Ifname is encoded a binary. In the unlikely case that a\n system is using non-7-bit-ASCII characters in network device names, special\n care has to be taken when encoding this argument.\n\n This option uses the Linux-specific socket option `SO_BINDTODEVICE`, such as\n in Linux kernel 2.0.30 or later, and therefore only exists when the runtime\n system is compiled for such an operating system.\n\n Before Linux 3.8, this socket option could be set, but could not retrieved\n with `getopts/2`. Since Linux 3.8, it is readable.\n\n The virtual machine also needs elevated privileges, either running as\n superuser or (for Linux) having capability `CAP_NET_RAW`.\n\n The primary use case for this option is to bind sockets into\n [Linux VRF instances](http://www.kernel.org/doc/Documentation/networking/vrf.txt).\n\n- **`list`** - Received `Packet` is delivered as a list.\n\n- **`binary`** - Received `Packet` is delivered as a binary.\n\n- **`{nodelay, Boolean}` (TCP/IP sockets)** [](){: #option-nodelay } -\n If `Boolean == true`, option `TCP_NODELAY` is turned on for the socket,\n which means that also small amounts of data are sent immediately.\n\n This option is _not_ supported for `domain = local`, but if\n `inet_backend =/= socket` this error will be _ignored_.\n\n- **`{nopush, Boolean}` (TCP/IP sockets)** - This translates to `TCP_NOPUSH` on\n BSD and to `TCP_CORK` on Linux.\n\n If `Boolean == true`, the corresponding option is turned on for the socket,\n which means that small amounts of data are accumulated until a full MSS-worth\n of data is available or this option is turned off.\n\n Note that while `TCP_NOPUSH` socket option is available on OSX, its semantics\n is very different (e.g., unsetting it does not cause immediate send of\n accumulated data). Hence, `nopush` option is intentionally ignored on OSX.\n\n- **`{packet, PacketType}` (TCP/IP sockets)** [](){: #option-packet } -\n Defines the type of packets to use for a socket. Possible values:\n\n - **`raw | 0`** - No packaging is done.\n\n - **`1 | 2 | 4`** - Packets consist of a header specifying the number of bytes\n in the packet, followed by that number of bytes. The header length can be\n one, two, or four bytes, and containing an unsigned integer in big-endian\n byte order. Each send operation generates the header, and the header is\n stripped off on each receive operation.\n\n The 4-byte header is limited to 2Gb.\n\n - **`asn1 | cdr | sunrm | fcgi | tpkt | line`** - These packet types only have\n effect on receiving. When sending a packet, it is the responsibility of the\n application to supply a correct header. On receiving, however, one message\n is sent to the controlling process for each complete packet received, and,\n similarly, each call to `gen_tcp:recv/2,3` returns one complete packet. The\n header is _not_ stripped off.\n\n The meanings of the packet types are as follows:\n\n - `asn1` - ASN.1 BER\n - `sunrm` - Sun's RPC encoding\n - `cdr` - CORBA (GIOP 1.1)\n - `fcgi` - Fast CGI\n - `tpkt` - TPKT format \\[RFC1006]\n - `line` - Line mode, a packet is a line-terminated with newline, lines\n longer than the receive buffer are truncated\n\n - **`http | http_bin`** - The Hypertext Transfer Protocol. The packets are\n returned with the format according to `HttpPacket` described in\n `erlang:decode_packet/3` in ERTS. A socket in passive mode returns\n `{ok, HttpPacket}` from `gen_tcp:recv` while an active socket sends messages\n like `{http, Socket, HttpPacket}`.\n\n - **`httph | httph_bin`** - These two types are often not needed, as the\n socket automatically switches from `http`/`http_bin` to `httph`/`httph_bin`\n internally after the first line is read. However, there can be occasions\n when they are useful, such as parsing trailers from chunked encoding.\n\n- **`{packet_size, Integer}`(TCP/IP sockets)** - Sets the maximum allowed length\n of the packet body. If the packet header indicates that the length of the\n packet is longer than the maximum allowed length, the packet is considered\n invalid. The same occurs if the packet header is too large for the socket\n receive buffer.\n\n For line-oriented protocols (`line`, `http*`), option `packet_size` also\n guarantees that lines up to the indicated length are accepted and not\n considered invalid because of internal buffer limitations.\n\n- **`{line_delimiter, Char}` (TCP/IP sockets)**\n [](){: #option-line_delimiter } -\n Sets the line delimiting character for line-oriented protocols (`line`).\n Defaults to `$\\n`.\n\n- **`{raw, Protocol, OptionNum, ValueBin}`** - See below.\n\n- **`{read_ahead, Boolean}`** [](){: #option-read_ahead } -\n If set to `false` avoids reading ahead from the OS socket layer.\n The default for this option is `true` which speeds up packet header parsing.\n Setting `false` has a performance penalty because the packet header\n has to be read first, to know exactly how many bytes to read for the body,\n which roughly doubles the number of read operations.\n\n The use of this option is essential for example before switching to kTLS\n which activates OS socket layer encryption and decryption by setting\n special (raw) socket options. So if the Erlang socket layer has read ahead,\n it has read bytes that was for the OS socket layer to decrypt,\n which makes packet decryption derail for the connection.\n\n > #### Warning {: .warning }\n >\n > For packet modes that doesn't have the packet length at a fixed location\n > in a packet header, such as `line` or `asn1`, not reading ahead\n > can become very inefficient since sometimes the only way to accomplish\n > this is to read one byte at the time until the length\n > or packet end is found.\n\n- **`{read_packets, Integer}` (UDP sockets)** [](){: #option-read_packets } -\n Sets the maximum number of UDP packets to read without intervention\n from the socket when data is available. When this many packets\n have been read and delivered to the destination process,\n new packets are not read until a new notification of available data\n has arrived. Defaults to `5`. If this parameter is set too high, the system\n can become unresponsive because of UDP packet flooding.\n\n- **`{recbuf, Size}`** [](){: #option-recbuf } -\n The minimum size of the receive buffer to use for the socket.\n You are encouraged to use `getopts/2` to retrieve the size\n set by your operating system.\n\n- **`{recvtclass, Boolean}`** [](){: #option-recvtclass } -\n If set to `true` activates returning the received `TCLASS` value\n on platforms that implements the protocol `IPPROTO_IPV6` option\n `IPV6_RECVTCLASS` or `IPV6_2292RECVTCLASS` for the socket.\n The value is returned as a `{tclass,TCLASS}` tuple regardless of if\n the platform returns an `IPV6_TCLASS` or an `IPV6_RECVTCLASS` CMSG value.\n\n For packet oriented sockets that supports receiving ancillary data with the\n payload data (`gen_udp` and `gen_sctp`), the `TCLASS` value is returned in an\n extended return tuple contained in an\n [ancillary data](`t:ancillary_data/0`) list. For stream oriented sockets\n (`gen_tcp`) the only way to get the `TCLASS` value is if the platform supports\n the [`pktoptions`](`t:gen_tcp:pktoptions_value/0`) option.\n\n- **`{recvtos, Boolean}`** [](){: #option-recvtos } -\n If set to `true` activates returning the received `TOS` value\n on platforms that implements the protocol `IPPROTO_IP` option\n `IP_RECVTOS` for the socket. The value is returned as a `{tos,TOS}` tuple\n regardless of if the platform returns an `IP_TOS` or an `IP_RECVTOS` CMSG\n value.\n\n For packet oriented sockets that supports receiving ancillary data with the\n payload data (`gen_udp` and `gen_sctp`), the `TOS` value is returned in an\n extended return tuple contained in an\n [ancillary data](`t:ancillary_data/0`) list. For stream oriented sockets\n (`gen_tcp`) the only way to get the `TOS` value is if the platform supports\n the [`pktoptions`](`t:gen_tcp:pktoptions_value/0`) option.\n\n- **`{recvttl, Boolean}`** [](){: #option-recvttl } -\n If set to `true` activates returning the received `TTL` value\n on platforms that implements the protocol `IPPROTO_IP` option `IP_RECVTTL`\n for the socket. The value is returned as a `{ttl,TTL}` tuple\n regardless of if the platform returns an `IP_TTL` or an `IP_RECVTTL` CMSG\n value.\n\n For packet oriented sockets that supports receiving ancillary data with the\n payload data (`gen_udp` and `gen_sctp`), the `TTL` value is returned in an\n extended return tuple contained in an\n [ancillary data](`t:ancillary_data/0`) list. For stream oriented sockets\n (`gen_tcp`) the only way to get the `TTL` value is if the platform supports\n the [`pktoptions`](`t:gen_tcp:pktoptions_value/0`) option.\n\n- **`{reuseaddr, Boolean}`[](){: #option-reuseaddr }** -\n Allows or disallows reuse of local address. By default, reuse is disallowed.\n\n > #### Note {: .info }\n >\n > On windows `{reuseaddr, true}` will have no effect unless also\n > [`{reuseport, true}`](#option-reuseport) is set. If both are set,\n > the `SO_REUSEADDR` Windows socket option will be enabled. This since setting\n > `SO_REUSEADDR` on Windows more or less has the same behavior as setting both\n > `SO_REUSEADDR` and `SO_REUSEPORT` on BSD. This behavior was introduced as of\n > OTP 26.0.\n >\n > > #### Change {: .info }\n > >\n > > Previous behavior on Windows:\n > >\n > > - Prior to OTP 25.0, the `{reuseaddr, true}` option was silently ignored.\n > > - Between OTP 25.0 and up to the predecessor of OTP 25.2, the underlying\n > > `SO_REUSEADDR` socket option was set if `{reuseaddr, true}` was set.\n > > - Between OTP 25.2 and up to the predecessor of OTP 26.0, the underlying\n > > `SO_REUSEADDR` socket option was only set on UDP sockets if\n > > `{reuseaddr, true}` was set, and silently ignored on other sockets.\n >\n > See also the [`exclusiveaddruse`](#option-exclusiveaddruse) option.\n\n- **`{reuseport, Boolean}`[](){: #option-reuseport }** -\n Allows or disallows reuse of local port which _may or may not_\n have load balancing depending on the underlying OS. By default,\n reuse is disallowed. See also [`reuseport_lb`](#option-reuseport_lb).\n\n > #### Note {: .info }\n >\n > On windows `{reuseport, true}` will have no effect unless also\n > [`{reuseaddr, true}`](#option-reuseaddr) is set. If both are set,\n > the `SO_REUSEADDR` Windows socket option will be enabled. This since setting\n > `SO_REUSEADDR` on Windows more or less has the same behavior as setting both\n > `SO_REUSEADDR` and `SO_REUSEPORT` on BSD. The `reuseport` option was\n > introduced as of OTP 26.0.\n >\n > See also the [`exclusiveaddruse`](#option-exclusiveaddruse) option.\n\n > #### Note {: .info }\n >\n > `reuseport` _may or may not_ be the same underlying option as\n > [`reuseport_lb`](#option-reuseport_lb) depending on the underlying\n > OS. They, for example, are on Linux. When they are the same underlying\n > option, operating on both may cause them to interact in surprising ways. For\n > example, by enabling `reuseport` and then disabling `reuseport_lb` both will\n > end up being disabled.\n\n > #### Note {: .info }\n >\n > This option is _currently_ not supported for socket created with\n > `inet_backend = socket`\n\n- **`{reuseport_lb, Boolean}`[](){: #option-reuseport_lb }** -\n Allows or disallows reuse of local port _with_ load balancing.\n By default, reuse is disallowed. See also [`reuseport`](#option-reuseport).\n\n > #### Note {: .info }\n >\n > `reuseport_lb` _may or may not_ be the same underlying option as\n > [`reuseport`](#option-reuseport) depending on the underlying OS.\n > On Linux, for example, they are. And when they are the same\n > underlying option, operating on both may cause them to interact\n > in surprising ways. For example, by enabling `reuseport_lb`,\n > and then disabling `reuseport`, both will end up being disabled.\n\n > #### Note {: .info }\n >\n > This option is _currently_ not supported for socket created with\n > `inet_backend = socket`\n\n- **`{send_timeout, Integer}`** - Only allowed for connection-oriented sockets.\n\n Specifies a longest time to wait for a send operation to be accepted by the\n underlying TCP stack. When the limit is exceeded, the send operation returns\n `{error, timeout}`. How much of a packet that got sent is unknown; the socket\n is therefore to be closed whenever a time-out has occurred (see\n `send_timeout_close` below). Defaults to `infinity`.\n\n- **`{send_timeout_close, Boolean}`** - Only allowed for connection-oriented\n sockets.\n\n Used together with `send_timeout` to specify whether the socket is to be\n automatically closed when the send operation returns `{error, timeout}`. The\n recommended setting is `true`, which automatically closes the socket. Defaults\n to `false` because of backward compatibility.\n\n- **`{show_econnreset, Boolean}` (TCP/IP sockets)**\n [](){: #option-show_econnreset } -\n When this option is set to `false`, which is default, an RST\n received from the TCP peer is treated as a normal close\n (as though an FIN was sent). A caller to `gen_tcp:recv/2` gets\n `{error, closed}`. In active mode, the controlling process receives a\n `{tcp_closed, Socket}` message, indicating that the peer has closed the\n connection.\n\n Setting this option to `true` allows you to distinguish between a connection\n that was closed normally, and one that was aborted (intentionally or\n unintentionally) by the TCP peer. A call to `gen_tcp:recv/2` returns\n `{error, econnreset}`. In active mode, the controlling process receives a\n `{tcp_error, Socket, econnreset}` message before the usual\n `{tcp_closed, Socket}`, as is the case for any other socket error. Calls to\n `gen_tcp:send/2` also returns `{error, econnreset}` when it is detected that a\n TCP peer has sent an RST.\n\n A connected socket returned from `gen_tcp:accept/1` inherits the\n `show_econnreset` setting from the listening socket.\n\n- **`{sndbuf, Size}`** [](){: #option-sndbuf } -\n The minimum size of the send buffer to use for the socket.\n You are encouraged to use `getopts/2`, to retrieve the size\n set by your operating system.\n\n- **`{priority, Integer}`** - Sets the `SO_PRIORITY` socket level option on\n platforms where this is implemented. The behavior and allowed range varies\n between different systems. The option is ignored on platforms where it is not\n implemented. Use with caution.\n\n- **`{tos, Integer}`** - Sets `IP_TOS IP` level options on platforms where this\n is implemented. The behavior and allowed range varies between different\n systems. The option is ignored on platforms where it is not implemented. Use\n with caution.\n\n- **`{tclass, Integer}`** - Sets `IPV6_TCLASS IP` level options on platforms\n where this is implemented. The behavior and allowed range varies between\n different systems. The option is ignored on platforms where it is not\n implemented. Use with caution.\n\nIn addition to these options, _raw_ option specifications can be used. The raw\noptions are specified as a tuple of arity four, beginning with tag `raw`,\nfollowed by the protocol level, the option number, and the option value\nspecified as a binary. This corresponds to the second, third, and fourth\narguments to the `setsockopt` call in the C socket API. The option value must be\ncoded in the native endianness of the platform and, if a structure is required,\nmust follow the structure alignment conventions on the specific platform.\n\nUsing raw socket options requires detailed knowledge about the current operating\nsystem and TCP stack.\n\n_Example:_\n\nThis example concerns the use of raw options. Consider a Linux system where you\nwant to set option `TCP_LINGER2` on protocol level `IPPROTO_TCP` in the stack.\nYou know that on this particular system it defaults to 60 (seconds), but you\nwant to lower it to 30 for a particular socket. Option `TCP_LINGER2` is not\nexplicitly supported by `inet`, but you know that the protocol level translates\nto number 6, the option number to number 8, and the value is to be specified as\na 32-bit integer. You can use this code line to set the option for the socket\nnamed `Sock`:\n\n```text\ninet:setopts(Sock, [{raw,6,8,<<30:32/native>>}]),\n```\n\nAs many options are silently discarded by the stack if they are specified out of\nrange; it can be a good idea to check that a raw option is accepted. The\nfollowing code places the value in variable `TcpLinger2:`\n\n```text\n{ok,[{raw,6,8,< >}]}=inet:getopts(Sock,[{raw,6,8,4}]),\n```\n\nCode such as these examples is inherently non-portable, even different versions\nof the same OS on the same platform can respond differently to this kind of\noption manipulation. Use with care.\n\nNotice that the default options for TCP/IP sockets can be changed with the\nKernel configuration parameters mentioned in the beginning of this manual page.","title":"inet.setopts/2","ref":"inet.html#setopts/2"},{"type":"function","doc":"Return the local address and port number for a socket.\n\nNotice that for SCTP sockets this function returns only one of the socket\naddresses. Function [`socknames/1,2`](`socknames/1`) returns all.","title":"inet.sockname/1","ref":"inet.html#sockname/1"},{"type":"function","doc":"Equivalent to [`socknames(Socket, 0)`](`socknames/2`).","title":"inet.socknames/1","ref":"inet.html#socknames/1"},{"type":"function","doc":"Return all localaddresses for a socket.\n\nReturns a list of all local address/port number pairs for a socket,\nfor the specified association `Assoc`.\n\nThis function can return multiple addresses for multihomed sockets,\nsuch as SCTP sockets. For other sockets it returns a one-element list.\n\nNotice that parameter `Assoc` is by the\n[SCTP Sockets API Extensions](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\ndefined to be ignored for one-to-one style sockets. For one-to-many style\nsockets, the special value `0` is defined to mean that the returned addresses\nmust be without any particular association. How different SCTP implementations\ninterpret this varies somewhat.","title":"inet.socknames/2","ref":"inet.html#socknames/2"},{"type":"type","doc":"","title":"inet.address_family/0","ref":"inet.html#t:address_family/0"},{"type":"type","doc":"Ancillary data / control messages.\n\nAncillary data received with a data packet, read with the socket option\n[`pktoptions`](`t:gen_tcp:pktoptions_value/0`) from a TCP socket,\nor to set in a call to [`gen_udp:send/4`](`m:gen_udp#send-4-AncData`)\nor `gen_udp:send/5`.\n\nThe value(s) correspond to the currently active socket\n[options](`t:socket_setopt/0`) [`recvtos`](#option-recvtos),\n[`recvtclass`](#option-recvtclass) and [`recvttl`](#option-recvttl),\nor for a single send operation the option(s) to override\nthe currently active socket option(s).","title":"inet.ancillary_data/0","ref":"inet.html#t:ancillary_data/0"},{"type":"type","doc":"","title":"inet.ether_address/0","ref":"inet.html#t:ether_address/0"},{"type":"type","doc":"A general network address.\n\nA general network address format on the form `{Family, Destination}`\nwhere `Family` is an atom such as `local` and the format of `Destination`\ndepends on `Family`. `Destination` is a complete address (for example\nan IP address with port number).","title":"inet.family_address/0","ref":"inet.html#t:family_address/0"},{"type":"type","doc":"Interface address description list.\n\nA list returned from [`getifaddrs/0,1`](`getifaddrs/0`)\nfor a named interface, translated from the\nreturned data of the POSIX API function `getaddrinfo()`.\n\n`Hwaddr` is hardware dependent, for example, on Ethernet interfaces it is the\n6-byte Ethernet address (MAC address (EUI-48 address)).\n\nThe tuples `{addr,Addr}`, `{netmask,Netmask}`, and possibly\n`{broadaddr,Broadaddr}` or `{dstaddr,Dstaddr}` are repeated in the list\nif the interface has got multiple addresses. An interface may have multiple\n`{flag,_}` tuples for example if it has different flags for different\naddress families.\n\nMultiple `{hwaddr,Hwaddr}` tuples is hard to say anything definite about,\nthough. The tuple `{flag,Flags}` is mandatory, all others are optional.\n\nDo not rely too much on the order of `Flags` atoms or the `Ifopt` tuples.\nThere are however some rules:\n\n- A `{flag,_}` tuple applies to all other tuples that follow.\n- Immediately after `{addr,_}` follows `{netmask,_}`.\n- Immediately thereafter may `{broadaddr,_}` follow if `broadcast`\n is member of `Flags`, or `{dstaddr,_}` if `pointtopoint`\n is member of `Flags`. Both `{dstaddr,_}` and `{broadaddr,_}` doesn't\n occur for the same `{addr,_}`.\n- Any `{netmask,_}`, `{broadaddr,_}`, or `{dstaddr,_}` tuples that follow an\n `{addr,Addr}` tuple concerns the address `Addr`.\n\nThe tuple `{hwaddr,_}` is not returned on Solaris, as the hardware address\nhistorically belongs to the link layer and it is not returned\nby the Solaris API function `getaddrinfo()`.\n\n> #### Warning {: .warning }\n>\n> On Windows, the data is fetched from different OS API functions, so the\n> `Netmask` and `Broadaddr` values may be calculated, just as some `Flags`\n> values.","title":"inet.getifaddrs_ifopts/0","ref":"inet.html#t:getifaddrs_ifopts/0"},{"type":"type","doc":"A record describing a host; name and address.\n\nCorresponds to the `C`: `struct hostent` as returned by for example\n`gethostbyname(3)`.\n\nThe record is defined in the Kernel include file `\"inet.hrl\"`.\n\nAdd the following directive to the module:\n\n```erlang\n-include_lib(\"kernel/include/inet.hrl\").\n```","title":"inet.hostent/0","ref":"inet.html#t:hostent/0"},{"type":"type","doc":"","title":"inet.hostname/0","ref":"inet.html#t:hostname/0"},{"type":"type","doc":"Options for selecting statistics items.\n\nRegarding `ShowPorts`, see `show_ports` as described in the `i/2` function,\ndefaults to `false`.","title":"inet.i_option/0","ref":"inet.html#t:i_option/0"},{"type":"type","doc":"A network address for the `inet6` family (`AF_INET6`, IPv6)\n> #### Warning {: .warning }\n>\n> This address format is currently experimental and for completeness\n> to make all address families have a `{Family, Destination}` representation.","title":"inet.inet6_address/0","ref":"inet.html#t:inet6_address/0"},{"type":"type","doc":"A network address for the `inet` family (`AF_INET`, IPv4)\n> #### Warning {: .warning }\n>\n> This address format is currently experimental and for completeness\n> to make all address families have a `{Family, Destination}` representation.","title":"inet.inet_address/0","ref":"inet.html#t:inet_address/0"},{"type":"type","doc":"Implementation backend selector for `t:socket/0`.\n\nSelects the implementation backend for [sockets](`t:socket/0`).\nThe current default is `inet` which uses `inet_drv.c` to call\nthe platform's socket API. The value `socket` instead uses\nthe `m:socket` module and its NIF implementation.\n\nThis is a _temporary_ option that will be ignored in a future release.","title":"inet.inet_backend/0","ref":"inet.html#t:inet_backend/0"},{"type":"type","doc":"","title":"inet.ip4_address/0","ref":"inet.html#t:ip4_address/0"},{"type":"type","doc":"","title":"inet.ip6_address/0","ref":"inet.html#t:ip6_address/0"},{"type":"type","doc":"","title":"inet.ip_address/0","ref":"inet.html#t:ip_address/0"},{"type":"type","doc":"A network address for the `local` family (`AF_LOCAL | AF_UNIX`)\n\nThis address family, also known as \"Unix domain sockets\" only works\non Unix-like systems.\n\n`File` is normally a file pathname in a local filesystem. It is limited in\nlength by the operating system, traditionally to 108 bytes.\n\nA `t:binary/0` is passed as is to the operating system,\nbut a `t:string/0` is encoded according to the\n[system filename encoding mode.](`file:native_name_encoding/0`)\n\nOther addresses are possible, for example Linux implements\n\"Abstract Addresses\". See the documentation for Unix Domain Sockets\non your system, normally `unix` in manual section 7.\n\nIn most API functions where you can use this address family\nthe port number must be `0`.","title":"inet.local_address/0","ref":"inet.html#t:local_address/0"},{"type":"type","doc":"","title":"inet.module_socket/0","ref":"inet.html#t:module_socket/0"},{"type":"type","doc":"","title":"inet.port_number/0","ref":"inet.html#t:port_number/0"},{"type":"type","doc":"POSIX Error Code `t:atom/0`.\n\nAn atom that is named from the POSIX error codes used in Unix,\nand in the runtime libraries of most C compilers.\nSee section [POSIX Error Codes](#posix-error-codes).","title":"inet.posix/0","ref":"inet.html#t:posix/0"},{"type":"type","doc":"a non-IP network address.\n\nAddresses besides `t:ip_address/0` ones that are returned from\nsocket API functions. See in particular `t:local_address/0`.\nThe `unspec` family corresponds to `AF_UNSPEC` and can occur\nif the other side has no socket address. The `undefined`\nfamily can only occur in the unlikely event of an address family\nthat the VM doesn't recognize.","title":"inet.returned_non_ip_address/0","ref":"inet.html#t:returned_non_ip_address/0"},{"type":"type","doc":"A socket recognized by this module and its siblings.\n\nSee `t:gen_tcp:socket/0` and `t:gen_udp:socket/0`.","title":"inet.socket/0","ref":"inet.html#t:socket/0"},{"type":"type","doc":"","title":"inet.socket_address/0","ref":"inet.html#t:socket_address/0"},{"type":"type","doc":"","title":"inet.socket_getopt/0","ref":"inet.html#t:socket_getopt/0"},{"type":"type","doc":"","title":"inet.socket_optval/0","ref":"inet.html#t:socket_optval/0"},{"type":"type","doc":"","title":"inet.socket_protocol/0","ref":"inet.html#t:socket_protocol/0"},{"type":"type","doc":"","title":"inet.socket_setopt/0","ref":"inet.html#t:socket_setopt/0"},{"type":"type","doc":"","title":"inet.stat_option/0","ref":"inet.html#t:stat_option/0"},{"type":"module","doc":"A rudimentary DNS client.\n\nThis module performs DNS name resolving towards recursive name servers.\n\nSee also [ERTS User's Guide: Inet Configuration](`e:erts:inet_cfg.md`)\nor more information about how to configure an Erlang runtime system for IP\ncommunication, and how to enable this DNS client by defining `'dns'`\nas a lookup method. The DNS client then acts as a backend for\nthe resolving functions in `m:inet`.\n\nThis DNS client can resolve DNS records even if it is not used\nfor normal name resolving in the node.\n\nThis is not a full-fledged resolver, only a DNS client that relies on asking\ntrusted recursive name servers.","title":"inet_res","ref":"inet_res.html"},{"type":"module","doc":"UDP queries are used unless resolver option `usevc` is `true`,\nwhich forces TCP queries. If the query is too large for UDP,\nTCP is used instead. For regular DNS queries, 512 bytes is the size limit.\n\nWhen EDNS is enabled (resolver option `edns` is set to the EDNS version\n(that is; `0` instead of `false`), resolver option `udp_payload_size`\nsets the payload size limit. If a name server replies with the TC bit set\n(truncation), indicating that the answer is incomplete, the query is retried\ntowards the same name server using TCP. Resolver option `udp_payload_size`\nalso sets the advertised size for the maximum allowed reply size,\nif EDNS is enabled, otherwise the name server uses the limit 512 bytes.\nIf the reply is larger, it gets truncated, forcing a TCP requery.\n\nFor UDP queries, resolver options `timeout` and `retry` control\nretransmission. Each name server in the `nameservers` list is tried\nwith a time-out of `timeout`/`retry`. Then all name servers are tried again,\ndoubling the time-out, for a total of `retry` times.\n\n[](){: #servfail_retry_timeout }\n\nBut before all name servers are tried again, there is a (user configurable)\ntime-out, `servfail_retry_timeout`. The point of this is to prevent\nthe new query to be handled by a server's servfail cache (a client\nthat is too eager will actually only get what is in the servfail cache).\nIf there is too little time left of the resolver call's time-out\nto do a retry, the resolver call may return before the call's time-out\nhas expired.\n\nFor queries not using the `search` list, if the query to all `nameservers`\nresults in `{error,nxdomain}` or an empty answer, the same query is tried for\n`alt_nameservers`.","title":"Name Resolving - inet_res","ref":"inet_res.html#module-name-resolving"},{"type":"module","doc":"The following data types concern the resolver:","title":"Resolver Types - inet_res","ref":"inet_res.html#module-resolver-types"},{"type":"module","doc":"The following data types concern the DNS client:","title":"DNS Types - inet_res","ref":"inet_res.html#module-dns-types"},{"type":"module","doc":"This access functions example shows how `lookup/3` can be implemented using\n`resolve/3` from outside the module:\n\n```erlang\nexample_lookup(Name, Class, Type) ->\n case inet_res:resolve(Name, Class, Type) of\n {ok,Msg} ->\n [inet_dns:rr(RR, data)\n || RR <- inet_dns:msg(Msg, anlist),\n inet_dns:rr(RR, type) =:= Type,\n inet_dns:rr(RR, class) =:= Class];\n {error,_} ->\n []\n end.\n```","title":"Example - inet_res","ref":"inet_res.html#module-example"},{"type":"function","doc":"","title":"inet_res.getbyname/2","ref":"inet_res.html#getbyname/2"},{"type":"function","doc":"Resolve a DNS query.\n\nResolves a DNS query of the specified `Type` for the specified host,\nof class`in`. Returns, on success, when resolving a `Type = a|aaaa`\nDNS record, a `#hostent{}` record with `#hostent.h_addrtype = inet|inet6`,\nrespectively; see `t:inet:hostent/0`.\n\nWhen resolving other `Type = dns_rr_type()`:s (of class `in`), also returns\na `#hostent{}` record but with `t:dns_rr_type/0` in `#hostent.h_addrtype`,\nand the resolved `t:dns_data/0` in `#hostent.h_addr_list`; see `t:hostent/0`.\n\nThis function uses resolver option `search` that is a list of domain names.\nIf the name to resolve contains no dots, it is prepended to each domain\nname in the search list, and they are tried in order. If the name\ncontains dots, it is first tried as an absolute name and if that fails,\nthe search list is used. If the name has a trailing dot, it is supposed\nto be an absolute name and the search list is not used.","title":"inet_res.getbyname/3","ref":"inet_res.html#getbyname/3"},{"type":"function","doc":"","title":"inet_res.gethostbyaddr/1","ref":"inet_res.html#gethostbyaddr/1"},{"type":"function","doc":"Backend function used by `inet:gethostbyaddr/1`.","title":"inet_res.gethostbyaddr/2","ref":"inet_res.html#gethostbyaddr/2"},{"type":"function","doc":"Backend functions used by [`inet:gethostbyname/1,2`](`inet:gethostbyname/1`).\n\nIf resolver option `inet6` is `true`, equivalent to\n[`gethostbyname(Name, inet6, infinity)`](`gethostbyname/3`),\notherwise [`gethostbyname(Name, inet, infinity)`](`gethostbyname/3`).","title":"inet_res.gethostbyname/1","ref":"inet_res.html#gethostbyname/1"},{"type":"function","doc":"","title":"inet_res.gethostbyname/2","ref":"inet_res.html#gethostbyname/2"},{"type":"function","doc":"Backend functions used by [`inet:gethostbyname/1,2`](`inet:gethostbyname/1`).\n\nThis function uses resolver option `search` just like\n[`getbyname/2,3`](`getbyname/2`).","title":"inet_res.gethostbyname/3","ref":"inet_res.html#gethostbyname/3"},{"type":"function","doc":"","title":"inet_res.lookup/3","ref":"inet_res.html#lookup/3"},{"type":"function","doc":"","title":"inet_res.lookup/4","ref":"inet_res.html#lookup/4"},{"type":"function","doc":"Look up DNS data.\n\nResolves the DNS data for the record `Name` of the specified\n`Type` and `Class`. On success, filters out the answer records\nwith the correct `Class` and `Type`, and returns a list of their data fields.\nSo, a lookup for type `any` gives an empty answer, as the answer records\nhave specific types that are not `any`. An empty answer or a failed lookup\nreturns an empty list.\n\nCalls [`resolve/*`](`resolve/3`) with the same arguments and filters the result,\nso `Opts` is described for those functions.","title":"inet_res.lookup/5","ref":"inet_res.html#lookup/5"},{"type":"function","doc":"","title":"inet_res.nnslookup/4","ref":"inet_res.html#nnslookup/4"},{"type":"function","doc":"Resolve a DNS query.\n\nLike `nslookup/4` but calls `resolve/5` with both the arguments\n`Opts = [{nameservers, Nameservers}]` and `Timeout`.","title":"inet_res.nnslookup/5","ref":"inet_res.html#nnslookup/5"},{"type":"function","doc":"","title":"inet_res.nslookup/3","ref":"inet_res.html#nslookup/3"},{"type":"function","doc":"Resolve a DNS query.\n\nThis function is a legacy wrapper to `resolve/5` that simplifies\nerrors matching `{error, {Reason, _}}` into `{error, Reason}`\nor `{error, einval}`.\n\nWith argument `Timeout` calls `resolve/5` with `Opts = []`.\n\nWith argument `Nameservers` calls `resolve/5` with\n`Opts = [{nameservers, Nameservers}]` and `Timeout = infinity`.","title":"inet_res.nslookup/4","ref":"inet_res.html#nslookup/4"},{"type":"function","doc":"","title":"inet_res.resolve/3","ref":"inet_res.html#resolve/3"},{"type":"function","doc":"","title":"inet_res.resolve/4","ref":"inet_res.html#resolve/4"},{"type":"function","doc":"Resolve a DNS query.\n\nResolves a DNS query for the specified `Type`, `Class`, and `Name`,\ninto a DNS message possibly containing Resource Records.\nThe returned `t:dns_msg/0` can be examined using access functions\nin `inet_db`, as described in section in [DNS Types](#module-dns-types).\n\nIf `Name` is an `ip_address()`, the domain name to query about is generated\nas the standard reverse `\".IN-ADDR.ARPA.\"` name for an IPv4 address, or the\n`\".IP6.ARPA.\"` name for an IPv6 address. In this case, you most probably\nwant to use `Class = in` and `Type = ptr`, but it is not done automatically.\n\n`Opts` overrides the corresponding resolver options. If option `nameservers`\nis specified, it is assumed that it is the complete list of name serves,\nso resolver option `alt_nameserves` is ignored. However, if option\n`alt_nameserves` is also specified to this function, it is used.\n\nOption `verbose` (or rather `{verbose,true}`) causes diagnostics printout\nthrough [`io:format/2`](`io:format/3`) of queries, replies, retransmissions,\nand so on, similar to utilities such as `dig` and `nslookup`.\n\nOption `nxdomain_reply` (or rather `{nxdomain_reply, true}`) causes NXDOMAIN\nerrors from DNS servers to be returned as `{error, {nxdomain, dns_msg()}}`.\n`t:dns_msg/0` contains the additional sections that where included by the\nanswering server. This is mainly useful to inspect the SOA record\nto get the TTL for negative caching.\n\nIf `Opt` is any atom, it is interpreted as `{Opt,true}` unless\nthe atom string starts with `\"no\"`, making the interpretation `{Opt,false}`.\nFor example, `usevc` is an alias for `{usevc, true}` and `nousevc`\nis an alias for `{usevc, false}`.\n\nOption `inet6` has no effect on this function. You probably want to use\n`Type = a | aaaa` instead.","title":"inet_res.resolve/5","ref":"inet_res.html#resolve/5"},{"type":"type","doc":"","title":"inet_res.dns_class/0","ref":"inet_res.html#t:dns_class/0"},{"type":"type","doc":"DNS record data (content)\n\nThe basic type of each data element is specified in this type.\n\n`Regexp` is a UTF-8 `t:string/0`. The other `t:string/0`s\nare actually Latin-1 strings.","title":"inet_res.dns_data/0","ref":"inet_res.html#t:dns_data/0"},{"type":"type","doc":"A DNS message.\n\nThis is the start of a hierarchy of opaque data structures that can be\nexamined with access functions in `inet_dns`, which return lists of\n`{Field,Value}` tuples. The arity 2 functions return the value\nfor a specified field.\n\n```erlang\ndns_msg() = DnsMsg\n inet_dns:msg(DnsMsg) ->\n [ {header, dns_header()}\n | {qdlist, dns_query()}\n | {anlist, dns_rr()}\n | {nslist, dns_rr()}\n | {arlist, dns_rr()} ]\n inet_dns:msg(DnsMsg, header) -> dns_header() % for example\n inet_dns:msg(DnsMsg, Field) -> Value\n\ndns_header() = DnsHeader\n inet_dns:header(DnsHeader) ->\n [ {id, integer()}\n | {qr, boolean()}\n | {opcode, query | iquery | status | integer()}\n | {aa, boolean()}\n | {tc, boolean()}\n | {rd, boolean()}\n | {ra, boolean()}\n | {pr, boolean()}\n | {rcode, integer(0..16)} ]\n inet_dns:header(DnsHeader, Field) -> Value\n\nquery_type() = axfr | mailb | maila | any | dns_rr_type()\n\ndns_query() = DnsQuery\n inet_dns:dns_query(DnsQuery) ->\n [ {domain, dns_name()}\n | {type, query_type()}\n | {class, dns_class()} ]\n inet_dns:dns_query(DnsQuery, Field) -> Value\n\ndns_rr() = DnsRr\n inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields\n DnsRrFields = [ {domain, dns_name()}\n | {type, dns_rr_type()}\n | {class, dns_class()}\n | {ttl, integer()}\n | {data, dns_data()} ]\n DnsRrOptFields = [ {domain, dns_name()}\n | {type, opt}\n | {udp_payload_size, integer()}\n | {ext_rcode, integer()}\n | {version, integer()}\n | {z, integer()}\n | {data, dns_data()} ]\n inet_dns:rr(DnsRr, Field) -> Value\n```\n\nThere is an information function for the types above:\n\n```erlang\ninet_dns:record_type(dns_msg()) -> msg;\ninet_dns:record_type(dns_header()) -> header;\ninet_dns:record_type(dns_query()) -> dns_query;\ninet_dns:record_type(dns_rr()) -> rr;\ninet_dns:record_type(_) -> undefined.\n```\n\nSo, `inet_dns:(inet_dns:record_type(X))(X)` converts any of these data\nstructures into a `{Field,Value}` list.","title":"inet_res.dns_msg/0","ref":"inet_res.html#t:dns_msg/0"},{"type":"type","doc":"A string with no adjacent dots.","title":"inet_res.dns_name/0","ref":"inet_res.html#t:dns_name/0"},{"type":"type","doc":"","title":"inet_res.dns_rr_type/0","ref":"inet_res.html#t:dns_rr_type/0"},{"type":"type","doc":"Extended variant of `t:inet:hostent/0`.\n\nAllows `t:dns_rr_type/0` for the\n[`#hostent{}.h_addrtype`](`t:inet:hostent/0`) field, and\n`[`[`dns_data/0`](`t:dns_data/0`)`]` for the\n[`#hostent{}.h_addr_list`](`t:inet:hostent/0`) field.","title":"inet_res.hostent/0","ref":"inet_res.html#t:hostent/0"},{"type":"type","doc":"","title":"inet_res.nameserver/0","ref":"inet_res.html#t:nameserver/0"},{"type":"type","doc":"","title":"inet_res.res_error/0","ref":"inet_res.html#t:res_error/0"},{"type":"type","doc":"","title":"inet_res.res_option/0","ref":"inet_res.html#t:res_option/0"},{"type":"module","doc":"Network interface.\n\nThis module provides an API for the network interface.","title":"net","ref":"net.html"},{"type":"function","doc":"","title":"net.getaddrinfo/1","ref":"net.html#getaddrinfo/1"},{"type":"function","doc":"Network address and service translation.\n\nThis function is the inverse of [`getnameinfo`](`getnameinfo/1`). It converts\nhost and service to a corresponding socket address.\n\nOne of the `Host` and `Service` may be `undefined` but _not_ both.","title":"net.getaddrinfo/2","ref":"net.html#getaddrinfo/2"},{"type":"function","doc":"Return the name of the current host.","title":"net.gethostname/0","ref":"net.html#gethostname/0"},{"type":"function","doc":"","title":"net.getifaddrs/0","ref":"net.html#getifaddrs/0"},{"type":"function","doc":"Get interface addresses.\n\nWith argument 'Filter: get the machines interface addresses,\nfiltered according to `Filter`.\n\nWith argument `Namespace`: equivalent to\n[`getifaddrs(default, Namespace)`](`getifaddrs/2`).","title":"net.getifaddrs/1","ref":"net.html#getifaddrs/1"},{"type":"function","doc":"Get interface addresses in a namespace.\n\nThe same as [`getifaddrs(Filter)`](`getifaddrs/1`) but\nin the specified `Namespace`.","title":"net.getifaddrs/2","ref":"net.html#getifaddrs/2"},{"type":"function","doc":"","title":"net.getnameinfo/1","ref":"net.html#getnameinfo/1"},{"type":"function","doc":"Address-to-name translation in a protocol-independant manner.\n\nThis function is the inverse of [`getaddrinfo`](`getaddrinfo/1`). It converts a\nsocket address to a corresponding host and service.","title":"net.getnameinfo/2","ref":"net.html#getnameinfo/2"},{"type":"function","doc":"","title":"net.getservbyname/1","ref":"net.html#getservbyname/1"},{"type":"function","doc":"Get service by name.\n\nThis function is used to get the port number of the specified protocol\nfor the named service.","title":"net.getservbyname/2","ref":"net.html#getservbyname/2"},{"type":"function","doc":"","title":"net.getservbyport/1","ref":"net.html#getservbyport/1"},{"type":"function","doc":"Get service by name.\n\nThis function is used to get the service name of the specified protocol\nfor the given port number.","title":"net.getservbyport/2","ref":"net.html#getservbyport/2"},{"type":"function","doc":"Mappings between network interface index and names.","title":"net.if_index2name/1","ref":"net.html#if_index2name/1"},{"type":"function","doc":"Mappings between network interface names and indexes.","title":"net.if_name2index/1","ref":"net.html#if_name2index/1"},{"type":"function","doc":"Get network interface names and indexes.","title":"net.if_names/0","ref":"net.html#if_names/0"},{"type":"type","doc":"","title":"net.address_info/0","ref":"net.html#t:address_info/0"},{"type":"type","doc":"Interface addresses and flags.\n\nThis type defines addresses and flags for an interface.\n\n> #### Note {: .info }\n>\n> Not all fields of this map has to be present. The flags field can be used to\n> test for some of the fields. For example `broadaddr` will only be present if\n> the `broadcast` flag is present in flags.","title":"net.ifaddrs/0","ref":"net.html#t:ifaddrs/0"},{"type":"type","doc":"Interface address filtering selector.\n\n- **all** - All interfaces\n\n- **default** - Interfaces with address family `inet` _or_ `inet6`\n\n- **inet | inet6 | packet | link** - Interfaces with _only_ the specified\n address family\n- **hwaddr** - Interfaces with address family `packet` _or_ `link`","title":"net.ifaddrs_filter/0","ref":"net.html#t:ifaddrs_filter/0"},{"type":"type","doc":"Interface address filtering selector `t:function/0`.\n\nFor each `ifaddrs` entry, return either `true` to keep the entry\nor `false` to discard the entry.\n\nFor example, to get an interface list which only contains\nnon-`loopback` `inet` interfaces:\n\n```erlang\nnet:getifaddrs(\n fun (#{ addr := #{family := inet},\n flags := Flags}) ->\n not lists:member(loopback, Flags);\n (_) ->\n false\n end).\n```","title":"net.ifaddrs_filter_fun/0","ref":"net.html#t:ifaddrs_filter_fun/0"},{"type":"type","doc":"Interface address filtering selector map.\n\nThe `family` field can only have the (above) specified values\n(and not all the values of socket:domain()).\nIt can also be a list of values, to cover the situation when\nany of the specified families are accepted.\nFor example, family can be set to `[inet,inet6]` if either `inet` or `inet6`\nis accepted.\n\nThe use of the `flags` field is that any flag provided must exist for the\ninterface.\n\nFor example, if `family` is set to `inet` and `flags` to\n`[broadcast, multicast]` only interfaces with address family `inet`\nand the flags `broadcast` and `multicast` will be listed.","title":"net.ifaddrs_filter_map/0","ref":"net.html#t:ifaddrs_filter_map/0"},{"type":"type","doc":"","title":"net.ifaddrs_flag/0","ref":"net.html#t:ifaddrs_flag/0"},{"type":"type","doc":"","title":"net.ifaddrs_flags/0","ref":"net.html#t:ifaddrs_flags/0"},{"type":"type","doc":"","title":"net.name_info/0","ref":"net.html#t:name_info/0"},{"type":"type","doc":"","title":"net.name_info_flag/0","ref":"net.html#t:name_info_flag/0"},{"type":"type","doc":"","title":"net.name_info_flag_ext/0","ref":"net.html#t:name_info_flag_ext/0"},{"type":"type","doc":"","title":"net.name_info_flags/0","ref":"net.html#t:name_info_flags/0"},{"type":"type","doc":"","title":"net.network_interface_index/0","ref":"net.html#t:network_interface_index/0"},{"type":"type","doc":"","title":"net.network_interface_name/0","ref":"net.html#t:network_interface_name/0"},{"type":"module","doc":"Socket interface.\n\nThis module provides an API for network sockets. Functions are provided to\ncreate, delete and manipulate the sockets as well as sending and receiving data\non them.\n\nThe intent is that it shall be as \"close as possible\" to the OS level socket\ninterface. The only significant addition is that some of the functions, e.g.\n`recv/3`, have a time-out argument.\n\n[](){: #asynchronous-calls }\n\n> #### Note {: .info }\n>\n> #### Asynchronous Calls\n>\n> Some functions feature _asynchronous calls_. This is achieved by setting\n> the `Timeout` argument to `nowait` or to a `Handle ::` `t:reference/0`.\n> See the respective function's type specification.\n>\n> This module has two different implementations of asynchronous calls.\n> One on the _Unix_ family of operating systems:\n> `select` - based on the standard socket interface's\n> `select(3)`/`poll(3)` calls, and one on _Windows_: `completion` -\n> based on asynchronous I/O Completion Ports.\n> The difference shows in the return values and message formats\n> because they have slightly different semantics.\n>\n> #### The `completion` and `select` Return Values\n>\n> For instance, if calling `recv/3` like this;\n> [`recv(Socket, 0, nowait)`](#recv-nowait), when there is\n> no data available for reading, it will return one of:\n>\n> - `{completion, `[`CompletionInfo`](`t:completion_info/0`)`}`\n> - `{select, `[`SelectInfo`](`t:select_info/0`)`}`\n>\n> `CompletionInfo` contains a [CompletionHandle](`t:completion_handle/0`) and\n> `SelectInfo` contains a [SelectHandle](`t:select_handle/0`).\n> Both are types are aliases to `t:reference/0`.\n> When the operation can continue, a `completion` message containing\n> the `CompletionHandle` or a `select` message containing\n> the `SelectHandle` is sent to the calling process.\n>\n> On `select` systems some functions may also return:\n>\n> - `{select, {`[`SelectInfo`](`t:select_info/0`)`, _}`\n>\n> This may happen for sockets of type [`stream`](`t:type/0`) where\n> the stream handling can split the data stream at any point.\n> See the respective function's type specification's return type.\n>\n> #### The `completion` and `select` Messages\n>\n> The `completion` message has the format:\n>\n> - `{'$socket', `[`Socket`](`t:socket/0`)`, completion,\n> {`[`CompletionHandle`](`t:completion_handle/0`)`, CompletionStatus}}`\n>\n> The `select` message has the format:\n>\n> - `{'$socket', `[`Socket`](`t:socket/0`)`, select,\n> `[`SelectHandle`](`t:select_handle/0`)`}`\n>\n> When a `completion` message is received (which contains the _result_\n> of the operation), it means that the operation has been _completed_ with\n> `CompletionStatus :: ok | {error, Reason}`.\n> See the respective function's documentation for possible values\n> of `Reason`, which are the same `{error, Reason}` values\n> that can be returned by the function itself.\n>\n> When a `select` message is received, it only means that the operation\n> _may now continue_, by retrying the operation (which may return\n> a new `{select, _}` value). Some operations are retried by repeating\n> the same function call, and some have a dedicated function variant\n> to be used for the retry. See the respective function's documentation.\n>\n> #### Operation Queuing on `select` Systems\n>\n> On `select` systems, all other processes are _locked out_ until the\n> current process has completed the operation as in a continuation\n> call has returned a value indicating success or failure\n> (not a `select` return). Other processes are queued and get\n> a `select` return which makes them wait for their turn.\n>\n> #### Canceling an operation\n>\n> An operation that is in progress (not completed) may be canceled\n> using `cancel/2` both on `completion` and `select` systems.\n>\n> Canceling an operation ensures that there is no `completion`,\n> `select`, nor `abort` message in the inbox after the `cancel/2` call.\n>\n> #### Using a `Handle`\n>\n> If creating a `t:reference/0` with [`make_ref()`](`erlang:make_ref/0`)\n> and using that as the `Timeout | Handle` argument, the same `Handle`\n> will then be the [`SelectHandle`](`t:select_handle/0`) in the returned\n> `t:select_info/0` and the received `select` message, or be\n> the [`CompletionHandle`](`t:completion_handle/0`) in the returned\n> `t:completion_info/0` and the received `completion` message.\n>\n> The compiler may then optimize a following `receive` statement\n> to only scan the messages that arrive after the `t:reference/0`\n> is created. If the message queue is large this is a big optimization.\n>\n> The `t:reference/0` has to be unique for the call.\n>\n> #### Repeating an Operation on a `select` Systems\n>\n> On`select` systems, if a call would be repeated _before_ the `select`\n> message has been received it replaces the call in progress:\n>\n> ```erlang\n> {select, {select_info, Handle}} = socket:accept(LSock, nowait),\n> {error, timeout} = socket:accept(LSock, 500),\n> :\n> ```\n> Above, `Handle` is _no longer_ valid once the second `accept/2`, call\n> has been made (the first call is automatically canceled).\n> After the second `accept/2` call returns `{error, timeout}`,\n> the accept operation has completed.\n>\n> Note that there is a race here; there is no way to know if the call\n> is repeated _before_ the `select` message is sent since it _may_\n> have been sent just before the repeated call. So now there\n> might be a `select` message containing `Handle` in the inbox.\n>\n> #### The `abort` Message\n>\n> Another message the user must be prepared for\n> (when using `nowait | Handle`) is the `abort` message:\n>\n> - `{'$socket', `[`Socket`](`t:socket/0`)`, abort, Info}`\n>\n> This message indicates that the operation in progress has been aborted.\n> For instance, if the socket has been closed by another process;\n> `Info` will be `{Handle, closed}`.\n\n> #### Note {: .info }\n>\n> Support for IPv6 has been implemented but not _fully_ tested.\n>\n> SCTP has only been partly implemented (and not tested).\n\nThis module was introduced in OTP 22.0, as experimental code.\n* In OTP 22.1, the `nowait` argument was added for many functions,\n and the `cancel/2` and `info/1` functions were also added.\n* In OTP 22.3, the `number_of/0` function was added.\n* In OTP 23.0, the functions [`is_supported/1,2`](`is_supported/1`)\n and the [`open/1,2`](`open/1`) functions with an `FD` argument were added.\n* In OTP 23.1, the `use_registry/1` function was added.\n* In OTP 24.0, the `t:select_handle/0` argument was added for many functions,\n the `cancel/1`, `cancel_monitor/1`, `getopt/3` with tuple options,\n `getopt_native/3`, `info/0`, `monitor/1`, `open/3` with an option list,\n many variants of the [`recv/*`](`recv/2`),\n [`recvfrom/*`](`recvfrom/1`), [`recvmsg/*`](`recvmsg/1`),\n [`send/*`](`send/2`), [`sendmsg/*`](`sendmsg/2`),\n the [`sendto/*`](`sendto/3`) functions,\n the [`sendfile/*`](`sendfile/5`) functions,\n and the `setopt/3`, `setopt_native/3` functions, were added.\n* In OTP 24.1, the [`i/*`](`i/0`) functions were added.\n* In OTP 24.2, the [`ioctl/*`](`ioctl/2`) functions were added.\n* In OTP 26.0, the `t:completion_handle/0` argument was added for\n many functions, and the `cancel/2` function with `t:completion_info/0`\n argument was added. That is: support for Windows asynchronous\n I/O Completion Ports was added. The Unix-ish flavored\n ([select handle](`t:select_handle/0`)) API features could be considered\n no longer experimental.\n* In OTP 27.0, the Windows flavored\n ([completion handle](`t:completion_handle/0`))\n API features could be considered no longer experimental.","title":"socket","ref":"socket.html"},{"type":"module","doc":"```erlang\nclient(SAddr, SPort) ->\n {ok, Sock} = socket:open(inet, stream, tcp),\n ok = socket:connect(Sock, #{family => inet,\n addr => SAddr,\n port => SPort}),\n Msg = <<\"hello\">>,\n ok = socket:send(Sock, Msg),\n ok = socket:shutdown(Sock, write),\n {ok, Msg} = socket:recv(Sock),\n ok = socket:close(Sock).\n\nserver(Addr, Port) ->\n {ok, LSock} = socket:open(inet, stream, tcp),\n ok = socket:bind(LSock, #{family => inet,\n port => Port,\n addr => Addr}),\n ok = socket:listen(LSock),\n {ok, Sock} = socket:accept(LSock),\n {ok, Msg} = socket:recv(Sock),\n ok = socket:send(Sock, Msg),\n ok = socket:close(Sock),\n ok = socket:close(LSock).\n```","title":"Examples - socket","ref":"socket.html#module-examples"},{"type":"function","doc":"Equivalent to [`accept(ListenSocket, infinity)`](`accept/2`).","title":"socket.accept/1","ref":"socket.html#accept/1"},{"type":"function","doc":"Accept a connection on a listening socket.\n\n`ListenSocket` has to be of a connection oriented type\n(types `stream` or `seqpacket`, see `open/1`), and set to listen\n(see `listen/1`).\n\n[](){: #accept-infinity }\n\nIf the `Timeout` argument is `infinity`; accepts the first pending\nincoming connection for the listen socket or wait for one to arrive,\nand return the new connection socket.\n\n[](){: #accept-timeout }\n\nIf the `Timeout` argument is a time-out value (`t:non_neg_integer/0`);\nreturns `{error, timeout}` if no connection has arrived\nafter `Timeout` milliseconds.\n\n[](){: #accept-nowait }\n\nIf the `Handle` argument `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.","title":"socket.accept/2","ref":"socket.html#accept/2"},{"type":"function","doc":"Bind a name to a socket.\n\nWhen a socket is created (with [`open`](`open/2`)), it has no address assigned\nto it. `bind` assigns the address specified by the `Addr` argument.\n\nThe rules used for name binding vary between domains.\n\nIf you bind a socket to an address in for example the `inet` or `inet6`\naddress families, with an ephemeral port number (`0`), and want to know\nwhich port that was chosen, you can find out using something like:\n`{ok, #{port := Port}} =`[`socket:sockname(Socket)`](`sockname/1`)","title":"socket.bind/2","ref":"socket.html#bind/2"},{"type":"function","doc":"Cancel an asynchronous call in progress.\n\nCall this function to cancel an [asynchronous call](#asynchronous-calls)\nin progress, that is; it returned a value containing\na `t:completion_info/0` or `t:select_info/0`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nIf another process tries an operation of the same basic type\n(`accept/1` | `send/2` | `recv/2`) it will be enqueued and notified\nthrough a `select` or `completion` message when the current operation\nand all enqueued before it has been completed. If the current operation\nis canceled by this function it is treated as a completed operation;\nthe process first in queue is notified.\n\nIf [`SelectInfo`](`t:select_info/0`) `|`\n[`CompletionInfo`](`t:completion_info/0`) does not match\nan operation in progress for the calling process, this function returns\n`{error, {invalid, SelectInfo | CompletionInfo}}`.","title":"socket.cancel/2","ref":"socket.html#cancel/2"},{"type":"function","doc":"Cancel a socket monitor.\n\nIf `MRef` is a reference that the calling process obtained by calling\n`monitor/1`, this monitor is removed. If there is no such monitor\nfor the calling process (or MRef doesn't correspond to a monitor),\nnothing happens.\n\nThe returned value is one of the following:\n\n- **`true`** - The monitor was found and removed. In this case, no `'DOWN'`\n message corresponding to this monitor has been delivered and will not be\n delivered.\n\n- **`false`** - The monitor was not found so it couldn't be removed. This\n might be because the monitor has already triggered and there is\n a `'DOWN'` message from this monitor in the caller message queue.","title":"socket.cancel_monitor/1","ref":"socket.html#cancel_monitor/1"},{"type":"function","doc":"Close a socket.\n\n> #### Note {: .info }\n>\n> Note that for `Protocol = tcp` (see `open/3`), although\n> TCP guarantees that when the other side sees the stream close\n> all data that we sent before closing has been delivered,\n> there is no way for us to know that the other side got all data\n> and the stream close. All kinds of network and OS issues\n> may obliterate that.\n>\n> To get such a guarantee we need to implement an in-band acknowledge\n> protocol on the connection, or we can use the [`shutdown`](`shutdown/2`)\n> function to signal that no more data will be sent and then wait\n> for the other end to close the socket. Then we will see our read side\n> getting a socket close. In this way we implement a small\n> acknowledge protocol using `shutdown/2`. The other side cannot\n> know that we ever saw the socket close, but in a client/server\n> scenario that is often not relevant.","title":"socket.close/1","ref":"socket.html#close/1"},{"type":"function","doc":"Finalize a [`connect/3`](#connect-nowait) operation.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nOn `select` systems this function finalizes a connection setup\non a socket, after receiving a `select` message\n`{'$socket',` [`Socket`](`t:socket/0`)`, select,\n`[`SelectHandle`](`t:select_handle/0`)`}`,\nand returns whether the connection setup was successful or not.\n\nInstead of calling this function, for backwards compatibility,\nit is allowed to call [`connect/2,3`](`connect/2`) again,\nbut that incurs more overhead since the connect address and\ntime-out argument are processed in vain.\n\nThe call that completes the connect operation, the second call,\ncannot return a `select` return value.","title":"socket.connect/1","ref":"socket.html#connect/1"},{"type":"function","doc":"Equivalent to\n[`connect(Socket, SockAddr, infinity)`](#connect-infinity).","title":"socket.connect/2","ref":"socket.html#connect/2"},{"type":"function","doc":"Connect the socket to the given address.\n\nThis function connects the socket to the address specified\nby the `SockAddr` argument.\n\nIf a connection attempt is already in progress (by another process),\n`{error, already}` is returned.\n\n> #### Note {: .info }\n>\n> On _Windows_ the socket has to be [_bound_](`bind/2`).\n\n[](){: #connect-infinity }\n\nIf the time-out argument (argument 3) is `infinity` it is\nup to the OS implementation to decide when the connection\nattempt failed and then what to return; probably `{error, etimedout}`.\nThe OS time-out may be very long.\n\n[](){: #connect-timeout }\n\nIf the time-out argument (argument 3) is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif the connection hasn't been established within `Timeout` milliseconds.\n\n> #### Note {: .info }\n>\n> Note that when this call has returned `{error, timeout}`\n> the connection state of the socket is uncertain since the platform's\n> network stack may complete the connection at any time,\n> up to some platform specific time-out.\n>\n> Repeating a connection attempt towards the same address would be ok, but\n> towards a different address could end up with a connection to either address.\n>\n> The safe play is to close the socket and start over.\n>\n> Also note that this applies to canceling a `nowait` connect call\n> described below.\n\n[](){: #connect-nowait }\n\nIf the time-out argument (argument 2) is `nowait` *(since OTP 22.1)*,\nstart an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the time-out argument (argument 2) is a `Handle ::` `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`Handle ::` `t:completion_handle/0` *(since OTP 26.0)*,\nstart an [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call `connect/1`\nto complete the operation.\n\nIf canceling the operation with `cancel/2` see the note above\nabout [connection time-out](#connect-timeout).","title":"socket.connect/3","ref":"socket.html#connect/3"},{"type":"function","doc":"Get the value of a socket option.\n\nGets the value of an OS protocol level socket option, or from\nthe `otp` pseudo protocol level, which is this module's\nimplementation level above the OS protocol levels.\n\nSee the type [otp_socket_option() ](`t:otp_socket_option/0`)\nfor a description of the `otp` protocol level.\n\nSee the type `t:socket_option/0` for which OS protocol level options\nthat this implementation knows about, how they are related to OS option names,\nand if there are known peculiarities with any of them.\n\nWhat options that are valid depends on the OS, and on the kind of socket\n(`t:domain/0`,`t:type/0` and `t:protocol/0`). See the type\n`t:socket_option()` and the\n[socket options ](socket_usage.md#socket_options) chapter\nin the User's Guide for more info.\n\n> #### Note {: .info }\n>\n> Not all options are valid, nor possible to get, on all platforms. That is,\n> even if this `socket` implementation support an option; it doesn't mean\n> that the underlying OS does.","title":"socket.getopt/2","ref":"socket.html#getopt/2"},{"type":"function","doc":"Get a socket option _(backwards compatibility function)_.\n\nEquivalent to [`getopt(Socket, {Level, Opt})`](`getopt/2`),\nor as a special case if\n`Opt = {NativeOpt :: `[`integer/0`](`t:integer/0`)`, ValueSpec}`\nequivalent to\n[`getopt_native(Socket, {Level, NativeOpt}, ValueSpec)`](`getopt_native/3`).\n\nUse `getopt/2` or `getopt_native/3` instead to handle\nthe option level and name as a single term, and to make the\ndifference between known options and native options clear.","title":"socket.getopt/3","ref":"socket.html#getopt/3"},{"type":"function","doc":"Get a \"native\" socket option.\n\nGets a socket option that may be unknown to our implementation, or that has a\ntype not compatible with our implementation, that is; in \"native mode\".\n\nThe socket option may be specified with an ordinary\n[`socket_option()` ](`t:socket_option/0`) tuple, with a known\n[`Level = level()` ](`t:level/0`) and an integer `NativeOpt`,\nor with both an integer `NativeLevel` and `NativeOpt`.\n\nHow to decode the option value has to be specified either with `ValueType`,\nby specifying the `ValueSize` for a `t:binary/0` that will contain the fetched\noption value, or by specifying a `t:binary/0` `ValueSpec` that will be copied\nto a buffer for the `getsockopt()` call to write the value in which will be\nreturned as a new `t:binary/0`.\n\nIf `ValueType` is `integer` a `C` type `(int)` will be fetched, if it is\n`boolean` a `C` type `(int)` will be fetched and converted into a `t:boolean/0`\naccording to the `C` implementation's notion about true and false.\n\nIf an option is valid depends both on the platform and on\nwhat kind of socket it is (`t:domain/0`, `t:type/0` and `t:protocol/0`).\n\nThe integer values for `NativeLevel` and `NativeOpt` as well as the `Value`\nencoding has to be deduced from the header files for the running system.","title":"socket.getopt_native/3","ref":"socket.html#getopt_native/3"},{"type":"function","doc":"Print information to the erlang shell in table format\nfor all sockets.\n\nThe information printed for each socket is specified by the default set\nof `t:info_keys/0` (all keys).\n\nThe sockets that are printed are all sockets created by this\n`socket` module's implementation.","title":"socket.i/0","ref":"socket.html#i/0"},{"type":"function","doc":"Print information to the erlang shell in table format\nfor all sockets.\n\nIf the argument is a list of `t:info_keys/0`, print the specified\ninformation for all sockets. See `i/0`.\n\nOtherwise the same as `i/2` with the same first argument\nand the default information (see `i/0`).","title":"socket.i/1","ref":"socket.html#i/1"},{"type":"function","doc":"Print information to the erlang shell in table format\nfor a selection of sockets.\n\nThe argument [`InfoKeys`](`t:info_keys/0`) specifies which information\nis printed for each socket.\n\nIf the first argument is `Domain` print information for\nall sockets of that specific `t:domain/0`.\n\nIf the first argument is `Proto` print information for\nall sockets of that specific `t:protocol/0`.\n\nIf the first argument is `Type` print information for\nall sockets of that specific `t:type/0`.","title":"socket.i/2","ref":"socket.html#i/2"},{"type":"function","doc":"Get miscellaneous information about this `socket` library.\n\nThe function returns a map with each information item as a key-value pair.\n\n> #### Note {: .info }\n>\n> In order to ensure data integrity, mutexes are taken when needed.\n> So, don't call this function often.","title":"socket.info/0","ref":"socket.html#info/0"},{"type":"function","doc":"Get miscellaneous info about a socket.\n\nThe function returns a map with each information item as a key-value pair\nreflecting the \"current\" state of the socket.\n\n> #### Note {: .info }\n>\n> In order to ensure data integrity, mutexes are taken when needed.\n> So, don't call this function often.","title":"socket.info/1","ref":"socket.html#info/1"},{"type":"function","doc":"Set socket (device) parameters.\n\nThis function retrieves a specific parameter, according to\nthe `GetRequest` argument.\n\n- **`gifconf`** - Get a list of interface (transport layer) addresses.\n\n Result; a list of `t:map/0`s, one for each interface,\n with its name and address.\n\n- **`nread`** - Get the number of bytes immediately available for reading\n *(since OTP 26.1)*.\n\n Result; the number of bytes, `t:integer/0`.\n\n- **`nwrite`** - Get the number of bytes in the send queue\n *(since OTP 26.1)*.\n\n Result; the number of bytes, `t:integer/0`.\n\n- **`nspace`** - Get the free space in the send queue\n *(since OTP 26.1)*.\n\n Result; the number of bytes, `t:integer/0`.\n\n- **`atmark`** - Test if there is OOB (out-of-bound) data waiting to be read\n *(since OTP 26.1)*.\n\n Result; a `t:boolean/0`.\n\n- **`tcp_info`** - Get miscellaneous TCP related information for a\n _connected_ socket *(since OTP 26.1)*.\n\n Result; a `t:map/0` with information items as key-value pairs.\n\n> #### Note {: .info }\n>\n> Not all requests are supported by all platforms.\n> To see if a ioctl request is supported on the current platform:\n>\n> ```erlang\n> \t Request = nread,\n> \t true = socket:is_supported(ioctl_requests, Request),\n> \t :\n> ```","title":"socket.ioctl/2","ref":"socket.html#ioctl/2"},{"type":"function","doc":"Get or set socket (device) parameters.\n\n[](){: #ioctl-get }\n\nThis function retrieves a specific parameter, according to\none of the following `GetRequest` arguments. The third argument is\nthe (lookup) \"key\", identifying the interface, for most requests\nthe name of the interface as a `t:string/0`.\nAlso, see the note above.\n\n- **`gifname`** - Get the name of the interface with the specified index\n (`t:integer/0`).\n\n Result; the name of the interface, `t:string/0`.\n\n- **`gifindex`** - Get the index of the interface with the specified name.\n\n Result; the interface index, `t:integer/0`.\n\n- **`gifaddr`** - Get the address of the interface with the specified name.\n\n Result; the address of the interface, `t:sockaddr/0`.\n\n- **`gifdstaddr`** - Get the destination address of the point-to-point\n interface with the specified name.\n\n Result; the destination address of the interface, `t:sockaddr/0`.\n\n- **`gifbrdaddr`** - Get the broadcast address of the interface with the\n specified name.\n\n Result; broadcast address of the interface, `t:sockaddr/0`.\n\n- **`gifnetmask`** - Get the network mask of the interface with\n the specified name.\n\n Result; the network mask of the interface, `t:sockaddr/0`.\n\n- **`gifhwaddr` | `genaddr`** - Get the hardware address for the interface with the\n specified name.\n\n Result; the hardware address of the interface, `t:sockaddr/0` | `t:binary/0`.\n The family field contains the 'ARPHRD' device type (or an integer).\n\n- **`gifmtu`** - Get the MTU (Maximum Transfer Unit) for the interface with the\n specified name.\n\n Result; MTU of the interface, `t:integer/0`.\n\n- **`giftxqlen`** - Get the transmit queue length of the interface with the\n specified name.\n\n Result; transmit queue length of the interface, `t:integer/0`.\n\n- **`gifflags`** - Get the active flag word of the interface\n with the specified name.\n\n Result; the active flag word of the interface, is a list of\n `t:ioctl_device_flag/0` `|` `t:integer( )`.\n\n[](){: #ioctl-set }\n\nWith the following `SetRequest` argument this function sets\nthe `Value` for the request parameter *(since OTP 26.1)*.\n\n- **`rcvall`** - Enables (or disables) a socket to receive all IPv4 or IPv6\n packages passing through a network interface.\n\n The `Socket` has to be one of:\n\n - **An IPv4 socket** - Created with the address\n [domain `inet`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `ip`](`t:protocol/0`).\n\n - **An IPv6 socket** - Created with the address\n [domain `inet6`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `ipv6`](`t:protocol/0`).\n\n The socket must also be bound to an (explicit) local IPv4 or IPv6 interface\n (`any` isn't allowed).\n\n Setting this IOCTL requires elevated privileges.\n\nWith the following `SetRequest` arguments this function sets\nthe `Value` for the request parameter *(since OTP 26.1)*.\n\n- **`rcvall_igmpmcall`** - Enables (or disables) a socket to receive IGMP\n multicast IP traffic, _without_ receiving any other IP traffic.\n\n The socket has to be created with the address\n [domain `inet`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `igmp`](`t:protocol/0`).\n\n The socket must also be bound to an (explicit) local interface\n (`any` isn't allowed).\n\n The receive buffer must be sufficiently large.\n\n Setting this IOCTL requires elevated privileges.\n\n- **`rcvall_mcall`** - Enables (or disables) a socket to receive all multicast\n IP traffic (as in; all IP packets destined for IP addresses in the range\n 224.0.0.0 to 239.255.255.255).\n\n The socket has to be created with the address\n [domain `inet`](`t:domain/0`), socket [type `raw`](`t:type/0`)\n and [protocol `udp`](`t:protocol/0`).\n\n The socket must also be bound to an (explicit) local interface\n (`any` isn't allowed), And bound to port `0`.\n\n The receive buffer must be sufficiently large.\n\n Setting this IOCTL requires elevated privileges.","title":"socket.ioctl/3","ref":"socket.html#ioctl/3"},{"type":"function","doc":"Set socket (device) parameters.\n\nThis function sets a specific parameter, according to the `SetRequest`\nargument. The `Name` argument is the name of the interface,\nand the `Value` argument is the value to set.\n\nThese operations require elevated privileges.\n\n- **`sifflags`** - Set the the active flag word, `#{Flag => boolean()}`, of the\n interface with the specified name.\n\n Each flag to be changed should be added to the value `t:map/0`,\n with the value `true` if the `Flag` should be set and `false`\n if the flag should be cleared.\n\n- **`sifaddr`** - Set the address, `t:sockaddr/0`, of the interface with the\n specified name.\n\n- **`sifdstaddr`** - Set the destination address, `t:sockaddr/0`, of a\n point-to-point interface with the specified name.\n\n- **`sifbrdaddr`** - Set the broadcast address, `t:sockaddr/0`,\nof the interface with the specified name.\n\n- **`sifnetmask`** - Set the network mask, `t:sockaddr/0`, of the interface\n with the specified name.\n\n- **`sifhwaddr`** - Set the hardware address, `t:sockaddr/0`,\nof the interface with the specified name.\n\n- **`sifmtu`** - Set the MTU (Maximum Transfer Unit), `t:integer/0`,\n for the interface with the specified name.\n\n- **`siftxqlen`** - Set the transmit queue length, `t:integer/0`,\n of the interface with the specified name.","title":"socket.ioctl/4","ref":"socket.html#ioctl/4"},{"type":"function","doc":"Check if a socket feature is supported.\n\nReturns `true` if `supports/0` has a `{Key1, true}` tuple\nor a `{Key1, list()}` tuple in its returned list,\notherwise `false` (also for unknown keys).\n\nExample:\n``` erlang\ntrue = socket:is_supported(local),\n```","title":"socket.is_supported/1","ref":"socket.html#is_supported/1"},{"type":"function","doc":"Check if a socket feature is supported.\n\nReturns `true` if [`supports(Key1)`](`supports/1`) has a `{Key2, true}` tuple\nin its returned list, otherwise `false` (also for unknown keys).\n\nExample:\n``` erlang\ntrue = socket:is_supported(msg_flags, errqueue),\n```","title":"socket.is_supported/2","ref":"socket.html#is_supported/2"},{"type":"function","doc":"Make a socket listen for connections.\n\nEquivalent to [`listen(Socket, Backlog)`](`listen/2`) with a default\nvalue for `Backlog` (currently `5`).","title":"socket.listen/1","ref":"socket.html#listen/1"},{"type":"function","doc":"Make a socket listen for connections.\n\nThe `Backlog` argument states the length of the queue for\nincoming not yet accepted connections.\nExactly how that number is interpreted is up to the OS'\nprotocol stack, but the resulting effective queue length\nwill most probably be perceived as at least that long.\n\n> #### Note {: .info }\n>\n> On _Windows_ the socket has to be _bound_.","title":"socket.listen/2","ref":"socket.html#listen/2"},{"type":"function","doc":"Start a socket monitor.\n\nIf the `Socket` doesn't exist or when later the monitor is triggered,\na `'DOWN'` message is sent to the process that called `monitor/1`\nwith the following pattern:\n\n``` erlang\n\t {'DOWN', MonitorRef, socket, Socket, Info}\n```\n`Info` is the termination reason of the socket or `nosock` if\n`Socket` did not exist when the monitor was started.\n\nMaking several calls to `socket:monitor/1` for the same `Socket` is not an\nerror; each call creates an independent monitor instance.","title":"socket.monitor/1","ref":"socket.html#monitor/1"},{"type":"function","doc":"Return the number of active sockets.","title":"socket.number_of/0","ref":"socket.html#number_of/0"},{"type":"function","doc":"Equivalent to [`open(FD, #{})`](`open/2`).","title":"socket.open/1","ref":"socket.html#open/1"},{"type":"function","doc":"Create a socket.\n\n#### With arguments `Domain` and `Type`\n\nEquivalent to [`open(Domain, Type, default, #{})`](`open/4`).\n\n#### With arguments `FD` and `Opts` *(since OTP 23.0)*\n\nCreates an endpoint for communication (socket) based on\nan already existing file descriptor that must be a socket.\nThis function attempts to retrieve the file descriptor's\n`domain`, `type` and `protocol` from the system.\nThis is however not possible on all platforms;\nin that case they should be specified in `Opts`.\n\nThe `Opts` argument can provide extra information:\n\n- **`domain`** - The file descriptor's communication domain. See also\n\n [`open/2,3,4`](`open/3`).\n\n- **`type`** - The file descriptor's socket type.\n\n See also [`open/2,3,4`](`open/3`).\n\n- **`protocol`** - The file descriptor's protocol. The atom `default` is\n equivalent to the integer protocol number `0` which means the default\n protocol for a given domain and type.\n\n If the protocol can not be retrieved from the platform for the socket, and\n `protocol` is not specified, the default protocol is used, which may\n or may not be correct.\n\n See also [`open/2,3,4`](`open/3`).\n\n- **`dup`** - If `false` don't duplicate the provided file descriptor.\n\n Defaults to `true`; do duplicate the file descriptor.\n\n- **`debug`** - If `true` enable socket debug logging.\n\n Defaults to `false`; don't enable socket debug logging.\n\n- **`use_registry`** - Enable or disable use of the socket registry\n for this socket. This overrides the global setting.\n\n Defaults to the global setting, see `use_registry/1`.\n\n> #### Note {: .info }\n>\n> This function should be used with care\\!\n>\n> On some platforms it is _necessary_ to provide `domain`, `type` and `protocol`\n> since they cannot be retrieved from the platform.\n>\n> On some platforms it is not easy to get hold of a file descriptor\n> to use in this function.","title":"socket.open/2","ref":"socket.html#open/2"},{"type":"function","doc":"Create a socket.\n\n#### With arguments `Domain`, `Type` and `Protocol`\n\nEquivalent to [`open(Domain, Type, Protocol, #{})`](`open/4`).\n\n#### With arguments `Domain`, `Type` and `Opts` *(since OTP 24.0)*\n\nEquivalent to [`open(Domain, Type, default, #{})`](`open/4`).","title":"socket.open/3","ref":"socket.html#open/3"},{"type":"function","doc":"Create a socket.\n\nCreates an endpoint for communication (socket).\n\n`Domain` and `Type` may be `t:integer/0`s, as defined in the platform's\nheader files. The same goes for `Protocol` as defined in the platform's\n`services(5)` database. See also the OS man page for the library call\n`socket(2)`.\n\n> #### Note {: .info }\n>\n> For some combinations of `Domain` and `Type` the platform has got\n> a default protocol that can be selected with `Protocol = default`,\n> and the platform may allow or require selecting the default protocol,\n> or a specific protocol.\n>\n> Examples:\n>\n> - **`socket:open(inet, stream, tcp)`** - It is common that for\n> protocol domain and type `inet,stream` it is allowed to select\n> the `tcp` protocol although that mostly is the default.\n> - **`socket:open(local, dgram)`** - It is common that for\n> the protocol domain `local` it is mandatory to not select a protocol,\n> that is; to select the default protocol.\n\nThe `Opts` argument is intended for \"other\" options.\nThe supported option(s) are described below:\n\n- **`netns: string()`** - Used to set the network namespace during the open\n call. Only supported on Linux.\n\n- **`debug: boolean()`** - Enable or disable debug logging.\n\n Defaults to `false`.\n\n- **`use_registry: boolean()`** - Enable or disable use of the socket registry\n for this socket. This overrides the global value.\n\n Defaults to the global value, see `use_registry/1`.","title":"socket.open/4","ref":"socket.html#open/4"},{"type":"function","doc":"Return the remote address of a socket.\n\nReturns the address of the connected peer, that is,\nthe remote end of the socket.","title":"socket.peername/1","ref":"socket.html#peername/1"},{"type":"function","doc":"Equivalent to [`recv(Socket, 0, [], infinity)`](`recv/4`).","title":"socket.recv/1","ref":"socket.html#recv/1"},{"type":"function","doc":"Receive data on a connected socket.\n\nWith argument `Length`; equivalent to\n[`recv(Socket, Length, [], infinity)`](`recv/4`).\n\nWith argument `Flags`; equivalent to\n[`recv(Socket, 0, Flags, infinity)`](`recv/4`) *(since OTP 24.0)*.","title":"socket.recv/2","ref":"socket.html#recv/2"},{"type":"function","doc":"Receive data on a connected socket.\n\nWith arguments `Length` and `Flags`; equivalent to\n[`recv(Socket, Length, Flags, infinity)`](`recv/4`).\n\nWith arguments `Length` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, Length, [], TimeoutOrHandle)`](`recv/4`).\n`TimeoutOrHandle :: nowait` has been allowed *since OTP 22.1*.\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.\n\nWith arguments `Flags` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, 0, Flags, TimeoutOrHandle)`](`recv/4`)\n*(since OTP 24.0)*.","title":"socket.recv/3","ref":"socket.html#recv/3"},{"type":"function","doc":"Receive data on a connected socket.\n\nThe argument `Length` specifies how many bytes to receive,\nwith the special case `0` meaning \"all available\".\n\nWhen `Length` is `0`, a default buffer size is used, which can be set by\n[`socket:setopt(Socket, {otp,recvbuf}, BufSz)`](`setopt/3`).\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\nWhen there is a socket error this function returns `{error, Reason}`,\nor if some data arrived before the error; `{error, {Reason, Data}}`\n(can only happen for a socket of [type `stream`](`t:type/0`)).\n\n[](){: #recv-infinity }\n\nIf the `Timeout` argument is `infinity`; waits for the data to arrive.\nFor a socket of [type `stream`](`t:type/0`) this call\nwon't return until _all_ requested data can be delivered,\nor if \"all available\" was requested when the first data chunk arrives,\nor if the OS reports an error for the operation.\n\n[](){: #recv-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has arrived after `Timeout` milliseconds,\nor `{error, {timeout, Data}}` if some but not enough data\nhas been received on a socket of [type `stream`](`t:type/0`).\n\n`Timeout = 0` only polls the OS receive call and doesn't\nengage the Asynchronous Calls mechanisms. If no data\nis immediately available `{error, timeout} is returned.\n`On a socket of type [`stream`](`t:type/0`), `{error, {timeout, Data}}`\nis returned if there is an insufficient amount of data immediately available.\n\n[](){: #recv-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nOn `select` systems, for a socket of type [`stream`](`t:type/0`),\nif `Length > 0` and there isn't enough data available, this function\nwill return [`{select, {SelectInfo, Data}}`](`t:select_info/0`)\nwith partial `Data`. A repeated call to complete the operation\nwill probably need an updated `Length` argument.","title":"socket.recv/4","ref":"socket.html#recv/4"},{"type":"function","doc":"Equivalent to [`recvfrom(Socket, 0, [], infinity)`](`recvfrom/4`).","title":"socket.recvfrom/1","ref":"socket.html#recvfrom/1"},{"type":"function","doc":"Receive a message on a socket.\n\nWith argument `BufSz`; equivalent to\n[`recvfrom(Socket, BufSz, [], infinity)`](`recvfrom/4`).\n\nWith argument `Flags`; equivalent to\n[`recvfrom(Socket, 0, Flags, infinity)`](`recvfrom/4`) *(since OTP 24.0)*.","title":"socket.recvfrom/2","ref":"socket.html#recvfrom/2"},{"type":"function","doc":"Receive a message on a socket.\n\nWith arguments `BufSz` and `Flags`; equivalent to\n[`recvfrom(Socket, BufSz, Flags, infinity)`](`recvfrom/4`).\n\nWith arguments `BufSz` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, BufSz, [], TimeoutOrHandle)`](`recvfrom/4`).\n\nWith arguments `Flags` and `TimeoutOrHandle`; equivalent to\n[`recv(Socket, 0, Flags, TimeoutOrHandle)`](`recvfrom/4`)\n\n`TimeoutOrHandle :: 'nowait'` has been allowed *since OTP 22.1*.\n\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.","title":"socket.recvfrom/3","ref":"socket.html#recvfrom/3"},{"type":"function","doc":"Receive a message on a socket.\n\nThis function is intended for sockets that are not connection\noriented such as type [`dgram`](`t:type/0`) or [`seqpacket`](`t:type/0`)\nwhere it may arrive messages from different source addresses.\n\nArgument `BufSz` specifies the number of bytes for the receive buffer.\nIf the buffer size is too small, the message will be truncated.\n\nIf `BufSz` is `0`, a default buffer size is used, which can be set by\n[`socket:setopt(Socket, {otp,recvbuf}, BufSz)`](`setopt/3`).\n\nIf there is no known appropriate buffer size, it may be possible\nto use the receive [message flag](`t:msg_flag/0`) `peek`.\nWhen this flag is used, the message is _not_ \"consumed\" from\nthe underlying buffers, so another `recvfrom/1,2,3,4` call\nis needed, possibly with an adjusted buffer size.\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s, as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\n[](){: #recvfrom-infinity }\n\nIf the `Timeout` argument is `infinity`; waits for a message\nto arrive, or for a socket error.\n\n[](){: #recvfrom-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); returns `{error, timeout}`\nif no message has arrived after `Timeout` milliseconds.\n\n`Timeout = 0` only polls the OS receive call and doesn't\nengage the Asynchronous Calls mechanisms. If no message\nis immediately available `{error, timeout}` is returned.\n\n[](){: #recvfrom-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the 'Handle' argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*,\nstarts an [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.","title":"socket.recvfrom/4","ref":"socket.html#recvfrom/4"},{"type":"function","doc":"Equivalent to [`recvmsg(Socket, 0, 0, [], infinity)`](`recvmsg/5`).","title":"socket.recvmsg/1","ref":"socket.html#recvmsg/1"},{"type":"function","doc":"Receive a message on a socket.\n\nWith argument `Flags`; equivalent to\n[`recvmsg(Socket, 0, 0, Flags, infinity)`](`recvmsg/5`).\n\nWith argument `TimeoutOrHandle`; equivalent to\n[`recvmsg(Socket, 0, 0, [], TimeoutOrHandle)`](`recvmsg/5`).\n\n`TimeoutOrHandle :: nowait` has been allowed *since OTP 22.1*.\n\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.","title":"socket.recvmsg/2","ref":"socket.html#recvmsg/2"},{"type":"function","doc":"Receive a message on a socket.\n\nWith arguments `Flags`; equivalent to\n[`recvmsg(Socket, 0, 0, Flags, infinity)`](`recvmsg/5`).\n\nWith argument `TimeoutOrHandle`; equivalent to\n[`recvmsg(Socket, 0, 0, [], TimeoutOrHandle)`](`recvmsg/5`).\n\n`TimeoutOrHandle :: nowait` has been allowed *since OTP 22.1*.\n\n`TimeoutOrHandle :: Handle` has been allowed *since OTP 24.0*.","title":"socket.recvmsg/3","ref":"socket.html#recvmsg/3"},{"type":"function","doc":"Equivalent to\n[`recvmsg(Socket, BufSz, CtrlSz, [], TimeoutOrHandle)`](`recvmsg/5`).","title":"socket.recvmsg/4","ref":"socket.html#recvmsg/4"},{"type":"function","doc":"Receive a message on a socket.\n\nThis function receives both data and control messages.\n\nArguments `BufSz` and `CtrlSz` specifies the number of bytes for the\nreceive buffer and the control message buffer. If the buffer size(s)\nis(are) too small, the message and/or control message list will be truncated.\n\nIf `BufSz` is `0`, a default buffer size is used, which can be set by\n[`socket:setopt(Socket, {otp,recvbuf}, BufSz)`](`setopt/3`).\nThe same applies to `CtrlSz` and\n[`socket:setopt(Socket, {otp,recvctrlbuf}, CtrlSz)`](`setopt/3`).\n\nIf there is no known appropriate buffer size, it may be possible\nto use the receive [message flag](`t:msg_flag/0`) `peek`.\nWhen this flag is used, the message is _not_ \"consumed\" from\nthe underlying buffers, so another `recvfrom/1,2,3,4` call\nis needed, possibly with an adjusted buffer size.\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s, as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\n[](){: #recvmsg-infinity }\n\nIf the `Timeout` argument is `infinity`; waits for the message\nto arrive, or for a socket error.\n\n[](){: #recvmsg-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no message has arrived after `Timeout` milliseconds.\n\n`Timeout = 0` only polls the OS receive call and doesn't\nengage the Asynchronous Calls mechanisms. If no message\nis immediately available `{error, timeout}` is returned.\n\n[](){: #recvmsg-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the 'Handle' argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*,\nstarts an [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.","title":"socket.recvmsg/5","ref":"socket.html#recvmsg/5"},{"type":"function","doc":"Equivalent to [`send(Socket, Data, [], infinity)`](`send/4`).","title":"socket.send/2","ref":"socket.html#send/2"},{"type":"function","doc":"Send data on a connected socket.\n\nWith argument `Timeout`; equivalent to\n[`send(Socket, Data, [], Timeout)`](`send/4`).\n\nWith argument `Flags`; equivalent to\n[`send(Socket, Data, Flags, infinity)`](`send/4`).\n\nWith argument `Cont`; equivalent to\n[`send(Socket, Data, Cont, infinity)`](`send/4`) *(since OTP 24.0)*.","title":"socket.send/3","ref":"socket.html#send/3"},{"type":"function","doc":"Send data on a connected socket.\n\nThe message `Flags` may be symbolic `t:msg_flag/0`s and/or\n`t:integer/0`s as in the platform's appropriate header files.\nThe values of all symbolic flags and integers are or:ed together.\n\nThe `Data`, if it is not a `t:binary/0`, is copied into one before\ncalling the platform network API, because a single buffer is required.\nA returned `RestData` is a sub binary of it.\n\nThe return value indicates the result from the platform's network layer:\n\n- **`ok`** - All data was accepted by the OS for delivery\n\n- **`{ok, RestData}`** - Some but not all data was accepted,\n but no error was reported (partially successful send). `RestData`\n is the tail of `Data` that wasn't accepted.\n\n This cannot happen for a socket of [type `stream`](`t:type/0`) where\n such a partially successful send is retried until the data is either\n accepted for delivery or there is an error.\n\n For a socket of [type `dgram`](`t:type/0`) this should probably\n also not happen since a message that cannot be passed atomically\n should render an error.\n\n It is nevertheless possible for the platform's network layer\n to return this, surely more possible for a socket of\n [type `seqpacket`](`t:type/0`).\n\n- **`{error, Reason}`** - An error has been reported and no data\n was accepted for delivery. [`Reason :: posix/0`](`t:posix/0`)\n is what the platform's network layer reported. `closed` means\n that this socket library was informed that the socket was closed,\n and `t:invalid/0` means that this socket library found\n an argument to be invalid.\n\n- **`{error, {Reason, RestData}}`** - An error was reported but before that\n some data was accepted for delivery. `RestData` is the tail of `Data`\n that wasn't accepted. See `{error, Reason}` above.\n\n This can only happen for a socket of [type `stream`](`t:type/0`)\n when a partially successful send is retried until there is an error.\n\n[](){: #send-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #send-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestData}}` if some data was sent\n(accepted by the OS for delivery). `RestData` is the tail of the data\nthat hasn't been sent.\n\n[](){: #send-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\n[](){: #send-cont }\n\nIf the function is called with a `Cont` argument, that is;\nthe [`SelectInfo`](`t:select_info/0`) from the previous\n[`send/3,4`](`send/3`) call; the send is continued with\npreprocessed send parameters in the `SelectInfo`.\nUsing this argument variant avoids for example having to validate\nand encode message flags in every call but the first.","title":"socket.send/4","ref":"socket.html#send/4"},{"type":"function","doc":"Send a file on a socket.\n\nEquivalent to\n[`sendfile(Socket, FileHandle_or_Continuation, 0, 0, infinity)`](`sendfile/5`).","title":"socket.sendfile/2","ref":"socket.html#sendfile/2"},{"type":"function","doc":"Send a file on a socket.\n\nEquivalent to\n[`sendfile(Socket, FileHandle_or_Continuation, 0, 0, Timeout_or_Handle)`](`sendfile/5`).","title":"socket.sendfile/3","ref":"socket.html#sendfile/3"},{"type":"function","doc":"Send a file on a socket.\n\nEquivalent to\n[`sendfile(Socket, FileHandle_or_Continuation, Offset, Count, infinity)`](`sendfile/5`).","title":"socket.sendfile/4","ref":"socket.html#sendfile/4"},{"type":"function","doc":"Send a file on a socket.\n\n> #### Note {: .info }\n> This function unsupported on Windows.\n\nThe `FileHandle` argument must refer to an open raw file\nas described in `file:open/2`.\n\nThe `Offset` argument is the file offset to start reading from.\nThe default offset is `0`.\n\nThe `Count` argument is the number of bytes to transfer\nfrom `FileHandle` to `Socket`. If `Count = 0` (the default)\nthe transfer stops at the end of file.\n\nThe return value indicates the result from the platform's network layer:\n\n- **`{ok, BytesSent}`** - The transfer completed successfully after `BytesSent`\n bytes of data.\n\n- **`{error, Reason}`** - An error has been reported and no data\n was transferred. [`Reason :: posix/0`](`t:posix/0`)\n is what the platform's network layer reported. `closed` means\n that this socket library was informed that the socket was closed,\n and `t:invalid/0` means that this socket library found\n an argument to be invalid.\n\n- **`{error, {Reason, BytesSent}}`** - An error has been reported\n but before that some data was transferred. See `{error, Reason}`\n and `{ok, BytesSent}` above.\n\n[](){: #sendfile-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendfile-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, BytesSent}}` if some but not all data was sent\n(accepted by the OS for delivery).\n\n[](){: #sendfile-nowait }\n\nIf the `Handle` argument is `nowait`,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call [`sendfile/2,3,4,5`](`sendfile/2`)\nwith `SelectInfo` as the `Continuation` argument, to complete the operation.\n\n[](){: #sendfile-cont }\n\nIf the function is called with a `Continuation` argument, that is;\nthe [`SelectInfo`](`t:select_info/0`) from the previous\n`sendfile/5` call; the transfer is continued with\npreprocessed parameters in the `SelectInfo`.\n\nThe `Offset` and maybe `Count` arguments will probably\nneed to be updated between continuation calls.","title":"socket.sendfile/5","ref":"socket.html#sendfile/5"},{"type":"function","doc":"Equivalent to [`sendmsg(Socket, Msg, [], infinity)`](`sendmsg/4`).","title":"socket.sendmsg/2","ref":"socket.html#sendmsg/2"},{"type":"function","doc":"Send data and control messages on a socket.\n\nWith arguments `Msg` and `Timeout`; equivalent to\n[`sendmsg(Socket, Msg, [], Timeout)`](`sendmsg/4`).\n\nWith arguments `Msg` and `Flags`; equivalent to\n[`sendmsg(Socket, Msg, Flags, infinity)`](`sendmsg/4`).\n\nWith arguments `Data` and `Cont`; equivalent to\n[`sendmsg(Socket, Data, Cont, infinity)`](`sendmsg/4`) *since OTP 24.0*.","title":"socket.sendmsg/3","ref":"socket.html#sendmsg/3"},{"type":"function","doc":"Send data and control messages on a socket.\n\nThe argument `Msg` is a map that contains the data to be sent\nunder the key `iov` as an`t:erlang:iovec/0` (list of `t:binary/0`).\nIt may also contain the destination address under the key `addr`,\nwhich is mandatory if the socket isn't connected. If the socket\n_is_ connected it is best to not have an `addr` key since\nthe platform may regard that as an error (or ignore it).\nUnder the key `ctrl` there may be a list of protocol and platform dependent\ncontrol messages (a.k.a ancillary data, a.k.a control information)\nto send.\n\n[](){: #sendmsg-iov }\n\nThe message data is given to the platform's network layer as an\nI/O vector without copying the content. If the number of elements\nin the I/O vector is larger than allowed on the platform (reported\nin the [`iov_max`](`t:info/0`) field from `info/0`), on a socket of\n[type `stream`](`t:type/0`) the send is iterated over all elements,\nbut for other socket types the call fails.\n\nSee `send/4` for a description of the `Flags` argument\nand the return values.\n\n> #### Note {: .info }\n>\n> On Windows, this function can only be used with datagram and raw sockets.\n\n[](){: #sendmsg-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendmsg-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestData}}` if some data was sent\n(accepted by the OS for delivery). `RestData` is the tail of the data\nthat hasn't been sent.\n\n[](){: #sendmsg-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call [`sendmsg/3,4`](`sendmsg/3`)\nwith `SelectInfo` as the `Cont` argument, to complete the operation.\n\n[](){: #sendmsg-cont }\n\nWith the arguments `Data` and [`Cont`](`t:select_info/0`),\ncontinues the send operation. `Cont` should be\nthe [`SelectInfo`](`t:select_info/0`) returned from the previous\n[`sendmsg/2,3,4`](`sendmsg/2`) call.\n\n`Data` can be a [`Msg`](`t:msg_send/0`) `t:map/0`\nwhere only the key `iov` is used, or an `t:erlang:iovec/0`.","title":"socket.sendmsg/4","ref":"socket.html#sendmsg/4"},{"type":"function","doc":"Send data on a socket.\n\nWith argument `Dest`; equivalent to\n[`sendto(Socket, Data, Dest, [], infinity)`](`sendto/5`).\n\nWith argument `Cont`; equivalent to\n[`sendto(Socket, Data, Cont, infinity)`](`sendto/4`) *since OTP 24.0*.","title":"socket.sendto/3","ref":"socket.html#sendto/3"},{"type":"function","doc":"Send data on a socket.\n\nWith arguments `Dest` and `TimeoutOrHandle`; equivalent to\n[`sendto(Socket, Data, Dest, [], TimeoutOrHandle)`](`sendto/5`).\n\nWith arguments `Dest` and `Flags`; equivalent to\n[`sendto(Socket, Data, Dest, Flags, infinity)`](`sendto/5`).\n\nWith arguments `Cont` and `TimeoutOrHandle`; `Cont` must be\nthe [`SelectInfo`](`t:select_info/0`) from the previous\n[`sendto/3,4,5`](`sendto/3`) call and the send is continued with\npreprocessed send parameters in the `SelectInfo`.\nUsing this argument variant avoids for example having o validate\nand encode message flags in every call but the first.\n*(Since OTP 24.0)*\n\nSee the last argument (argument 5) of `sendto/5` for\nan explanation of `TimeoutOrHandle`.","title":"socket.sendto/4","ref":"socket.html#sendto/4"},{"type":"function","doc":"Send data on a socket.\n\nThe `To` argument is the destination address where to send the data.\nFor a connected socket this argument is still passed to the OS call\nthat may ignore the address or return an error.\n\nSee `send/4` for a description of the `Flags` and `Data` arguments,\nand the return values.\n\n[](){: #sendto-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendto-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestData}}` if some data was sent\n(accepted by the OS for delivery). `RestData` is the tail of the data\nthat hasn't been sent.\n\n[](){: #sendto-nowait }\n\nIf the `Handle` argument is `nowait` *(since OTP 22.1)*,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\n*(since OTP 24.0)*, or on _Windows_, the equivalent\n`t:completion_handle/0` *(since OTP 26.0)*, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\nAfter receiving a `select` message call [`sendto/3,4`](`sendto/3`)\nwith `SelectInfo` as the `Cont` argument, to complete the operation.","title":"socket.sendto/5","ref":"socket.html#sendto/5"},{"type":"function","doc":"","title":"socket.sendv/2","ref":"socket.html#sendv/2"},{"type":"function","doc":"Send `t:erlang:iovec/0` data on a connected socket.\n\nSee [`sendmsg/4`](#sendmsg-iov) about how the [`IOV`](`t:erlang:iovec/0`)\ndata is handled towards the platform's network layer.\n\nThe return value indicates the result from the platform's network layer:\n\n- **`ok`** - All data has been accepted by the OS for delivery.\n\n- **`{ok, RestIOV}`** - Some but not all data was accepted,\n but no error was reported (partially successful send). `RestIOV`\n is the tail of `IOV` that wasn't accepted.\n\n- **`{error, Reason}`** - An error has been reported and no data\n was accepted for delivery. [`Reason :: posix/0`](`t:posix/0`)\n is what the platform's network layer reported. `closed` means\n that this socket library was informed that the socket was closed,\n and `t:invalid/0` means that this socket library found\n an argument to be invalid.\n\n- **`{error, {Reason, RestIOV}}`** - - An error was reported but before that\n some data was accepted for delivery. `RestIOV` is the tail of `IOV`\n that wasn't accepted. See `{error, Reason}` above.\n\n[](){: #sendv-infinity }\n\nIf the `Timeout` argument is `infinity`; wait for the OS to\ncomplete the send operation (take responsibility for the data),\nor return an error.\n\n[](){: #sendv-timeout }\n\nIf the `Timeout` argument is a time-out value\n(`t:non_neg_integer/0`); return `{error, timeout}`\nif no data has been sent within `Timeout` millisecond,\nor `{error, {timeout, RestIOV}}` if some data was sent\n(accepted by the OS for delivery). `RestIOV` is the tail of the data\nthat hasn't been sent.\n\n[](){: #sendv-nowait }\n\nIf the `Handle` argument is `nowait`,\nstarts an [asynchronous call](#asynchronous-calls) if the operation\ncouldn't be completed immediately.\n\nIf the `Handle` argument is a `t:select_handle/0`,\nor on _Windows_, the equivalent `t:completion_handle/0`, starts\nan [asynchronous call](#asynchronous-calls) like for `nowait`.\n\nSee the note [Asynchronous Calls](#asynchronous-calls)\nat the start of this module reference manual page.\n\n[](){: #sendv-cont }\n\nWith the argument [`Cont`](`t:select_info/0`), equivalent to\n[`sendv(Socket, IOV, Cont, infinity)`](`sendv/4`).","title":"socket.sendv/3","ref":"socket.html#sendv/3"},{"type":"function","doc":"Send data on a connected socket, continuation.\n\nContinues sending data on a connected socket.\n`Cont` is the [`SelectInfo`](`t:select_info/0`) returned from\nthe previous [`sendv/2,3`](`sendv/2`) call.\n`IOV` should be the rest data that wasn't sent.\n\nSee [asynchronous calls](#asynchronous-calls) about continuing\nunfinished calls.\n\nSee `sendv/3` about the return values.","title":"socket.sendv/4","ref":"socket.html#sendv/4"},{"type":"function","doc":"Set a socket option.\n\nSet an OS protocol level option, or an `otp` pseudo protocol level option.\nThe latter level is this module's implementation level above\nthe OS protocol levels.\n\nSee the type [otp_socket_option() ](`t:otp_socket_option/0`)\nfor a description of the `otp` protocol level.\n\nSee the type `t:socket_option/0` for which OS protocol level options\nthat this implementation knows about, how they are related to OS option names,\nand if there are known peculiarities with any of them.\n\nWhat options that are valid depends on the OS, and on the kind of socket\n(`t:domain/0`,`t:type/0` and `t:protocol/0`). See the type\n`t:socket_option()` and the\n[socket options ](socket_usage.md#socket_options) chapter\nin the User's Guide for more info.\n\n> #### Note {: .info }\n>\n> Not all options are valid, nor possible to set, on all platforms. That is,\n> even if this `socket` implementation support an option; it doesn't mean\n> that the underlying OS does.","title":"socket.setopt/3","ref":"socket.html#setopt/3"},{"type":"function","doc":"Set a socket option _(backwards compatibility function)_.\n\nEquivalent to [`setopt(Socket, {Level, Opt}, Value)`](`setopt/3`),\nor as a special case if `Opt = NativeOpt ::` `t:integer/0`\nand `Value =` `t:binary/0` equivalent to\n[`setopt_native(Socket, {Level, NativeOpt}, ValueSpec)`](`setopt_native/3`).\n\nUse `setopt/3` or `setopt_native/3` instead to handle\nthe option level and name as a single term, and to make the\ndifference between known options and native options clear.","title":"socket.setopt/4","ref":"socket.html#setopt/4"},{"type":"function","doc":"Set a \"native\" socket option.\n\nSets a socket option that may be unknown to our implementation, or that has a\ntype not compatible with our implementation, that is; in \"native mode\".\n\nIf `Value` is an `t:integer/0` it will be used as a `C` type `(int)`,\nif it is a `t:boolean/0` it will be used as a `C` type `(int)`\nwith the `C` implementations values for `false` or `true`,\nand if it is a `t:binary/0` its content and size will be used\nas the option value.\n\nThe socket option may be specified with an ordinary\n`t:socket_option/0` tuple, with a symbolic `Level` as\n`{`[`Level :: level/0`](`t:level/0`)`, `[`NativeOpt :: integer/0`](`t:integer/0`)`}`,\nor with integers for both `NativeLevel` and `NativeOpt` as\n`{`[`NativeLevel :: integer/0`](`t:integer/0`)`, `[`NativeOpt :: integer/0`](`t:integer/0`)`}`.\n\nIf an option is valid depends both on the platform and on\nwhat kind of socket it is (`t:domain/0`, `t:type/0` and `t:protocol/0`).\n\nThe integer values for `NativeLevel` and `NativeOpt` as well as the `Value`\nencoding has to be deduced from the header files for the running system.","title":"socket.setopt_native/3","ref":"socket.html#setopt_native/3"},{"type":"function","doc":"Shut down all or part of a full-duplex connection.","title":"socket.shutdown/2","ref":"socket.html#shutdown/2"},{"type":"function","doc":"Get the socket's address.\n\nReturns the address to which the socket is currently bound.\nIf the bind address had the wildcard port `0`,\nthe address returned by this function contains the ephemeral port\nselected by the OS.","title":"socket.sockname/1","ref":"socket.html#sockname/1"},{"type":"function","doc":"Retrieve information about what socket features\nthe module and the platform supports.\n\nReturns a list of, in no particular order,\n`{Key1, `[`supports(Key1)`](`supports/1`)`}` tuples\nfor every `Key1` described in `supports/1`,\nand `{Key, boolean()}` tuples for each of the following keys:\n\n- **`sctp`** - SCTP support\n\n- **`ipv6`** - IPv6 support\n\n- **`local`** - Unix Domain sockets support (`AF_UNIX | AF_LOCAL`)\n\n- **`netns`** - Network Namespaces support (Linux, `setns(2)`)\n\n- **`sendfile`** - Sendfile support (`sendfile(2)`)","title":"socket.supports/0","ref":"socket.html#supports/0"},{"type":"function","doc":"Retrieve information about what socket features\nthe module and the platform supports.\n\nIf `Key1 = msg_flags` returns a list of `{Flag, boolean()}`\ntuples for every `Flag` in `t:msg_flag/0` with the `t:boolean/0`\nindicating if the flag is supported on this platform.\n\nIf `Key1 = protocols` returns a list of `{Name, boolean()}`\ntuples for every `Name` in`t:protocol/0` with the `t:boolean/0`\nindicating if the protocol is supported on this platform.\n\nIf `Key1 = options` returns a list of `{SocketOption, boolean()}`\ntuples for every `SocketOption` in `t:socket_option/0` with the `t:boolean/0`\nindicating if the socket option is supported on this platform.\n\nThere is no particular order of any of the returned lists.\n\nFor other values of `Key1` returns `[]`.\nNote that in future versions of this module or on different platforms,\nthere might be more supported keys.","title":"socket.supports/1","ref":"socket.html#supports/1"},{"type":"function","doc":"Retrieve information about what socket features\nthe module and the platform supports.\n\nIf `Key1 = options`, for a `Key2` in `t:level/0` returns\na list of `{Opt, boolean()}` tuples for all known socket options\n[`Opt` on that `Level = Key2`](`t:socket_option/0`) with the `t:boolean/0`\nindicating if the socket option is supported on this platform.\nSee `setopt/3` and `getopt/2`.\n\nThere is no particular order of any of the returned lists.\n\nFor other values of `Key1` or `Key2` returns `[]`.\nNote that in future versions of this module or on different platforms,\nthere might be more supported keys.","title":"socket.supports/2","ref":"socket.html#supports/2"},{"type":"function","doc":"Set the global [`use_registry`](`t:otp_socket_option/0`)\noption default value.\n\nGlobally change if the socket registry is to be used or not.\nNote that its still possible to override this explicitly\nwhen creating an individual sockets, see [`open/2,3,4`](`open/2`)\nfor more info (the [`Opts :: map/0`](`t:map/0`)).","title":"socket.use_registry/1","ref":"socket.html#use_registry/1"},{"type":"function","doc":"Return a list of all known sockets.\n\nEquivalent to [`which_sockets(fun (_) -> true end)`](`which_sockets/1`).","title":"socket.which_sockets/0","ref":"socket.html#which_sockets/0"},{"type":"function","doc":"Return a filtered list of known sockets.\n\nThere are several predefined `FilterRule`s and one general:\n\n- **`inet | inet6`** - Only the sockets with matching `t:domain/0`\n are returned.\n\n- **`stream | dgram | seqpacket`** - Only the sockets with\n matching `t:type/0` are returned.\n\n- **`sctp | tcp | udp`** - Only the sockets with\n matching `t:protocol/0` are returned.\n\n- **`t:pid/0`** - Only the sockets with matching Controlling Process\n are returned. See the OTP socket option\n [`controlling_process`](`t:otp_socket_option/0`).\n\n- **`fun((socket_info()) -> boolean())`** - The general filter rule.\n A fun that takes the socket info and returns a `t:boolean/0`\n indicating if the socket should be returned or not.","title":"socket.which_sockets/1","ref":"socket.html#which_sockets/1"},{"type":"type","doc":"Control messages (ancillary messages).","title":"socket.cmsg/0","ref":"socket.html#t:cmsg/0"},{"type":"type","doc":"Control messages (ancillary messages) returned by\n[`recvmsg/1,2,3,5`](`recvmsg/1`).\n\nA control message has got a `data` field with a native (`binary`) value for the\nmessage data, and may also have a decoded `value` field if this socket library\nsuccessfully decoded the data.","title":"socket.cmsg_recv/0","ref":"socket.html#t:cmsg_recv/0"},{"type":"type","doc":"Control messages (ancillary messages) accepted by\n[`sendmsg/2,3,4`](`sendmsg/2`).\n\nA control message may for some message types have a `value` field with a\nsymbolic value, or a `data` field with a native value, that has to be binary\ncompatible what is defined in the platform's header files.","title":"socket.cmsg_send/0","ref":"socket.html#t:cmsg_send/0"},{"type":"type","doc":"[Completion operation](#asynchronous-calls) handle.\n\nA `t:reference/0` that uniquely identifies the (completion) operation,\ncontained in the returned `t:completion_info/0`.","title":"socket.completion_handle/0","ref":"socket.html#t:completion_handle/0"},{"type":"type","doc":"[Completion operation](#asynchronous-calls) info.\n\nReturned by an operation that requires the caller to wait for a\n[completion message](`m:socket#asynchronous-calls`) containing the\n[`CompletionHandle`](`t:completion_handle/0`) _and_ the result of the operation;\nthe `CompletionStatus`.","title":"socket.completion_info/0","ref":"socket.html#t:completion_info/0"},{"type":"type","doc":"[Completion operation](#asynchronous-calls) tag.\n\n\nA tag that describes the ongoing (completion) operation (= function name),\ncontained in the returned `t:completion_info/0`.","title":"socket.completion_tag/0","ref":"socket.html#t:completion_tag/0"},{"type":"type","doc":"Protocol _domain_ a.k.a address _family_.\n\nA lowercase `t:atom/0` representing a protocol _domain_\non the platform named `AF_*` (or `PF_*`). For example\n`inet` corresponds to `AF_INET`.\n\n[`is_supported(ipv6)` ](`is_supported/1`) tells if the IPv6 protocol,\nprotocol domain `inet6`, is supported.\n\n[`is_supported(local)` ](`is_supported/1`) tells if the\nprotocol domain `local` is supported.\n\n`supports/0` reports both values, but also many more, with a single call.","title":"socket.domain/0","ref":"socket.html#t:domain/0"},{"type":"type","doc":"","title":"socket.ee_origin/0","ref":"socket.html#t:ee_origin/0"},{"type":"type","doc":"Extended Error Information.\n\nA term containing additional (error) information\n_if_ the socket NIF has been configured to produce it.","title":"socket.eei/0","ref":"socket.html#t:eei/0"},{"type":"type","doc":"","title":"socket.extended_err/0","ref":"socket.html#t:extended_err/0"},{"type":"type","doc":"","title":"socket.hatype/0","ref":"socket.html#t:hatype/0"},{"type":"type","doc":"","title":"socket.icmp_dest_unreach/0","ref":"socket.html#t:icmp_dest_unreach/0"},{"type":"type","doc":"","title":"socket.icmpv6_dest_unreach/0","ref":"socket.html#t:icmpv6_dest_unreach/0"},{"type":"type","doc":"","title":"socket.in6_addr/0","ref":"socket.html#t:in6_addr/0"},{"type":"type","doc":"","title":"socket.in6_flow_info/0","ref":"socket.html#t:in6_flow_info/0"},{"type":"type","doc":"","title":"socket.in6_scope_id/0","ref":"socket.html#t:in6_scope_id/0"},{"type":"type","doc":"","title":"socket.in_addr/0","ref":"socket.html#t:in_addr/0"},{"type":"type","doc":"Platform dependent information items.\n\nThe value of `iov_max` is the value of the `IOV_MAX` constant\nin the system headers, which is the largest allowed I/O vector.\nSee also `sendmsg/4` regarding the `iov` key of `t:msg_send/0`.\nThe smallest allowed `IOV_MAX` value according to POSIX is `16`,\nbut check your platform documentation to be sure.\n\nAbout the `use_registry` key, see `use_registry/1`\nand the `t:otp_socket_option/0` with the same name.","title":"socket.info/0","ref":"socket.html#t:info/0"},{"type":"type","doc":"Information element designators for the `i/1` and `i/2` functions.","title":"socket.info_keys/0","ref":"socket.html#t:info_keys/0"},{"type":"type","doc":"The interface type (of the datalink). We only translate a few values to atoms,\nthe rest are left as (unsigned) integer values.","title":"socket.interface_type/0","ref":"socket.html#t:interface_type/0"},{"type":"type","doc":"","title":"socket.invalid/0","ref":"socket.html#t:invalid/0"},{"type":"type","doc":"","title":"socket.ioctl_device_flag/0","ref":"socket.html#t:ioctl_device_flag/0"},{"type":"type","doc":"","title":"socket.ioctl_device_map/0","ref":"socket.html#t:ioctl_device_map/0"},{"type":"type","doc":"C: `struct ip_mreq`\n\nCorresponds to the C `struct ip_mreq` for managing multicast groups.","title":"socket.ip_mreq/0","ref":"socket.html#t:ip_mreq/0"},{"type":"type","doc":"C: `struct ip_mreq_source`\n\nCorresponds to the C `struct ip_mreq_source` for managing multicast groups.","title":"socket.ip_mreq_source/0","ref":"socket.html#t:ip_mreq_source/0"},{"type":"type","doc":"C: `struct ip_msfilter`\n\nCorresponds to the C `struct ip_msfilter` for managing\nmulticast source filtering (RFC 3376).","title":"socket.ip_msfilter/0","ref":"socket.html#t:ip_msfilter/0"},{"type":"type","doc":"C: `struct ip_pktinfo`","title":"socket.ip_pktinfo/0","ref":"socket.html#t:ip_pktinfo/0"},{"type":"type","doc":"C: `IP_PMTUDISC_*` values.\n\nLowercase `t:atom/0` values corresponding to the C library constants\n`IP_PMTUDISC_*`. Some constant(s) may be unsupported by the platform.","title":"socket.ip_pmtudisc/0","ref":"socket.html#t:ip_pmtudisc/0"},{"type":"type","doc":"C: `IPTOS_*` values.\n\nLowercase `t:atom/0` values corresponding to the C library constants `IPTOS_*`.\nSome constant(s) may be unsupported by the platform.","title":"socket.ip_tos/0","ref":"socket.html#t:ip_tos/0"},{"type":"type","doc":"IPv6 hop limit value.\n\nThe value `default` is only valid to _set_ and is translated to the C value\n`-1`, meaning the route default.","title":"socket.ipv6_hops/0","ref":"socket.html#t:ipv6_hops/0"},{"type":"type","doc":"C: `struct ipv6_mreq`\n\nCorresponds to the C `struct ipv6_mreq` for managing multicast groups. See also\nRFC 2553.","title":"socket.ipv6_mreq/0","ref":"socket.html#t:ipv6_mreq/0"},{"type":"type","doc":"C: `struct in6_pktinfo`","title":"socket.ipv6_pktinfo/0","ref":"socket.html#t:ipv6_pktinfo/0"},{"type":"type","doc":"C: `IPV6_PMTUDISC_*` values\n\nLowercase `t:atom/0` values corresponding to the C library constants\n`IPV6_PMTUDISC_*`. Some constant(s) may be unsupported by the platform.","title":"socket.ipv6_pmtudisc/0","ref":"socket.html#t:ipv6_pmtudisc/0"},{"type":"type","doc":"Protocol level.\n\nA lowercase `t:atom/0` OS protocol level, that is:\n`socket` or a `t:protocol/0` name.\n\n`socket` is the `SOL_SOCKET` protocol level in the OS header files,\nwith options named `SO_`\\* .","title":"socket.level/0","ref":"socket.html#t:level/0"},{"type":"type","doc":"C: `struct linger`\n\nCorresponds to the C `struct linger` for managing the\n[socket option](`t:socket_option/0`) `{socket, linger}`.","title":"socket.linger/0","ref":"socket.html#t:linger/0"},{"type":"type","doc":"C: `struct msghdr`","title":"socket.msg/0","ref":"socket.html#t:msg/0"},{"type":"type","doc":"Platform dependent message flags.\n\nTranslates to/from message flag constants on the platform.\nThese flags are lowercase while the constants are uppercase\nwith prefix `MSG_`; for example `oob` translates to `MSG_OOB`.\n\nSome flags are only used for sending, some only for receiving, some in received\ncontrol messages, and some for several of these. Not all flags are supported on\nall platforms. See the platform's documentation,\n[`supports(msg_flags)`](`supports/1`), and\n[`is_supported(msg_flags, MsgFlag)`](`is_supported/2`).","title":"socket.msg_flag/0","ref":"socket.html#t:msg_flag/0"},{"type":"type","doc":"Message returned by [`recvmsg/1,2,3,5`](`recvmsg/1`).\n\nCorresponds to a C `struct msghdr`, see your platform documentation for\n[`recvmsg(2)`](`recvmsg/1`).\n\n- **`addr`** - Optional peer address, used on unconnected sockets. Corresponds\n to `msg_name` and `msg_namelen` fields of a `struct msghdr`. If `NULL` the map\n key is not present.\n\n- **`iov`** - Data as a list of binaries. The `msg_iov` and `msg_iovlen` fields\n of a `struct msghdr`.\n\n- **`ctrl`** - A possibly empty list of control messages (CMSG). Corresponds to\n the `msg_control` and `msg_controllen` fields of a `struct msghdr`.\n\n- **`flags`** - Message flags. Corresponds to the `msg_flags` field of a\n `struct msghdr`. Unknown flags, if any, are returned in one `t:integer/0`,\n last in the containing list.","title":"socket.msg_recv/0","ref":"socket.html#t:msg_recv/0"},{"type":"type","doc":"Message sent by [`sendmsg/2,3,4`](`sendmsg/2`).\n\nCorresponds to a C `struct msghdr`, see your platform documentation for\n`sendmsg(2)`.\n\n- **`addr`** - Optional peer address, used on unconnected sockets. Corresponds\n to `msg_name` and `msg_namelen` fields of a `struct msghdr`. If not used they\n are set to `NULL`, `0`.\n\n- **`iov`** - Mandatory data as a list of binaries. The `msg_iov` and\n `msg_iovlen` fields of a `struct msghdr`.\n\n- **`ctrl`** - Optional list of control messages (CMSG). Corresponds to the\n `msg_control` and `msg_controllen` fields of a `struct msghdr`. If not used\n they are set to `NULL`, `0`.\n\nThe `msg_flags` field of the `struct msghdr` is set to `0`.","title":"socket.msg_send/0","ref":"socket.html#t:msg_send/0"},{"type":"type","doc":"","title":"socket.native_value/0","ref":"socket.html#t:native_value/0"},{"type":"type","doc":"Protocol level `otp` socket option.\n\nSocket options for the `otp` pseudo protocol level,\nthat is: `{otp, Name}` options.\n\nThis protocol level is the Erlang/OTP's socket implementation layer,\nhence above all OS protocol levels.\n\n- **`debug`** - `t:boolean/0` \\- Activate debug logging.\n\n- **`iow`** - `t:boolean/0` \\- Inform On Wrap of statistics counters.\n\n- **`controlling_process`** - `t:pid/0` \\- The socket \"owner\". Only the current\n controlling process can set this option.\n\n- **`rcvbuf`** -\n `BufSize :: (default | integer()>0) | {N :: integer()>0, BufSize :: (default | integer()>0)} `\\-\n Receive buffer size.\n\n The value `default` is only valid to _set_.\n\n `N` specifies the number of read attempts to do in a tight loop before\n assuming no more data is pending.\n\n This is the allocation size for the receive buffer used when calling the OS\n protocol stack's receive API, when no specific size (size 0) is requested.\n When the receive function returns the receive buffer is reallocated to the\n actually received size. If the data is copied or shrunk in place is up to\n the allocator, and can to some extent be configured in the Erlang VM.\n\n The similar socket option; `{socket,rcvbuf}` is a related option for the OS'\n protocol stack that on Unix corresponds to `SOL_SOCKET,SO_RCVBUF`.\n\n- **`rcvctrlbuf`** - `BufSize :: (default | integer()>0) `\\- Allocation size for\n the ancillary data buffer used when calling the OS protocol stack's receive\n API.\n\n The value `default` is only valid to _set_.\n\n- **`sndctrlbuf`** - `BufSize :: (default | integer()>0) `\\- Allocation size for\n the ancillary data buffer used when calling the OS protocol stack's\n [sendmsg](`sendmsg/2`) API.\n\n The value `default` is only valid to _set_.\n\n It is the user's responsibility to set a buffer size that has room for the\n encoded ancillary data in the message to send.\n\n See [sendmsg](`sendmsg/2`) and also the `ctrl` field of the `t:msg_send/0`\n type.\n\n- **`fd`** - `t:integer/0` \\- Only valid to _get_. The OS protocol levels'\n socket descriptor. Functions [`open/1,2`](`open/1`) can be used to create a\n socket according to this module from an existing OS socket descriptor.\n\n- **`use_registry`** - `t:boolean/0` \\- Only valid to _get_. The value is set\n when the socket is created with `open/2` or `open/4`.\n\nOptions not described here are intentionally undocumented and for Erlang/OTP\ninternal use only.","title":"socket.otp_socket_option/0","ref":"socket.html#t:otp_socket_option/0"},{"type":"type","doc":"","title":"socket.packet_type/0","ref":"socket.html#t:packet_type/0"},{"type":"type","doc":"","title":"socket.port_number/0","ref":"socket.html#t:port_number/0"},{"type":"type","doc":"Posix error codes.\n\nLocal alias for `t:inet:posix/0`, a set of `t:atom/0`s.","title":"socket.posix/0","ref":"socket.html#t:posix/0"},{"type":"type","doc":"Protocol name.\n\nA lowercase `t:atom/0` representing an OS protocol name.\nTo be used for example in `t:socket_option/0`\nin [control messages](`t:cmsg/0`).\n\nThey have the following names in the OS header files:\n\n- **`ip`** - `IPPROTO_IP` a.k.a `SOL_IP` with options named `IP_`\\*.\n\n- **`ipv6`** - `IPPROTO_IPV6` a.k.a `SOL_IPV6` with options named `IPV6_`\\*.\n\n- **`tcp`** - `IPPROTO_TCP` with options named `TCP_`\\*.\n\n- **`udp`** - `IPPROTO_UDP` with options named `UDP_`\\*.\n\n- **`sctp`** - `IPPROTO_SCTP` with options named `SCTP_`\\*.\n\nThere are many other possible protocols, but the ones above are those for which\nthis socket library implements socket options and/or control messages.\n\nAll protocols known to the OS are enumerated when the Erlang VM is started,\nthrough the `C` library call `getprotoent()`. See the OS man page for\nprotocols(5). Those in the list above are valid if supported by the platform,\neven if they aren't enumerated.\n\nThe calls [`is_supported(ipv6)` ](`is_supported/1`)\nand [`is_supported(sctp)` ](`is_supported/1`) can be used to find out\nif the protocols `ipv6` and `sctp` are supported on the platform\nas in appropriate header file and library exists.\n\nThe call [`is_supported(protocols, Protocol)` ](`is_supported/2`)\ncan only be used to find out if the platform knows the protocol number\nfor a named `Protocol`.\n\nSee [`open/2,3,4`](`open/3`)","title":"socket.protocol/0","ref":"socket.html#t:protocol/0"},{"type":"type","doc":"C: `struct sctp_assocparams`","title":"socket.sctp_assocparams/0","ref":"socket.html#t:sctp_assocparams/0"},{"type":"type","doc":"C: `struct sctp_event_subscribe`.\n\nNot all fields are implemented on all platforms; unimplemented fields are\nignored, but implemented fields are mandatory. Note that the '\\_event' suffixes\nhave been stripped from the C struct field names, for convenience.","title":"socket.sctp_event_subscribe/0","ref":"socket.html#t:sctp_event_subscribe/0"},{"type":"type","doc":"C: `struct sctp_initmsg`.","title":"socket.sctp_initmsg/0","ref":"socket.html#t:sctp_initmsg/0"},{"type":"type","doc":"C: `struct sctp_rtoinfo`.","title":"socket.sctp_rtoinfo/0","ref":"socket.html#t:sctp_rtoinfo/0"},{"type":"type","doc":"[Select operation](#asynchronous-calls) handle.\n\nA `t:reference/0` that uniquely identifies the (select) operation,\ncontained in the returned `t:select_info/0`.","title":"socket.select_handle/0","ref":"socket.html#t:select_handle/0"},{"type":"type","doc":"[Select operation](#asynchronous-calls) info.\n\nReturned by an operation that requires the caller to wait for a\n[select message](`m:socket#asynchronous-calls`) containing the\n[`SelectHandle`](`t:select_handle/0`).","title":"socket.select_info/0","ref":"socket.html#t:select_info/0"},{"type":"type","doc":"[Select operation](#asynchronous-calls) tag.\n\nA tag that describes the (select) operation (= function name),\ncontained in the returned `t:select_info/0`.","title":"socket.select_tag/0","ref":"socket.html#t:select_tag/0"},{"type":"type","doc":"","title":"socket.sockaddr/0","ref":"socket.html#t:sockaddr/0"},{"type":"type","doc":"C: `struct sockaddr_dl`\n\nLink level address (PF_LINK) on BSD:s.","title":"socket.sockaddr_dl/0","ref":"socket.html#t:sockaddr_dl/0"},{"type":"type","doc":"C: `struct sockaddr_in6`\n\n[Domain `inet6`](`t:domain/0`) (IPv6) address.","title":"socket.sockaddr_in6/0","ref":"socket.html#t:sockaddr_in6/0"},{"type":"type","doc":"C: `struct sockaddr_in`\n\n[Domain `inet`](`t:domain/0`) (IPv4) address.","title":"socket.sockaddr_in/0","ref":"socket.html#t:sockaddr_in/0"},{"type":"type","doc":"C: `struct sockaddr_ll`\n\n[Domain `packet`](`t:domain/0`), [type `raw`](`t:type/0`)\n(link level) address.","title":"socket.sockaddr_ll/0","ref":"socket.html#t:sockaddr_ll/0"},{"type":"type","doc":"C: `struct sockaddr`\n\nIn C, a `struct sockaddr` with the integer value of `sa_family`\nin the `t:map/0` key `family`,\nand the content of `sa_data` in the `t:map/0` key `addr`.","title":"socket.sockaddr_native/0","ref":"socket.html#t:sockaddr_native/0"},{"type":"type","doc":"","title":"socket.sockaddr_recv/0","ref":"socket.html#t:sockaddr_recv/0"},{"type":"type","doc":"C: `struct sockaddr_un`.\n\nA Unix Domain socket address, a.k.a local address (`AF_LOCAL`).\n\nThe `path` element will always be a `binary` when returned from this module.\nWhen supplied to an API function in this module it may be a `t:string/0`, which\nwill be encoded into a binary according to the\n[native file name encoding ](`file:native_name_encoding/0`)on the platform.\n\nA terminating zero character will be appended before the address path is given\nto the OS, and the terminating zero will be stripped before giving the address\npath to the caller.\n\nLinux's non-portable abstract socket address extension is handled by not doing\nany terminating zero processing in either direction, if the first byte of the\naddress is zero.","title":"socket.sockaddr_un/0","ref":"socket.html#t:sockaddr_un/0"},{"type":"type","doc":"C: `struct sockaddr` of `AF_UNSPEC`\n\nIn C, a `struct sockaddr` with `sa_family = AF_UNSPEC`\nand the content of `sa_data` in the `t:map/0` key `addr`.","title":"socket.sockaddr_unspec/0","ref":"socket.html#t:sockaddr_unspec/0"},{"type":"type","doc":"A socket, according to this module.\n\nCreated and returned by [`open/1,2,3,4`](`open/1`)\nand [`accept/1,2`](`accept/1`).","title":"socket.socket/0","ref":"socket.html#t:socket/0"},{"type":"type","doc":"A `t:map/0` of `Name := Counter` associations.","title":"socket.socket_counters/0","ref":"socket.html#t:socket_counters/0"},{"type":"opaque","doc":"Opaque socket handle unique for the socket.","title":"socket.socket_handle/0","ref":"socket.html#t:socket_handle/0"},{"type":"type","doc":"","title":"socket.socket_info/0","ref":"socket.html#t:socket_info/0"},{"type":"type","doc":"Socket option.\n\nSocket options on the form `{Level, Opt}` where the OS protocol `Level` =\n`t:level/0` and `Opt` is a socket option on that protocol level.\n\nThe OS name for an options is, except where otherwise noted, the `Opt` atom, in\ncapitals, with prefix according to `t:level/0`.\n\n> #### Note {: .info }\n>\n> The `IPv6` option `pktoptions` is a special (barf) case. It is intended for\n> backward compatibility usage only.\n>\n> Do _not_ use this option.\n\n> #### Note {: .info }\n>\n> See the OS documentation for every socket option.\n\nAn option below that has the value type `t:boolean/0` will translate the value\n`false` to a C `int` with value `0`, and the value `true` to `!!0` (not (not\nfalse)).\n\nAn option with value type `t:integer/0` will be translated to a C `int` that may\nhave a restricted range, for example byte: `0..255`. See the OS documentation.\n\nThe calls [`supports(options)`](`supports/1`),\n[`supports(options, Level)`](`supports/1`) and\n[`is_supported(options, {Level, Opt})` ](`is_supported/2`)can be used to find\nout which socket options that are supported by the platform.\n\n_Options for protocol level_ [_`socket`_:](`t:level/0`)\n\n- **`{socket, acceptconn}`** - `Value = boolean()`\n\n- **`{socket, bindtodevice}`** - `Value = string()`\n\n- **`{socket, broadcast}`** - `Value = boolean()`\n\n- **`{socket, debug}`** - `Value = integer()`\n\n- **`{socket, domain}`** - `Value =` `t:domain/0`\n\n Only valid to _get_.\n\n The socket's protocol domain. Does _not_ work on for instance FreeBSD.\n\n- **`{socket, dontroute}`** - `Value = boolean()`\n\n- **`{socket, keepalive}`** - `Value = boolean()`\n\n- **`{socket, linger}`** - `Value = abort |` `t:linger/0`\n\n The value `abort` is shorthand for `#{onoff => true, linger => 0}`, and only\n valid to _set_.\n\n- **`{socket, oobinline}`** - `Value = boolean()`\n\n- **`{socket, passcred}`** - `Value = boolean()`\n\n- **`{socket, peek_off}`** - `Value = integer()`\n\n Currently disabled due to a possible infinite loop when calling\n [`recv/1-4`](`recv/1`) with [`peek`](`t:msg_flag/0`) in `Flags`.\n\n- **`{socket, priority}`** - `Value = integer()`\n\n- **`{socket, protocol}`** - `Value =` `t:protocol/0`\n\n Only valid to _get_.\n\n The socket's protocol. Does _not_ work on for instance Darwin.\n\n- **`{socket, rcvbuf}`** - `Value = integer()`\n\n- **`{socket, rcvlowat}`** - `Value = integer()`\n\n- **`{socket, rcvtimeo}`** - `Value =` `t:timeval/0`\n\n This option is unsupported per default; OTP has to be explicitly built with\n the `--enable-esock-rcvsndtimeo` configure option for this to be available.\n\n Since our implementation uses non-blocking sockets, it is unknown if and how\n this option works, or even if it may cause malfunction. Therefore, we do not\n recommend setting this option.\n\n Instead, use the `Timeout` argument to, for instance, the `recv/3` function.\n\n- **`{socket, reuseaddr}`** - `Value = boolean()`\n\n- **`{socket, reuseport}`** - `Value = boolean()`\n\n- **`{socket, sndbuf}`** - `Value = integer()`\n\n- **`{socket, sndlowat}`** - `Value = integer()`\n\n- **`{socket, sndtimeo}`** - `Value =` `t:timeval/0`\n\n This option is unsupported per default; OTP has to be explicitly built with\n the `--enable-esock-rcvsndtimeo` configure option for this to be available.\n\n Since our implementation uses non-blocking sockets, it is unknown if and how\n this option works, or even if it may cause malfunction. Therefore, we do not\n recommend setting this option.\n\n Instead, use the `Timeout` argument to, for instance, the `send/3` function.\n\n- **`{socket, timestamp}`** - `Value = boolean()`\n\n- **`{socket, type}`** - `Value =` `t:type/0`\n\n Only valid to _get_.\n\n The socket's type.\n\n_Options for protocol level_ [_`ip`_:](`t:level/0`)\n\n- **`{ip, add_membership}`** - `Value =` `t:ip_mreq/0`\n\n Only valid to _set_.\n\n- **`{ip, add_source_membership}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n- **`{ip, block_source}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n- **`{ip, drop_membership}`** - `Value =` `t:ip_mreq/0`\n\n Only valid to _set_.\n\n- **`{ip, drop_source_membership}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n- **`{ip, freebind}`** - `Value = boolean()`\n\n- **`{ip, hdrincl}`** - `Value = boolean()`\n\n- **`{ip, minttl}`** - `Value = integer()`\n\n- **`{ip, msfilter}`** - `Value =` `null |` `t:ip_msfilter/0`\n\n Only valid to _set_.\n\n The value `null` passes a `NULL` pointer and size `0` to the C library call.\n\n- **`{ip, mtu}`** - `Value = integer()`\n\n Only valid to _get_.\n\n- **`{ip, mtu_discover}`** - `Value =`\n [`ip_pmtudisc()` ](`t:ip_pmtudisc/0`)`| integer()`\n\n An `t:integer/0` value according to the platform's header files.\n\n- **`{ip, multicast_all}`** - `Value = boolean()`\n\n- **`{ip, multicast_if}`** - `Value =` `any |` `t:in_addr/0`\n\n- **`{ip, multicast_loop}`** - `Value = boolean()`\n\n- **`{ip, multicast_ttl}`** - `Value = integer()`\n\n- **`{ip, nodefrag}`** - `Value = boolean()`\n\n- **`{ip, pktinfo}`** - `Value = boolean()`\n\n- **`{ip, recvdstaddr}`** - `Value = boolean()`\n\n- **`{ip, recverr}`** - `Value = boolean()`\n\n Enable extended reliable error message passing.\n\n _Warning\\!_ When this option is enabled, error messages may arrive on the\n socket's error queue, which should be read using the message flag\n [`errqueue`](`t:msg_flag/0`), and using [`recvmsg/1,2,3,4,5`](`recvmsg/1`) to\n get all error information in the [message's](`t:msg_recv/0`) `ctrl` field as a\n [control message](`t:cmsg_recv/0`) `#{level := ip, type := recverr}`.\n\n A working strategy should be to first poll the error queue using\n [`recvmsg/2,3,4` ](`m:socket#recvmsg-timeout`)with `Timeout =:= 0` and `Flags`\n containing `errqueue` (ignore the return value `{error, timeout}`) before\n reading the actual data to ensure that the error queue gets cleared. And read\n the data using one of the `nowait |`\n [`select_handle()` ](`t:select_handle/0`)recv functions:\n [`recv/3,4`](`m:socket#recv-nowait`),\n [`recvfrom/3,4`](`m:socket#recvfrom-nowait`) or\n [`recvmsg/3,4,5`](`m:socket#recvmsg-nowait`). Otherwise you might accidentally\n cause a busy loop in and out of 'select' for the socket.\n\n- **`{ip, recvif}`** - `Value = boolean()`\n\n- **`{ip, recvopts}`** - `Value = boolean()`\n\n- **`{ip, recvorigdstaddr}`** - `Value = boolean()`\n\n- **`{ip, recvtos}`** - `Value = boolean()`\n\n- **`{ip, recvttl}`** - `Value = boolean()`\n\n- **`{ip, retopts}`** - `Value = boolean()`\n\n- **`{ip, router_alert}`** - `Value = integer()`\n\n- **`{ip, sendsrcaddr}`** - `Value = boolean()`\n\n- **`{ip, tos}`** - `Value =` [`ip_tos()` ](`t:ip_tos/0`)`| integer()`\n\n An `t:integer/0` value is according to the platform's header files.\n\n- **`{ip, transparent}`** - `Value = boolean()`\n\n- **`{ip, ttl}`** - `Value = integer()`\n\n- **`{ip, unblock_source}`** - `Value =` `t:ip_mreq_source/0`\n\n Only valid to _set_.\n\n_Options for protocol level_ [_`ipv6`_:](`t:level/0`)\n\n- **`{ipv6, addrform}`** - `Value =` `t:domain/0`\n\n As far as we know the only valid value is `inet` and it is only allowed for an\n IPv6 socket that is connected and bound to an IPv4-mapped IPv6 address.\n\n- **`{ipv6, add_membership}`** - `Value =` `t:ipv6_mreq/0`\n\n Only valid to _set_.\n\n- **`{ipv6, authhdr}`** - `Value = boolean()`\n\n- **`{ipv6, drop_membership}`** - `Value =` `t:ipv6_mreq/0`\n\n Only valid to _set_.\n\n- **`{ipv6, dstopts}`** - `Value = boolean()`\n\n- **`{ipv6, flowinfo}`** - `Value = boolean()`\n\n- **`{ipv6, hoplimit}`** - `Value = boolean()`\n\n- **`{ipv6, hopopts}`** - `Value = boolean()`\n\n- **`{ipv6, mtu}`** - `Value = integer()`\n\n- **`{ipv6, mtu_discover}`** - `Value =`\n [`ipv6_pmtudisc()` ](`t:ipv6_pmtudisc/0`)`| integer()`\n\n An `t:integer/0` value is according to the platform's header files.\n\n- **`{ipv6, multicast_hops}`** - `Value =` `t:ipv6_hops/0`\n\n- **`{ipv6, multicast_if}`** - `Value = integer()`\n\n- **`{ipv6, multicast_loop}`** - `Value = boolean()`\n\n- **`{ipv6, recverr}`** - `Value = boolean()`\n\n _Warning\\!_ See the socket option `{ip, recverr}` regarding the socket's error\n queue. The same warning applies for this option.\n\n- **`{ipv6, recvhoplimit}`** - `Value = boolean()`\n\n- **`{ipv6, recvpktinfo}`** - `Value = boolean()`\n\n- **`{ipv6, recvtclass}`** - `Value = boolean()`\n\n- **`{ipv6, router_alert}`** - `Value = integer()`\n\n- **`{ipv6, rthdr}`** - `Value = boolean()`\n\n- **`{ipv6, tclass}`** - `Value = boolean()`\n\n- **`{ipv6, unicast_hops}`** - `Value =` `t:ipv6_hops/0`\n\n- **`{ipv6, v6only}`** - `Value = boolean()`\n\n_Options for protocol level_ [_`sctp`_](`t:level/0`). See also RFC 6458.\n\n- **`{sctp, associnfo}`** - `Value =` `t:sctp_assocparams/0`\n\n- **`{sctp, autoclose}`** - `Value = integer()`\n\n- **`{sctp, disable_fragments}`** - `Value = boolean()`\n\n- **`{sctp, events}`** - `Value =` `t:sctp_event_subscribe/0`\n\n Only valid to _set_.\n\n- **`{sctp, initmsg}`** - `Value =` `t:sctp_initmsg/0`\n\n- **`{sctp, maxseg}`** - `Value = integer()`\n\n- **`{sctp, nodelay}`** - `Value = boolean()`\n\n- **`{sctp, rtoinfo}`** - `Value =` `t:sctp_rtoinfo/0`\n\n_Options for protocol level_ [_`tcp`:_](`t:level/0`)\n\n- **`{tcp, congestion}`** - `Value = string()`\n\n- **`{tcp, cork}`** - `Value = boolean()`\n\n- **`{tcp, maxseg}`** - `Value = integer()`\n\n- **`{tcp, nodelay}`** - `Value = boolean()`\n\n_Options for protocol level_ [_`udp`:_](`t:level/0`)\n\n- **`{udp, cork}`** - `Value = boolean()`","title":"socket.socket_option/0","ref":"socket.html#t:socket_option/0"},{"type":"type","doc":"C: `struct timeval`\n\nCorresponds to the C `struct timeval`. The field `sec` holds seconds, and `usec`\nmicroseconds.","title":"socket.timeval/0","ref":"socket.html#t:timeval/0"},{"type":"type","doc":"Protocol type.\n\nA lowercase `t:atom/0` representing a protocol _type_\non the platform named `SOCK_*`. For example\n`stream` corresponds to `SOCK_STREAM`.","title":"socket.type/0","ref":"socket.html#t:type/0"},{"type":"module","doc":"`disk_log` is a disk-based term logger that enables efficient logging of items\non files.\n\nThree types of logs are supported:\n\n- **halt logs** - Appends items to a single file, which size can be limited by\n the `disk_log` module.\n\n- **wrap logs** - Uses a sequence of wrap log files of limited size. As a wrap\n log file is filled up, further items are logged on to the next file in the\n sequence, starting all over with the first file when the last file is filled\n up.\n\n- **rotate logs** - Uses a sequence of rotate log files of limited size. As a\n log file is filled up, it is rotated and then compressed. There is one active\n log file and upto the configured number of compressed log files. Only\n externally formatted logs are supported. It follows the same naming convention\n as the handler logger_std_h for Logger. For more details about the naming\n convention check the file parameter for `open/1`.\n\n It follows the same naming convention as that for the compressed files for\n Linux's logrotate and BSD's newsyslog.\n\nFor efficiency reasons, items are always written to files as binaries.\n\nTwo formats of the log files are supported:\n\n- **internal format** - Supports automatic repair of log files that are not\n properly closed and enables efficient reading of logged items in _chunks_\n using a set of functions defined in this module. This is the only way to read\n internally formatted logs. An item logged to an internally formatted log must\n not occupy more than 4 GB of disk space (the size must fit in 4 bytes).\n\n- **external format** - Leaves it up to the user to read and interpret the\n logged data. The `disk_log` module cannot repair externally formatted logs.\n\nFor each open disk log, one process handles requests made to the disk log. This\nprocess is created when `open/1` is called, provided there exists no process\nhandling the disk log. A process that opens a disk log can be an _owner_ or an\nanonymous _user_ of the disk log. Each owner is linked to the disk log process,\nand an owner can close the disk log either explicitly (by calling\n[`close/1`](`close/1`)) or by terminating.\n\nOwners can subscribe to _notifications_, messages of the form\n`{disk_log, Node, Log, Info}`, which are sent from the disk log process when\ncertain events occur, see the functions and in particular the\n[`open/1`](`open/1`) option [`notify`](`m:disk_log#notify`). A log can have many\nowners, but a process cannot own a log more than once. However, the same process\ncan open the log as a user more than once.\n\nFor a disk log process to close its file properly and terminate, it must be\nclosed by its owners and once by some non-owner process for each time the log\nwas used anonymously. The users are counted and there must not be any users left\nwhen the disk log process terminates.\n\nItems can be logged _synchronously_ by using functions `log/2`, `blog/2`,\n`log_terms/2`, and `blog_terms/2`. For each of these functions, the caller is\nput on hold until the items are logged (but not necessarily written, use\n[`sync/1`](`sync/1`) to ensure that). By adding an `a` to each of the mentioned\nfunction names, we get functions that log items _asynchronously_. Asynchronous\nfunctions do not wait for the disk log process to write the items to the file,\nbut return the control to the caller more or less immediately.\n\nWhen using the internal format for logs, use functions `log/2`, `log_terms/2`,\n`alog/2`, and `alog_terms/2`. These functions log one or more Erlang terms. By\nprefixing each of the functions with a `b` (for \"binary\"), we get the\ncorresponding `blog()` functions for the external format. These functions log\none or more chunks of bytes. For example, to log the string `\"hello\"` in ASCII\nformat, you can use [`disk_log:blog(Log, \"hello\")`](`blog/2`), or\n[`disk_log:blog(Log, list_to_binary(\"hello\"))`](`blog/2`). The two alternatives\nare equally efficient.\n\nThe `blog()` functions can also be used for internally formatted logs, but in\nthis case they must be called with binaries constructed with calls to\n[`term_to_binary/1`](`erlang:term_to_binary/1`). There is no check to ensure\nthis, it is entirely the responsibility of the caller. If these functions are\ncalled with binaries that do not correspond to Erlang terms, the\n[`chunk/2,3`](`chunk/3`) and automatic repair functions fail. The corresponding\nterms (not the binaries) are returned when [`chunk/2,3`](`chunk/3`) is called.\n\nAn open disk log is only accessible from the node where the disk log process\nruns. All processes on the node where the disk log process runs can log items or\notherwise change, inspect, or close the log.\n\nErrors are reported differently for asynchronous log attempts and other uses of\nthe `m:disk_log` module. When used synchronously, this module replies with an\nerror message, but when called asynchronously, this module does not know where\nto send the error message. Instead, owners subscribing to notifications receive\nan `error_status` message.\n\nThe `m:disk_log` module does not report errors to the `m:error_logger` module. It\nis up to the caller to decide whether to employ the error logger. Function\n`format_error/1` can be used to produce readable messages from error replies.\nHowever, information events are sent to the error logger in two situations,\nnamely when a log is repaired, or when a file is missing while reading chunks.\n\nError message `no_such_log` means that the specified disk log is not open.\nNothing is said about whether the disk log files exist or not.\n\n> #### Note {: .info }\n>\n> If an attempt to reopen or truncate a log fails (see\n> [`reopen/2,3`](`reopen/3`) and [`truncate/1,2`](`truncate/2`)) the disk log\n> process terminates immediately. Before the process terminates, links to owners\n> and blocking processes (see [`block/1,2`](`block/2`)) are removed. The effect\n> is that the links work in one direction only. Any process using a disk log\n> must check for error message `no_such_log` if some other process truncates or\n> reopens the log simultaneously.","title":"disk_log","ref":"disk_log.html"},{"type":"module","doc":"`m:file`, `m:wrap_log_reader`","title":"See Also - disk_log","ref":"disk_log.html#module-see-also"},{"type":"function","doc":"Returns the names of the disk logs accessible on the current node.","title":"disk_log.all/0","ref":"disk_log.html#all/0"},{"type":"function","doc":"Asynchronously version of `log/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the item cannot be written on the log, and possibly one\nof the messages `wrap`, `full`, or `error_status` if an item is written on the\nlog. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","title":"disk_log.alog/2","ref":"disk_log.html#alog/2"},{"type":"function","doc":"Asynchronously version of `log_terms/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the items cannot be written on the log, and possibly one\nor more of the messages `wrap`, `full`, and `error_status` if items are written\non the log. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","title":"disk_log.alog_terms/2","ref":"disk_log.html#alog_terms/2"},{"type":"function","doc":"Asynchronously version of `blog/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the item cannot be written on the log, and possibly one\nof the messages `wrap`, `full`, or `error_status` if an item is written on the\nlog. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","title":"disk_log.balog/2","ref":"disk_log.html#balog/2"},{"type":"function","doc":"Asynchronously version of `blog_terms/2`.\n\nOwners subscribing to notifications receive message `read_only`, `blocked_log`,\nor `format_external` if the items cannot be written on the log, and possibly one\nor more of the messages `wrap`, `full`, and `error_status` if items are written\non the log. Message `error_status` is sent if something is wrong with the header\nfunction or if a file error occurs.","title":"disk_log.balog_terms/2","ref":"disk_log.html#balog_terms/2"},{"type":"function","doc":"","title":"disk_log.bchunk/2","ref":"disk_log.html#bchunk/2"},{"type":"function","doc":"Equivalent to [`chunk(Log, Continuation, N)`](`chunk/3`) except that\nit returns the binaries read from the file, that is it does not call\n`binary_to_term/1`.","title":"disk_log.bchunk/3","ref":"disk_log.html#bchunk/3"},{"type":"function","doc":"","title":"disk_log.block/1","ref":"disk_log.html#block/1"},{"type":"function","doc":"With a call to `block/2` a process can block a log.\n\nIf the blocking process is not an owner of the log, a temporary link is created\nbetween the disk log process and the blocking process. The link ensures that the disk log is\nunblocked if the blocking process terminates without first closing or unblocking\nthe log.\n\nAny process can probe a blocked log with [`info/1`](`info/1`) or close it with\n[`close/1`](`close/1`). The blocking process can also use functions [`chunk/2,3`](`chunk/3`),\n[`bchunk/2,3`](`chunk/3`), [`chunk_step/3`](`chunk_step/3`), and [`unblock/1`](`unblock/1`)\nwithout being affected by the block. Any other attempt than those mentioned so\nfar to update or read a blocked log suspends the calling process until the log\nis unblocked or returns error message `{blocked_log, Log}`, depending on whether\nthe value of `QueueLogRecords` is `true` or `false`.","title":"disk_log.block/2","ref":"disk_log.html#block/2"},{"type":"function","doc":"Equivalent to `log/2` except that it is used for externally formatted logs.\n\n`blog/2` can also be used for internally formatted logs\nif the binaries are constructed with calls to `term_to_binary/1`.","title":"disk_log.blog/2","ref":"disk_log.html#blog/2"},{"type":"function","doc":"Equivalent to `log_terms/2` except that it is used for externally formatted logs.\n\n`blog_terms/2` can also be used for internally formatted logs\nif the binaries are constructed with calls to `term_to_binary/1`.","title":"disk_log.blog_terms/2","ref":"disk_log.html#blog_terms/2"},{"type":"function","doc":"Equivalent to `reopen` except that it is used for externally formatted logs.","title":"disk_log.breopen/3","ref":"disk_log.html#breopen/3"},{"type":"function","doc":"Equivalent to `truncate/2` for externally formatted logs.","title":"disk_log.btruncate/2","ref":"disk_log.html#btruncate/2"},{"type":"function","doc":"Changes the value of option `head` or `head_func` for an owner of a disk log.","title":"disk_log.change_header/2","ref":"disk_log.html#change_header/2"},{"type":"function","doc":"Changes the value of option `notify` for an owner of a disk log.","title":"disk_log.change_notify/3","ref":"disk_log.html#change_notify/3"},{"type":"function","doc":"Changes the size of an open log. For a halt log, the size can always be\nincreased, but it cannot be decreased to something less than the current file\nsize.\n\nFor a wrap or rotate log, both the size and the number of files can always be\nincreased, as long as the number of files does not exceed 65000. For wrap logs,\nif the maximum number of files is decreased, the change is not valid until the\ncurrent file is full and the log wraps to the next file. The redundant files are\nremoved the next time the log wraps around, that is, starts to log to file\nnumber 1.\n\nAs an example, assume that the old maximum number of files is 10 and that the\nnew maximum number of files is 6. If the current file number is not greater than\nthe new maximum number of files, files 7-10 are removed when file 6 is full and\nthe log starts to write to file number 1 again. Otherwise, the files greater\nthan the current file are removed when the current file is full (for example, if\nthe current file is 8, files 9 and 10 are removed). The files between the new\nmaximum number of files and the current file (that is, files 7 and 8) are\nremoved the next time file 6 is full.\n\nFor rotate logs, if the maximum number of files is decreased, the redundant\nfiles are deleted instantly.\n\nIf the size of the files is decreased, the change immediately affects the\ncurrent log. It does not change the size of log files already full until the\nnext time they are used.\n\nIf the log size is decreased, for example, to save space, function\n`next_file/1`, can be used to force the log to wrap.","title":"disk_log.change_size/2","ref":"disk_log.html#change_size/2"},{"type":"function","doc":"","title":"disk_log.chunk/2","ref":"disk_log.html#chunk/2"},{"type":"function","doc":"Efficiently reads the terms that are appended to an internally formatted log.\n\nIt minimizes disk I/O by reading 64 kilobyte chunks from the file.\n\nThe first time `chunk()` is called, an initial continuation, the\natom `start`, must be provided.\n\nWhen [`chunk/3`](`chunk/3`) is called, `N` controls the maximum number of terms\nthat are read from the log in each chunk. `infinity` means\nthat all the terms contained in the 64 kilobyte chunk are read. If less than `N`\nterms are returned, this does not necessarily mean that the end of the file is\nreached.\n\n`chunk/3` returns a tuple `{Continuation2, Terms}`, where `Terms` is a list of\nterms found in the log. `Continuation2` is yet another continuation, which must\nbe passed on to any subsequent calls to `chunk()`. With a series of calls to\n`chunk()`, all terms from a log can be extracted.\n\n`chunk/3` returns a tuple `{Continuation2, Terms, Badbytes}` if the log is\nopened in read-only mode and the read chunk is corrupt. `Badbytes` is the number\nof bytes in the file found not to be Erlang terms in the chunk. Notice that the\nlog is not repaired. When trying to read chunks from a log opened in read-write\nmode, tuple `{corrupt_log_file, FileName}` is returned if the read chunk is\ncorrupt.\n\n`chunk/3` returns `eof` when the end of the log is reached, or `{error, Reason}`\nif an error occurs. If a wrap log file is missing, a message is output on the\nerror log.\n\nWhen [`chunk/2,3`](`chunk/3`) is used with wrap logs, the returned continuation might not be\nvalid in the next call to `chunk/3`. This is because the log can wrap and delete\nthe file into which the continuation points. To prevent this, the log can be\nblocked during the search.","title":"disk_log.chunk/3","ref":"disk_log.html#chunk/3"},{"type":"function","doc":"Returns the pair `{node, Node}`, describing the chunk continuation returned by\n`chunk/2,3`, [`bchunk/2,3`](`bchunk/3`), or [`chunk_step/3`](`chunk_step/3`).\n\nTerms are read from the disk log running on `Node`.","title":"disk_log.chunk_info/1","ref":"disk_log.html#chunk_info/1"},{"type":"function","doc":"Can be used with [`chunk/2,3`](`chunk/3`) and [`bchunk/2,3`](`chunk/3`) to\nsearch through an internally formatted wrap log.\n\nIt takes as argument a continuation as returned by [`chunk/2,3`](`chunk/3`),\n[`bchunk/2,3`](`bchunk/3`), or [`chunk_step/3`](`chunk_step/3`), and steps\nforward (or backward) `Step` files in the wrap log. The continuation returned,\npoints to the first log item in the new current file.\n\nIf atom `start` is specified as continuation, the first file of the wrap log is\nchosen as the new current file.\n\nIf the wrap log is not full because all files are not yet used,\n`{error, end_of_log}` is returned if trying to step outside the log.","title":"disk_log.chunk_step/3","ref":"disk_log.html#chunk_step/3"},{"type":"function","doc":"Closes a disk log properly.\n\nAn internally formatted log must be closed before the Erlang system is stopped.\nOtherwise, the log is regarded as unclosed and the automatic repair procedure is\nactivated next time the log is opened.\n\nThe disk log process is not terminated as long as there are owners or users of\nthe log. All owners must close the log, possibly by terminating. Also, any other\nprocess, not only the processes that have opened the log anonymously, can\ndecrement the `users` counter by closing the log. Attempts to close a log by a\nprocess that is not an owner are ignored if there are no users.\n\nIf the log is blocked by the closing process, the log is also unblocked.","title":"disk_log.close/1","ref":"disk_log.html#close/1"},{"type":"function","doc":"Given the error returned by any function in this module, this function returns a\ndescriptive string of the error in English.\n\nFor file errors, function [`format_error/1`](`format_error/1`) in module\n[`file`](`file:format_error/1`) is called.","title":"disk_log.format_error/1","ref":"disk_log.html#format_error/1"},{"type":"function","doc":"Forces the internally formatted disk log to start logging to the next log file.\nIt can be used, for example, with [`change_size/2`](`change_size/2`) to reduce\nthe amount of disk space allocated by the disk log.\n\nOwners subscribing to notifications normally receive a `wrap` message, but if an\nerror occurs with a reason tag of `invalid_header` or `file_error`, an\n`error_status` message is sent.","title":"disk_log.inc_wrap_file/1","ref":"disk_log.html#inc_wrap_file/1"},{"type":"function","doc":"Returns a list of `{Tag, Value}` pairs describing a log running on the node.\n\nThe following pairs are returned for all logs:\n\n- **`{name, Log}`** - `Log` is the log name as specified by the\n [`open/1`](`open/1`) option `name`.\n\n- **`{file, File}`** - For halt logs `File` is the filename, and for wrap logs\n `File` is the base name.\n\n- **`{type, Type}`** - `Type` is the log type as specified by the\n [`open/1`](`open/1`) option `type`.\n\n- **`{format, Format}`** - `Format` is the log format as specified by the\n [`open/1`](`open/1`) option `format`.\n\n- **`{size, Size}`** - `Size` is the log size as specified by the\n [`open/1`](`open/1`) option `size`, or the size set by\n [`change_size/2`](`change_size/2`). The value set by\n [`change_size/2`](`change_size/2`) is reflected immediately.\n\n- **`{mode, Mode}`** - `Mode` is the log mode as specified by the\n [`open/1`](`open/1`) option `mode`.\n\n- **`{owners, [{pid(), Notify}]}`** - `Notify` is the value set by the\n [`open/1`](`open/1`) option `notify` or function\n [`change_notify/3`](`change_notify/3`) for the owners of the log.\n\n- **`{users, Users}`** - `Users` is the number of anonymous users of the log,\n see the [`open/1`](`open/1`) option [`linkto`](`m:disk_log#linkto`).\n\n- **`{status, Status}`** - `Status` is `ok` or `{blocked, QueueLogRecords}` as\n set by functions `block/1,2` and [`unblock/1`](`unblock/1`).\n\n- **`{node, Node}`** - The information returned by the current invocation of\n function [`info/1`](`info/1`) is gathered from the disk log process running on\n `Node`.\n\nThe following pairs are returned for all logs opened in `read_write` mode:\n\n- **`{head, Head}`** - Depending on the value of the [`open/1`](`open/1`)\n options `head` and `head_func`, or set by function\n [`change_header/2`](`change_header/2`), the value of `Head` is `none`\n (default), `{head, H}` (`head` option), or `{M,F,A}` (`head_func` option).\n\n- **`{no_written_items, NoWrittenItems}`** - `NoWrittenItems` is the number of\n items written to the log since the disk log process was created.\n\nThe following pair is returned for halt logs opened in `read_write` mode:\n\n- **`{full, Full}`** - `Full` is `true` or `false` depending on whether the halt\n log is full or not.\n\nThe following pairs are returned for wrap logs opened in `read_write` mode:\n\n- **`{no_current_bytes, integer() >= 0}`** - The number of bytes written to the\n current wrap log file.\n\n- **`{no_current_items, integer() >= 0}`** - The number of items written to the\n current wrap log file, header inclusive.\n\n- **`{no_items, integer() >= 0}`** - The total number of items in all wrap log\n files.\n\n- **`{current_file, integer()}`** - The ordinal for the current wrap log file in\n the range `1..MaxNoFiles`, where `MaxNoFiles` is specified by the\n [`open/1`](`open/1`) option `size` or set by\n [`change_size/2`](`change_size/2`).\n\n- **`{no_overflows, {SinceLogWasOpened, SinceLastInfo}}`** - `SinceLogWasOpened`\n (`SinceLastInfo`) is the number of times a wrap log file has been filled up\n and a new one is opened or [`inc_wrap_file/1`](`inc_wrap_file/1`) has been\n called since the disk log was last opened ([`info/1`](`info/1`) was last\n called). The first time `info/2` is called after a log was (re)opened or\n truncated, the two values are equal.\n\nNotice that functions [`chunk/2,3`](`chunk/3`), [`bchunk/2,3`](`bchunk/3`), and\n[`chunk_step/3`](`chunk_step/3`) do not affect any value returned by\n[`info/1`](`info/1`).","title":"disk_log.info/1","ref":"disk_log.html#info/1"},{"type":"function","doc":"Synchronously appends a term to a internally formatted disk log. Returns `ok`\nor `{error, Reason}` when the term is written to disk.\n\nTerms are written by the ordinary `write()` function of the operating system.\nHence, it is not guaranteed that the term is written to disk, it can linger in\nthe operating system kernel for a while. To ensure that the item is written to disk,\nfunction `sync/1` must be called.\n\nOwners subscribing to notifications are notified of an error with an\n`error_status` message if the error reason tag is `invalid_header` or\n`file_error`.","title":"disk_log.log/2","ref":"disk_log.html#log/2"},{"type":"function","doc":"Synchronously appends a list of items to an internally formatted log.\n\nIt is more efficient to use this functions instead of [`log/2`](`log/2`). The specified\nlist is split into as large sublists as possible (limited by the size of wrap log files),\nand each sublist is logged as one single item, which reduces the overhead.\n\nOwners subscribing to notifications are notified of an error with an\n`error_status` message if the error reason tag is `invalid_header` or\n`file_error`.","title":"disk_log.log_terms/2","ref":"disk_log.html#log_terms/2"},{"type":"function","doc":"For wrap logs, it forces the disk log to start logging to the next log file. It\ncan be used, for example, with [`change_size/2`](`change_size/2`) to reduce the\namount of disk space allocated by the disk log.\n\nOwners subscribing to notifications normally receive a `wrap` message, but if an\nerror occurs with a reason tag of `invalid_header` or `file_error`, an\n`error_status` message is sent.\n\nFor rotate logs, it forces rotation of the currently active log file, compresses\nit and opens a new active file for logging.","title":"disk_log.next_file/1","ref":"disk_log.html#next_file/1"},{"type":"function","doc":"Open a new disk_log file for reading or writing.\n\nParameter `ArgL` is a list of the following options:\n\n- **`{name, Log}`** - Specifies the log name. This name must be passed on as a\n parameter in all subsequent logging operations. A name must always be\n supplied.\n\n- **`{file, FileName}`** - Specifies the name of the file to be used for logged\n terms. If this value is omitted and the log name is an atom or a string, the\n filename defaults to `lists:concat([Log, \".LOG\"])` for halt logs.\n\n For wrap logs, this is the base name of the files. Each file in a wrap log is\n called ` .N`, where `N` is an integer. Each wrap log also has two\n files called ` .idx` and ` .siz`.\n\n For rotate logs, this is the name of the active log file. The compressed files\n are named as ` .N.gz`, where `N` is an integer and ` .0.gz`\n is the latest compressed log file. All the compressed files are renamed at\n each rotation so that the latest files have the smallest index. The maximum\n value for N is the value of `MaxNoFiles` minus 1.\n\n- **`{linkto, LinkTo}`[](){: #linkto } ** \n If `LinkTo` is a pid, it becomes an owner of the log. If `LinkTo` is `none`, the\n log records that it is used anonymously by some process by incrementing the `users`\n counter. By default, the process that calls [`open/1`](`open/1`) owns the log.\n\n- **`{repair, Repair}`** - If `Repair` is `true`, the current log file is\n repaired, if needed. As the restoration is initiated, a message is output on\n the error log. If `false` is specified, no automatic repair is attempted.\n Instead, the tuple `{error, {need_repair, Log}}` is returned if an attempt is\n made to open a corrupt log file. If `truncate` is specified, the log file\n becomes truncated, creating an empty log, regardless of previous content.\n Defaults to `true`, which has no effect on logs opened in read-only mode.\n\n- **`{type, Type}`** - The log type. Defaults to `halt`.\n\n- **`{format, Format}`** - Disk log format. Defaults to `internal`.\n\n- **`{size, Size}`** - Log size.\n\n When a halt log has reached its maximum size, all attempts to log more items\n are rejected. Defaults to `infinity`, which for halt implies that there is no\n maximum size.\n\n For wrap and rotate logs, parameter `Size` can be a pair\n `{MaxNoBytes, MaxNoFiles}`. For wrap logs it can also be `infinity`. In the\n latter case, if the files of an existing wrap log with the same name can be\n found, the size is read from the existing wrap log, otherwise an error is\n returned.\n\n Wrap logs write at most `MaxNoBytes` bytes on each file and use `MaxNoFiles`\n files before starting all over with the first wrap log file. Regardless of\n `MaxNoBytes`, at least the header (if there is one) and one item are written\n on each wrap log file before wrapping to the next file.\n\n The first time an existing wrap log is opened, that is, when the disk log\n process is created, the value of the option `size` is allowed to differ from\n the current log size, and the size of the disk log is changed as per\n `change_size/2`.\n\n When opening an existing wrap log, it is not necessary to supply a value for\n option `size`, but if the log is already open, that is, the disk log process\n exists, the supplied value must equal the current log size, otherwise the\n tuple `{error, {size_mismatch, CurrentSize, NewSize}}` is returned.\n\n > #### Note {: .info }\n >\n > Before Erlang/OTP 24.0, the supplied value of option `size` was to be equal\n > to the current log size when opening an existing wrap log for the first\n > time, that is, when creating the disk log process.\n\n Rotate logs write at most `MaxNoBytes` bytes on the active log file and keep\n the latest `MaxNoFiles` compressed files. Regardless of `MaxNoBytes`, at least\n the header (if there is one) and one item are written on each rotate log file\n before rotation.\n\n When opening an already open halt log, option `size` is ignored.\n\n- **`{notify, boolean()}`**{: #notify } - If `true`, the log owners are notified\n when certain log events occur. Defaults to `false`. The owners are sent one of the\n following messages when an event occurs:\n\n - **`{disk_log, Node, Log, {wrap, NoLostItems}}`** - Sent when a wrap log has\n filled up one of its files and a new file is opened. `NoLostItems` is the\n number of previously logged items that were lost when truncating existing\n files.\n\n - **`{disk_log, Node, Log, {truncated, NoLostItems}}`** - Sent when a log is\n truncated or reopened. For halt logs `NoLostItems` is the number of items\n written on the log since the disk log process was created. For wrap logs\n `NoLostItems` is the number of items on all wrap log files.\n\n - **`{disk_log, Node, Log, {read_only, Items}}`** - Sent when an asynchronous\n log attempt is made to a log file opened in read-only mode. `Items` is the\n items from the log attempt.\n\n - **`{disk_log, Node, Log, {blocked_log, Items}}`** - Sent when an\n asynchronous log attempt is made to a blocked log that does not queue log\n attempts. `Items` is the items from the log attempt.\n\n - **`{disk_log, Node, Log, {format_external, Items}}`** - Sent when function\n [`alog/2`](`alog/2`) or [`alog_terms/2`](`alog_terms/2`) is used for\n internally formatted logs. `Items` is the items from the log attempt.\n\n - **`{disk_log, Node, Log, full}`** - Sent when an attempt to log items to a\n wrap log would write more bytes than the limit set by option `size`.\n\n - **`{disk_log, Node, Log, {error_status, Status}}`** - Sent when the error\n status changes. The error status is defined by the outcome of the last\n attempt to log items to the log, or to truncate the log, or the last use of\n function [`sync/1`](`sync/1`), [`inc_wrap_file/1`](`inc_wrap_file/1`), or\n [`change_size/2`](`change_size/2`). `Status` is either `ok` or\n `{error, Error}`, the former is the initial value.\n\n- **`{head, Head}`** - Specifies a header to be written first on the log file.\n If the log is a wrap or rotate log, the item `Head` is written first in each\n new file. `Head` is to be a term if the format is `internal`, otherwise an\n `t:iodata/0`. Defaults to `none`, which means that no header is written first\n on the file.\n\n- **`{head_func, {M,F,A}}`** - Specifies a function to be called each time a new\n log file is opened. The call `M:F(A)` is assumed to return `{ok, Head}`. The\n item `Head` is written first in each file. `Head` is to be a term if the\n format is `internal`, otherwise an `t:iodata/0`.\n\n- **`{mode, Mode}`** - Specifies if the log is to be opened in read-only or\n read-write mode. Defaults to `read_write`.\n\n- **`{quiet, Boolean}`** - Specifies if messages will be sent to `error_logger`\n on recoverable errors with the log files. Defaults to `false`.\n\n[`open/1`](`open/1`) returns `{ok, Log}` if the log file is successfully opened.\nIf the file is successfully repaired, the tuple\n`{repaired, Log, {recovered, Rec}, {badbytes, Bad}}` is returned, where `Rec` is\nthe number of whole Erlang terms found in the file and `Bad` is the number of\nbytes in the file that are non-Erlang terms.\n\nWhen a disk log is opened in read-write mode, any existing log file is checked\nfor. If there is none, a new empty log is created, otherwise the existing file\nis opened at the position after the last logged item, and the logging of items\nstarts from there. If the format is `internal` and the existing file is not\nrecognized as an internally formatted log, a tuple\n`{error, {not_a_log_file, FileName}}` is returned.\n\n[`open/1`](`open/1`) cannot be used for changing the values of options of an\nopen log. When there are prior owners or users of a log, all option values\nexcept `name`, `linkto`, and `notify` are only checked against the values\nsupplied before as option values to function [`open/1`](`open/1`),\n[`change_header/2`](`change_header/2`), [`change_notify/3`](`change_notify/3`),\nor [`change_size/2`](`change_size/2`). Thus, none of the options except `name`\nis mandatory. If some specified value differs from the current value, a tuple\n`{error, {arg_mismatch, OptionName, CurrentValue, Value}}` is returned.\n\n> #### Note {: .info }\n>\n> If an owner attempts to open a log as owner once again, it is acknowledged\n> with the return value `{ok, Log}`, but the state of the disk log is not\n> affected.\n\nA log file can be opened more than once by giving different values to option\n`name` or by using the same file when opening a log on different nodes. It is up\nto the user of module `disk_log` to ensure that not more than one disk log\nprocess has write access to any file, otherwise the file can be corrupted.\n\nIf an attempt to open a log file for the first time fails, the disk log process\nterminates with the EXIT message `{{failed,Reason},[{disk_log,open,1}]}`. The\nfunction returns `{error, Reason}` for all other errors.","title":"disk_log.open/1","ref":"disk_log.html#open/1"},{"type":"function","doc":"Returns the log name given the pid of a disk log process on the current node, or\n`undefined` if the specified pid is not a disk log process.\n\nThis function is meant to be used for debugging only.","title":"disk_log.pid2name/1","ref":"disk_log.html#pid2name/1"},{"type":"function","doc":"Equivalent to [`reopen(Log, File, Head)`](`reopen/3`) where `Head` is\nthe `Head` specified in `open/1`.","title":"disk_log.reopen/2","ref":"disk_log.html#reopen/2"},{"type":"function","doc":"Renames an internally formatted log file to `File` and then recreates a new log file. If a\nwrap/rotate log exists, `File` is used as the base name of the renamed files.\n\nWrites the value of `Head` first in the newly opened log file. The header argument\nis used only once. Next time a wrap/rotate log file is opened, the header given to\n[`open/1`](`open/1`) is used.\n\nOwners subscribing to notifications receive a `truncate` message.\n\nUpon failure to reopen the log, the disk log process terminates with the EXIT\nmessage `{{failed,Error},[{disk_log,Fun,Arity}]}`. Other processes having\nrequests queued receive the message\n`{disk_log, Node, {error, disk_log_stopped}}`.","title":"disk_log.reopen/3","ref":"disk_log.html#reopen/3"},{"type":"function","doc":"Ensures that the contents of the log are written to the disk. This is usually a\nrather expensive operation.","title":"disk_log.sync/1","ref":"disk_log.html#sync/1"},{"type":"function","doc":"Equivalent to [`truncate(Log, Head)`](`truncate/2`) where `Head` is\nthe `Head` specified in `open/1`.\n\nThis function can be used for both internally and externally\nformatted logs.","title":"disk_log.truncate/1","ref":"disk_log.html#truncate/1"},{"type":"function","doc":"Removes all items from an internally formatted disk log. The argument `Head` or\nis written first in the newly truncated log.\n\nThe header argument is used only once. Next time a wrap/rotate log file is opened,\nthe header given to [`open/1`](`open/1`) is used.\n\nOwners subscribing to notifications receive a `truncate` message.\n\nIf the attempt to truncate the log fails, the disk log process terminates with\nthe EXIT message `{{failed,Reason},[{disk_log,Fun,Arity}]}`. Other processes\nhaving requests queued receive the message\n`{disk_log, Node, {error, disk_log_stopped}}`.","title":"disk_log.truncate/2","ref":"disk_log.html#truncate/2"},{"type":"function","doc":"Unblocks a log. A log can only be unblocked by the blocking process.","title":"disk_log.unblock/1","ref":"disk_log.html#unblock/1"},{"type":"type","doc":"","title":"disk_log.bchunk_ret/0","ref":"disk_log.html#t:bchunk_ret/0"},{"type":"type","doc":"","title":"disk_log.block_error_rsn/0","ref":"disk_log.html#t:block_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.chunk_error_rsn/0","ref":"disk_log.html#t:chunk_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.chunk_ret/0","ref":"disk_log.html#t:chunk_ret/0"},{"type":"type","doc":"","title":"disk_log.close_error_rsn/0","ref":"disk_log.html#t:close_error_rsn/0"},{"type":"opaque","doc":"Chunk continuation returned by [`chunk/2,3`](`chunk/3`),\n[`bchunk/2,3`](`bchunk/3`), or [`chunk_step/3`](`chunk_step/3`).","title":"disk_log.continuation/0","ref":"disk_log.html#t:continuation/0"},{"type":"type","doc":"","title":"disk_log.dlog_format/0","ref":"disk_log.html#t:dlog_format/0"},{"type":"type","doc":"","title":"disk_log.dlog_head_opt/0","ref":"disk_log.html#t:dlog_head_opt/0"},{"type":"type","doc":"","title":"disk_log.dlog_info/0","ref":"disk_log.html#t:dlog_info/0"},{"type":"type","doc":"","title":"disk_log.dlog_mode/0","ref":"disk_log.html#t:dlog_mode/0"},{"type":"type","doc":"","title":"disk_log.dlog_optattr/0","ref":"disk_log.html#t:dlog_optattr/0"},{"type":"type","doc":"","title":"disk_log.dlog_option/0","ref":"disk_log.html#t:dlog_option/0"},{"type":"type","doc":"","title":"disk_log.dlog_options/0","ref":"disk_log.html#t:dlog_options/0"},{"type":"type","doc":"","title":"disk_log.dlog_size/0","ref":"disk_log.html#t:dlog_size/0"},{"type":"type","doc":"","title":"disk_log.dlog_type/0","ref":"disk_log.html#t:dlog_type/0"},{"type":"type","doc":"","title":"disk_log.file_error/0","ref":"disk_log.html#t:file_error/0"},{"type":"type","doc":"","title":"disk_log.inc_wrap_error_rsn/0","ref":"disk_log.html#t:inc_wrap_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.invalid_header/0","ref":"disk_log.html#t:invalid_header/0"},{"type":"type","doc":"","title":"disk_log.log/0","ref":"disk_log.html#t:log/0"},{"type":"type","doc":"","title":"disk_log.log_error_rsn/0","ref":"disk_log.html#t:log_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.next_file_error_rsn/0","ref":"disk_log.html#t:next_file_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.notify_ret/0","ref":"disk_log.html#t:notify_ret/0"},{"type":"type","doc":"","title":"disk_log.open_error_rsn/0","ref":"disk_log.html#t:open_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.open_ret/0","ref":"disk_log.html#t:open_ret/0"},{"type":"type","doc":"","title":"disk_log.reopen_error_rsn/0","ref":"disk_log.html#t:reopen_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.sync_error_rsn/0","ref":"disk_log.html#t:sync_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.trunc_error_rsn/0","ref":"disk_log.html#t:trunc_error_rsn/0"},{"type":"type","doc":"","title":"disk_log.unblock_error_rsn/0","ref":"disk_log.html#t:unblock_error_rsn/0"},{"type":"module","doc":"Erlang error logger.\n\n> #### Note {: .info }\n>\n> In Erlang/OTP 21.0, a new API for logging was added. The old `m:error_logger`\n> module can still be used by legacy code, but log events are redirected to the\n> new Logger API. New code should use the Logger API directly.\n>\n> `m:error_logger` is no longer started by default, but is automatically started\n> when an event handler is added with [`error_logger:add_report_handler/1,2`](`error_logger:add_report_handler/2`). The\n> `m:error_logger` module is then also added as a handler to the new logger.\n>\n> See `m:logger` and the [Logging](logger_chapter.md) chapter in the User's\n> Guide for more information.\n\nThe Erlang _error logger_ is an event manager (see\n[OTP Design Principles](`e:system:design_principles.md`) and `m:gen_event`),\nregistered as `m:error_logger`.\n\nError logger is no longer started by default, but is automatically started when\nan event handler is added with\n[`add_report_handler/1,2`](`add_report_handler/1`). The `m:error_logger` module is\nthen also added as a handler to the new logger, causing log events to be\nforwarded from logger to error logger, and consequently to all installed error\nlogger event handlers.\n\nUser-defined event handlers can be added to handle application-specific events.\n\nExisting event handlers provided by STDLIB and SASL are still available, but are\nno longer used by OTP.\n\nWarning events were introduced in Erlang/OTP R9C and are enabled by default as\nfrom Erlang/OTP 18.0. To retain backwards compatibility with existing\nuser-defined event handlers, the warning events can be tagged as `errors` or\n`info` using command-line flag `+W `, thus showing up as\n`ERROR REPORT` or `INFO REPORT` in the logs.\n\n[](){: #events }","title":"error_logger","ref":"error_logger.html"},{"type":"module","doc":"All event handlers added to the error logger must handle the following events.\n`Gleader` is the group leader pid of the process that sent the event, and `Pid`\nis the process that sent the event.\n\n- **`{error, Gleader, {Pid, Format, Data}}`** -\n Generated when [`error_msg/1,2`](`error_msg/2`) or `format/2` is called.\n\n- **`{error_report, Gleader, {Pid, std_error, Report}}`** -\n Generated when [`error_report/1`](`error_report/1`) is called.\n\n- **`{error_report, Gleader, {Pid, Type, Report}}`** -\n Generated when [`error_report/2`](`error_report/2`) is called.\n\n- **`{warning_msg, Gleader, {Pid, Format, Data}}`** -\n Generated when [`warning_msg/1,2`](`warning_msg/2`) is called if warnings are set to\n be tagged as warnings.\n\n- **`{warning_report, Gleader, {Pid, std_warning, Report}}`** -\n Generated when [`warning_report/1`](`warning_report/1`) is called if warnings are\n set to be tagged as warnings.\n\n- **`{warning_report, Gleader, {Pid, Type, Report}}`** - Generated when\n [`warning_report/2`](`warning_report/2`) is called if warnings are set to be\n tagged as warnings.\n\n- **`{info_msg, Gleader, {Pid, Format, Data}}`** -\n Generated when [`info_msg/1,2`](`info_msg/2`) is called.\n\n- **`{info_report, Gleader, {Pid, std_info, Report}}`** -\n Generated when [`info_report/1`](`info_report/1`) is called.\n\n- **`{info_report, Gleader, {Pid, Type, Report}}`** -\n Generated when [`info_report/2`](`info_report/2`) is called.\n\nNotice that some system-internal events can also be received. Therefore a\ncatch-all clause last in the definition of the event handler callback function\n`c:gen_event:handle_event/2` is necessary. This also applies for\n`c:gen_event:handle_info/2`, as the event handler must also take care of some\nsystem-internal messages.","title":"Events - error_logger","ref":"error_logger.html#module-events"},{"type":"module","doc":"`m:gen_event`, `m:logger`, `m:log_mf_h`, [`kernel`](kernel_app.md),\n[`sasl`](`e:sasl:sasl_app.md`)","title":"See Also - error_logger","ref":"error_logger.html#module-see-also"},{"type":"function","doc":"","title":"error_logger.add_report_handler/1","ref":"error_logger.html#add_report_handler/1"},{"type":"function","doc":"Adds a new event handler to the error logger. The event handler must be\nimplemented as a `m:gen_event` callback module.\n\n`Handler` is typically the name of the callback module and `Args` is an optional\nterm (defaults to []) passed to the initialization callback function\n`c:gen_event:init/1`. The function returns `ok` if successful.\n\nThe event handler must be able to handle the events in this module, see section\n[Events](`m:error_logger#module-events`).\n\nThe first time this function is called, `m:error_logger` is added as a Logger\nhandler, and the `m:error_logger` process is started.","title":"error_logger.add_report_handler/2","ref":"error_logger.html#add_report_handler/2"},{"type":"function","doc":"Deletes an event handler from the error logger by calling\n[`gen_event:delete_handler(error_logger, Handler, [])`](`gen_event:delete_handler/3`).\n\nIf no more event handlers exist after the deletion, `m:error_logger` is removed as\na Logger handler, and the `m:error_logger` process is stopped.","title":"error_logger.delete_report_handler/1","ref":"error_logger.html#delete_report_handler/1"},{"type":"function","doc":"","title":"error_logger.error_msg/1","ref":"error_logger.html#error_msg/1"},{"type":"function","doc":"Log a standard error event. The `Format` and `Data` arguments are the same as\nthe arguments of `io:format/2` in STDLIB.\n\nError logger forwards the event to Logger, including metadata that allows\nbackwards compatibility with legacy error logger event handlers.\n\nThe event is handled by the default Logger handler.\n\nThis function is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_ERROR`](`m:logger#module-macros`) macro or\n[`logger:error/1,2,3`](`logger:error/1`) instead.\n\n_Example:_\n\n```text\n1> error_logger:error_msg(\"An error occurred in ~p\", [a_module]).\n=ERROR REPORT==== 22-May-2018::11:18:43.376917 ===\nAn error occurred in a_module\nok\n```\n\n> #### Warning {: .warning }\n>\n> If the Unicode translation modifier (`t`) is used in the format string, all\n> event handlers must ensure that the formatted output is correctly encoded for\n> the I/O device.","title":"error_logger.error_msg/2","ref":"error_logger.html#error_msg/2"},{"type":"function","doc":"Log a standard error event. Error logger forwards the event to Logger, including\nmetadata that allows backwards compatibility with legacy error logger event\nhandlers.\n\nThe event is handled by the default Logger handler.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_ERROR`](`m:logger#module-macros`) macro or\n[`logger:error/1,2,3`](`logger:error/1`) instead.\n\n_Example:_\n\n```text\n2> error_logger:error_report([{tag1,data1},a_term,{tag2,data}]).\n=ERROR REPORT==== 22-May-2018::11:24:23.699306 ===\n tag1: data1\n a_term\n tag2: data\nok\n3> error_logger:error_report(\"Serious error in my module\").\n=ERROR REPORT==== 22-May-2018::11:24:45.972445 ===\nSerious error in my module\nok\n```","title":"error_logger.error_report/1","ref":"error_logger.html#error_report/1"},{"type":"function","doc":"Log a user-defined error event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nError logger also adds a `domain` field with value `[Type]` to this event's\nmetadata, causing the filters of the default Logger handler to discard the\nevent. A different Logger handler, or an error logger event handler, must be\nadded to handle this event.\n\nIt is recommended that `Report` follows the same structure as for\n`error_report/1`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_ERROR`](`m:logger#module-macros`) macro or\n[`logger:error/1,2,3`](`logger:error/1`) instead.","title":"error_logger.error_report/2","ref":"error_logger.html#error_report/2"},{"type":"function","doc":"","title":"error_logger.format/2","ref":"error_logger.html#format/2"},{"type":"function","doc":"Returns [`max(10, Depth)`](`max/2`), where `Depth` is the value of\n[`error_logger_format_depth`](kernel_app.md#error_logger_format_depth) in the\nKernel application, if Depth is an integer. Otherwise, `unlimited` is returned.\n\n> #### Note {: .info }\n>\n> The [`error_logger_format_depth`](kernel_app.md#error_logger_format_depth) variable is\n> [deprecated](kernel_app.md#deprecated-configuration-parameters) since the\n> [Logger API](`m:logger`) was introduced in Erlang/OTP 21.0. The variable, and\n> this function, are kept for backwards compatibility since they still might be\n> used by legacy report handlers.","title":"error_logger.get_format_depth/0","ref":"error_logger.html#get_format_depth/0"},{"type":"function","doc":"","title":"error_logger.info_msg/1","ref":"error_logger.html#info_msg/1"},{"type":"function","doc":"Log a standard information event. The `Format` and `Data` arguments are the same\nas the arguments of `io:format/2` in STDLIB.\n\nError logger forwards the event to Logger, including metadata that allows\nbackwards compatibility with legacy error logger event handlers.\n\nThe event is handled by the default Logger handler.\n\nThese functions are kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_INFO`](`m:logger#module-macros`) macro or\n[`logger:info/1,2,3`](`logger:info/1`) instead.\n\n_Example:_\n\n```text\n1> error_logger:info_msg(\"Something happened in ~p\", [a_module]).\n=INFO REPORT==== 22-May-2018::12:03:32.612462 ===\nSomething happened in a_module\nok\n```\n\n> #### Warning {: .warning }\n>\n> If the Unicode translation modifier (`t`) is used in the format string, all\n> event handlers must ensure that the formatted output is correctly encoded for\n> the I/O device.","title":"error_logger.info_msg/2","ref":"error_logger.html#info_msg/2"},{"type":"function","doc":"Log a standard information event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nThe event is handled by the default Logger handler.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_INFO`](`m:logger#module-macros`) macro or\n[`logger:info/1,2,3`](`logger:info/1`) instead.\n\n_Example:_\n\n```text\n2> error_logger:info_report([{tag1,data1},a_term,{tag2,data}]).\n=INFO REPORT==== 22-May-2018::12:06:35.994440 ===\n tag1: data1\n a_term\n tag2: data\nok\n3> error_logger:info_report(\"Something strange happened\").\n=INFO REPORT==== 22-May-2018::12:06:49.066872 ===\nSomething strange happened\nok\n```","title":"error_logger.info_report/1","ref":"error_logger.html#info_report/1"},{"type":"function","doc":"Log a user-defined information event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nError logger also adds a `domain` field with value `[Type]` to this event's\nmetadata, causing the filters of the default Logger handler to discard the\nevent. A different Logger handler, or an error logger event handler, must be\nadded to handle this event.\n\nIt is recommended that `Report` follows the same structure as for\n`info_report/1`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_INFO`](`m:logger#module-macros`) macro or\n[`logger:info/1,2,3`](`logger:info/1`) instead.","title":"error_logger.info_report/2","ref":"error_logger.html#info_report/2"},{"type":"function","doc":"Enables or disables printout of standard events to a file.\n\nThis is done by adding or deleting the `error_logger_file_h` event handler, and\nthus indirectly adding `m:error_logger` as a Logger handler.\n\nNotice that this function does not manipulate the Logger configuration directly,\nmeaning that if the default Logger handler is already logging to a file, this\nfunction can potentially cause logging to a second file.\n\nThis function is useful as a shortcut during development and testing, but must\nnot be used in a production system. See section [Logging](logger_chapter.md) in\nthe Kernel User's Guide, and the `m:logger` manual page for information about\nhow to configure Logger for live systems.\n\n`Request` is one of the following:\n\n- **`{open, Filename}`** - Opens log file `Filename`. Returns `ok` if\n successful, or `{error, allready_have_logfile}` if logging to file is already\n enabled, or an error tuple if another error occurred (for example, if\n `Filename` cannot be opened). The file is opened with encoding UTF-8.\n\n- **`close`** - Closes the current log file. Returns `ok`, or\n `{error, module_not_found}`.\n\n- **`filename`** - Returns the name of the log file `Filename`, or\n `{error, no_log_file}` if logging to file is not enabled.","title":"error_logger.logfile/1","ref":"error_logger.html#logfile/1"},{"type":"function","doc":"Enables (`Flag == true`) or disables (`Flag == false`) printout of standard\nevents to the terminal.\n\nThis is done by manipulating the Logger configuration. The function is useful as\na shortcut during development and testing, but must not be used in a production\nsystem. See section [Logging](logger_chapter.md) in the Kernel User's Guide, and\nthe `m:logger` manual page for information about how to configure Logger for\nlive systems.","title":"error_logger.tty/1","ref":"error_logger.html#tty/1"},{"type":"function","doc":"Returns the current mapping for warning events.\n\nEvents sent using [`warning_msg/1,2`](`warning_msg/2`) or\n[`warning_report/1,2`](`warning_report/2`) are tagged as errors, warnings\n(default), or info, depending on the value of command-line flag `+W`.\n\n_Example:_\n\n```text\nos$ erl\nErlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]\n\nEshell V5.4.8 (abort with ^G)\n1> error_logger:warning_map().\nwarning\n2> error_logger:warning_msg(\"Warnings tagged as: ~p~n\", [warning]).\n\n=WARNING REPORT==== 11-Aug-2005::15:31:55 ===\nWarnings tagged as: warning\nok\n3>\nUser switch command\n --> q\nos$ erl +W e\nErlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]\n\nEshell V5.4.8 (abort with ^G)\n1> error_logger:warning_map().\nerror\n2> error_logger:warning_msg(\"Warnings tagged as: ~p~n\", [error]).\n\n=ERROR REPORT==== 11-Aug-2005::15:31:23 ===\nWarnings tagged as: error\nok\n```","title":"error_logger.warning_map/0","ref":"error_logger.html#warning_map/0"},{"type":"function","doc":"","title":"error_logger.warning_msg/1","ref":"error_logger.html#warning_msg/1"},{"type":"function","doc":"Log a standard warning event. The `Format` and `Data` arguments are the same as\nthe arguments of `io:format/2` in STDLIB.\n\nError logger forwards the event to Logger, including metadata that allows\nbackwards compatibility with legacy error logger event handlers.\n\nThe event is handled by the default Logger handler. The log level can be changed\nto error or info, see `warning_map/0`.\n\nThese functions are kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_WARNING`](`m:logger#module-macros`) macro or\n[`logger:warning/1,2,3`](`logger:warning/1`) instead.\n\n> #### Warning {: .warning }\n>\n> If the Unicode translation modifier (`t`) is used in the format string, all\n> event handlers must ensure that the formatted output is correctly encoded for\n> the I/O device.","title":"error_logger.warning_msg/2","ref":"error_logger.html#warning_msg/2"},{"type":"function","doc":"Log a standard warning event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nThe event is handled by the default Logger handler. The log level can be changed\nto error or info, see `warning_map/0`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_WARNING`](`m:logger#module-macros`) macro or\n[`logger:warning/1,2,3`](`logger:warning/1`) instead.","title":"error_logger.warning_report/1","ref":"error_logger.html#warning_report/1"},{"type":"function","doc":"Log a user-defined warning event. Error logger forwards the event to Logger,\nincluding metadata that allows backwards compatibility with legacy error logger\nevent handlers.\n\nError logger also adds a `domain` field with value `[Type]` to this event's\nmetadata, causing the filters of the default Logger handler to discard the\nevent. A different Logger handler, or an error logger event handler, must be\nadded to handle this event.\n\nThe log level can be changed to error or info, see `warning_map/0`.\n\nIt is recommended that `Report` follows the same structure as for\n`warning_report/1`.\n\nThis functions is kept for backwards compatibility and must not be used by new\ncode. Use the [`?LOG_WARNING`](`m:logger#module-macros`) macro or\n[`logger:warning/1,2,3`](`logger:warning/1`) instead.","title":"error_logger.warning_report/2","ref":"error_logger.html#warning_report/2"},{"type":"type","doc":"","title":"error_logger.open_error/0","ref":"error_logger.html#t:open_error/0"},{"type":"type","doc":"","title":"error_logger.report/0","ref":"error_logger.html#t:report/0"},{"type":"module","doc":"API module for Logger, the standard logging facility in Erlang/OTP.\n\nThis module implements the main API for logging in Erlang/OTP. To create a log\nevent, use the [API functions](#logging-api-functions) or the log\n[macros](#module-macros), for example:\n\n```erlang\n?LOG_ERROR(\"error happened because: ~p\", [Reason]). % With macro\nlogger:error(\"error happened because: ~p\", [Reason]). % Without macro\n```\n\nTo configure the Logger backend, use\n[Kernel configuration parameters](kernel_app.md#logger) or\n[configuration functions](#configuration-api-functions) in the Logger API.\n\nBy default, the Kernel application installs one log handler at system start.\nThis handler is named `default`. It receives and processes standard log events\nproduced by the Erlang runtime system, standard behaviours and different\nErlang/OTP applications. The log events are by default printed to the terminal.\n\nIf you want your systems logs to be printed to a file instead, you must\nconfigure the default handler to do so. The simplest way is to include the\nfollowing in your [`sys.config`](config.md):\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{config => #{file => \"path/to/file.log\"}}}]}]}].\n```\n\nFor more information about:\n\n- the Logger facility in general, see the [User's Guide](logger_chapter.md).\n- how to configure Logger, see the\n [Configuration](logger_chapter.md#configuration) section in the User's Guide.\n- the built-in handlers, see `m:logger_std_h` and `m:logger_disk_log_h`.\n- the built-in formatter, see `m:logger_formatter`.\n- built-in filters, see `m:logger_filters`.","title":"logger","ref":"logger.html"},{"type":"module","doc":"The following macros are defined in `logger.hrl`, which is included in a module\nwith the directive\n\n```erlang\n -include_lib(\"kernel/include/logger.hrl\").\n```\n\n- `?LOG_EMERGENCY(StringOrReport[,Metadata])`\n- `?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])`\n- `?LOG_ALERT(StringOrReport[,Metadata])`\n- `?LOG_ALERT(FunOrFormat,Args[,Metadata])`\n- `?LOG_CRITICAL(StringOrReport[,Metadata])`\n- `?LOG_CRITICAL(FunOrFormat,Args[,Metadata])`\n- `?LOG_ERROR(StringOrReport[,Metadata])`\n- `?LOG_ERROR(FunOrFormat,Args[,Metadata])`\n- `?LOG_WARNING(StringOrReport[,Metadata])`\n- `?LOG_WARNING(FunOrFormat,Args[,Metadata])`\n- `?LOG_NOTICE(StringOrReport[,Metadata])`\n- `?LOG_NOTICE(FunOrFormat,Args[,Metadata])`\n- `?LOG_INFO(StringOrReport[,Metadata])`\n- `?LOG_INFO(FunOrFormat,Args[,Metadata])`\n- `?LOG_DEBUG(StringOrReport[,Metadata])`\n- `?LOG_DEBUG(FunOrFormat,Args[,Metadata])`\n- `?LOG(Level,StringOrReport[,Metadata])`\n- `?LOG(Level,FunOrFormat,Args[,Metadata])`\n\nAll macros expand to a call to Logger, where `Level` is taken from the macro\nname, or from the first argument in the case of the `?LOG` macro. Location data\nis added to the metadata as described under the `t:metadata/0` type definition.\n\nThe call is wrapped in a case statement and will be evaluated only if `Level` is\nequal to or below the configured log level.","title":"Macros - logger","ref":"logger.html#module-macros"},{"type":"module","doc":"[`config`](config.md), `m:erlang`, `m:io`, `m:logger_disk_log_h`,\n`m:logger_filters`, `m:logger_handler`, `m:logger_formatter`, `m:logger_std_h`,\n`m:unicode`","title":"See Also - logger","ref":"logger.html#module-see-also"},{"type":"function","doc":"Add a handler with the given configuration.\n\n`HandlerId` is a unique identifier which must be used in all subsequent calls\nreferring to this handler.","title":"logger.add_handler/3","ref":"logger.html#add_handler/3"},{"type":"function","doc":"Add a filter to the specified handler.\n\nThe filter fun is called with the log event as the first parameter, and the\nspecified `filter_args()` as the second parameter.\n\nThe return value of the fun specifies if a log event is to be discarded or\nforwarded to the handler callback:\n\n- **`t:log_event/0`** - The filter _passed_. The next handler filter, if any, is\n applied. If no more filters exist for this handler, the log event is forwarded\n to the handler callback.\n\n- **`stop`** - The filter _did not pass_, and the log event is immediately\n discarded.\n\n- **`ignore`** - The filter has no knowledge of the log event. The next handler\n filter, if any, is applied. If no more filters exist for this handler, the\n value of the `filter_default` configuration parameter for the handler\n specifies if the log event shall be discarded or forwarded to the handler\n callback.\n\nSee section [Filters](logger_chapter.md#filters) in the User's Guide for more\ninformation about filters.\n\nSome built-in filters exist. These are defined in `m:logger_filters`.","title":"logger.add_handler_filter/3","ref":"logger.html#add_handler_filter/3"},{"type":"function","doc":"Reads the application configuration parameter `logger` and calls\n[`add_handlers/1`](`add_handlers/1`) with its contents.\n\nThis function should be used by custom Logger handlers to make configuration\nconsistent no matter which handler the system uses. Normal usage is to add a\ncall to `logger:add_handlers/1` just after the processes that the handler needs\nare started, and pass the application's `logger` configuration as the argument.\nFor example:\n\n```erlang\n-behaviour(application).\nstart(_, []) ->\n case supervisor:start_link({local, my_sup}, my_sup, []) of\n {ok, Pid} ->\n ok = logger:add_handlers(my_app),\n {ok, Pid, []};\n Error -> Error\n end.\n```\n\nThis reads the `logger` configuration parameter from the `my_app` application\nand starts the configured handlers. The contents of the configuration use the\nsame rules as the\n[logger handler configuration](logger_chapter.md#handler-configuration).\n\nIf the handler is meant to replace the default handler, the Kernel's default\nhandler have to be disabled before the new handler is added. A `sys.config` file\nthat disables the Kernel handler and adds a custom handler could look like this:\n\n```erlang\n[{kernel,\n [{logger,\n %% Disable the default Kernel handler\n [{handler, default, undefined}]}]},\n {my_app,\n [{logger,\n %% Enable this handler as the default\n [{handler, default, my_handler, #{}}]}]}].\n```","title":"logger.add_handlers/1","ref":"logger.html#add_handlers/1"},{"type":"function","doc":"Add a primary filter to Logger.\n\nThe filter fun is called with the log event as the first parameter, and the\nspecified `filter_args()` as the second parameter.\n\nThe return value of the fun specifies if a log event is to be discarded or\nforwarded to the handlers:\n\n- **`t:log_event/0`** - The filter _passed_. The next primary filter, if any, is\n applied. If no more primary filters exist, the log event is forwarded to the\n handler part of Logger, where handler filters are applied.\n\n- **`stop`** - The filter _did not pass_, and the log event is immediately\n discarded.\n\n- **`ignore`** - The filter has no knowledge of the log event. The next primary\n filter, if any, is applied. If no more primary filters exist, the value of the\n primary `filter_default` configuration parameter specifies if the log event\n shall be discarded or forwarded to the handler part.\n\nSee section [Filters](logger_chapter.md#filters) in the User's Guide for more\ninformation about filters.\n\nSome built-in filters exist. These are defined in `m:logger_filters`.","title":"logger.add_primary_filter/2","ref":"logger.html#add_primary_filter/2"},{"type":"function","doc":"","title":"logger.alert/1","ref":"logger.html#alert/1"},{"type":"function","doc":"Create a alert log event.\n\nEquivalent to [`log(alert, StringOrReport, Metadata)`](`log/3`) if called\nas [`alert(StringOrReport, Metadata)`](`alert/2`).\n\nEquivalent to [`alert(FormatOrFun, Args, #{})`](`alert/3`) if called as\n[`alert(FormatOrFun, Args)`](`alert/2`).","title":"logger.alert/2","ref":"logger.html#alert/2"},{"type":"function","doc":"","title":"logger.alert/3","ref":"logger.html#alert/3"},{"type":"function","doc":"Compare the severity of two log levels. Returns `gt` if `Level1` is more severe\nthan `Level2`, `lt` if `Level1` is less severe, and `eq` if the levels are\nequal.","title":"logger.compare_levels/2","ref":"logger.html#compare_levels/2"},{"type":"function","doc":"","title":"logger.critical/1","ref":"logger.html#critical/1"},{"type":"function","doc":"Create a critical log event.\n\nEquivalent to [`log(critical, StringOrReport, Metadata)`](`log/3`) if called\nas [`critical(StringOrReport, Metadata)`](`critical/2`).\n\nEquivalent to [`critical(FormatOrFun, Args, #{})`](`critical/3`) if called as\n[`critical(FormatOrFun, Args)`](`critical/2`).","title":"logger.critical/2","ref":"logger.html#critical/2"},{"type":"function","doc":"","title":"logger.critical/3","ref":"logger.html#critical/3"},{"type":"function","doc":"","title":"logger.debug/1","ref":"logger.html#debug/1"},{"type":"function","doc":"Create a debug log event.\n\nEquivalent to [`log(debug, StringOrReport, Metadata)`](`log/3`) if called\nas [`debug(StringOrReport, Metadata)`](`debug/2`).\n\nEquivalent to [`debug(FormatOrFun, Args, #{})`](`debug/3`) if called as\n[`debug(FormatOrFun, Args)`](`debug/2`).","title":"logger.debug/2","ref":"logger.html#debug/2"},{"type":"function","doc":"","title":"logger.debug/3","ref":"logger.html#debug/3"},{"type":"function","doc":"","title":"logger.emergency/1","ref":"logger.html#emergency/1"},{"type":"function","doc":"Create a emergency log event.\n\nEquivalent to [`log(emergency, StringOrReport, Metadata)`](`log/3`) if called\nas [`emergency(StringOrReport, Metadata)`](`emergency/2`).\n\nEquivalent to [`emergency(FormatOrFun, Args, #{})`](`emergency/3`) if called as\n[`emergency(FormatOrFun, Args)`](`emergency/2`).","title":"logger.emergency/2","ref":"logger.html#emergency/2"},{"type":"function","doc":"","title":"logger.emergency/3","ref":"logger.html#emergency/3"},{"type":"function","doc":"","title":"logger.error/1","ref":"logger.html#error/1"},{"type":"function","doc":"Create a error log event.\n\nEquivalent to [`log(error, StringOrReport, Metadata)`](`log/3`) if called\nas [`error(StringOrReport, Metadata)`](`error/2`).\n\nEquivalent to [`error(FormatOrFun, Args, #{})`](`error/3`) if called as\n[`error(FormatOrFun, Args)`](`error/2`).","title":"logger.error/2","ref":"logger.html#error/2"},{"type":"function","doc":"","title":"logger.error/3","ref":"logger.html#error/3"},{"type":"function","doc":"Convert a log message on report form to `{Format, Args}`. This is the default\nreport callback used by `m:logger_formatter` when no custom report callback is\nfound. See section [Log Message](logger_chapter.md#log-message) in the Kernel\nUser's Guide for information about report callbacks and valid forms of log\nmessages.\n\nThe function produces lines of `Key: Value` from key-value lists. Strings are\nprinted with `~ts` and other terms with `~tp`.\n\nIf `Report` is a map, it is converted to a key-value list before formatting as\nsuch.","title":"logger.format_report/1","ref":"logger.html#format_report/1"},{"type":"function","doc":"Look up all current Logger configuration, including primary, handler, and proxy\nconfiguration, and module level settings.","title":"logger.get_config/0","ref":"logger.html#get_config/0"},{"type":"function","doc":"Look up the current configuration for all handlers.","title":"logger.get_handler_config/0","ref":"logger.html#get_handler_config/0"},{"type":"function","doc":"Look up the current configuration for the given handler.","title":"logger.get_handler_config/1","ref":"logger.html#get_handler_config/1"},{"type":"function","doc":"Look up the identities for all installed handlers.","title":"logger.get_handler_ids/0","ref":"logger.html#get_handler_ids/0"},{"type":"function","doc":"Look up all current module levels. Returns a list containing one\n`{Module,Level}` element for each module for which the module level was\npreviously set with `set_module_level/2`.","title":"logger.get_module_level/0","ref":"logger.html#get_module_level/0"},{"type":"function","doc":"Look up the current level for the given modules. Returns a list containing one\n`{Module,Level}` element for each of the given modules for which the module\nlevel was previously set with `set_module_level/2`.","title":"logger.get_module_level/1","ref":"logger.html#get_module_level/1"},{"type":"function","doc":"Look up the current primary configuration for Logger.","title":"logger.get_primary_config/0","ref":"logger.html#get_primary_config/0"},{"type":"function","doc":"Retrieve data set with `set_process_metadata/1` or `update_process_metadata/1`.","title":"logger.get_process_metadata/0","ref":"logger.html#get_process_metadata/0"},{"type":"function","doc":"Look up the current configuration for the Logger proxy.\n\nFor more information about the proxy, see section\n[Logger Proxy](logger_chapter.md#logger-proxy) in the Kernel User's Guide.","title":"logger.get_proxy_config/0","ref":"logger.html#get_proxy_config/0"},{"type":"function","doc":"Pretty print all Logger configuration.","title":"logger.i/0","ref":"logger.html#i/0"},{"type":"function","doc":"Pretty print the Logger configuration.","title":"logger.i/1","ref":"logger.html#i/1"},{"type":"function","doc":"","title":"logger.info/1","ref":"logger.html#info/1"},{"type":"function","doc":"Create a info log event.\n\nEquivalent to [`log(info, StringOrReport, Metadata)`](`log/3`) if called\nas [`info(StringOrReport, Metadata)`](`info/2`).\n\nEquivalent to [`info(FormatOrFun, Args, #{})`](`info/3`) if called as\n[`info(FormatOrFun, Args)`](`info/2`).","title":"logger.info/2","ref":"logger.html#info/2"},{"type":"function","doc":"","title":"logger.info/3","ref":"logger.html#info/3"},{"type":"function","doc":"","title":"logger.log/2","ref":"logger.html#log/2"},{"type":"function","doc":"Create a log event at the given [log level](logger_chapter.md#log-level), with\nthe given [message](logger_chapter.md#log-message) to be logged and\n[_metadata_](logger_chapter.md#metadata).\n\n*Example*:\n\n```erlang\n%% A plain string\n1> logger:log(info, \"Hello World\").\n%% A plain string with metadata\n2> logger:log(debug, \"Hello World\", #{ meta => data }).\n%% A format string with arguments\n3> logger:log(warning, \"The roof is on ~ts\",[Cause]).\n%% A report\n4> logger:log(warning, #{ what => roof, cause => Cause }).\n```\n\nEquivalent to [`log(Level, FormatOrFun, Args, #{})`](`log/4`) if called as\n`log(Level, FormatOrFun, Args)`.","title":"logger.log/3","ref":"logger.html#log/3"},{"type":"function","doc":"Create a log event at the given [log level](logger_chapter.md#log-level), with\nthe given [message](logger_chapter.md#log-message) to be logged and\n[_metadata_](logger_chapter.md#metadata).\n\nThe message and metadata can either be given directly in the arguments, or\nreturned from a fun. Passing a fun instead of the message/metadata directly is\nuseful in scenarios when the message/metadata is very expensive to compute. This\nis because the fun is only evaluated when the message/metadata is actually\nneeded, which may be not at all if the log event is not to be logged. Examples:\n\n```erlang\n%% A plain string with expensive metadata\n1> logger:info(fun([]) -> {\"Hello World\", #{ meta => expensive() }} end,[]).\n%% An expensive report\n2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).\n%% A plain string with expensive metadata and normal metadata\n3> logger:debug(fun([]) -> {\"Hello World\", #{ meta => expensive() }} end,[],\n #{ meta => data }).\n```\n\nWhen metadata is given both as an argument and returned from the fun they are\nmerged. If equal keys exists the values are taken from the metadata returned by\nthe fun.","title":"logger.log/4","ref":"logger.html#log/4"},{"type":"function","doc":"","title":"logger.notice/1","ref":"logger.html#notice/1"},{"type":"function","doc":"Create a notice log event.\n\nEquivalent to [`log(notice, StringOrReport, Metadata)`](`log/3`) if called\nas [`notice(StringOrReport, Metadata)`](`notice/2`).\n\nEquivalent to [`notice(FormatOrFun, Args, #{})`](`notice/3`) if called as\n[`notice(FormatOrFun, Args)`](`notice/2`).","title":"logger.notice/2","ref":"logger.html#notice/2"},{"type":"function","doc":"","title":"logger.notice/3","ref":"logger.html#notice/3"},{"type":"function","doc":"Reconfigure Logger using updated `kernel` configuration that was set after\n`kernel` application was loaded.\n\nBeware, that this is meant to be run only by the build tools, not manually\nduring application lifetime, as this may cause missing log entries.","title":"logger.reconfigure/0","ref":"logger.html#reconfigure/0"},{"type":"function","doc":"Remove the handler identified by `HandlerId`.","title":"logger.remove_handler/1","ref":"logger.html#remove_handler/1"},{"type":"function","doc":"Remove the filter identified by `FilterId` from the handler identified by\n`HandlerId`.","title":"logger.remove_handler_filter/2","ref":"logger.html#remove_handler_filter/2"},{"type":"function","doc":"Remove the primary filter identified by `FilterId` from Logger.","title":"logger.remove_primary_filter/1","ref":"logger.html#remove_primary_filter/1"},{"type":"function","doc":"Set the log level for all the modules of the specified application.\n\nThis function is a convenience function that calls\n[logger:set_module_level/2](`set_module_level/2`) for each module associated\nwith an application.","title":"logger.set_application_level/2","ref":"logger.html#set_application_level/2"},{"type":"function","doc":"Set configuration data for the specified handler. This overwrites the current\nhandler configuration.\n\nTo modify the existing configuration, use `update_handler_config/2`, or, if a\nmore complex merge is needed, read the current configuration with\n[`get_handler_config/1` ](`get_handler_config/1`), then do the merge before\nwriting the new configuration back with this function.\n\nIf a key is removed compared to the current configuration, and the key is known\nby Logger, the default value is used. If it is a custom key, then it is up to\nthe handler implementation if the value is removed or a default value is\ninserted.","title":"logger.set_handler_config/2","ref":"logger.html#set_handler_config/2"},{"type":"function","doc":"Add or update configuration data for the specified handler. If the given `Key`\nalready exists, its associated value will be changed to the given value. If it\ndoes not exist, it will be added.\n\nIf the value is incomplete, which for example can be the case for the `config`\nkey, it is up to the handler implementation how the unspecified parts are set.\nFor all handlers in the Kernel application, unspecified data for the `config`\nkey is set to default values. To update only specified data, and keep the\nexisting configuration for the rest, use `update_handler_config/3`.\n\nSee the definition of the `t:logger_handler:config/0` type for more information\nabout the different parameters.","title":"logger.set_handler_config/3","ref":"logger.html#set_handler_config/3"},{"type":"function","doc":"Set the log level for the specified modules.\n\nThe log level for a module overrides the primary log level of Logger for log\nevents originating from the module in question. Notice, however, that it does\nnot override the level configuration for any handler.\n\nFor example: Assume that the primary log level for Logger is `info`, and there\nis one handler, `h1`, with level `info` and one handler, `h2`, with level\n`debug`.\n\nWith this configuration, no debug messages will be logged, since they are all\nstopped by the primary log level.\n\nIf the level for `mymodule` is now set to `debug`, then debug events from this\nmodule will be logged by the handler `h2`, but not by handler `h1`.\n\nDebug events from other modules are still not logged.\n\nTo change the primary log level for Logger, use\n[`set_primary_config(level, Level)`](`set_primary_config/2`).\n\nTo change the log level for a handler, use\n[`set_handler_config(HandlerId, level, Level)` ](`set_handler_config/3`).\n\n> #### Note {: .info }\n>\n> The originating module for a log event is only detected if the key `mfa`\n> exists in the metadata, and is associated with `{Module, Function, Arity}`.\n> When log macros are used, this association is automatically added to all log\n> events. If an API function is called directly, without using a macro, the\n> logging client must explicitly add this information if module levels shall\n> have any effect.","title":"logger.set_module_level/2","ref":"logger.html#set_module_level/2"},{"type":"function","doc":"Set primary configuration data for Logger. This overwrites the current\nconfiguration.\n\nTo modify the existing configuration, use `update_primary_config/1`, or, if a\nmore complex merge is needed, read the current configuration with\n[`get_primary_config/0` ](`get_primary_config/0`), then do the merge before\nwriting the new configuration back with this function.\n\nIf a key is removed compared to the current configuration, the default value is\nused.","title":"logger.set_primary_config/1","ref":"logger.html#set_primary_config/1"},{"type":"function","doc":"Add or update primary configuration data for Logger. If the given `Key` already\nexists, its associated value will be changed to the given value. If it does not\nexist, it will be added.\n\nThe `metadata` key was added in OTP 24.0.","title":"logger.set_primary_config/2","ref":"logger.html#set_primary_config/2"},{"type":"function","doc":"Set metadata which Logger shall automatically insert in all log events produced\non the current process.\n\nLocation data produced by the log macros, and/or metadata given as argument to\nthe log call (API function or macro), are merged with the process metadata. If\nthe same keys occur, values from the metadata argument to the log call overwrite\nvalues from the process metadata, which in turn overwrite values from the\nlocation data.\n\nSubsequent calls to this function overwrites previous data set. To update\nexisting data instead of overwriting it, see `update_process_metadata/1`.","title":"logger.set_process_metadata/1","ref":"logger.html#set_process_metadata/1"},{"type":"function","doc":"Set configuration data for the Logger proxy. This overwrites the current proxy\nconfiguration. Keys that are not specified in the `Config` map gets default\nvalues.\n\nTo modify the existing configuration, use `update_proxy_config/1`, or, if a more\ncomplex merge is needed, read the current configuration with\n[`get_proxy_config/0` ](`get_proxy_config/0`), then do the merge before writing\nthe new configuration back with this function.\n\nFor more information about the proxy, see section\n[Logger Proxy](logger_chapter.md#logger-proxy) in the Kernel User's Guide.","title":"logger.set_proxy_config/1","ref":"logger.html#set_proxy_config/1"},{"type":"function","doc":"Return a timestamp that can be inserted as the `time` field in the meta data for\na log event. It is produced with\n[`os:system_time(microsecond)`](`os:system_time/1`).\n\nNotice that Logger automatically inserts a timestamp in the meta data unless it\nalready exists. This function is exported for the rare case when the timestamp\nmust be taken at a different point in time than when the log event is issued.","title":"logger.timestamp/0","ref":"logger.html#timestamp/0"},{"type":"function","doc":"Unset the log level for all the modules of the specified application.\n\nThis function is a utility function that calls\n[logger:unset_module_level/2](`unset_module_level/1`) for each module associated\nwith an application.","title":"logger.unset_application_level/1","ref":"logger.html#unset_application_level/1"},{"type":"function","doc":"Remove module specific log settings. After this, the primary log level is used\nfor all modules.","title":"logger.unset_module_level/0","ref":"logger.html#unset_module_level/0"},{"type":"function","doc":"Remove module specific log settings. After this, the primary log level is used\nfor the specified modules.","title":"logger.unset_module_level/1","ref":"logger.html#unset_module_level/1"},{"type":"function","doc":"Delete data set with `set_process_metadata/1` or `update_process_metadata/1`.","title":"logger.unset_process_metadata/0","ref":"logger.html#unset_process_metadata/0"},{"type":"function","doc":"Update the formatter configuration for the specified handler.\n\nThe new configuration is merged with the existing formatter configuration.\n\nTo overwrite the existing configuration without any merge, use\n\n```erlang\nset_handler_config(HandlerId, formatter,\n\t {FormatterModule, FormatterConfig}).\n```","title":"logger.update_formatter_config/2","ref":"logger.html#update_formatter_config/2"},{"type":"function","doc":"","title":"logger.update_formatter_config/3","ref":"logger.html#update_formatter_config/3"},{"type":"function","doc":"Update configuration data for the specified handler. This function behaves as if\nit was implemented as follows:\n\n```erlang\n{ok, {_, Old}} = logger:get_handler_config(HandlerId),\nlogger:set_handler_config(HandlerId, maps:merge(Old, Config)).\n```\n\nTo overwrite the existing configuration without any merge, use\n[`set_handler_config/2` ](`set_handler_config/2`).","title":"logger.update_handler_config/2","ref":"logger.html#update_handler_config/2"},{"type":"function","doc":"Add or update configuration data for the specified handler. If the given `Key`\nalready exists, its associated value will be changed to the given value. If it\ndoes not exist, it will be added.\n\nIf the value is incomplete, which for example can be the case for the `config`\nkey, it is up to the handler implementation how the unspecified parts are set.\nFor all handlers in the Kernel application, unspecified data for the `config`\nkey is not changed. To reset unspecified data to default values, use\n`set_handler_config/3`.\n\nSee the definition of the `t:logger_handler:config/0` type for more information\nabout the different parameters.","title":"logger.update_handler_config/3","ref":"logger.html#update_handler_config/3"},{"type":"function","doc":"Update primary configuration data for Logger. This function behaves as if it was\nimplemented as follows:\n\n```erlang\nOld = logger:get_primary_config(),\nlogger:set_primary_config(maps:merge(Old, Config)).\n```\n\nTo overwrite the existing configuration without any merge, use\n[`set_primary_config/1` ](`set_primary_config/1`).","title":"logger.update_primary_config/1","ref":"logger.html#update_primary_config/1"},{"type":"function","doc":"Set or update metadata to use when logging from current process\n\nIf process metadata exists for the current process, this function behaves as if\nit was implemented as follows:\n\n```erlang\nlogger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).\n```\n\nIf no process metadata exists, the function behaves as\n[`set_process_metadata/1` ](`set_process_metadata/1`).","title":"logger.update_process_metadata/1","ref":"logger.html#update_process_metadata/1"},{"type":"function","doc":"Update configuration data for the Logger proxy. This function behaves as if it\nwas implemented as follows:\n\n```erlang\nOld = logger:get_proxy_config(),\nlogger:set_proxy_config(maps:merge(Old, Config)).\n```\n\nTo overwrite the existing configuration without any merge, use\n[`set_proxy_config/1` ](`set_proxy_config/1`).\n\nFor more information about the proxy, see section\n[Logger Proxy](logger_chapter.md#logger-proxy) in the Kernel User's Guide.","title":"logger.update_proxy_config/1","ref":"logger.html#update_proxy_config/1"},{"type":"function","doc":"","title":"logger.warning/1","ref":"logger.html#warning/1"},{"type":"function","doc":"Create a warning log event.\n\nEquivalent to [`log(warning, StringOrReport, Metadata)`](`log/3`) if called\nas [`warning(StringOrReport, Metadata)`](`warning/2`).\n\nEquivalent to [`warning(FormatOrFun, Args, #{})`](`warning/3`) if called as\n[`warning(FormatOrFun, Args)`](`warning/2`).","title":"logger.warning/2","ref":"logger.html#warning/2"},{"type":"function","doc":"","title":"logger.warning/3","ref":"logger.html#warning/3"},{"type":"type","doc":"Configuration used when adding or updating a handler.","title":"logger.config_handler/0","ref":"logger.html#t:config_handler/0"},{"type":"type","doc":"A filter which can be installed as a handler filter, or as a primary filter in\nLogger.","title":"logger.filter/0","ref":"logger.html#t:filter/0"},{"type":"type","doc":"The second argument to the filter fun.","title":"logger.filter_arg/0","ref":"logger.html#t:filter_arg/0"},{"type":"type","doc":"A unique identifier for a filter.","title":"logger.filter_id/0","ref":"logger.html#t:filter_id/0"},{"type":"type","doc":"The return value from the filter fun.","title":"logger.filter_return/0","ref":"logger.html#t:filter_return/0"},{"type":"type","doc":"Configuration data for the formatter. See `m:logger_formatter` for an example of\na formatter implementation.","title":"logger.formatter_config/0","ref":"logger.html#t:formatter_config/0"},{"type":"type","doc":"Handler configuration data for Logger.\n\n> #### Note {: .info }\n>\n> DEPRECATED: Use `t:logger_handler:config/0` instead.","title":"logger.handler_config/0","ref":"logger.html#t:handler_config/0"},{"type":"type","doc":"A unique identifier for a handler instance.\n\n> #### Note {: .info }\n>\n> DEPRECATED: Use `t:logger_handler:id/0` instead.","title":"logger.handler_id/0","ref":"logger.html#t:handler_id/0"},{"type":"type","doc":"The severity level for the message to be logged.","title":"logger.level/0","ref":"logger.html#t:level/0"},{"type":"type","doc":"A log event passed to filters and handlers","title":"logger.log_event/0","ref":"logger.html#t:log_event/0"},{"type":"type","doc":"Metadata for the log event.\n\nLogger adds the following metadata to each log event:\n\n- `pid => self()`\n- `gl => group_leader()`\n- `time => logger:timestamp()`\n\nWhen a log macro is used, Logger also inserts location information:\n\n- `mfa => {?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY}`\n- `file => ?FILE`\n- `line => ?LINE`\n\nYou can add custom metadata, either by:\n\n- specifying a map as the last parameter to any of the log macros or the logger\n API functions.\n- setting process metadata with `set_process_metadata/1` or\n `update_process_metadata/1`.\n- setting primary metadata with `set_primary_config/1` or through the kernel\n configuration parameter [logger_metadata](kernel_app.md#logger_metadata)\n\n> #### Note {: .info }\n>\n> When adding custom metadata, make sure not to use any of the keys mentioned\n> above as that may cause a lot of confusion about the log events.\n\nLogger merges all the metadata maps before forwarding the log event to the\nhandlers. If the same keys occur, values from the log call overwrite process\nmetadata, which overwrites the primary metadata, which in turn overwrite values\nset by Logger.\n\nThe following custom metadata keys have special meaning:\n\n- **`domain`** - The value associated with this key is used by filters for\n grouping log events originating from, for example, specific functional areas.\n See `logger_filters:domain/2` for a description of how this field can be used.\n\n- **`report_cb`** - If the log message is specified as a `t:report/0`, the\n `report_cb` key can be associated with a fun (report callback) that converts\n the report to a format string and arguments, or directly to a string. See the\n type definition of `t:report_cb/0`, and section\n [Log Message](logger_chapter.md#log-message) in the User's Guide for more\n information about report callbacks.","title":"logger.metadata/0","ref":"logger.html#t:metadata/0"},{"type":"type","doc":"","title":"logger.msg_fun/0","ref":"logger.html#t:msg_fun/0"},{"type":"type","doc":"","title":"logger.msg_fun_return/0","ref":"logger.html#t:msg_fun_return/0"},{"type":"type","doc":"Overload protection configuration.\n\n> #### Note {: .info }\n>\n> DEPRECATED: Use `t:logger_handler:olp_config/0` instead.","title":"logger.olp_config/0","ref":"logger.html#t:olp_config/0"},{"type":"type","doc":"Primary configuration data for Logger. The following default values apply:\n\n- `level => info`\n- `filter_default => log`\n- `filters => []`","title":"logger.primary_config/0","ref":"logger.html#t:primary_config/0"},{"type":"type","doc":"A log report.","title":"logger.report/0","ref":"logger.html#t:report/0"},{"type":"type","doc":"A fun which converts a [`report()`](`t:report/0`) to a format string and\narguments, or directly to a string.\n\nSee section [Log Message](logger_chapter.md#log-message) in the User's Guide\nfor more information.","title":"logger.report_cb/0","ref":"logger.html#t:report_cb/0"},{"type":"type","doc":"","title":"logger.report_cb_config/0","ref":"logger.html#t:report_cb_config/0"},{"type":"type","doc":"A timestamp produced with [`logger:timestamp()`](`timestamp/0`).","title":"logger.timestamp/0","ref":"logger.html#t:timestamp/0"},{"type":"module","doc":"A disk_log based handler for Logger\n\nThis is a handler for Logger that offers circular (wrapped) logs by using\n`m:disk_log`. Multiple instances of this handler can be added to Logger, and\neach instance prints to its own disk log file, created with the name and\nsettings specified in the handler configuration.\n\nThe default standard handler, `m:logger_std_h`, can be replaced by a disk_log\nhandler at startup of the Kernel application. See an example of this below.\n\nThe handler has an overload protection mechanism that keeps the handler process\nand the Kernel application alive during high loads of log events. How overload\nprotection works, and how to configure it, is described in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nTo add a new instance of the disk_log handler, use\n[`logger:add_handler/3`](`logger:add_handler/3`). The handler configuration\nargument is a map which can contain general configuration parameters, as\ndocumented in the [`User's Guide`](logger_chapter.md#handler-configuration),\nand handler specific parameters. The specific data is stored in a sub map with\nthe key `config`, and can contain the following parameters:\n\n- **`file`** - This is the full name of the disk log file. The option\n corresponds to the `name` property in the [`dlog_option()`](`disk_log:open/1`)\n datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to the same name as the handler identity, in the current directory.\n\n- **`type`** - This is the disk log type, `wrap` or `halt`. The option\n corresponds to the `type` property in the [`dlog_option()`](`disk_log:open/1`)\n datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `wrap`.\n\n- **`max_no_files`** - This is the maximum number of files that disk_log uses\n for its circular logging. The option corresponds to the `MaxNoFiles` element\n in the `size` property in the [`dlog_option()`](`disk_log:open/1`) datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `10`.\n\n The setting has no effect on a halt log.\n\n- **`max_no_bytes`** - This is the maximum number of bytes that is written to a\n log file before disk_log proceeds with the next file in order, or generates an\n error in case of a full halt log. The option corresponds to the `MaxNoBytes`\n element in the `size` property in the [`dlog_option()`](`disk_log:open/1`)\n datatype.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `1048576` bytes for a wrap log, and `infinity` for a halt log.\n\n- **`filesync_repeat_interval`** - This value, in milliseconds, specifies how\n often the handler does a disk_log sync operation to write buffered data to\n disk. The handler attempts the operation repeatedly, but only performs a new\n sync if something has actually been logged.\n\n Defaults to `5000` milliseconds.\n\n If `no_repeat` is set as value, the repeated sync operation is disabled. The\n user can also call the [`filesync/1`](`filesync/1`) function to perform a\n disk_log sync.\n\nOther configuration parameters exist, to be used for customizing the overload\nprotection behaviour. The same parameters are used both in the standard handler\nand the disk_log handler, and are documented in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nNotice that when changing the configuration of the handler in runtime, the\ndisk_log options (`file`, `type`, `max_no_files`, `max_no_bytes`) must not be\nmodified.\n\nExample of adding a disk_log handler:\n\n```erlang\nlogger:add_handler(my_disk_log_h, logger_disk_log_h,\n #{config => #{file => \"./my_disk_log\",\n type => wrap,\n max_no_files => 4,\n max_no_bytes => 10000,\n filesync_repeat_interval => 1000}}).\n```\n\nTo use the disk_log handler instead of the default standard handler when\nstarting an Erlang node, change the Kernel default logger to use\n`logger_disk_log_h`. Example:\n\n```text\nerl -kernel logger '[{handler,default,logger_disk_log_h,\n #{config => #{file => \"./system_disk_log\"}}}]'\n```","title":"logger_disk_log_h","ref":"logger_disk_log_h.html"},{"type":"module","doc":"`m:logger`, `m:logger_std_h`, `m:disk_log`","title":"See Also - logger_disk_log_h","ref":"logger_disk_log_h.html#module-see-also"},{"type":"function","doc":"Write buffered data to disk.","title":"logger_disk_log_h.filesync/1","ref":"logger_disk_log_h.html#filesync/1"},{"type":"module","doc":"Filters to use with Logger.\n\nAll functions exported from this module can be used as primary or handler\nfilters. See `logger:add_primary_filter/2` and `logger:add_handler_filter/3` for\nmore information about how filters are added.\n\nFilters are removed with `logger:remove_primary_filter/1` and\n`logger:remove_handler_filter/2`.","title":"logger_filters","ref":"logger_filters.html"},{"type":"module","doc":"`m:logger`","title":"See Also - logger_filters","ref":"logger_filters.html#module-see-also"},{"type":"function","doc":"This filter provides a way of filtering log events based on a `domain` field in\n`Metadata`. This field is optional, and the purpose of using it is to group log\nevents from, for example, a specific functional area. This allows filtering or\nother specialized treatment in a Logger handler.\n\nA domain field must be a list of atoms, creating smaller and more specialized\ndomains as the list grows longer. The greatest domain is `[]`, which comprises\nall possible domains.\n\nFor example, consider the following domains:\n\n```erlang\nD1 = [otp]\nD2 = [otp, sasl]\n```\n\n`D1` is the greatest of the two, and is said to be a super-domain of `D2`. `D2`\nis a sub-domain `D1`. Both `D1` and `D2` are sub-domains of `[]`.\n\nThe above domains are used for logs originating from Erlang/OTP. D1 specifies\nthat the log event comes from Erlang/OTP in general, and D2 indicates that the\nlog event is a so called [SASL report](logger_chapter.md#sasl_reports).\n\nThe `Extra` parameter to the [`domain/2`](`domain/2`) function is specified when\nadding the filter via `logger:add_primary_filter/2` or\n`logger:add_handler_filter/3`.\n\nThe filter compares the value of the `domain` field in the log event's metadata\n(`Domain`) against `MatchDomain`. The filter matches if the value of `Compare`\nis:\n\n- **`sub`** - and `Domain` is equal to or a sub-domain of `MatchDomain`, that\n is, if `MatchDomain` is a prefix of `Domain`.\n\n- **`super`** - and `Domain` is equal to or a super-domain of `MatchDomain`,\n that is, if `Domain` is a prefix of `MatchDomain`.\n\n- **`equal`** - and `Domain` is equal to `MatchDomain`.\n\n- **`not_equal`** - and `Domain` differs from `MatchDomain`, or if there is no\n domain field in metadata.\n\n- **`undefined`** - and there is no domain field in metadata. In this case\n `MatchDomain` must be set to `[]`.\n\nIf the filter matches and `Action` is `log`, the log event is allowed. If the\nfilter matches and `Action` is `stop`, the log event is stopped.\n\nIf the filter does not match, it returns `ignore`, meaning that other filters,\nor the value of the configuration parameter `filter_default`, decide if the\nevent is allowed or not.\n\nLog events that do not contain any domain field, match only when `Compare` is\nequal to `undefined` or `not_equal`.\n\nExample: stop all events with domain `[otp, sasl | _]`\n\n```erlang\n1> logger:set_handler_config(h1, filter_default, log). % this is the default\nok\n2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.\n...\n3> logger:add_handler_filter(h1, no_sasl, Filter).\nok\n```","title":"logger_filters.domain/2","ref":"logger_filters.html#domain/2"},{"type":"function","doc":"This filter provides a way of filtering log events based on the log level. It\nmatches log events by comparing the log level with a specified `MatchLevel`\n\nThe `Extra` parameter is specified when adding the filter via\n`logger:add_primary_filter/2` or `logger:add_handler_filter/3`.\n\nThe filter compares the value of the event's log level (`Level`) to `MatchLevel`\nby calling\n[`logger:compare_levels(Level, MatchLevel)`](`logger:compare_levels/2`). The\nfilter matches if the value of `Operator` is:\n\n- **`neq`** - and the compare function returns `lt` or `gt`.\n\n- **`eq`** - and the compare function returns `eq`.\n\n- **`lt`** - and the compare function returns `lt`.\n\n- **`gt`** - and the compare function returns `gt`.\n\n- **`lteq`** - and the compare function returns `lt` or `eq`.\n\n- **`gteq`** - and the compare function returns `gt` or `eq`.\n\nIf the filter matches and `Action` is `log`, the log event is allowed. If the\nfilter matches and `Action` is `stop`, the log event is stopped.\n\nIf the filter does not match, it returns `ignore`, meaning that other filters,\nor the value of the configuration parameter `filter_default`, will decide if the\nevent is allowed or not.\n\nExample: only allow debug level log events\n\n```erlang\nlogger:set_handler_config(h1, filter_default, stop).\nFilter = {fun logger_filters:level/2, {log, eq, debug}}.\nlogger:add_handler_filter(h1, debug_only, Filter).\nok\n```","title":"logger_filters.level/2","ref":"logger_filters.html#level/2"},{"type":"function","doc":"This filter matches all progress reports from `m:supervisor` and\n[`application_controller`](`m:application`).\n\nIf `Extra` is `log`, the progress reports are allowed. If `Extra` is `stop`, the\nprogress reports are stopped.\n\nThe filter returns `ignore` for all other log events.","title":"logger_filters.progress/2","ref":"logger_filters.html#progress/2"},{"type":"function","doc":"This filter matches all events originating from a process that has its group\nleader on a remote node.\n\nIf `Extra` is `log`, the matching events are allowed. If `Extra` is `stop`, the\nmatching events are stopped.\n\nThe filter returns `ignore` for all other log events.","title":"logger_filters.remote_gl/2","ref":"logger_filters.html#remote_gl/2"},{"type":"behaviour","doc":"Default formatter for Logger.\n\nEach Logger handler has a configured formatter specified as a module and a\nconfiguration term. The purpose of the formatter is to translate the log events\nto a final printable string ([`unicode:chardata()`](`t:unicode:chardata/0`))\nwhich can be written to the output device of the handler. See sections\n[Handlers](logger_chapter.md#handlers) and\n[Formatters](logger_chapter.md#formatters) in the Kernel User's Guide for more\ninformation.\n\n`m:logger_formatter` is the default formatter used by Logger.","title":"logger_formatter","ref":"logger_formatter.html"},{"type":"behaviour","doc":"`m:calendar`, `m:error_logger`, `m:io`, `m:io_lib`, `m:logger`, `m:maps`,\n[`sasl(6)`](`e:sasl:sasl_app.md`), `m:unicode`","title":"See Also - logger_formatter","ref":"logger_formatter.html#module-see-also"},{"type":"function","doc":"The function is called by Logger when the formatter configuration for a handler\nis set or modified. It returns `ok` if the configuration is valid, and\n`{error,term()}` if it is faulty.\n\nThe following Logger API functions can trigger this callback:\n\n- `logger:add_handler/3`\n- [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`)\n- `logger:update_handler_config/2`\n- `logger:update_formatter_config/2`","title":"logger_formatter.check_config/1","ref":"logger_formatter.html#check_config/1"},{"type":"callback","doc":"The function is called by a Logger when formatter configuration is set or\nmodified. The formatter must validate the given configuration and return `ok` if\nit is correct, and `{error,Reason}` if it is faulty.\n\nThe following Logger API functions can trigger this callback:\n\n- `logger:add_handler/3`\n- [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`)\n- [`logger:update_handler_config/2,3`](`logger:update_handler_config/2`)\n- `logger:update_formatter_config/2`\n\nSee `m:logger_formatter` for an example implementation. `m:logger_formatter` is\nthe default formatter used by Logger.","title":"logger_formatter.check_config/1","ref":"logger_formatter.html#c:check_config/1"},{"type":"function","doc":"This the formatter callback function to be called from handlers.\n\nThe log event is processed as follows:\n\n- If the message is on report form, it is converted to `{Format,Args}` by\n calling the report callback. See section\n [Log Message](logger_chapter.md#log-message) in the Kernel User's Guide for\n more information about report callbacks and valid forms of log messages.\n- The message size is limited according to the values of configuration\n parameters [`chars_limit`](`m:logger_formatter#chars_limit`) and\n [`depth`](`m:logger_formatter#depth`).\n- The full log entry is composed according to the\n [`template`](`m:logger_formatter#template`).\n- If the final string is too long, it is truncated according to the value of\n configuration parameter [`max_size`](`m:logger_formatter#max_size`).","title":"logger_formatter.format/2","ref":"logger_formatter.html#format/2"},{"type":"callback","doc":"The function can be called by a log handler to convert a log event term to a\nprintable string. The returned value can, for example, be printed as a log entry\nto the console or a file using [`io:put_chars/1,2`](`io:put_chars/1`).\n\nSee `m:logger_formatter` for an example implementation. `m:logger_formatter` is\nthe default formatter used by Logger.","title":"logger_formatter.format/2","ref":"logger_formatter.html#c:format/2"},{"type":"type","doc":"The configuration term for `logger_formatter` is a [map](`m:maps`), and the\nfollowing keys can be set as configuration parameters:\n\n- **`chars_limit = integer() > 0 | unlimited`{: #chars_limit }** - A positive\n integer representing the value of the option with the same name to be used\n when calling `io_lib:format/3`. This value limits the total number of\n characters printed for each log event. Notice that this is a soft limit. For a\n hard truncation limit, see option `max_size`.\n\n Defaults to `unlimited`.\n\n- **`depth = integer() > 0 | unlimited`{: #depth }** - A positive integer\n representing the maximum depth to which terms shall be printed by this\n formatter. Format strings passed to this formatter are rewritten. The format\n controls ~p and ~w are replaced with ~P and ~W, respectively, and the value is\n used as the depth parameter. For details, see [`io:format/2,3`](`io:format/2`)\n in STDLIB.\n\n Defaults to `unlimited`.\n\n- **`legacy_header = boolean()`** - If set to `true` a header field is added to\n logger_formatter's part of `Metadata`. The value of this field is a string\n similar to the header created by the old `m:error_logger` event handlers. It\n can be included in the log event by adding the list\n `[logger_formatter,header]` to the template. See the description of the\n `t:template/0` type for more information.\n\n Defaults to `false`.\n\n- **`max_size = integer() > 0 | unlimited`{: #max_size }** - A positive integer\n representing the absolute maximum size a string returned from this formatter\n can have. If the formatted string is longer, after possibly being limited by\n `chars_limit` or `depth`, it is truncated.\n\n Defaults to `unlimited`.\n\n- **`report_cb = ` `t:logger:report_cb/0`** - A report callback is used by the\n formatter to transform log messages on report form to a format string and\n arguments. The report callback can be specified in the metadata for the log\n event. If no report callback exists in metadata, `logger_formatter` will use\n `logger:format_report/1` as default callback.\n\n If this configuration parameter is set, it replaces both the default report\n callback, and any report callback found in metadata. That is, all reports are\n converted by this configured function.\n\n- **`single_line = boolean()`** - If set to `true`, each log event is printed as\n a single line. To achieve this, `logger_formatter` sets the field width to `0`\n for all `~p` and `~P` control sequences in the format a string (see\n `io:format/2`), and replaces all newlines in the message with `\", \"`. White\n spaces following directly after newlines are removed. Notice that newlines\n added by the `template` parameter are not replaced.\n\n Defaults to `true`.\n\n- **`template = `{: #template }`t:template/0`** - The template describes how the\n formatted string is composed by combining different data values from the log\n event. See the description of the `t:template/0` type for more information\n about this.\n\n- **`time_designator = byte()`** - Timestamps are formatted according to\n RFC3339, and the time designator is the character used as date and time\n separator.\n\n Defaults to `$T`.\n\n The value of this parameter is used as the `time_designator` option to\n `calendar:system_time_to_rfc3339/2`.\n\n- **`time_offset = integer() | [byte()]`** - The time offset, either a string or\n an integer, to be used when formatting the timestamp.\n\n An empty string is interpreted as local time. The values `\"Z\"`, `\"z\"` or `0`\n are interpreted as Universal Coordinated Time (UTC).\n\n Strings, other than `\"Z\"`, `\"z\"`, or `\"\"`, must be on the form `±[hh]:[mm]`,\n for example `\"-02:00\"` or `\"+00:00\"`.\n\n Integers must be in microseconds, meaning that the offset `7200000000` is\n equivalent to `\"+02:00\"`.\n\n Defaults to an empty string, meaning that timestamps are displayed in local\n time. However, for backwards compatibility, if the SASL configuration\n parameter [`utc_log`](`e:sasl:sasl_app.md#utc_log`)`=true`, the default is\n changed to `\"Z\"`, meaning that timestamps are displayed in UTC.\n\n The value of this parameter is used as the `offset` option to\n `calendar:system_time_to_rfc3339/2`.","title":"logger_formatter.config/0","ref":"logger_formatter.html#t:config/0"},{"type":"type","doc":"","title":"logger_formatter.metakey/0","ref":"logger_formatter.html#t:metakey/0"},{"type":"type","doc":"The template to be used by a logger formatter.\n\nThe template is a list of atoms, atom lists, tuples and strings. The atoms\n`level` or `msg`, are treated as placeholders for the severity level and the log\nmessage, respectively. Other atoms or atom lists are interpreted as placeholders\nfor metadata, where atoms are expected to match top level keys, and atom lists\nrepresent paths to sub keys when the metadata is a nested map. For example the\nlist `[key1,key2]` is replaced by the value of the `key2` field in the nested\nmap below. The atom `key1` on its own is replaced by the complete value of the\n`key1` field. The values are converted to strings.\n\n```text\n#{key1 => #{key2 => my_value,\n ...}\n ...}\n```\n\nTuples in the template express if-exist tests for metadata keys. For example,\nthe following tuple says that if `key1` exists in the metadata map, print\n`\"key1=Value\"`, where `Value` is the value that `key1` is associated with in the\nmetadata map. If `key1` does not exist, print nothing.\n\n```text\n{key1, [\"key1=\",key1], []}\n```\n\nStrings in the template are printed literally.\n\nThe default value for the `template` configuration parameter depends on the\nvalue of the `single_line` and `legacy_header` configuration parameters as\nfollows.\n\nThe log event used in the examples is:\n\n```text\n?LOG_ERROR(\"name: ~p~nexit_reason: ~p\", [my_name, \"It crashed\"])\n```\n\n- **`legacy_header = true, single_line = false`** - Default template:\n `[[logger_formatter,header],\"\\n\",msg,\"\\n\"]`\n\n Example log entry:\n\n ```text\n =ERROR REPORT==== 17-May-2018::18:30:19.453447 ===\n name: my_name\n exit_reason: \"It crashed\"\n ```\n\n Notice that all eight levels can occur in the heading, not only `ERROR`,\n `WARNING` or `INFO` as `m:error_logger` produces. And microseconds are added\n at the end of the timestamp.\n\n- **`legacy_header = true, single_line = true`** - Default template:\n `[[logger_formatter,header],\"\\n\",msg,\"\\n\"]`\n\n Notice that the template is here the same as for `single_line=false`, but the\n resulting log entry differs in that there is only one line after the heading:\n\n ```text\n =ERROR REPORT==== 17-May-2018::18:31:06.952665 ===\n name: my_name, exit_reason: \"It crashed\"\n ```\n\n- **`legacy_header = false, single_line = true`** - Default template:\n `[time,\" \",level,\": \",msg,\"\\n\"]`\n\n Example log entry:\n\n ```text\n 2018-05-17T18:31:31.152864+02:00 error: name: my_name, exit_reason: \"It crashed\"\n ```\n\n- **`legacy_header = false, single_line = false`** - Default template:\n `[time,\" \",level,\":\\n\",msg,\"\\n\"]`\n\n Example log entry:\n\n ```text\n 2018-05-17T18:32:20.105422+02:00 error:\n name: my_name\n exit_reason: \"It crashed\"\n ```","title":"logger_formatter.template/0","ref":"logger_formatter.html#t:template/0"},{"type":"behaviour","doc":"logger_handler behavior module.\n\nThe behaviour module for logger handlers. A logger handler is a callback module\nthat is called when a log event has passed all filters and is ready to be logged\nsomewhere. For more information see [Handlers](logger_chapter.md#handlers) in\nthe Users Guide.","title":"logger_handler","ref":"logger_handler.html"},{"type":"behaviour","doc":"`m:logger_filters`, `m:logger_formatter`, `m:logger`","title":"See Also - logger_handler","ref":"logger_handler.html#module-see-also"},{"type":"callback","doc":"The function is called on a temporary process when a new handler is about to be\nadded. The purpose is to verify the configuration and initiate all resources\nneeded by the handler.\n\nThe handler identity is associated with the `id` key in `Config1`.\n\nIf everything succeeds, the callback function can add possible default values or\ninternal state values to the configuration, and return the adjusted map in\n`{ok,Config2}`.\n\nIf the configuration is faulty, or if the initiation fails, the callback\nfunction must return `{error,Reason}`.","title":"logger_handler.adding_handler/1","ref":"logger_handler.html#c:adding_handler/1"},{"type":"callback","doc":"The function is called on a temporary process when the configuration for a\nhandler is about to change. The purpose is to verify and act on the new\nconfiguration.\n\n`OldConfig` is the existing configuration and `NewConfig` is the new\nconfiguration.\n\nThe handler identity is associated with the `id` key in `OldConfig`.\n\n`SetOrUpdate` has the value `set` if the configuration change originates from a\ncall to [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`), and\n`update` if it originates from\n[`logger:update_handler_config/2,3`](`logger:update_handler_config/2`). The\nhandler can use this parameter to decide how to update the value of the `config`\nfield, that is, the handler specific configuration data. Typically, if\n`SetOrUpdate` equals `set`, values that are not specified must be given their\ndefault values. If `SetOrUpdate` equals `update`, the values found in\n`OldConfig` must be used instead.\n\nIf everything succeeds, the callback function must return a possibly adjusted\nconfiguration in `{ok,Config}`.\n\nIf the configuration is faulty, the callback function must return\n`{error,Reason}`.","title":"logger_handler.changing_config/3","ref":"logger_handler.html#c:changing_config/3"},{"type":"callback","doc":"The function is called when one of the Logger API functions for fetching the\nhandler configuration is called, for example `logger:get_handler_config/1`.\n\nIt allows the handler to remove internal data fields from its configuration data\nbefore it is returned to the caller.","title":"logger_handler.filter_config/1","ref":"logger_handler.html#c:filter_config/1"},{"type":"callback","doc":"The function is called when all primary filters and all handler filters for the\nhandler in question have passed for the given log event. It is called on the\nclient process, that is, the process that issued the log event.\n\nThe handler identity is associated with the `id` key in `Config`.\n\nThe handler must log the event.\n\nThe return value from this function is ignored by Logger.","title":"logger_handler.log/2","ref":"logger_handler.html#c:log/2"},{"type":"callback","doc":"The function is called on a temporary process when a handler is about to be\nremoved. The purpose is to release all resources used by the handler.\n\nThe handler identity is associated with the `id` key in `Config`.\n\nThe return value is ignored by Logger.","title":"logger_handler.removing_handler/1","ref":"logger_handler.html#c:removing_handler/1"},{"type":"type","doc":"Handler configuration data for Logger. The following default values apply:\n\n- `level => all`\n- `filter_default => log`\n- `filters => []`\n- `formatter => {logger_formatter, DefaultFormatterConfig`\\}\n\nIn addition to these, the following fields are automatically inserted by Logger,\nvalues taken from the two first parameters to `logger:add_handler/3`:\n\n- `id => HandlerId`\n- `module => Module`\n\nThese are read-only and cannot be changed in runtime.\n\nHandler specific configuration data is inserted by the handler callback itself,\nin a sub structure associated with the field named `config`. See the\n`m:logger_std_h` and `m:logger_disk_log_h` manual pages for information about\nthe specific configuration for these handlers.\n\nSee the [`logger_formatter`](`t:logger_formatter:config/0`) manual page for\ninformation about the default configuration for this formatter.","title":"logger_handler.config/0","ref":"logger_handler.html#t:config/0"},{"type":"type","doc":"A unique identifier for a handler instance.","title":"logger_handler.id/0","ref":"logger_handler.html#t:id/0"},{"type":"type","doc":"Overload protection configuration.\n\nSee [Protecting the Handler from Overload](logger_chapter.md#protecting-the-handler-from-overload)\nfor more details.","title":"logger_handler.olp_config/0","ref":"logger_handler.html#t:olp_config/0"},{"type":"module","doc":"Standard handler for Logger.\n\nThis is the standard handler for Logger. Multiple instances of this handler can\nbe added to Logger, and each instance prints logs to\n[`standard_io`](`t:io:standard_io/0`),\n[`standard_error`](`t:io:standard_error/0`), or to file.\n\nThe handler has an overload protection mechanism that keeps the handler process\nand the Kernel application alive during high loads of log events. How overload\nprotection works, and how to configure it, is described in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nTo add a new instance of the standard handler, use\n[`logger:add_handler/3`](`logger:add_handler/3`). The handler configuration\nargument is a map which can contain general configuration parameters, as\ndocumented in the [`User's Guide`](logger_chapter.md#handler-configuration),\nand handler specific parameters. The specific data is stored in a sub map with\nthe key `config`, and can contain the following parameters:\n\n- **`type = ` `t:io:standard_io/0` ` | ` `t:io:standard_error/0` ` | file | {device, ` `t:io:device/0` `}`**{: #type } -\n Specifies the log destination.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to [`standard_io`](`t:io:standard_io/0`), unless parameter\n [`file`](`m:logger_std_h#file`) is given, in which case it defaults to `file`.\n\n- **`file = ` `t:file:filename/0`**{: #file } - This specifies the name of the\n log file when the handler is of type `file`.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to the same name as the handler identity, in the current directory.\n\n- **`modes = [` `t:file:mode/0` `]`**{: #modes } - This specifies the file modes\n to use when opening the log file, see `file:open/2`. If `modes` are not\n specified, the default list used is `[raw,append,delayed_write]`. If `modes`\n are specified, the list replaces the default modes list with the following\n adjustments:\n\n - If `raw` is not found in the list, it is added.\n - If none of `write`, `append` or `exclusive` is found in the list, `append`\n is added.\n - If none of `delayed_write` or `{delayed_write,Size,Delay}` is found in the\n list, `delayed_write` is added.\n\n Log files are always UTF-8 encoded. The encoding cannot be changed by setting\n the mode `{encoding,Encoding}`.\n\n The value is set when the handler is added, and it cannot be changed in\n runtime.\n\n Defaults to `[raw,append,delayed_write]`.\n\n- **`max_no_bytes = ` `t:pos_integer/0` ` | infinity`{: #max_no_bytes }** - This\n parameter specifies if the log file should be rotated or not. The value\n `infinity` means the log file will grow indefinitely, while an integer value\n specifies at which file size (bytes) the file is rotated.\n\n Defaults to `infinity`.\n\n- **`max_no_files = ` `t:non_neg_integer/0`**{: #max_no_files } - This parameter\n specifies the number of rotated log file archives to keep. This has meaning\n only if [`max_no_bytes`](`m:logger_std_h#max_no_bytes`) is set to an integer\n value.\n\n The log archives are named `FileName.0`, `FileName.1`, ... `FileName.N`, where\n `FileName` is the name of the current log file. `FileName.0` is the newest of\n the archives. The maximum value for `N` is the value of `max_no_files`\n minus 1.\n\n Notice that setting this value to `0` does not turn off rotation. It only\n specifies that no archives are kept.\n\n Defaults to `0`.\n\n- **`compress_on_rotate = ` `t:boolean/0`**{: #compress_on_rotate } - This parameter\n specifies if the rotated log file archives shall be compressed or not. If set\n to `true`, all archives are compressed with `gzip`, and renamed to\n `FileName.N.gz`\n\n `compress_on_rotate` has no meaning if\n [`max_no_bytes`](`m:logger_std_h#max_no_bytes`) has the value `infinity`.\n\n Defaults to `false`.\n\n- **`file_check = ` `t:non_neg_integer/0`**{: #file_check } - When `logger_std_h`\n logs to a file, it reads the file information of the log file prior to each\n write operation. This is to make sure the file still exists and has the same\n inode as when it was opened. This implies some performance loss, but ensures\n that no log events are lost in the case when the file has been removed or\n renamed by an external actor.\n\n In order to allow minimizing the performance loss, the `file_check` parameter\n can be set to a positive integer value, `N`. The handler will then skip\n reading the file information prior to writing, as long as no more than `N`\n milliseconds have passed since it was last read.\n\n Notice that the risk of losing log events grows when the `file_check` value\n grows.\n\n Defaults to 0.\n\n- **`filesync_repeat_interval = ` `t:pos_integer/0` ` | no_repeat`** - This value, in\n milliseconds, specifies how often the handler does a file sync operation to\n write buffered data to disk. The handler attempts the operation repeatedly,\n but only performs a new sync if something has actually been logged.\n\n If `no_repeat` is set as value, the repeated file sync operation is disabled,\n and it is the operating system settings that determine how quickly or slowly\n data is written to disk. The user can also call the `filesync/1` function to\n perform a file sync.\n\n Defaults to `5000` milliseconds.\n\nOther configuration parameters exist, to be used for customizing the overload\nprotection behaviour. The same parameters are used both in the standard handler\nand the disk_log handler, and are documented in the\n[`User's Guide`](logger_chapter.md#overload_protection).\n\nNotice that if changing the configuration of the handler in runtime, the `type`,\n`file`, or `modes` parameters must not be modified.\n\nExample of adding a standard handler:\n\n```erlang\nlogger:add_handler(my_standard_h, logger_std_h,\n #{config => #{file => \"./system_info.log\",\n filesync_repeat_interval => 1000}}).\n```\n\nTo set the default handler, that starts initially with the Kernel application,\nto log to file instead of [`standard_io`](`t:io:standard_io/0`), change the\nKernel default logger configuration. Example:\n\n```text\nerl -kernel logger '[{handler,default,logger_std_h,\n #{config => #{file => \"./log.log\"}}}]'\n```\n\nAn example of how to replace the standard handler with a disk_log handler at\nstartup is found in the `m:logger_disk_log_h` manual.","title":"logger_std_h","ref":"logger_std_h.html"},{"type":"module","doc":"`m:logger`, `m:logger_disk_log_h`","title":"See Also - logger_std_h","ref":"logger_std_h.html#module-see-also"},{"type":"function","doc":"Write buffered data to disk.","title":"logger_std_h.filesync/1","ref":"logger_std_h.html#filesync/1"},{"type":"module","doc":"A service to read internally formatted wrap disk logs.\n\nThis module makes it possible to read internally formatted wrap disk logs, see\n`m:disk_log`. `m:wrap_log_reader` does not interfere with `m:disk_log` activities;\nthere is however a bug in this version of the `m:wrap_log_reader`, see section\n[Known Limitations](`m:wrap_log_reader#module-known-limitations`).\n\nA wrap disk log file consists of many files, called index files. A log file can\nbe opened and closed. Also, a single index file can be opened separately. If a\nnon-existent or non-internally formatted file is opened, an error message is\nreturned. If the file is corrupt, no attempt is made to repair it, but an error\nmessage is returned.\n\nIf a log is configured to be distributed, it is possible that all items are not\nlogged on all nodes. `m:wrap_log_reader` only reads the log on the called node; it\nis up to the user to be sure that all items are read.","title":"wrap_log_reader","ref":"wrap_log_reader.html"},{"type":"module","doc":"This version of `m:wrap_log_reader` does not detect if `m:disk_log` wraps to a new\nindex file between a call to `wrap_log_reader:open/1` and the first call to\n`wrap_log_reader:chunk/1`. If this occurs, the call to `chunk/1` reads the last\nlogged items in the log file, as the opened index file was truncated by\n`m:disk_log`.","title":"Known Limitations - wrap_log_reader","ref":"wrap_log_reader.html#module-known-limitations"},{"type":"function","doc":"","title":"wrap_log_reader.chunk/1","ref":"wrap_log_reader.html#chunk/1"},{"type":"function","doc":"Enables to efficiently read the terms that are appended to a log. Minimises disk\nI/O by reading 64 kilobyte chunks from the file.\n\nThe first time `chunk/2` is called, an initial continuation returned from\n[`open/1`](`open/1`) or [`open/2`](`open/2`) must be provided.\n\nWhen `chunk/2` is called, `N` controls the maximum number of terms that are read\nfrom the log in each chunk. `infinity` means that all the\nterms contained in the 8K chunk are read. If less than `N` terms are returned,\nthis does not necessarily mean that end of file is reached.\n\nReturns a tuple `{Continuation2, Terms}`, where `Terms` is a list of terms found\nin the log. `Continuation2` is yet another continuation that must be passed on\nto any subsequent calls to `chunk()`. With a series of calls to `chunk()`, it is\nthen possible to extract all terms from a log.\n\nReturns a tuple `{Continuation2, Terms, Badbytes}` if the log is opened in read\nonly mode and the read chunk is corrupt. `Badbytes` indicates the number of\nnon-Erlang terms found in the chunk. Notice that the log is not repaired.\n\nReturns `{Continuation2, eof}` when the end of the log is reached, and\n`{error, Reason}` if an error occurs.\n\nThe returned continuation either is or is not valid in the next call to this\nfunction. This is because the log can wrap and delete the file into which the\ncontinuation points. To ensure this does not occur, the log can be blocked\nduring the search.","title":"wrap_log_reader.chunk/2","ref":"wrap_log_reader.html#chunk/2"},{"type":"function","doc":"Closes a log file properly.","title":"wrap_log_reader.close/1","ref":"wrap_log_reader.html#close/1"},{"type":"function","doc":"Equivalent to [`open(Filename, ...)`](`open/2`) except that the whole\nwrap log file is read.","title":"wrap_log_reader.open/1","ref":"wrap_log_reader.html#open/1"},{"type":"function","doc":"`Filename` specifies the name of the file to be read.\n\n`N` specifies the index of the file to be read. Use `open/1` to read the entire\nwrap log.\n\nReturns `{ok, Continuation}` if the log/index file is opened successfully.\n`Continuation` is to be used when chunking or closing the file.\n\nReturns `{error, Reason}` for all errors.","title":"wrap_log_reader.open/2","ref":"wrap_log_reader.html#open/2"},{"type":"type","doc":"","title":"wrap_log_reader.chunk_ret/0","ref":"wrap_log_reader.html#t:chunk_ret/0"},{"type":"opaque","doc":"Continuation returned by `open/1,2` or `chunk/1,2`.","title":"wrap_log_reader.continuation/0","ref":"wrap_log_reader.html#t:continuation/0"},{"type":"type","doc":"","title":"wrap_log_reader.open_ret/0","ref":"wrap_log_reader.html#t:open_ret/0"},{"type":"module","doc":"Sequential tracing of information transfers.\n\nSequential tracing makes it possible to trace information flows between\nprocesses resulting from one initial transfer of information. Sequential tracing\nis independent of the ordinary tracing in Erlang, which is controlled by the\n`erlang:trace/3` BIF. For more information about what sequential tracing is and\nhow it can be used, see section [Sequential Tracing](`m:seq_trace#whatis`).\n\n`seq_trace` provides functions that control all aspects of sequential tracing.\nThere are functions for activation, deactivation, inspection, and for collection\nof the trace output.","title":"seq_trace","ref":"seq_trace.html"},{"type":"module","doc":"The format of the messages is one of the following, depending on if flag\n`timestamp` of the trace token is set to `true` or `false`:\n\n```text\n{seq_trace, Label, SeqTraceInfo, TimeStamp}\n```\n\nor\n\n```text\n{seq_trace, Label, SeqTraceInfo}\n```\n\nWhere:\n\n```erlang\nLabel = int()\nTimeStamp = {Seconds, Milliseconds, Microseconds}\n Seconds = Milliseconds = Microseconds = int()\n```\n\n`SeqTraceInfo` can have the following formats:\n\n- **`{send, Serial, From, To, Message}`** - Used when a process `From` with its\n trace token flag `send` set to `true` has sent information. `To` may be a\n process identifier, a registered name on a node represented as\n `{NameAtom, NodeAtom}`, or a node name represented as an atom. `From` may be a\n process identifier or a node name represented as an atom. `Message` contains\n the information passed along in this information transfer. If the transfer is\n done via message passing, it is the actual message.\n\n- **`{'receive', Serial, From, To, Message}`** - Used when a process `To`\n receives information with a trace token that has flag `'receive'` set to\n `true`. `To` may be a process identifier, or a node name represented as an\n atom. `From` may be a process identifier or a node name represented as an\n atom. `Message` contains the information passed along in this information\n transfer. If the transfer is done via message passing, it is the actual\n message.\n\n- **`{print, Serial, From, _, Info}`** - Used when a process `From` has called\n `seq_trace:print(Label, TraceInfo)` and has a trace token with flag `print`\n set to `true`, and `label` set to `Label`.\n\n`Serial` is a tuple `{PreviousSerial, ThisSerial}`, where:\n\n- Integer `PreviousSerial` denotes the serial counter passed in the last\n received information that carried a trace token. If the process is the first\n in a new sequential trace, `PreviousSerial` is set to the value of the process\n internal \"trace clock\".\n- Integer `ThisSerial` is the serial counter that a process sets on outgoing\n messages. It is based on the process internal \"trace clock\", which is\n incremented by one before it is attached to the trace token in the message.\n\n[](){: #whatis }","title":"Trace Messages Sent to the System Tracer - seq_trace","ref":"seq_trace.html#module-trace-messages-sent-to-the-system-tracer"},{"type":"module","doc":"Sequential tracing is a way to trace a sequence of information transfers between\ndifferent local or remote processes, where the sequence is initiated by a single\ntransfer. The typical information transfer is an ordinary Erlang message passed\nbetween two processes, but information is transferred also in other ways. In\nshort, it works as follows:\n\nEach process has a _trace token_, which can be empty or not empty. When not\nempty, the trace token can be seen as the tuple `{Label, Flags, Serial, From}`.\nThe trace token is passed invisibly when information is passed between\nprocesses. In most cases the information is passed in ordinary messages between\nprocesses, but information is also passed between processes by other means. For\nexample, by spawning a new process. An information transfer between two\nprocesses is represented by a send event and a receive event regardless of how\nit is passed.\n\nTo start a sequential trace, the user must explicitly set the trace token in the\nprocess that will send the first information in a sequence.\n\nThe trace token of a process is set each time the process receives information.\nThis is typically when the process matches a message in a receive statement,\naccording to the trace token carried by the received message, empty or not.\n\nOn each Erlang node, a process can be set as the _system tracer_. This process\nwill receive trace messages each time information with a trace token is sent or\nreceived (if the trace token flag `send` or `'receive'` is set). The system\ntracer can then print each trace event, write it to a file, or whatever\nsuitable.\n\n> #### Note {: .info }\n>\n> The system tracer only receives those trace events that occur locally within\n> the Erlang node. To get the whole picture of a sequential trace, involving\n> processes on many Erlang nodes, the output from the system tracer on each\n> involved node must be merged (offline).\n\nThe following sections describe sequential tracing and its most fundamental\nconcepts.","title":"Sequential Tracing - seq_trace","ref":"seq_trace.html#module-sequential-tracing"},{"type":"module","doc":"Information flows between processes in a lot of different ways. Not all flows of\ninformation will be covered by sequential tracing. One example is information\npassed via ETS tables. Below is a list of information paths that are covered by\nsequential tracing:\n\n- **Message Passing** - All ordinary messages passed between Erlang processes.\n\n- **Exit signals** - An exit signal is represented as an `{'EXIT', Pid, Reason}`\n tuple.\n\n- **Process Spawn** - A process spawn is represented as multiple information\n transfers. At least one spawn request and one spawn reply. The actual amount\n of information transfers depends on what type of spawn it is and may also\n change in future implementations. Note that this is more or less an internal\n protocol that you are peeking at. The spawn request will be represented as a\n tuple with the first element containing the atom `spawn_request`, but this is\n more or less all that you can depend on.\n\n> #### Note {: .info }\n>\n> If you do ordinary `send` or `receive` trace on the system, you will only see\n> ordinary message passing, not the other information transfers listed above.\n\n> #### Note {: .info }\n>\n> When a send event and corresponding receive event do not both correspond to\n> ordinary Erlang messages, the `Message` part of the trace messages may not be\n> identical. This since all information not necessarily are available when\n> generating the trace messages.","title":"Different Information Transfers - seq_trace","ref":"seq_trace.html#module-different-information-transfers"},{"type":"module","doc":"Each process has a current trace token which is \"invisibly\" passed from the\nparent process on creation of the process.\n\nThe current token of a process is set in one of the following two ways:\n\n- Explicitly by the process itself, through a call to `seq_trace:set_token/1,2`\n- When information is received. This is typically when a received message is\n matched out in a receive expression, but also when information is received in\n other ways.\n\nIn both cases, the current token is set. In particular, if the token of a\nreceived message is empty, the current token of the process is set to empty.\n\nA trace token contains a label and a set of flags. Both the label and the flags\nare set in both alternatives above.","title":"Trace Token - seq_trace","ref":"seq_trace.html#module-trace-token"},{"type":"module","doc":"The trace token contains a component called `serial`. It consists of two\nintegers, `Previous` and `Current`. The purpose is to uniquely identify each\ntraced event within a trace sequence, as well as to order the messages\nchronologically and in the different branches, if any.\n\nThe algorithm for updating `Serial` can be described as follows:\n\nLet each process have two counters, `prev_cnt` and `curr_cnt`, both are set to\n`0` when a process is created outside of a trace sequence. The counters are\nupdated at the following occasions:\n\n- _When the process is about to pass along information to another process and\n the trace token is not empty._ This typically occurs when sending a message,\n but also, for example, when spawning another process.\n\n Let the serial of the trace token be `tprev` and `tcurr`.\n\n ```text\n curr_cnt := curr_cnt + 1\n tprev := prev_cnt\n tcurr := curr_cnt\n ```\n\n The trace token with `tprev` and `tcurr` is then passed along with the\n information passed to the other process.\n\n- _When the process calls_ `seq_trace:print(Label, Info)`, `Label` _matches the\n label part of the trace token and the trace token print flag is `true`._\n\n The algorithm is the same as for send above.\n\n- _When information is received that also contains a non-empty trace token. For\n example, when a message is matched out in a receive expression, or when a new\n process is spawned._\n\n The process trace token is set to the trace token from the message.\n\n Let the serial of the trace token be `tprev` and `tcurr`.\n\n ```text\n if (curr_cnt < tcurr )\n curr_cnt := tcurr\n prev_cnt := tcurr\n ```\n\n`curr_cnt` of a process is incremented each time the process is involved in a\nsequential trace. The counter can reach its limit (27 bits) if a process is very\nlong-lived and is involved in much sequential tracing. If the counter overflows,\nthe serial for ordering of the trace events cannot be used. To prevent the\ncounter from overflowing in the middle of a sequential trace, function\n`seq_trace:reset_trace/0` can be called to reset `prev_cnt` and `curr_cnt` of\nall processes in the Erlang node. This function also sets all trace tokens in\nprocesses and their message queues to empty, and thus stops all ongoing\nsequential tracing.","title":"Serial - seq_trace","ref":"seq_trace.html#module-serial"},{"type":"module","doc":"The performance degradation for a system that is enabled for sequential tracing\nis negligible as long as no tracing is activated. When tracing is activated,\nthere is an extra cost for each traced message, but all other messages are\nunaffected.","title":"Performance Considerations - seq_trace","ref":"seq_trace.html#module-performance-considerations"},{"type":"module","doc":"Sequential tracing is not performed across ports.\n\nIf the user for some reason wants to pass the trace token to a port, this must\nbe done manually in the code of the port controlling process. The port\ncontrolling processes have to check the appropriate sequential trace settings\n(as obtained from `seq_trace:get_token/1`) and include trace information in the\nmessage data sent to their respective ports.\n\nSimilarly, for messages received from a port, a port controller has to retrieve\ntrace-specific information, and set appropriate sequential trace flags through\ncalls to `seq_trace:set_token/2`.","title":"Ports - seq_trace","ref":"seq_trace.html#module-ports"},{"type":"module","doc":"Sequential tracing between nodes is performed transparently. This applies to\nC-nodes built with `Erl_Interface` too. A C-node built with `Erl_Interface` only\nmaintains one trace token, which means that the C-node appears as one process\nfrom the sequential tracing point of view.","title":"Distribution - seq_trace","ref":"seq_trace.html#module-distribution"},{"type":"module","doc":"This example gives a rough idea of how the new primitives can be used and what\nkind of output it produces.\n\nAssume that you have an initiating process with `Pid == <0.30.0>` like this:\n\n```erlang\n-module(seqex).\n-compile(export_all).\n\nloop(Port) ->\n receive\n {Port,Message} ->\n seq_trace:set_token(label,17),\n seq_trace:set_token('receive',true),\n seq_trace:set_token(print,true),\n seq_trace:print(17,\"**** Trace Started ****\"),\n call_server ! {self(),the_message};\n {ack,Ack} ->\n ok\n end,\n loop(Port).\n```\n\nAnd a registered process `call_server` with `Pid == <0.31.0>` like this:\n\n```erlang\nloop() ->\n receive\n {PortController,Message} ->\n Ack = {received, Message},\n seq_trace:print(17,\"We are here now\"),\n PortController ! {ack,Ack}\n end,\n loop().\n```\n\nA possible output from the system's `sequential_tracer` can be like this:\n\n```erlang\n17:<0.30.0> Info {0,1} WITH\n\"**** Trace Started ****\"\n17:<0.31.0> Received {0,2} FROM <0.30.0> WITH\n{<0.30.0>,the_message}\n17:<0.31.0> Info {2,3} WITH\n\"We are here now\"\n17:<0.30.0> Received {2,4} FROM <0.31.0> WITH\n{ack,{received,the_message}}\n```\n\nThe implementation of a system tracer process that produces this printout can\nlook like this:\n\n```erlang\ntracer() ->\n receive\n {seq_trace,Label,TraceInfo} ->\n print_trace(Label,TraceInfo,false);\n {seq_trace,Label,TraceInfo,Ts} ->\n print_trace(Label,TraceInfo,Ts);\n _Other -> ignore\n end,\n tracer().\n\nprint_trace(Label,TraceInfo,false) ->\n io:format(\"~p:\",[Label]),\n print_trace(TraceInfo);\nprint_trace(Label,TraceInfo,Ts) ->\n io:format(\"~p ~p:\",[Label,Ts]),\n print_trace(TraceInfo).\n\nprint_trace({print,Serial,From,_,Info}) ->\n io:format(\"~p Info ~p WITH~n~p~n\", [From,Serial,Info]);\nprint_trace({'receive',Serial,From,To,Message}) ->\n io:format(\"~p Received ~p FROM ~p WITH~n~p~n\",\n [To,Serial,From,Message]);\nprint_trace({send,Serial,From,To,Message}) ->\n io:format(\"~p Sent ~p TO ~p WITH~n~p~n\",\n [From,Serial,To,Message]).\n```\n\nThe code that creates a process that runs this tracer function and sets that\nprocess as the system tracer can look like this:\n\n```erlang\nstart() ->\n Pid = spawn(?MODULE,tracer,[]),\n seq_trace:set_system_tracer(Pid), % set Pid as the system tracer\n ok.\n```\n\nWith a function like `test/0`, the whole example can be started:\n\n```erlang\ntest() ->\n P = spawn(?MODULE, loop, [port]),\n register(call_server, spawn(?MODULE, loop, [])),\n start(),\n P ! {port,message}.\n```","title":"Example of Use - seq_trace","ref":"seq_trace.html#module-example-of-use"},{"type":"function","doc":"Returns the pid, port identifier or tracer module of the current system tracer\nor `false` if no system tracer is activated.","title":"seq_trace.get_system_tracer/0","ref":"seq_trace.html#get_system_tracer/0"},{"type":"function","doc":"Returns the value of the trace token for the calling process. If `[]` is\nreturned, it means that tracing is not active. Any other value returned is the\nvalue of an active trace token. The value returned can be used as input to the\n[`set_token/1`](`set_token/1`) function.","title":"seq_trace.get_token/0","ref":"seq_trace.html#get_token/0"},{"type":"function","doc":"Returns the value of the trace token component `Component`. See `set_token/2`\nfor possible values of `Component` and `Val`.","title":"seq_trace.get_token/1","ref":"seq_trace.html#get_token/1"},{"type":"function","doc":"Puts the Erlang term `TraceInfo` into the sequential trace output if the calling\nprocess currently is executing within a sequential trace and the `print` flag of\nthe trace token is set.","title":"seq_trace.print/1","ref":"seq_trace.html#print/1"},{"type":"function","doc":"Same as [`print/1`](`print/1`) with the additional condition that `TraceInfo` is\noutput only if `Label` is equal to the label component of the trace token.","title":"seq_trace.print/2","ref":"seq_trace.html#print/2"},{"type":"function","doc":"Sets the trace token to empty for all processes on the local node. The process\ninternal counters used to create the serial of the trace token is set to 0. The\ntrace token is set to empty for all messages in message queues. Together this\nwill effectively stop all ongoing sequential tracing in the local node.","title":"seq_trace.reset_trace/0","ref":"seq_trace.html#reset_trace/0"},{"type":"function","doc":"Sets the system tracer. The system tracer can be either a process, port or\n[tracer module](`m:erl_tracer`) denoted by `Tracer`. Returns the previous value\n(which can be `false` if no system tracer is active).\n\nFailure: `{badarg, Info}}` if `Pid` is not an existing local pid.","title":"seq_trace.set_system_tracer/1","ref":"seq_trace.html#set_system_tracer/1"},{"type":"function","doc":"Sets the trace token for the calling process to `Token`. If `Token == []` then\ntracing is disabled, otherwise `Token` should be an Erlang term returned from\n`get_token/0` or [`set_token/1`](`set_token/1`). [`set_token/1`](`set_token/1`)\ncan be used to temporarily exclude message passing from the trace by setting the\ntrace token to empty like this:\n\n```erlang\nOldToken = seq_trace:set_token([]), % set to empty and save\n % old value\n% do something that should not be part of the trace\nio:format(\"Exclude the signalling caused by this~n\"),\nseq_trace:set_token(OldToken), % activate the trace token again\n...\n```\n\nReturns the previous value of the trace token.","title":"seq_trace.set_token/1","ref":"seq_trace.html#set_token/1"},{"type":"function","doc":"Sets the individual `Component` of the trace token to `Val`. Returns the\nprevious value of the component.\n\n- **[`set_token(label, Label)`](`set_token/2`)** - The `label` component is a\n term which identifies all events belonging to the same sequential trace. If\n several sequential traces can be active simultaneously, `label` is used to\n identify the separate traces. Default is 0.\n\n > #### Warning {: .warning }\n >\n > Labels were restricted to small signed integers (28 bits) prior to OTP 21.\n > The trace token will be silently dropped if it crosses over to a node that\n > does not support the label.\n\n- **[`set_token(serial, SerialValue)`](`set_token/2`)** -\n `SerialValue = {Previous, Current}`. The `serial` component contains counters\n which enables the traced messages to be sorted, should never be set explicitly\n by the user as these counters are updated automatically. Default is `{0, 0}`.\n\n- **[`set_token(send, Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables tracing on information sending.\n Default is `false`.\n\n- **[`set_token('receive', Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables tracing on information reception.\n Default is `false`.\n\n- **[`set_token(print, Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables tracing on explicit calls to\n `seq_trace:print/1`. Default is `false`.\n\n- **[`set_token(timestamp, Bool)`](`set_token/2`)** - A trace token flag\n (`true | false`) which enables/disables a timestamp to be generated for each\n traced event. Default is `false`.\n\n- **[`set_token(strict_monotonic_timestamp, Bool)`](`set_token/2`)** - A trace\n token flag (`true | false`) which enables/disables a strict monotonic\n timestamp to be generated for each traced event. Default is `false`.\n Timestamps will consist of\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`) and\n a monotonically increasing integer. The time-stamp has the same format and\n value as produced by\n `{erlang:monotonic_time(nanosecond), erlang:unique_integer([monotonic])}`.\n\n- **[`set_token(monotonic_timestamp, Bool)`](`set_token/2`)** - A trace token\n flag (`true | false`) which enables/disables a strict monotonic timestamp to\n be generated for each traced event. Default is `false`. Timestamps will use\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`).\n The time-stamp has the same format and value as produced by\n `erlang:monotonic_time(nanosecond)`.\n\nIf multiple timestamp flags are passed, `timestamp` has precedence over\n`strict_monotonic_timestamp` which in turn has precedence over\n`monotonic_timestamp`. All timestamp flags are remembered, so if two are passed\nand the one with highest precedence later is disabled the other one will become\nactive.","title":"seq_trace.set_token/2","ref":"seq_trace.html#set_token/2"},{"type":"type","doc":"","title":"seq_trace.component/0","ref":"seq_trace.html#t:component/0"},{"type":"type","doc":"","title":"seq_trace.flag/0","ref":"seq_trace.html#t:flag/0"},{"type":"type","doc":"An opaque term (a tuple) representing a trace token.","title":"seq_trace.token/0","ref":"seq_trace.html#t:token/0"},{"type":"type","doc":"","title":"seq_trace.tracer/0","ref":"seq_trace.html#t:tracer/0"},{"type":"type","doc":"","title":"seq_trace.value/0","ref":"seq_trace.html#t:value/0"},{"type":"module","doc":"The Erlang trace interface.\n\nThe Erlang run-time system exposes several trace points that allow users\nto be notified when they are triggered. Trace points are things such as\nfunction calls, message sending and receiving, garbage collection, and\nprocess scheduling.\n\nThe functions in this module can be used directly, but can also be\nused as building blocks to build more sophisticated debugging or\nprofiling tools. For debugging Erlang code it is recommended to use\n`m:dbg` and for profiling to use `m:tprof`.","title":"trace","ref":"trace.html"},{"type":"module","doc":"All tracing is done within a trace session. Trace sessions can be\n[created](`session_create/3`) and [destroyed](`session_destroy/1`)\ndynamically. Each session has its own tracer that will receive all trace\nmessages. Several sessions can exist at the same time without interfering with\neach other. When a trace session is destroyed, all its trace settings are\nautomatically cleaned up.\n\n*Example*:\n\n```erlang\n%% Create a tracer process that will receive the trace events\n1> Tracer = spawn(fun F() -> receive M -> io:format(\"~p~n\",[M]), F() end end).\n<0.91.0>\n%% Create a session using the Tracer\n2> Session = trace:session_create(my_session, Tracer, []).\n{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}\n%% Setup call tracing on self()\n3> trace:process(Session, self(), true, [call]).\n1\n%% Setup call tracing on lists:seq/2\n4> trace:function(Session, {lists,seq,2}, [], []).\n1\n%% Call the traced function\n5> lists:seq(1, 10).\n{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message\n[1,2,3,4,5,6,7,8,9,10] % The return value\n%% Cleanup the trace session\n6> trace:session_destroy(Session).\nok\n```","title":"Trace Sessions - trace","ref":"trace.html#module-trace-sessions"},{"type":"module","doc":"The functions in this module only operates on the local node. That is, both the\ntraced processes/ports as well as the tracer process/port/module must all reside\non the same local node as the call is made. To trace remote nodes use `m:dbg` or\n`m:ttb`.\n\n> #### Change {: .info }\n>\n> This `trace` module was introduced in OTP 27.0. The interface and semantics are\n> similar to the older functions `erlang:trace/3`, `erlang:trace_pattern/3`,\n> and `erlang:trace_info/2`.\n>\n> The main difference is the old functions operate on a single static\n> trace session per node. That could impose the problem that different\n> users and tools would interfere with each other's trace settings. The new trace\n> functions in this module all operate on dynamically created trace sesssions\n> isolated from each other. Also, this makes it easier to safely disable all trace\n> settings when done by a single call to `session_destroy/1`.\n>\n> To change an existing tool to use the interface the following table can be\n> useful:\n>\n> | Old function call | corresponds to |\n> | ------------------------------------------- | ------------------------------------------------------------------ |\n> | [`erlang:trace(Pid, ...)`][1] | [`process(S, Pid, ...)`][p] |\n> | [`erlang:trace(processes, ...)`][1] | [`process(S, all, ...)`][p] |\n> | [`erlang:trace(existing_processes, ...)`][1] | [`process(S, existing, ...)`][p] |\n> | [`erlang:trace(new_processes, ...)`][1] | [`process(S, new, ...)`][p] |\n> | [`erlang:trace(Port, ...)`][1] | [`port(S, Port, ...)`][o] |\n> | [`erlang:trace(ports, ...)`][1] | [`port(S, all, ...)`][o] |\n> | [`erlang:trace(existing_ports, ...)`][1] | [`port(S, existing, ...)`][o] |\n> | [`erlang:trace(new_ports, ...)`][1] | [`port(S, new, ...)`][o] |\n> | [`erlang:trace(all, ...)`][1] | [`process(S, all, ...)`][p] and [`port(S, all, ...)`][o] |\n> | [`erlang:trace(existing, ...)`][1] | [`process(S, existing, ...)`][p] and [`port(S, existing, ...)`][o] |\n> | [`erlang:trace(new, ...)`][1] | [`process(S, new, ...)`][p] and [`port(S, new, ...)`][o] |\n> | [`erlang:trace_pattern(MFA, ...)`][2] | [`function(S, MFA, ...)`][f] |\n> | [`erlang:trace_pattern(send, ...)`][2] | [`send(S, ...)`][s] |\n> | [`erlang:trace_pattern('receive', ...)`][2] | [`recv(S, ...)`][r] |\n> | [`erlang:trace_info(...)`][3] | [`info(S, ...)`][i] |\n>\n> Argument `S` is the trace session that must first be created with\n> `session_create/3`. The other arguments (implied by `...`) are mostly the\n> same. The only other difference is that the tracer is always the tracer\n> specified when the session was created. Options `{tracer,T}`, `{tracer,M,S}`,\n> `{meta,T}`, and `{meta,M,S}` are therefore not allowed, and the default tracer is\n> never the calling process.\n\n[1]: `erlang:trace/3`\n[2]: `erlang:trace_pattern/3`\n[3]: `erlang:trace_info/2`\n[p]: `process/4`\n[o]: `port/4`\n[f]: `function/4`\n[s]: `send/3`\n[r]: `recv/3`\n[i]: `info/3`","title":"Node Local Tracing Only - trace","ref":"trace.html#module-node-local-tracing-only"},{"type":"function","doc":"Equivalent to [`erlang:trace_delivered(Tracee)`](`erlang:trace_delivered/1`)\nexcept that it is run within the given `t:session/0`.","title":"trace.delivered/2","ref":"trace.html#delivered/2"},{"type":"function","doc":"Enable or disable _call tracing_ for one or more functions.\n\nMust be combined with `process/4` to set the `call` trace flag for one or more\nprocesses.\n\nConceptually, call tracing works as follows. In each trace session, a\nset of processes and a set of functions haven been marked for\ntracing. If a traced process calls a traced function, the trace action\nis taken. Otherwise, nothing happens.\n\nTo add or remove one or more processes to the set of traced processes, use\n`process/4`.\n\nUse this function to add or remove functions to the set of traced functions\nin a trace session.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nArgument **`MFA`** is to be a tuple, such as `{Module, Function, Arity}`, or the\natom `on_load` (described below). The `MFA` tuple specifies the module,\nfunction, and arity for the functions to be traced. The atom `'_'` can be used\nas a wildcard in any of the following ways:\n\n- **`{Module,Function,'_'}`** - All functions of any arity named `Function` in\n module `Module`.\n\n- **`{Module,'_','_'}`** - All functions in module `Module`.\n\n- **`{'_','_','_'}`** - All functions in all loaded modules.\n\nOther combinations, such as `{Module,'_',Arity}`, are not allowed.\n\nIf argument `MFA` is the atom `on_load`, the match specification and flag list\nare used on all functions in all modules that are newly loaded.\n\nArgument **`MatchSpec`** can take the following forms:\n\n- **`true`** - Enable tracing for the matching functions. Any match\n specification is removed.\n\n- **`false`** - Disable tracing for the matching functions. Any match\n specification is removed.\n\n- **`MatchExpression`** - A match specification. An empty list is equivalent to\n `true`. For a description of match specifications, see section\n [Match Specifications in Erlang](`e:erts:match_spec.md`) in the User's Guide\n for the ERTS application.\n\n- **`restart`** - For the `FlagList` options `call_count`, `call_time` and\n `call_memory`: restarts the existing counters. The behavior is undefined for\n other `FlagList` options.\n\n- **`pause`** - For the `FlagList` options `call_count`, `call_time` and\n `call_memory`: pauses the existing counters. The behavior is undefined for\n other `FlagList` options.\n\nArgument **`FlagList`** is a list of options. The following are the valid options:\n\n- **`global`** - Turn on or off call tracing for global function calls (that\n is, calls specifying the module explicitly). Only exported functions match and\n only global calls generate trace messages. **This is the default if `FlagList`\n is empty**.\n\n- **`local`** - Turn on or off call tracing for all types of function calls.\n Trace messages are sent whenever any of the specified functions are called,\n regardless of how they are called. If flag `return_to` is set for the process,\n a `return_to` message is also sent when this function returns to its caller.\n\n- **`meta`** - Turn on or off meta-tracing for all types of function\n calls. Trace messages are sent to the tracer whenever any of the specified\n functions are called.\n\n Meta-tracing traces all processes and does not care about the process trace\n flags set by `process/4`, the trace flags are instead fixed to\n `[call, timestamp]`.\n\n The match specification function `{return_trace}` works with meta-trace.\n\n- **`call_count`**{: #call_count } - Start (`MatchSpec == true`) or stop\n (`MatchSpec == false`) call count tracing for all types of function calls. For\n every function, a counter is incremented when the function is called, in any\n process. No process trace flags need to be activated.\n\n If call count tracing is started while already running, the count is restarted\n from zero. To pause running counters, use `MatchSpec == pause`. Paused and\n running counters can be restarted from zero with `MatchSpec == restart`.\n\n To read the counter value for a function, call\n [`trace:info(_, MFA, call_count)`](`info/3`).\n\n- **`call_time`**{: #call_time } - Start (`MatchSpec` is `true`) or stops (`MatchSpec` is `false`)\n call time tracing for all types of function calls. For every function, a\n counter is incremented when the function is called and the time spent in the\n function is measured and accumulated in another counter. The counters are\n stored for each call traced process.\n\n If call time tracing is started while already running, the count and time\n restart from zero. To pause running counters, use `MatchSpec == pause`. Paused\n and running counters can be restarted from zero with `MatchSpec == restart`.\n\n To read the counter values, use `info/3`.\n\n- **`call_memory`**{: #call_memory } - Start (`MatchSpec == true`) or stop\n (`MatchSpec == false`) call memory tracing for all types of function calls.\n\n If call memory tracing is started while already running, counters and\n allocations restart from zero. To pause running counters, use\n `MatchSpec == pause`. Paused and running counters can be restarted from zero\n with `MatchSpec == restart`.\n\n To read the counter value, use `info/3`.\n\nOption `global` cannot be combined with any of the other options, which all\nperform some kind of local tracing. If global tracing is specified for\na set of functions, then `local`, `meta`, `call_count`, `call_time`,\nand `call_memory` tracing for the matching set of functions are\ndisabled, and vice versa.\n\nWhen disabling trace, the option must match the type of trace set on the\nfunction. That is, local tracing must be disabled with option `local` and global\ntracing with option `global` (or no option), and so on.\n\nPart of a match specification cannot be changed directly. If a function has\na match specification, it can be replaced with a new one. Function `info/3` can\nbe used to retrieve the existing match specification.\n\nReturns the number of functions matching argument `MFA`. Zero is returned if\nnone matched or if `on_load` was specified.\n\nFails by raising an error exception with an error reason of:\n\n- **`badarg`** - If an argument is invalid.\n\n- **`system_limit`** - If a match specification passed as argument has excessive\n nesting which causes scheduler stack exhaustion for the scheduler that the\n calling process is executing on.\n [Scheduler stack size](`e:erts:erl_cmd.md#sched_thread_stack_size`) can be configured\n when starting the runtime system.","title":"trace.function/4","ref":"trace.html#function/4"},{"type":"function","doc":"Return trace information about a port, process, function, or event.\n\nArgument `Session` is the trace session to inspect as returned by\n`session_create/3` or `session_info/1`.\n\n**To get information about a port or process**, `PidPortFuncEvent` is to be a\nprocess identifier (pid), port identifier, or one of the atoms `new`,\n`new_processes`, or `new_ports`. The atom `new` or `new_processes` means that\nthe default trace state for processes to be created is returned. The atom\n`new_ports` means that the default trace state for ports to be created is\nreturned.\n\nValid `Item` values for ports and processes:\n\n- **`flags`** - Returns a list of atoms indicating what kind of traces is\n enabled for the process. The list is empty if no traces are enabled, and one\n or more of [`trace_info_flag()`](`t:trace_info_flag/0`) if traces are enabled.\n The order is arbitrary.\n\n- **`tracer`** - Returns the identifier for process, port, or a tuple containing\n the tracer module and tracer state tracing this process. If this process is\n not traced, the return value is `[]`.\n\n**To get information about a function**, `PidPortFuncEvent` is to be the\nthree-element tuple `{Module, Function, Arity}` or the atom `on_load`. No\nwildcards are allowed. Returns `undefined` if the function does not exist or\n`false` if the function is not traced. If `PidPortFuncEvent` is `on_load`, the\ninformation returned refers to the default value for code that will be loaded.\n\nValid `Item` values for functions:\n\n- **`traced`** - Returns `global` if this function is traced on global function\n calls, `local` if this function is traced on local function calls (that is,\n local and global function calls), and `false` if local or global function\n calls are not traced.\n\n- **`match_spec`** - Returns the match specification for this function, if it\n has one. If the function is locally or globally traced but has no match\n specification defined, the returned value is `[]`.\n\n- **`meta`** - Returns the meta-trace tracer process, port, or trace module for\n this function, if it has one. If the function is not meta-traced, the returned\n value is `false`. If the function is meta-traced but has once detected that\n the tracer process is invalid, the returned value is `[]`.\n\n- **`meta_match_spec`** - Returns the meta-trace match specification for this\n function, if it has one. If the function is meta-traced but has no match\n specification defined, the returned value is `[]`.\n\n- **`call_count`** - Returns the call count value for this function or `true`\n for the pseudo function `on_load` if call count tracing is active. Otherwise\n `false` is returned.\n\n See also `function/4`.\n\n- **`call_time`** - Returns the call time values for this function or `true` for\n the pseudo function `on_load` if call time tracing is active. Otherwise\n `false` is returned. The call time values returned, `[{Pid, Count, S, Us}]`,\n is a list of each process that executed the function and its specific\n counters. `Count` is the call count. `S` and `Us` are the accumulated call\n time expressed in seconds and microseconds.\n\n See also `function/4`.\n\n- **`call_memory`** - Returns the accumulated number of words allocated by this\n function. Accumulation stops at the next memory traced function: if there are\n `outer`, `middle` and `inner` functions each allocating 3 words, but only\n `outer` is traced, it will report 9 allocated words. If `outer` and `inner`\n are traced, 6 words are reported for `outer` and 3 for `inner`. When function\n is not traced, `false` is returned. Returned tuple is `[{Pid, Count, Words}]`,\n for each process that executed the function.\n\n See also `function/4`.\n\n- **`all`** - Returns a list containing the `{Item, Value}` tuples for all other\n items, or returns `false` if no tracing is active for this function.\n\n**To get information about an event**, `PidPortFuncEvent` is to be one of the\natoms `send` or `'receive'`.\n\nOne valid `Item` for events exists:\n\n- **`match_spec`** - Returns the match specification for this event, if it has\n one, or `true` if no match specification has been set.\n\nThe return value is `{Item, Value}`, where `Value` is the requested information\nas described earlier. If a pid for a dead process was specified, or the name of\na non-existing function, `Value` is `undefined`.","title":"trace.info/3","ref":"trace.html#info/3"},{"type":"function","doc":"Turn on or off trace flags for one or more ports.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\n`Ports` is either a port identifier for a local port or one of the following atoms:\n\n- **`all`** - All currently existing ports and all that will be\n created in the future.\n\n- **`existing`** - All currently existing ports.\n\n- **`new`** - All ports that will be created in the future.\n\n`FlagList` can contain any number of the following flags (the \"message tags\"\nrefers to the list of [`trace messages`](#port_trace_messages)):\n\n- **`all`** - Sets all trace flags except `cpu_timestamp`, which are in its\n nature different than the others.\n\n- **`send`** - Traces sending of messages.\n\n Message tags: [`send`](#port_trace_messages_send) and\n [`send_to_non_existing_process`](#port_trace_messages_send_to_non_existing_process).\n\n- **`'receive'`** - Traces receiving of messages.\n\n Message tags: [`'receive'`](#port_trace_messages_receive).\n\n- **`ports`** - Traces port-related events.\n\n Message tags: [`open`](#port_trace_messages_open),\n [`closed`](#port_trace_messages_closed),\n [`register`](#port_trace_messages_register),\n [`unregister`](#port_trace_messages_unregister),\n [`getting_linked`](#port_trace_messages_getting_linked), and\n [`getting_unlinked`](#port_trace_messages_getting_unlinked).\n\n- **`running_ports`** - Traces scheduling of ports.\n\n Message tags: [`in`](#port_trace_messages_in_port) and\n [`out`](#port_trace_messages_out_port).\n\n- **`timestamp`**, **`cpu_timestamp`**, **`monotonic_timestamp`**,\n **`strict_monotonic_timestamp`** - Same as for timestamps in\n [`process/4`](#timestamp).\n\nThe tracing process receives the _trace messages_ described in the following\nlist. `Port` is the port identifier of the traced port in which the traced\nevent has occurred. The third tuple element is the message tag.\n\nIf flag `timestamp`, `strict_monotonic_timestamp`, or `monotonic_timestamp` is\nspecified, the first tuple element is `trace_ts` instead, and the time stamp is\nadded as an extra element last in the message tuple. If multiple time stamp\nflags are passed, `timestamp` has precedence over `strict_monotonic_timestamp`,\nwhich in turn has precedence over `monotonic_timestamp`. All time stamp flags\nare remembered, so if two are passed and the one with highest precedence later\nis disabled, the other one becomes active.\n\nIf a match specification (applicable only for `send` and `'receive'`\ntracing) contains a `{message}` action function with a non-boolean value, that\nvalue is added as an extra element to the message tuple either in the last\nposition or before the timestamp (if it is present).\n\nTrace messages:\n\n[](){: #port_trace_messages }\n\n- **`{trace, Port, send, Msg, To}`{: #port_trace_messages_send }** - When\n `Port` sends message `Msg` to process `To`.\n\n- **`{trace, Port, send_to_non_existing_process, Msg, To}`{:\n #port_trace_messages_send_to_non_existing_process }** - When `Port`\n sends message `Msg` to the non-existing process `To`.\n\n- **`{trace, Port, 'receive', Msg}`{: #port_trace_messages_receive }** -\n When `Port` receives message `Msg`. If `Msg` is set to time-out, a receive\n statement can have timed out, or the process received a message with the\n payload `timeout`.\n\n- **`{trace, Port, register, RegName}`{: #port_trace_messages_register\n }** - When `Port` gets the name `RegName` registered.\n\n- **`{trace, Port, unregister, RegName}`{: #port_trace_messages_unregister\n }** - When `Port` gets the name `RegName` unregistered. This is done\n automatically when a registered process or port exits.\n\n- **`{trace, Port, getting_linked, Pid2}`{:\n #port_trace_messages_getting_linked }** - When `Port` gets linked to a\n process `Pid2`.\n\n- **`{trace, Port, getting_unlinked, Pid2}`{:\n #port_trace_messages_getting_unlinked }** - When `Port` gets unlinked\n from a process `Pid2`.\n\n- **`{trace, Port, open, Pid, Driver}`{: #port_trace_messages_open }** - When\n `Pid` opens a new port `Port` with the running `Driver`.\n\n `Driver` is the name of the driver as an atom.\n\n- **`{trace, Port, closed, Reason}`{: #port_trace_messages_closed }** - When\n `Port` closes with `Reason`.\n\n- **`{trace, Port, in, Command | 0}`{: #port_trace_messages_in_port }** -\n When `Port` is scheduled to run. `Command` is the first thing the port will\n execute, it can however run several commands before being scheduled out. On\n some rare occasions, the current function cannot be determined, then the last\n element is `0`.\n\n The possible commands are `call`, `close`, `command`, `connect`, `control`,\n `flush`, `info`, `link`, `open`, and `unlink`.\n\n- **`{trace, Port, out, Command | 0}`{: #port_trace_messages_out_port }** -\n When `Port` is scheduled out. The last command run was `Command`. On some rare\n occasions, the current function cannot be determined, then the last element is\n `0`. `Command` can contain the same commands as `in`\n\nIf the tracing process/port dies or the tracer module returns `remove`, the\nflags are silently removed.\n\nReturns a number indicating the number of ports that matched `Ports`.\nIf `Ports` is a port identifier, the return value is `1`. If\n`Ports` is `all` or `existing`, the return value is the number of\nexisting ports. If `Ports` is `new`, the return value is `0`.\n\nFailure: `badarg` if the specified arguments are not supported. For example,\n`cpu_timestamp` is not supported on all platforms.","title":"trace.port/4","ref":"trace.html#port/4"},{"type":"function","doc":"Turn on or off trace flags for one or more processes.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nArgument `Procs` is either a process identifier (pid) for a local process or\none of the following atoms:\n\n- **`all`** - All currently existing processes and all that will be\n created in the future.\n\n- **`existing`** - All currently existing processes.\n\n- **`new`** - All processes that will be created in the future.\n\nArgument `How` is either `true` to turn on trace flags or `false` to turn them off.\n\nArgument `FlagList` can contain any number of the following flags (the \"message\ntags\" refers to the list of [`trace messages`](#process_trace_messages)):\n\n- **`all`** - Sets all trace flags except `cpu_timestamp`, which\n is in its nature different than the others.\n\n- **`send`** - Traces sending of messages. Limit which sent messages to trace by\n calling `send/3`.\n\n Message tags: [`send`](#process_trace_messages_send) and\n [`send_to_non_existing_process`](#process_trace_messages_send_to_non_existing_process).\n\n- **`'receive'`** - Traces receiving of messages. Limit which received messages\n to trace by calling `recv/3`.\n\n Message tags: [`'receive'`](#process_trace_messages_receive).\n\n- **`call`** - Traces certain function calls. Specify which function calls to\n trace by calling `function/4`.\n\n Message tags: [`call`](#process_trace_messages_call) and\n [`return_from`](#process_trace_messages_return_from).\n\n- **`silent`** - Used with the `call` trace flag. The `call`, `return_from`, and\n `return_to` trace messages are inhibited if this flag is set, but they are\n executed as normal if there are match specifications.\n\n Silent mode is inhibited by executing `trace:process(_, _, false, [silent|_])`, or\n by a match specification executing the function `{silent, false}`.\n\n The `silent` trace flag facilitates setting up a trace on many or even all\n processes in the system. The trace can then be activated and deactivated using\n the match specification function `{silent,Bool}`, giving a high degree of\n control of which functions with which arguments that trigger the trace.\n\n Message tags: [`call`](#process_trace_messages_call),\n [`return_from`](#process_trace_messages_return_from), and\n [`return_to`](#process_trace_messages_return_to). Or rather, the\n absence of.\n\n- **`return_to`** - Used with the `call` trace flag. Traces the exit from\n call traced functions back to where the execution resumes. Only works for\n functions traced with option `local` to `function/4`.\n\n The semantics is that a `return_to` trace message is sent when a call traced\n function returns or throws and exception that is caught. For tail calls, only\n one trace message is sent per chain of tail calls, so the properties of tail\n recursiveness for function calls are kept while tracing with this\n flag. Similar for exceptions, only one `return_to` trace message is sent, even\n if the exception passed more than one call traced function before it was\n caught.\n\n Using `call` and `return_to` trace together makes it possible to know exactly\n in which function a process executes at any time.\n\n To get trace messages containing return values from functions, use the\n `{return_trace}` match specification action instead.\n\n Message tags: [`return_to`](#process_trace_messages_return_to).\n\n- **`procs`** - Traces process-related events.\n\n Message tags: [`spawn`](#process_trace_messages_spawn),\n [`spawned`](#process_trace_messages_spawned),\n [`exit`](#process_trace_messages_exit),\n [`register`](#process_trace_messages_register),\n [`unregister`](#process_trace_messages_unregister),\n [`link`](#process_trace_messages_link),\n [`unlink`](#process_trace_messages_unlink),\n [`getting_linked`](#process_trace_messages_getting_linked), and\n [`getting_unlinked`](#process_trace_messages_getting_unlinked).\n\n- **`running`** - Traces scheduling of processes.\n\n Message tags: [`in`](#process_trace_messages_in_proc) and\n [`out`](#process_trace_messages_out_proc).\n\n- **`exiting`** - Traces scheduling of exiting processes.\n\n Message tags:\n [`in_exiting`](#process_trace_messages_in_exiting_proc),\n [`out_exiting`](#process_trace_messages_out_exiting_proc), and\n [`out_exited`](#process_trace_messages_out_exited_proc).\n\n- **`running_procs`** - Traces scheduling of processes just like `running`.\n However, this option also includes schedule events when the process executes\n within the context of a port without being scheduled out itself.\n\n Message tags: [`in`](#process_trace_messages_in_proc) and\n [`out`](#process_trace_messages_out_proc).\n\n- **`garbage_collection`** - Traces garbage collections of processes.\n\n Message tags:\n [`gc_minor_start`](#process_trace_messages_gc_minor_start),\n [`gc_max_heap_size`](#process_trace_messages_gc_max_heap_size), and\n [`gc_minor_end`](#process_trace_messages_gc_minor_end).\n\n- **`timestamp`{: #timestamp }** - Includes a time stamp in all trace\n messages. The time stamp (Ts) has the same form as returned by\n `erlang:now/0`.\n\n- **`cpu_timestamp`** - A global trace flag for the Erlang node that makes all\n trace time stamps using flag `timestamp` to be in CPU time, not wall clock\n time. That is, `cpu_timestamp` is not be used if `monotonic_timestamp` or\n `strict_monotonic_timestamp` is enabled. Only allowed with `Procs==all`.\n If the host machine OS does not support high-resolution CPU time measurements,\n `process/4` exits with `badarg`. Notice that most OS do not\n synchronize this value across cores, so be prepared that time can seem to go\n backwards when using this option.\n\n- **`monotonic_timestamp`** - Includes an\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`) time stamp\n in all trace messages. The time stamp (Ts) has the same format and value as\n produced by [`erlang:monotonic_time(nanosecond)`](`erlang:monotonic_time/1`). This\n flag overrides flag `cpu_timestamp`.\n\n- **`strict_monotonic_timestamp`** - Includes an time stamp consisting of\n [Erlang monotonic time](`e:erts:time_correction.md#erlang-monotonic-time`) and a\n monotonically increasing integer in all trace messages. The time stamp (Ts)\n has the same format and value as produced by `{`\n [`erlang:monotonic_time(nanosecond)`](`erlang:monotonic_time/1`)`,`\n [`erlang:unique_integer([monotonic])`](`erlang:unique_integer/1`)`}`. This flag\n overrides flag `cpu_timestamp`.\n\n If multiple time stamp flags are passed, `timestamp` has precedence over\n `strict_monotonic_timestamp`, which in turn has precedence over\n `monotonic_timestamp`. All time stamp flags are remembered, so if two are\n passed and the one with highest precedence later is disabled, the other one\n becomes active.\n\n- **`arity`** - Used with the `call` trace flag. `{M, F, Arity}` is specified\n instead of `{M, F, Args}` in call trace messages.\n\n- **`set_on_spawn`** - Makes any process created by a traced process inherit all\n its trace flags, including flag `set_on_spawn` itself.\n\n- **`set_on_first_spawn`** - Makes the first process created by a traced process\n inherit all its trace flags, excluding flag `set_on_first_spawn` itself. That\n is, after the first spawn is done, `set_on_first_spawn` will be cleared in\n both the spawned process and the spawning process.\n\n If both are set, `set_on_first_spawn` will supersede `set_on_spawn`.\n\n- **`set_on_link`** - Makes any process linked by a traced process inherit all\n its trace flags, including flag `set_on_link` itself.\n\n- **`set_on_first_link`** - Makes the first process linked to by a traced\n process inherit all its trace flags, excluding flag `set_on_first_link`\n itself. That is, after the first link is done, `set_on_first_link` will be\n cleared in both the linked process and the linking process.\n\n If both are set, `set_on_first_link` will supersede `set_on_link`.\n\nThe tracing process receives the _trace messages_ described in the following\nlist. `Pid` is the process identifier of the traced process in which the traced\nevent has occurred. The third tuple element is the message tag.\n\nIf flag `timestamp`, `strict_monotonic_timestamp`, or `monotonic_timestamp` is\nspecified, the first tuple element is `trace_ts` instead, and the time stamp is\nadded as an extra element last in the message tuple.\n\nIf a match specification (applicable only for `call`, `send`, and `'receive'`\ntracing) contains a `{message}` action function with a non-boolean value, that\nvalue is added as an extra element to the message tuple either in the last\nposition or before the timestamp (if it is present).\n\nTrace messages:\n\n[](){: #process_trace_messages }\n\n- **`{trace, Pid, send, Msg, To}`{: #process_trace_messages_send }** - When\n process `Pid` sends message `Msg` to process `To`.\n\n- **`{trace, Pid, send_to_non_existing_process, Msg, To}`{:\n #process_trace_messages_send_to_non_existing_process }** - When process `Pid`\n sends message `Msg` to the non-existing process `To`.\n\n- **`{trace, Pid, 'receive', Msg}`{: #process_trace_messages_receive }** -\n When process `Pid` receives message `Msg`. If `Msg` is set to time-out, a receive\n statement can have timed out, or the process received a message with the\n payload `timeout`.\n\n- **`{trace, Pid, call, {M, F, Args}}`{: #process_trace_messages_call }** - When\n process `Pid` calls a traced function. The return values of calls are never\n supplied, only the call and its arguments.\n\n Trace flag `arity` can be used to change the contents of this message, so that\n `Arity` is specified instead of `Args`.\n\n- **`{trace, Pid, return_to, {M, F, Arity}}`{: #process_trace_messages_return_to\n }** - When process `Pid` returns _to_ the specified function. This trace\n message is sent if both the flags `call` and `return_to` are set, and the\n function is set to be traced on _local_ function calls. The message is only\n sent when returning from a chain of tail recursive function calls, where at\n least one call generated a `call` trace message (that is, the functions match\n specification matched, and `{message, false}` was not an action).\n\n- **`{trace, Pid, return_from, {M, F, Arity}, ReturnValue}`{:\n #process_trace_messages_return_from }** - When `Pid` returns _from_ the\n specified function. This trace message is sent if flag `call` is set, and the\n function has a match specification with a `return_trace` or `exception_trace`\n action.\n\n- **`{trace, Pid, exception_from, {M, F, Arity}, {Class, Value}}`{:\n #process_trace_messages_exception_from }** - When `Pid` exits _from_ the\n specified function because of an exception. This trace message is sent if flag\n `call` is set, and the function has a match specification with an\n `exception_trace` action.\n\n- **`{trace, Pid, spawn, Pid2, {M, F, Args}}`{: #process_trace_messages_spawn\n }** - When `Pid` spawns a new process `Pid2` with the specified function call\n as entry point.\n\n `Args` is supposed to be the argument list, but can be any term if the spawn\n is erroneous.\n\n- **`{trace, Pid, spawned, Pid2, {M, F, Args}}`{:\n #process_trace_messages_spawned }** - When `Pid` is spawned by process `Pid2`\n with the specified function call as entry point.\n\n `Args` is supposed to be the argument list, but can be any term if the spawn\n is erroneous.\n\n- **`{trace, Pid, exit, Reason}`{: #process_trace_messages_exit }** - When `Pid`\n exits with reason `Reason`.\n\n- **`{trace, Pid, register, RegName}`{: #process_trace_messages_register\n }** - When process `Pid` gets the name `RegName` registered.\n\n- **`{trace, Pid, unregister, RegName}`{: #process_trace_messages_unregister\n }** - When process `Pid` gets the name `RegName` unregistered. This is done\n automatically when a registered process or port exits.\n\n- **`{trace, Pid, link, Pid2}`{: #process_trace_messages_link }** - When `Pid`\n links to a process `Pid2`.\n\n- **`{trace, Pid, unlink, Pid2}`{: #process_trace_messages_unlink }** - When\n `Pid` removes the link from a process `Pid2`.\n\n- **`{trace, Pid, getting_linked, Pid2}`{:\n #process_trace_messages_getting_linked }** - When `Pid` gets linked to a\n process `Pid2`.\n\n- **`{trace, Pid, getting_unlinked, Pid2}`{:\n #process_trace_messages_getting_unlinked }** - When `Pid` gets unlinked\n from a process `Pid2`.\n\n- **`{trace, Port, open, Pid, Driver}`{: #process_trace_messages_open }** - When\n `Pid` opens a new port `Port` with the running `Driver`.\n\n `Driver` is the name of the driver as an atom.\n\n- **[](){: #process_trace_messages_in_proc }\n `{trace, Pid, in | in_exiting, {M, F, Arity} | 0}`{:\n #process_trace_messages_in_exiting_proc }**\n When `Pid` is scheduled to run. The process runs in function `{M, F, Arity}`.\n On some rare occasions, the current function cannot be determined, then the\n last element is `0`.\n\n- **[](){: #process_trace_messages_out_proc } [](){:\n #process_trace_messages_out_exiting_proc }\n `{trace, Pid, out | out_exiting | out_exited, {M, F, Arity} | 0}`{:\n #process_trace_messages_out_exited_proc }**\n When `Pid` is scheduled out. The process was running in function `{M, F,\n Arity}`. On some rare occasions, the current function cannot be determined,\n then the last element is `0`.\n\n- **`{trace, Pid, gc_minor_start, Info}`{:\n #process_trace_messages_gc_minor_start }** - [](){: #gc_minor_start } Sent\n when a garbage collection of the young generation is about to be started.\n `Info` is a list of two-element tuples, where the first element is a key,\n and the second is the value. Do not depend on any order of the tuples.\n The following keys are defined:\n\n - **`heap_size`** - The size of the used part of the heap.\n\n - **`heap_block_size`** - The size of the memory block used for storing the\n heap and the stack.\n\n - **`old_heap_size`** - The size of the used part of the old heap.\n\n - **`old_heap_block_size`** - The size of the memory block used for storing\n the old heap.\n\n - **`stack_size`** - The size of the stack.\n\n - **`recent_size`** - The size of the data that survived the previous garbage\n collection.\n\n - **`mbuf_size`** - The combined size of message buffers associated with the\n process.\n\n - **`bin_vheap_size`** - The total size of unique off-heap binaries referenced\n from the process heap.\n\n - **`bin_vheap_block_size`** - The total size of binaries allowed in the\n virtual heap in the process before doing a garbage collection.\n\n - **`bin_old_vheap_size`** - The total size of unique off-heap binaries\n referenced from the process old heap.\n\n - **`bin_old_vheap_block_size`** - The total size of binaries allowed in the\n virtual old heap in the process before doing a garbage collection.\n\n - **`wordsize`** - For the `gc_minor_start` event it is the size of the need\n that triggered the GC. For the corresponding `gc_minor_end` event it is the\n size of reclaimed memory = start `heap_size` - end `heap_size`.\n\n All sizes are in words.\n\n- **`{trace, Pid, gc_max_heap_size, Info}`{:\n #process_trace_messages_gc_max_heap_size }** - Sent when the\n [`max_heap_size`](`e:erts:erlang#process_flag_max_heap_size`) is reached during\n garbage collection. `Info` contains the same kind of list as in message\n `gc_start`, but the sizes reflect the sizes that triggered `max_heap_size` to\n be reached.\n\n- **`{trace, Pid, gc_minor_end, Info}`{: #process_trace_messages_gc_minor_end\n }** - Sent when young garbage collection is finished. `Info` contains the same\n kind of list as in message `gc_minor_start`, but the sizes reflect the new\n sizes after garbage collection.\n\n- **`{trace, Pid, gc_major_start, Info}`{:\n #process_trace_messages_gc_major_start }** - Sent when fullsweep garbage\n collection is about to be started. `Info` contains the same kind of list as in\n message `gc_minor_start`.\n\n- **`{trace, Pid, gc_major_end, Info}`{: #process_trace_messages_gc_major_end\n }** - Sent when fullsweep garbage collection is finished. `Info` contains the\n same kind of list as in message `gc_minor_start`, but the sizes reflect the\n new sizes after a fullsweep garbage collection.\n\nIf the tracing process dies or the tracer module returns `remove`, the\nflags are silently removed.\n\nReturns a number indicating the number of processes that matched `Procs`.\nIf `Procs` is a process identifier, the return value is `1`. If\n`Procs` is `all` or `existing`, the return value is the number of\nprocesses running. If `Procs` is `new`, the return value is `0`.\n\nFailure: `badarg` if the specified arguments are not supported. For example,\n`cpu_timestamp` is not supported on all platforms.","title":"trace.process/4","ref":"trace.html#process/4"},{"type":"function","doc":"Set trace pattern for _message receiving_.\n\nMust be combined with `process/4` or `port/4` to set the `'receive'` trace flag\nfor one or more processes or ports.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nThe default value for the `receive` trace pattern in each session is\n`true`. That is, all messages received by processes having `'receive'`\ntrace enabled will be traced. Use this function to limit traced\n`'receive'` events based on the message content, the sender, and/or the\nreceiver.\n\nArgument `MatchSpec` can take the following forms:\n\n- **`MatchExpression`** - A match specification. The matching is done on\n the list `[Node, Sender, Msg]`. `Node` is the node name of the sender.\n `Sender` is the process or port identity of the sender, or the atom\n `undefined` if the sender is not known (which can be the case for remote\n senders). `Msg` is the message term. The pid of the receiving process can be\n accessed with the guard function `self/0`. An empty list is the same as\n `true`. For more information, see section\n [Match Specifications in Erlang](`e:erts:match_spec.md`) in the User's Guide\n for the ERTS application.\n\n- **`true`** - Enable tracing for all received messages (to `'receive'` traced\n processes). Any match specification is removed. _This is the default_.\n\n- **`false`** - Disable tracing for all received messages. Any match\n specification is removed.\n\nArgument `FlagList` must be `[]` for receive tracing.\n\nThe return value is always `1`.\n\n*Examples:*\n\nOnly trace messages from a specific process `Pid`:\n\n```erlang\n> trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).\n1\n```\n\nOnly trace messages matching `{reply, _}`:\n\n```erlang\n> trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).\n1\n```\n\nOnly trace messages from other nodes:\n\n```erlang\n> trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).\n1\n```\n\n> #### Note {: .info }\n>\n> A match specification for `'receive'` trace can use all guard and body\n> functions except `caller`, `is_seq_trace`, `get_seq_token`, `set_seq_token`,\n> `enable_trace`, `disable_trace`, `trace`, `silent`, and `process_dump`.\n\nFails by raising an error exception with an error reason of:\n\n- **`badarg`** - If an argument is invalid.\n\n- **`system_limit`** - If a match specification passed as argument has excessive\n nesting which causes scheduler stack exhaustion for the scheduler that the\n calling process is executing on.\n [Scheduler stack size](`e:erts:erl_cmd.md#sched_thread_stack_size`) can be configured\n when starting the runtime system.","title":"trace.recv/3","ref":"trace.html#recv/3"},{"type":"function","doc":"Set trace pattern for _message sending_.\n\nMust be combined with `process/4` or `port/4` to set the `send` trace flag for\none or more processes or ports.\n\nArgument `Session` is the trace session to operate on as returned by\n`session_create/3`.\n\nThe default value for the `send` trace pattern in each session is\n`true`. That is, all messages sent from processes having `send` trace\nenabled will be traced. Use this function to limit traced `send`\nevents based on the message content, the sender, and/or the receiver.\n\nArgument `MatchSpec` can take the following forms:\n\n- **`MatchExpression`** - A match specification. The matching is done on\n the list `[Receiver, Msg]`. `Receiver` is the process or port identity of the\n receiver and `Msg` is the message term. The pid of the sending process can be\n accessed with the guard function `self/0`. An empty list is the same as\n `true`. For more information, see section\n [Match Specifications in Erlang](`e:erts:match_spec.md`) in the User's Guide\n for the ERTS application.\n\n- **`true`** - Enable tracing for all sent messages (from `send` traced\n processes). Any match specification is removed.\n\n- **`false`** - Disable tracing for all sent messages. Any match specification\n is removed.\n\nArgument `FlagList` must be `[]`.\n\nThe return value is always `1`.\n\n*Examples:*\n\nOnly trace messages to a specific process `Pid`:\n\n```erlang\n> trace:send(Session, [{[Pid, '_'],[],[]}], []).\n1\n```\n\nOnly trace messages matching `{reply, _}`:\n\n```erlang\n> trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).\n1\n```\n\nOnly trace messages sent to the sender itself:\n\n```erlang\n> trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).\n1\n```\n\nOnly trace messages sent to other nodes:\n\n```erlang\n> trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).\n1\n```\n\n> #### Note {: .info }\n>\n> A match specification for `send` trace can use all guard and body functions\n> except `caller`.\n\nFails by raising an error exception with an error reason of:\n\n- **`badarg`** - If an argument is invalid.\n\n- **`system_limit`** - If a match specification passed as argument has excessive\n nesting which causes scheduler stack exhaustion for the scheduler that the\n calling process is executing on.\n [Scheduler stack size](`e:erts:erl_cmd.md#sched_thread_stack_size`) can be configured\n when starting the runtime system.","title":"trace.send/3","ref":"trace.html#send/3"},{"type":"function","doc":"Create a new trace session.\n\nArgument `Name` is an atom name for the session. It will be returned when\ninspecting with `session_info/1`.\n\nArgument `Tracer` specifies the consumer of all trace events for the session. It\ncan be an identifier of a local process or port to receive all trace\nmessages.\n\n`Tracer` can also be a tuple `{TracerModule, TracerState}` for a tracer module\nto be called instead of sending a trace message. The tracer module can then\nignore or change the trace message. For more details on how to write a tracer\nmodule, see module `m:erl_tracer`.\n\nArgument `Opts` must be `[]`.\n\nReturns an opaque handle to the trace session. The handle will keep the session\nalive. If the handle is dropped and garbage collected, the session will be\ndestroyed and cleaned up as if `session_destroy/1` was called.","title":"trace.session_create/3","ref":"trace.html#session_create/3"},{"type":"function","doc":"Destroy a trace session and cleanup all its settings on processes, ports, and\nfunctions.\n\nThe only things not cleaned up are trace messages that have already been sent.\n\nReturns `true` if the session was active. Returns `false` if the session had\nalready been destroyed by either an earler call to this function or the garbage\ncollector.","title":"trace.session_destroy/1","ref":"trace.html#session_destroy/1"},{"type":"function","doc":"Return which trace sessions that affect a port, process, function, or event.\n\nArgument `all` returns all active trace sessions that exists on the node.\n\nReturns a list of [weak session handles](`t:session_weak_ref/0`) or `undefined` if the\nprocess/port/function does not exists.","title":"trace.session_info/1","ref":"trace.html#session_info/1"},{"type":"type","doc":"","title":"trace.match_variable/0","ref":"trace.html#t:match_variable/0"},{"type":"type","doc":"A handle to an isolated trace session.","title":"trace.session/0","ref":"trace.html#t:session/0"},{"type":"opaque","doc":"","title":"trace.session_strong_ref/0","ref":"trace.html#t:session_strong_ref/0"},{"type":"opaque","doc":"A weak session handle as returned by `session_info/1`. A weak session handle can\nbe used like a full session handle, but it will not prevent the session from\nbeing destroyed when the last strong handle is garbage collected.","title":"trace.session_weak_ref/0","ref":"trace.html#t:session_weak_ref/0"},{"type":"type","doc":"","title":"trace.trace_flag/0","ref":"trace.html#t:trace_flag/0"},{"type":"type","doc":"","title":"trace.trace_info_flag/0","ref":"trace.html#t:trace_info_flag/0"},{"type":"type","doc":"","title":"trace.trace_info_item_result/0","ref":"trace.html#t:trace_info_item_result/0"},{"type":"type","doc":"","title":"trace.trace_info_return/0","ref":"trace.html#t:trace_info_return/0"},{"type":"type","doc":"","title":"trace.trace_match_spec/0","ref":"trace.html#t:trace_match_spec/0"},{"type":"type","doc":"","title":"trace.trace_pattern_flag/0","ref":"trace.html#t:trace_pattern_flag/0"},{"type":"type","doc":"","title":"trace.trace_pattern_mfa/0","ref":"trace.html#t:trace_pattern_mfa/0"},{"type":"extras","doc":"\n# Kernel Application","title":"Kernel Application","ref":"kernel_app.html"},{"type":"extras","doc":"The Kernel application has all the code necessary to run the Erlang runtime\nsystem: file servers, code servers, and so on.\n\nThe Kernel application is the first application started. It is mandatory in the\nsense that the minimal system based on Erlang/OTP consists of Kernel and STDLIB.\nKernel contains the following functional areas:\n\n- Start, stop, supervision, configuration, and distribution of applications\n- Code loading\n- Logging\n- Global name service\n- Supervision of Erlang/OTP\n- Communication with sockets\n- Operating system interface","title":"Description - Kernel Application","ref":"kernel_app.html#description"},{"type":"extras","doc":"Two standard logger handlers are defined in the Kernel application. These are\ndescribed in the [Kernel User's Guide](logger_chapter.md), and in the\n`m:logger_std_h` and [`logger_disk_log_h` ](`m:logger_disk_log_h`)manual pages.\n\n[](){: #erl_signal_server }","title":"Logger Handlers - Kernel Application","ref":"kernel_app.html#logger-handlers"},{"type":"extras","doc":"Asynchronous OS signals may be subscribed to via the Kernel applications event\nmanager (see [OTP Design Principles](`e:system:design_principles.md`) and\n`m:gen_event`) registered as `erl_signal_server`. A default signal handler is\ninstalled which handles the following signals:\n\n- **`sigusr1`** - The default handler will halt Erlang and produce a crashdump\n with slogan \"Received SIGUSR1\". This is equivalent to calling\n `erlang:halt(\"Received SIGUSR1\")`.\n\n- **`sigquit`** - The default handler will halt Erlang immediately. This is\n equivalent to calling `erlang:halt()`.\n\n- **`sigterm`** - The default handler will terminate Erlang normally. This is\n equivalent to calling `init:stop()`.","title":"OS Signal Event Handler - Kernel Application","ref":"kernel_app.html#os-signal-event-handler"},{"type":"extras","doc":"Any event handler added to `erl_signal_server` must handle the following events.\n\n- **`sighup`** - Hangup detected on controlling terminal or death of controlling\n process\n\n- **`sigquit`** - Quit from keyboard\n\n- **`sigabrt`** - Abort signal from abort\n\n- **`sigalrm`** - Timer signal from alarm\n\n- **`sigterm`** - Termination signal\n\n- **`sigusr1`** - User-defined signal 1\n\n- **`sigusr2`** - User-defined signal 2\n\n- **`sigchld`** - Child process stopped or terminated\n\n- **`sigstop`** - Stop process\n\n- **`sigtstp`** - Stop typed at terminal\n\nSetting OS signals are described in `os:set_signal/2`.","title":"Events - Kernel Application","ref":"kernel_app.html#events"},{"type":"extras","doc":"The following configuration parameters are defined for the Kernel application.\nFor more information about configuration parameters, see file\n[`app`](app.md).\n\n- **`connect_all = true | false`{: #connect_all }** - If enabled (`true`), which\n also is the default, `m:global` will actively connect to all nodes that\n becomes known to it. Note that you also want to enable\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n in order for `global` to ensure that a fully connected network is maintained.\n `prevent_overlapping_partitions` will also prevent inconsistencies in\n `global`'s name registration and locking.\n\n The now deprecated command line argument\n [`-connect_all `](`e:erts:erl_cmd.md#connect_all`) has the same\n effect as the `connect_all` configuration parameter. If this configuration\n parameter is defined, it will override the command line argument.\n\n- **`distributed = [Distrib]`{: #distributed }** - Specifies which applications\n that are distributed and on which nodes they are allowed to execute. In this\n parameter:\n\n - `Distrib = {App,Nodes} | {App,Time,Nodes}`\n - `App = atom()`\n - `Time = integer()>0`\n - `Nodes = [node() | {node(),...,node()}]`\n\n The parameter is described in `application:load/2`.\n\n- **`dist_auto_connect = Value`{: #dist_auto_connect }** - Specifies when nodes\n are automatically connected. If this parameter is not specified, a node is\n always automatically connected, for example, when a message is to be sent to\n that node. `Value` is one of:\n\n - **`never`** - Connections are never automatically established, they must be\n explicitly connected. See `m:net_kernel`.\n\n - **`once`** - Connections are established automatically, but only once per\n node. If a node goes down, it must thereafter be explicitly connected. See\n `m:net_kernel`.\n\n- **`epmd_module = module()`{: #epmd_module }** - Configures the module\n responsible for communication with [epmd](`e:erts:epmd_cmd.md`). If this parameter\n is undefined, it defaults to `erl_epmd`.\n\n The now deprecated command line argument\n [`-epmd_module `](`e:erts:erl_cmd.md#epmd_module`) has the same\n effect as the `epmd_module` configuration parameter. If this configuration\n parameter is defined, it will override the command line argument.\n\n- **`erl_epmd_node_listen_port = integer()`{: #erl_epmd_node_listen_port }** - Configures the port used by `m:erl_epmd`\n to listen for connection and connect to other nodes. If this flag is set, the\n Erlang VM will boot in distributed mode even if EPMD is not available. If not\n set, a port is chosen automatically (equivalent to port `0`). See `m:erl_epmd`\n for more details.\n\n The now deprecated command line argument\n [`erl_epmd_port `](`e:erts:erl_cmd.md#erl_epmd_port`) has the same\n effect as the `erl_epmd_node_listen_port` configuration parameter. If this\n configuration parameter is defined, it will override the command line argument.\n\n- **`permissions = [Perm]`{: #permissions }** - Specifies the default permission\n for applications when they are started. In this parameter:\n\n - `Perm = {ApplName,Bool}`\n - `ApplName = atom()`\n - `Bool = boolean()`\n\n Permissions are described in `application:permit/2`.\n\n- **`logger = [Config]`{: #logger }** - Specifies the configuration for\n [Logger](`m:logger`), except the primary log level, which is specified with\n [`logger_level`](kernel_app.md#logger_level), and the compatibility with\n [SASL Error Logging](`e:sasl:error_logging.md`), which is specified with\n [`logger_sasl_compatible`](kernel_app.md#logger_sasl_compatible).\n\n The `logger `parameter is described in section\n [Logging](logger_chapter.md#logger_parameter) in the Kernel User's Guide.\n\n- **`logger_level = Level`{: #logger_level }** - Specifies the primary log level\n for Logger. Log events with the same, or a more severe level, pass through the\n primary log level check. See section [Logging](logger_chapter.md) in the\n Kernel User's Guide for more information about Logger and log levels.\n\n `Level = emergency | alert | critical | error | warning | notice | info | debug | all | none`\n\n To change the primary log level at runtime, use\n [`logger:set_primary_config(level, Level)`](`logger:set_primary_config/2`).\n\n Defaults to `notice`.\n\n- **`logger_metadata = Metadata`{: #logger_metadata }** - Specifies primary\n metadata for log events.\n\n `Metadata = map()`\n\n Defaults to `#{}`.\n\n- **`logger_sasl_compatible = true | false`{: #logger_sasl_compatible }** -\n Specifies if Logger behaves backwards compatible with the SASL error logging\n functionality from releases prior to Erlang/OTP 21.0.\n\n If this parameter is set to `true`, the default Logger handler does not log\n any progress-, crash-, or supervisor reports. If the SASL application is then\n started, it adds a Logger handler named `sasl`, which logs these events\n according to values of the SASL configuration parameter `sasl_error_logger`\n and `sasl_errlog_type`.\n\n See section\n [Deprecated Error Logger Event Handlers and Configuration](`e:sasl:sasl_app.md#deprecated_error_logger_config`)\n in the sasl(6) manual page for information about the SASL configuration\n parameters.\n\n See section [SASL Error Logging](`e:sasl:error_logging.md`) in the SASL User's\n Guide, and section\n [Backwards Compatibility with error_logger](logger_chapter.md#backwards-compatibility-with-error_logger)\n in the Kernel User's Guide for information about the SASL error logging\n functionality, and how Logger can be backwards compatible with this.\n\n Defaults to `false`.\n\n > #### Note {: .info }\n >\n > If this parameter is set to `true`, `sasl_errlog_type` indicates that\n > progress reports shall be logged, and the configured primary log level is\n > `notice` or more severe, then SASL automatically sets the primary log level\n > to `info`. That is, this setting can potentially overwrite the value of the\n > Kernel configuration parameter `logger_level`. This is to allow progress\n > reports, which have log level `info`, to be forwarded to the handlers.\n\n- **`global_groups = [GroupTuple]`{: #global_groups }** - Defines global groups,\n see `m:global_group`. In this parameter:\n\n - `GroupTuple = {GroupName, [Node]} | {GroupName, PublishType, [Node]}`\n - `GroupName = atom()`\n - `PublishType = normal | hidden`\n - `Node = node()`\n\n- **`inet_default_connect_options = [{Opt, Val}]`{: #inet_default_connect_options }** - Specifies default options for `connect`\n sockets, see `m:inet`.\n\n- **`inet_default_listen_options = [{Opt, Val}]`{: #inet_default_listen_options\n }** - Specifies default options for `listen` (and `accept`) sockets, see\n `m:inet`.\n\n- **`inet_dist_use_interface = ip_address()`{: #inet_dist_use_interface }** - If\n the host of an Erlang node has many network interfaces, this parameter\n specifies which one to listen on. For the type definition of `ip_address()`,\n see `m:inet`.\n\n- **`inet_dist_listen_min = First`{: #inet_dist_listen } \n `inet_dist_listen_max = Last`** \n Defines the `First..Last` port range for the listener socket of a distributed\n Erlang node.\n\n- **`inet_dist_listen_options = Opts`{: #inet_dist_listen_options }** - Defines\n a list of extra socket options to be used when opening the listening socket\n for a distributed Erlang node. See `gen_tcp:listen/2`.\n\n- **`inet_dist_connect_options = Opts`{: #inet_dist_connect_options }** -\n Defines a list of extra socket options to be used when connecting to other\n distributed Erlang nodes. See `gen_tcp:connect/4`.\n\n- **`inet_parse_error_log = silent`{: #inet_parse_error_log }** - If set, no log\n events are issued when erroneous lines are found and skipped in the various\n Inet configuration files.\n\n- **`inetrc = Filename`{: #inetrc }** - The name (string) of an Inet user\n configuration file. For details, see section\n [`Inet Configuration`](`e:erts:inet_cfg.md`) in the ERTS User's Guide.\n\n- **`net_setuptime = SetupTime`{: #net_setuptime }** -\n `SetupTime` must be a positive integer or floating point number, and is\n interpreted as the maximum allowed time for each network operation during\n connection setup to another Erlang node. The maximum allowed value is `120`.\n If higher values are specified, `120` is used. Default is 7 seconds if the\n variable is not specified, or if the value is incorrect (for example, not a\n number).\n\n Notice that this value does not limit the total connection setup time, but\n rather each individual network operation during the connection setup and\n handshake.\n\n- **`net_ticker_spawn_options = Opts`{: #net_ticker_spawn_options }** - Defines\n a list of extra spawn options for net ticker processes. There exist one such\n process for each connection to another node. A net ticker process is\n responsible for supervising the connection it is associated with. These\n processes also execute the distribution handshake protocol when setting up\n connections. When there is a large number of distribution connections, setting\n up garbage collection options can be helpful to reduce memory usage. Default\n is `[link, {priority, max}]`, and these two options cannot be changed. The\n `monitor` and `{monitor, MonitorOpts}` options are not allowed and will be\n dropped if present. See the documentation of the `erlang:spawn_opt/4` BIF for\n information about valid options. If the `Opts` list is not a proper list, or\n containing invalid options the setup of connections will fail.\n\n Note that the behavior described above is only true if the distribution\n carrier protocol used is implemented as described in\n [ERTS User's Guide ➜ How to implement an Alternative Carrier for the Erlang Distribution ➜ Distribution Module](`e:erts:alt_dist.md#distribution-module`)\n without further alterations. The implementer of the distribution carrier\n protocol used, may have chosen to ignore the `net_ticker_spawn_options`\n parameter or altered its behavior. Currently all distribution modules shipped\n with OTP do, however, behave as described above.\n\n- **`net_tickintensity = NetTickIntensity`{: #net_tickintensity }** - _Net tick\n intensity_ specifies how many ticks to send during a\n [net tick time](kernel_app.md#net_ticktime) period when no other data is sent\n over a connection to another node. This also determines how often to check for\n data from the other node. The higher net tick intensity, the closer to the\n chosen net tick time period the node will detect an unresponsive node. The net\n tick intensity defaults to `4`. The value of `NetTickIntensity` should be an\n integer in the range `4..1000`. If the `NetTickIntensity` is not an integer or\n an integer less than `4`, `4` will silently be used. If `NetTickIntensity` is\n an integer larger than `1000`, `1000` will silently be used.\n\n > #### Note {: .info }\n >\n > Note that all communicating nodes are expected to use the same _net tick\n > intensity_ as well as the same _net tick time_.\n\n > #### Warning {: .warning }\n >\n > Be careful not to set a too high net tick intensity, since you can overwhelm\n > the node with work if it is set too high.\n\n- **`net_ticktime = NetTickTime`{: #net_ticktime }** - Specifies the _net tick\n time_ in seconds. This is the approximate time a connected node may be\n unresponsive until it is considered down and thereby disconnected.\n\n Net tick time together with\n [net tick intensity](kernel_app.md#net_tickintensity) determines an interval\n `TickInterval = NetTickTime/NetTickIntensity`. Once every `TickInterval`\n seconds, each connected node is ticked if nothing has been sent to it during\n that last `TickInterval` seconds. A tick is a small package sent on the\n connection. A connected node is considered to be down if no ticks or payload\n packages have been received during the last `NetTickIntensity` number of\n `TickInterval` seconds intervals. This ensures that nodes that are not\n responding, for reasons such as hardware errors, are considered to be down.\n\n As the availability is only checked every `TickInterval` seconds, the actual\n time `T` a node have been unresponsive when detected may vary between `MinT`\n and `MaxT`, where:\n\n ```c\n MinT = NetTickTime - NetTickTime / NetTickIntensity\n MaxT = NetTickTime + NetTickTime / NetTickIntensity\n ```\n\n `NetTickTime` defaults to `60` seconds and `NetTickIntensity` defaults to `4`.\n Thus, `45 #### Note {: .info }\n >\n > Notice that _all_ communicating nodes are to have the _same_ `NetTickTime`\n > and `NetTickIntensity` values specified, as it determines both the frequency\n > of outgoing ticks and the expected frequency of incominging ticks.\n\n `NetTickTime` needs to be a multiple of `NetTickIntensity`. If the configured\n values are not, `NetTickTime` will internally be rounded up to the nearest\n millisecond.\n [`net_kernel:get_net_ticktime()`](`net_kernel:get_net_ticktime/0`) will,\n however, report net tick time truncated to the nearest second.\n\n Normally, a terminating node is detected immediately by the transport protocol\n (like TCP/IP).\n\n- **`prevent_overlapping_partitions = true | false`{:\n #prevent_overlapping_partitions }** - If enabled (`true`), `global` will\n actively prevent overlapping partitions from forming when connections are lost\n between nodes. This fix is enabled by default. If you are about to disable\n this fix, make sure to read the\n [`global`](`m:global#prevent_overlapping_partitions`) documentation about this\n fix for more important information about this.\n\n- **`shutdown_timeout = integer() | infinity`{: #shutdown_timeout }** -\n Specifies the time `application_controller` waits for an application to\n terminate during node shutdown. If the timer expires, `application_controller`\n brutally kills `application_master` of the hanging application. If this\n parameter is undefined, it defaults to `infinity`.\n\n- **`sync_nodes_mandatory = [NodeName]`{: #sync_nodes_mandatory }** - Specifies\n which other nodes that _must_ be alive for this node to start properly. If\n some node in the list does not start within the specified time, this node does\n not start either. If this parameter is undefined, it defaults to `[]`.\n\n- **`sync_nodes_optional = [NodeName]`{: #sync_nodes_optional }** - Specifies\n which other nodes that _can_ be alive for this node to start properly. If some\n node in this list does not start within the specified time, this node starts\n anyway. If this parameter is undefined, it defaults to the empty list.\n\n- **`sync_nodes_timeout = integer() | infinity`{: #sync_nodes_timeout }** -\n Specifies the time (in milliseconds) that this node waits for the mandatory\n and optional nodes to start. If this parameter is undefined, no node\n synchronization is performed. This option ensures that `global` is\n synchronized.\n\n- **`start_distribution = true | false`{: #start_distribution }** - Starts all\n distribution services, such as `rpc`, `global`, and `net_kernel` if the\n parameter is `true`. This parameter is to be set to `false` for systems who\n want to disable all distribution functionality.\n\n Defaults to `true`.\n\n- **`start_dist_ac = true | false`{: #start_dist_ac }** - Starts the `dist_ac`\n server if the parameter is `true`. This parameter is to be set to `true` for\n systems using distributed applications.\n\n Defaults to `false`. If this parameter is undefined, the server is started if\n parameter `distributed` is set.\n\n- **`start_boot_server = true | false`{: #start_boot_server }** - Starts the\n `boot_server` if the parameter is `true` (see `m:erl_boot_server`). This\n parameter is to be set to `true` in an embedded system using this service.\n\n Defaults to `false`.\n\n- **`boot_server_slaves = [SlaveIP]`{: #boot_server_slaves }** - If\n configuration parameter `start_boot_server` is `true`, this parameter can be\n used to initialize `boot_server` with a list of slave IP addresses:\n\n `SlaveIP = string() | atom | {integer(),integer(),integer(),integer()}`,\n\n where `0 <= integer() <=255`.\n\n Examples of `SlaveIP` in atom, string, and tuple form:\n\n `'150.236.16.70', \"150,236,16,70\", {150,236,16,70}`.\n\n Defaults to `[]`.\n\n- **`start_disk_log = true | false`{: #start_disk_log }** - Starts the\n `disk_log_server` if the parameter is `true` (see `m:disk_log`). This\n parameter is to be set to `true` in an embedded system using this service.\n\n Defaults to `false`.\n\n- **`start_pg = true | false`{: #start_pg }** - Starts the\n default `pg` scope server (see `m:pg`) if the parameter is `true`. This\n parameter is to be set to `true` in an embedded system that uses this service.\n\n Defaults to `false`.\n\n- **`start_timer = true | false`{: #start_timer }** - Starts the `timer_server`\n if the parameter is `true` (see `m:timer`). This parameter is to be set to\n `true` in an embedded system using this service.\n\n Defaults to `false`.\n\n- **`shell_history = enabled | disabled | module()`{: #shell_history }** -\n Specifies whether shell history should be logged to disk between usages of\n `erl` (`enabled`), not logged at all (`disabled`), or a user-specified module\n will be used to log shell history. This module should export\n `load() -> [string()]` returning a list of strings to load in the shell when\n it starts, and `add(iodata()) -> ok.` called every time new line is entered in\n the shell. By default logging is disabled.\n\n- **`shell_history_drop = [string()]`{: #shell_history_drop }** - Specific log\n lines that should not be persisted. For example `[\"q().\", \"init:stop().\"]`\n will allow to ignore commands that shut the node down. Defaults to `[]`.\n\n- **`shell_history_file_bytes = integer()`{: #shell_history_file_bytes }** - How\n many bytes the shell should remember. By default, the value is set to 512kb,\n and the minimal value is 50kb.\n\n- **`shell_history_path = string()`{: #shell_history_path }** - Specifies where\n the shell history files will be stored. defaults to the user's cache directory\n as returned by `filename:basedir(user_cache, \"erlang-history\")`.\n\n- **`shutdown_func = {Mod :: atom(), Func :: atom()}`{: #shutdown_func }** -\n Sets a function that `application_controller` calls when it starts to\n terminate. The function is called as `Mod:Func(Reason)`, where `Reason` is the\n terminate reason for `application_controller`, and it must return as soon as\n possible for `application_controller` to terminate properly.\n\n- **`source_search_rules = [DirRule] | [SuffixRule]`{: #source_search_rules }**\n\n Where:\n\n - `DirRule = {ObjDirSuffix,SrcDirSuffix}`\n - `SuffixRule = {ObjSuffix,SrcSuffix,[DirRule]}`\n - `ObjDirSuffix = string()`\n - `SrcDirSuffix = string()`\n - `ObjSuffix = string()`\n - `SrcSuffix = string()`\n\n Specifies a list of rules for use by `filelib:find_file/2`\n `filelib:find_source/2` If this is set to some other value than the empty\n list, it replaces the default rules. Rules can be simple pairs of directory\n suffixes, such as `{\"ebin\", \"src\"}`, which are used by `filelib:find_file/2`,\n or triples specifying separate directory suffix rules depending on file name\n extensions, for example `[{\".beam\", \".erl\", [{\"ebin\", \"src\"}]}`, which are\n used by `filelib:find_source/2`. Both kinds of rules can be mixed in the list.\n\n The interpretation of `ObjDirSuffix` and `SrcDirSuffix` is as follows: if the\n end of the directory name where an object is located matches `ObjDirSuffix`,\n then the name created by replacing `ObjDirSuffix` with `SrcDirSuffix` is\n expanded by calling `filelib:wildcard/1`, and the first regular file found\n among the matches is the source file.\n\n- **`standard_io_encoding = Encoding`{: #standard_io_encoding }** - Set whether\n bytes sent or received via standard_io should be interpreted as unicode or\n latin1. By default input and output is interpreted as Unicode if it is\n supported on the host. With this flag you may configure the encoding on\n startup.\n\n This works similarly to\n [`io:setopts(standard_io, {encoding, Encoding})`](`io:setopts/2`) but is\n applied before any bytes on standard_io may have been read.\n\n Encoding is one of:\n\n - **`unicode`** - Configure standard_io to use unicode mode.\n\n - **`latin1`** - Configure standard_io to use latin1 mode.\n\n - **`_`** - Anything other than unicode or latin1 will be ignored and the\n system will configure the encoding by itself, typically unicode on modern\n systems.\n\n See\n [Escripts and non-interactive I/O in Unicode Usage in Erlang](`e:stdlib:unicode_usage.md#escripts-and-non-interactive-i-o`)\n for more details.\n\n- **`os_cmd_shell = string()`{: #os_cmd_shell }** - Specifies which shell to\n use when invoking system commands via `os:cmd/2`. By default the shell is detected\n automatically.","title":"Configuration - Kernel Application","ref":"kernel_app.html#configuration"},{"type":"extras","doc":"In Erlang/OTP 21.0, a new API for logging was added. The old `error_logger`\nevent manager, and event handlers running on this manager, still work, but they\nare no longer used by default.\n\nThe following application configuration parameters can still be set, but they\nare only used if the corresponding configuration parameters for Logger are not\nset.\n\n- **`error_logger`** - Replaced by setting the [`type`](`m:logger_std_h#type`),\n and possibly [`file`](`m:logger_std_h#file`) and\n [`modes`](`m:logger_std_h#modes`) parameters of the default `logger_std_h`\n handler. Example:\n\n ```text\n erl -kernel logger '[{handler,default,logger_std_h,#{config=>#{file=>\"/tmp/erlang.log\"}}}]'\n ```\n\n- **`error_logger_format_depth`**{: #error_logger_format_depth } - Replaced by setting the\n [`depth`](`m:logger_formatter#depth`) parameter of the default handlers\n formatter. Example:\n\n ```text\n erl -kernel logger '[{handler,default,logger_std_h,#{formatter=>{logger_formatter,#{legacy_header=>true,template=>[{logger_formatter,header},\"\\n\",msg,\"\\n\"],depth=>10}}}]'\n ```\n\nSee [Backwards compatibility with error_logger](logger_chapter.md#backwards-compatibility-with-error_logger)\nfor more information.","title":"Deprecated Configuration Parameters - Kernel Application","ref":"kernel_app.html#deprecated-configuration-parameters"},{"type":"extras","doc":"\n# Kernel Release Notes\n\nThis document describes the changes made to the Kernel application.","title":"Kernel Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Kernel 10.2 - Kernel Release Notes","ref":"notes.html#kernel-10-2"},{"type":"extras","doc":"- `gen_sctp:peeloff/2` has been fixed to inherit socket options to the peeled off socket more like `gen_tcp:accept/1`, for example the options `tos` or `tclass`.\n \n When setting SCTP options that are unsupported on the platform, some should be silently ignored, but a bug caused the option parsing to derail so the options after could bail out and cause an error instead. This has been fixed.\n\n Own Id: OTP-19225 Aux Id: [PR-8789]\n\n- Made it possible to expand help text displayed by pressing ^[h by pressing ^[h again.\n\n Own Id: OTP-19260 Aux Id: [PR-8884]\n\n- [`inet:getifaddrs/0,1`](`inet:getifaddrs/1`) is improved when using\n inet_backend = socket.\n\n Own Id: OTP-19264\n\n- Fixed `t:logger:report/0` to mandate at least one element in the report. This fixes an issue with overlapping `spec` domains in all `m:logger` functions that use `t:logger:report/0`.\n\n Own Id: OTP-19302 Aux Id: [PR-8959]\n\n- Fixed deadlock on `code_server`. Multiple calls loading the same module with an `on_load` function loading call would create a deadlock.\n\n Own Id: OTP-19305 Aux Id: [PR-8744], [GH-7466], [GH-8510]\n\n[PR-8789]: https://github.com/erlang/otp/pull/8789\n[PR-8884]: https://github.com/erlang/otp/pull/8884\n[PR-8959]: https://github.com/erlang/otp/pull/8959\n[PR-8744]: https://github.com/erlang/otp/pull/8744\n[GH-7466]: https://github.com/erlang/otp/issues/7466\n[GH-8510]: https://github.com/erlang/otp/issues/8510","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The Kernel application now recognizes the `epmd_module` and `erl_epmd_listen_port` parameters, similar to `-kernel:connect_all`.\n\n Own Id: OTP-19253 Aux Id: [PR-8671]\n\n- The `inetrc` kernel argument will now tolerate atoms again to improve compatibility with old configurations that relied on atoms working by accident.\n \n The expected type always was, and still remains, a string.\n\n Own Id: OTP-19280 Aux Id: [GH-8899], [PR-8902]\n\n- The `t:file:io_device/0` type has been updated to clearly show the difference between a `raw` and `cooked` IoDevice.\n\n Own Id: OTP-19301 Aux Id: [PR-8956]\n\n- Erlang/OTP type specifications has been updated to eliminate overlapping domains.\n\n Own Id: OTP-19310 Aux Id: [GH-8810], [GH-8821], [PR-8986]\n\n- Added the kernel parameter [`os_cmd_shell`](kernel_app.md#os_cmd_shell) that controls which shell should be used by `os:cmd/1`.\n\n Own Id: OTP-19342 Aux Id: [PR-8972]\n\n- Added logging support to `t:io:user/0`, `t:io:standard_io/0` and `t:io:standard_error/0`. See `io:setopts/2` for more details.\n\n Own Id: OTP-19372 Aux Id: [PR-8947]\n\n[PR-8671]: https://github.com/erlang/otp/pull/8671\n[GH-8899]: https://github.com/erlang/otp/issues/8899\n[PR-8902]: https://github.com/erlang/otp/pull/8902\n[PR-8956]: https://github.com/erlang/otp/pull/8956\n[GH-8810]: https://github.com/erlang/otp/issues/8810\n[GH-8821]: https://github.com/erlang/otp/issues/8821\n[PR-8986]: https://github.com/erlang/otp/pull/8986\n[PR-8972]: https://github.com/erlang/otp/pull/8972\n[PR-8947]: https://github.com/erlang/otp/pull/8947","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 10.1.2 - Kernel Release Notes","ref":"notes.html#kernel-10-1-2"},{"type":"extras","doc":"- On windows the socket:recv could return with success ({ok, Data}) even though not all data had been read.\n\n Own Id: OTP-19328\n\n- gen_udp:send on domain local can leak inet_reply messages.\n\n Own Id: OTP-19332 Aux Id: [#8989]\n\n- Failure to create an UDP IPv6 socket when inet_backend = socket with certain IPv6 socket options.\n\n Own Id: OTP-19357\n\n- net:getifaddrs does not properly report the running flag on windows.\n\n Own Id: OTP-19366 Aux Id: OTP-19061, ERIERL-1134\n\n[#8989]: https://github.com/erlang/otp/issues/8989","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 10.1.1 - Kernel Release Notes","ref":"notes.html#kernel-10-1-1"},{"type":"extras","doc":"- A bug has been fixed where receiving an SCTP message with `gen_sctp` could waste the first fragments of a message and only deliver the last fragment.\n \n This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.\n \n A bug has been fixed with a lingering time-out from after an SCTP connect that could stop the flow of incoming messages on an active `gen_tcp` socket.\n\n Own Id: OTP-19235 Aux Id: ERIERL-1133, [PR-8837]\n\n- An boolean option `non_block_send` for SCTP, has ben added to be able to achieve the old behaviour to avoid blocking send operations by passing the OS network stack error message (`{error,eagain}` through.\n\n Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134\n\n[PR-8837]: https://github.com/erlang/otp/pull/8837","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 10.1 - Kernel Release Notes","ref":"notes.html#kernel-10-1"},{"type":"extras","doc":"- A faulty assertion was corrected in the `prim_tty` module. This assertion could trigger when invalid UTF-8 was read from stdin just as the mode was changed from unicode to latin1.\n\n Own Id: OTP-19097 Aux Id: [PR-8503]\n\n- Opening a `disk_log` file and combining `head_func` with `rotate` options did not work.\n\n Own Id: OTP-19104 Aux Id: ERIERL-870\n\n- Fixed an error info printout for `erlang:is_process_alive/1` on non-local pids.\n\n Own Id: OTP-19134 Aux Id: [PR-8560]\n\n- A race in the kTLS flavour of SSL distribution has been fixed so that `inet_drv.c` doesn't read ahead too much data, which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the `inet_drv.c` buffer as unencrypted.\n\n Own Id: OTP-19175 Aux Id: [GH-8561], [PR-8690]\n\n- Fixed a deadlock when an application crashes during startup and log messages were sent to standard out. Logger would fail to print the messages to standard out and instead print them to standard error.\n\n Own Id: OTP-19205\n\n- The `-proto_dist` init parameter will no longer be ignored when specified multiple times. It will now log a warning and use the first specified value.\n\n Own Id: OTP-19208 Aux Id: [PR-8672]\n\n- Corrected socket:ioctl for genaddr (SIOCGENADDR).\n\n Own Id: OTP-19216\n\n[PR-8503]: https://github.com/erlang/otp/pull/8503\n[PR-8560]: https://github.com/erlang/otp/pull/8560\n[GH-8561]: https://github.com/erlang/otp/issues/8561\n[PR-8690]: https://github.com/erlang/otp/pull/8690\n[PR-8672]: https://github.com/erlang/otp/pull/8672","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added functions `getservbyname` and `getservbyport` to the `net` module.\n\n Own Id: OTP-19101 Aux Id: OTP-18835\n\n- Introduced enet | esock variants of `m:inet` functions, either when called with sockets,\n with explicit inet_backend config or with the e inet_backend kernel config option.\n\n Own Id: OTP-19132 Aux Id: OTP-19101\n\n- The function `socket:i/0` now uses the `m:net` module (instead of the `m:inet` module) for service translation.\n\n Own Id: OTP-19138 Aux Id: OTP-19101\n\n- A boolean option `read_ahead` has been implemented for `gen_tcp`, default `true`, to facilitate not reading past (caching data) the end of a packet. In particular, for kTLS, caching data could read in data that was supposed to be decrypted by the platform's network stack, before crypto parameters could be activated.\n\n Own Id: OTP-19199 Aux Id: OTP-19175, [GH-8561], [GH-8690], [GH-8785]\n\n[GH-8561]: https://github.com/erlang/otp/issues/8561\n[GH-8690]: https://github.com/erlang/otp/issues/8690\n[GH-8785]: https://github.com/erlang/otp/issues/8785","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 10.0.1 - Kernel Release Notes","ref":"notes.html#kernel-10-0-1"},{"type":"extras","doc":"- Polish the `m:logger` documentation.\n\n Own Id: OTP-19118 Aux Id: [PR-8534]\n\n[PR-8534]: https://github.com/erlang/otp/pull/8534","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 10.0 - Kernel Release Notes","ref":"notes.html#kernel-10-0"},{"type":"extras","doc":"- Fixed a crash when calling `file:delete/2` with an empty option list.\n\n Own Id: OTP-18590 Aux Id: [PR-7220]\n\n- New functions have been added to the undocumented module `m:inet_dns` that take a flag to specify if encode/decode is for mDNS. This affects how CLASS values in the private range, with the top bit set, are handled.\n\n Own Id: OTP-18878 Aux Id: [GH-7718], OTP-17734\n\n- The error information for `erlang:phash/2` has been corrected.\n\n Own Id: OTP-18904 Aux Id: [PR-7960]\n\n- `get_until` requests using the I/O protocol now correctly return a binary or list when `eof` is the last item returned by the callback.\n\n Own Id: OTP-18930 Aux Id: [PR-7993], [GH-4992]\n\n- Calling `logger:add_handlers/1` with config option now works.\n\n Own Id: OTP-18954 Aux Id: [GH-8061], [PR-8076]\n\n- The `code:del_path/1` function now also works on paths added through `-pa`, `-pz` , `-path` and the boot script.\n\n Own Id: OTP-18959 Aux Id: [GH-6692], [PR-7697]\n\n- A call to `socket:[recv|recvfrom|recvmsg]/*` with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.\n\n Own Id: OTP-19063 Aux Id: OTP-18835\n\n- Improve heuristic for when a characters is wide in the shell for systems with old libc versions.\n\n Own Id: OTP-19087 Aux Id: [PR-8382]\n\n- Fix reading a line when reading from `t:io:user/0` to not consider `\\r` without `\\n` to be a new line when `erl` is started with `-noshell`.\n\n Own Id: OTP-19088 Aux Id: [PR-8396], [GH-8360]\n\n[PR-7220]: https://github.com/erlang/otp/pull/7220\n[GH-7718]: https://github.com/erlang/otp/issues/7718\n[PR-7960]: https://github.com/erlang/otp/pull/7960\n[PR-7993]: https://github.com/erlang/otp/pull/7993\n[GH-4992]: https://github.com/erlang/otp/issues/4992\n[GH-8061]: https://github.com/erlang/otp/issues/8061\n[PR-8076]: https://github.com/erlang/otp/pull/8076\n[GH-6692]: https://github.com/erlang/otp/issues/6692\n[PR-7697]: https://github.com/erlang/otp/pull/7697\n[PR-8382]: https://github.com/erlang/otp/pull/8382\n[PR-8396]: https://github.com/erlang/otp/pull/8396\n[GH-8360]: https://github.com/erlang/otp/issues/8360","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added `file:read_file/2` with a `raw` option for reading files without going through the file server.\n\n Own Id: OTP-18589 Aux Id: [PR-7220]\n\n- The undocumented Erlang DNS resolver library (`inet_dns` and `inet_res`) has been augmented to handle IXFR, NOTIFY, UPDATE and TSIG records. With this some bug fixes and code cleanup has been done, and the resolver used in the test suite has been changed to Knot DNS. See the source code. \n \n Kudos to Alexander Clouter that did almost all the work!\n\n Own Id: OTP-18713 Aux Id: [PR-6985], [GH-6985]\n\n- The `ebin` directories for escripts are now cached.\n\n Own Id: OTP-18778 Aux Id: [PR-7556]\n\n- `-callback` attributes haven been added to `m:application`, `m:logger_handler`, and `m:logger_formatter`.\n\n Own Id: OTP-18795 Aux Id: [PR-7703]\n\n- Progress reports from before logger is started are now logged when log level is set to debug.\n\n Own Id: OTP-18807 Aux Id: [PR-7732] ERIERL-985\n\n- The `code:where_is_file/2` and\n `code:which/1` functions now check for existence of the file directly instead of listing the content of each directory in the code path.\n\n Own Id: OTP-18816 Aux Id: [PR-7711]\n\n- Type specs has been added to the [`logger:Level/1,2,3`](`m:logger`) functions.\n\n Own Id: OTP-18820 Aux Id: [PR-7779]\n\n- For `inet_backend = socket`, setting the `active` socket option alone, to `once`, `true` or `N` has been optimized, as well as the corresponding data delivery.\n\n Own Id: OTP-18835\n\n- New functions `socket:sendv/*` for sending I/O vectors have been added.\n\n Own Id: OTP-18845\n\n- The shell now pages long output from the documentation help command ([`h(Module)`](`c:h/1`)), auto completions and the search command.\n\n Own Id: OTP-18846 Aux Id: [PR-7845]\n\n- Native coverage support has been implemented in the JIT. It will automatically be used by the `m:cover` tool to reduce the execution overhead when running cover-compiled code.\n \n There are also new APIs to support native coverage without using the `cover` tool.\n \n To instrument code for native coverage it must be compiled with the [`line_coverage`](`m:compile#line_coverage`) option.\n \n To enable native coverage in the runtime system, start it like so:\n \n ```text\n $ erl +JPcover true\n ```\n \n There are also the following new functions for supporting native coverage:\n \n * `code:coverage_support/0`\n * `code:get_coverage/2`\n * `code:reset_coverage/1`\n * `code:get_coverage_mode/0`\n * `code:get_coverage_mode/1`\n * `code:set_coverage_mode/1`\n\n Own Id: OTP-18856 Aux Id: [PR-7856]\n\n- Optimized code loading by moving certain operations from the code server to the caller.\n\n Own Id: OTP-18941 Aux Id: [PR-7981]\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n- Application startup has been optimized by removing an intermediary process.\n\n Own Id: OTP-18963 Aux Id: [PR-8042]\n\n- The existing experimental support for archive files will be changed in a future release. The support for having an archive in an escript will remain, but the support for using archives in a release will either become more limited or completely removed.\n \n As of Erlang/OTP 27, the function `code:lib_dir/2`, the `-code_path_choice` flag, and using `m:erl_prim_loader` for reading members of an archive are deprecated.\n \n To remain compatible with future version of Erlang/OTP `escript` scripts that need to retrieve data files from its archive should use `escript:extract/2` instead of `erl_prim_loader` and `code:lib_dir/2`.\n\n *** POTENTIAL INCOMPATIBILITY ***\n\n Own Id: OTP-18966 Aux Id: [PR-8091]\n\n- The undocumented and deprecated `file:pid2name` function has been removed.\n\n Own Id: OTP-18967 Aux Id: [PR-8092]\n\n- There is a new module `m:trace` in Kernel providing the same trace functionality as `erlang:trace/3` and `erlang:trace_pattern/3`, but with the addition of **dynamic isolated trace sessions**.\n\n Own Id: OTP-18980\n\n- Error logging has been improved when the `t:io:standard_io/0` reader and/or writer terminates with an error.\n\n Own Id: OTP-18989 Aux Id: [PR-8103]\n\n- `inet_backend = socket` has been optimized and reworked to be more compatible with the original `inet_backend = inet`.\n\n Own Id: OTP-19004 Aux Id: OTP-18835\n\n- Add an simple example (echo server) )to the socket users guide.\n\n Own Id: OTP-19042\n\n- `inet:i/0,1,2` has been improved to allow port numbers to be shown explicitly.\n\n Own Id: OTP-19053 Aux Id: [#6724]\n\n- The `socket` documentation has been reworked, and due to\n that a few details were fixed:\n * `socket:is_supported/1` now returns `true` for example for `protocols`\n that is a \"category\", not an item.\n * `socket:cancel_monitor/1` no longer badargs for a monitor that was set by\n another process, instead it returns `false` as for other unknown\n `reference()`s.\n\n Own Id: OTP-19054\n\n- Add `stdin`, `stdout` and `stderr` keys to `io:getopts/1` on `t:io:standard_io/0` to indicate if the respective I/O device is backed by a terminal.\n\n Own Id: OTP-19089 Aux Id: [PR-8396]\n\n[PR-7220]: https://github.com/erlang/otp/pull/7220\n[PR-6985]: https://github.com/erlang/otp/pull/6985\n[GH-6985]: https://github.com/erlang/otp/issues/6985\n[PR-7556]: https://github.com/erlang/otp/pull/7556\n[PR-7703]: https://github.com/erlang/otp/pull/7703\n[PR-7732]: https://github.com/erlang/otp/pull/7732\n[PR-7711]: https://github.com/erlang/otp/pull/7711\n[PR-7779]: https://github.com/erlang/otp/pull/7779\n[PR-7845]: https://github.com/erlang/otp/pull/7845\n[PR-7856]: https://github.com/erlang/otp/pull/7856\n[PR-7981]: https://github.com/erlang/otp/pull/7981\n[PR-8026]: https://github.com/erlang/otp/pull/8026\n[PR-8042]: https://github.com/erlang/otp/pull/8042\n[PR-8091]: https://github.com/erlang/otp/pull/8091\n[PR-8092]: https://github.com/erlang/otp/pull/8092\n[PR-8103]: https://github.com/erlang/otp/pull/8103\n[#6724]: https://github.com/erlang/otp/issues/6724\n[PR-8396]: https://github.com/erlang/otp/pull/8396","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 9.2.4.4 - Kernel Release Notes","ref":"notes.html#kernel-9-2-4-4"},{"type":"extras","doc":"* gen_udp:send on domain local can leak inet_reply messages.\n\n Own Id: OTP-19332 Aux Id: #8989\n* Failure to create an UDP IPv6 socket when inet_backend = socket with certain IPv6 socket options.\n\n Own Id: OTP-19357\n* net:getifaddrs does not properly report the running flag on windows.\n\n Own Id: OTP-19366 Aux Id: OTP-19061, ERIERL-1134","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2.4.3 - Kernel Release Notes","ref":"notes.html#kernel-9-2-4-3"},{"type":"extras","doc":"* A bug has been fixed where receiving an SCTP message with \\`gen_sctp\\` could waste the first fragments of a message and only deliver the last fragment.\n\n This happened with low probability when the OS signaled that the socket was ready for reading in combination with an internal time-out retry.\n\n A bug has been fixed with a lingering time-out from after an SCTP connect that could stop the flow of incoming messages on an active \\`gen_tcp\\` socket.\n\n Own Id: OTP-19235 Aux Id: ERIERL-1133, PR-8837\n* An boolean option \\`non_block_send\\` for SCTP, has ben added to be able to achieve the old behaviour to avoid blocking send operations by passing the OS network stack error message (\\`\\{error,eagain\\}\\` through.\n\n Own Id: OTP-19258 Aux Id: OTP-19061, ERIERL-1134","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2.4.2 - Kernel Release Notes","ref":"notes.html#kernel-9-2-4-2"},{"type":"extras","doc":"* A race in the kTLS flavour of SSL distribution has been fixed so inet_drv.c doesn't read ahead too much data which could cause the kTLS encryption to be activated too late when some encrypted data had already been read into the inet_drv.c buffer as unencrypted.\n\n Own Id: OTP-19175 Aux Id: GH-8561, PR-8690\n* Fix a deadlock when an application crashes during startup and log messages were sent to standard out. Logger would fail to print the messages to standard out and instead print them to standard error.\n\n Own Id: OTP-19205\n* Add the stdlib application parameters `shell_redraw_prompt_on_output` which when set to `false` disables redrawing of the shell prompt if any other output is done.\n\n Own Id: OTP-19213 Aux Id: PR-8763 ERIERL-1108","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2.4.1 - Kernel Release Notes","ref":"notes.html#kernel-9-2-4-1"},{"type":"extras","doc":"* A call to socket:\\[recv|recvfrom|recvmsg]/* with Timeout = 0 on Windows could cause a (case clause) crash if data is immediately available.\n\n Own Id: OTP-19063 Aux Id: OTP-18835\n* Open a `disk_log` file and combining `head_func` with `rotate` options did not work.\n\n Own Id: OTP-19104 Aux Id: ERIERL-870","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2.4 - Kernel Release Notes","ref":"notes.html#kernel-9-2-4"},{"type":"extras","doc":"* Fix the shell Job Control Mode to not crash when typing `TAB` or `CTRL+R`.\n\n Own Id: OTP-19072 Aux Id: PR-8391\n* Fix calls to blocking `m:application` APIs to throw an exception with reason `terminating` if called when the system is terminating.\n\n This is done in order to avoid deadlocks during shutdown or restart.\n\n Own Id: OTP-19078 Aux Id: PR-8422","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2.3 - Kernel Release Notes","ref":"notes.html#kernel-9-2-3"},{"type":"extras","doc":"* When using IPv6, classic gen_udp failed to add (group) membership (drop was used instead).\n\n Own Id: OTP-19049 Aux Id: #8176\n* The check in inet_res of the RD bit has been relaxed slightly.\n\n Own Id: OTP-19056 Aux Id: PR-8312, OTP-17323","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2.2 - Kernel Release Notes","ref":"notes.html#kernel-9-2-2"},{"type":"extras","doc":"* Fix performance bug when using `io:fread` to read from `standard_io`. This regression was introduced in OTP 26.0.\n\n Own Id: OTP-18910 Aux Id: PR-7933 GH-7924\n* A bug in the code server could cause it to crash in some concurrent scenarios. This bug was introduced in 26.1.\n\n Own Id: OTP-18948 Aux Id: PR-8046\n* Fixed gen_udp:open/2 type spec to include already supported module socket address types.\n\n Own Id: OTP-18990 Aux Id: GH-8158\n* Fix reading of password for ssh client when in `user_interactive` mode.\n\n Own Id: OTP-19007 Aux Id: ERIERL-1049","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2.1 - Kernel Release Notes","ref":"notes.html#kernel-9-2-1"},{"type":"extras","doc":"* Fix `group` (that is the shell) to properly handle when an `get_until` callback function returned `{done, eof, []}` when an `eof` was detected.\n\n Own Id: OTP-18901","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.2 - Kernel Release Notes","ref":"notes.html#kernel-9-2"},{"type":"extras","doc":"- For `inet_backend = socket`, an unexpected receive error such as `etimedout`\n caused the receiving state machine server to crash. This bug has now been\n fixed.\n\n Own Id: OTP-18749 Aux Id: GH-7608\n\n- Fix bug where reading using `file` from a unicode enabled `standard_io`,\n `standard_error` or any other `group` backed device would result in incorrect\n values being returned or a crash.\n\n Now instead a no_translation error is returned to the caller when unicode data\n is read using `file`. See\n [Using Unicode](`e:stdlib:unicode_usage.md#escripts-and-non-interactive-i-o`)\n in the STDLIB User's Guide for more details on how to correctly read from\n `standard_io`.\n\n Own Id: OTP-18800 Aux Id: PR-7714 GH-7591\n\n- The native resolver interface module has gotten a rewrite of its ETS table\n handling to minimize term copying, and also to move the handling of client\n time-outs to the clients, which helps the native resolver name server from\n digging itself into a tar pit when heavily loaded.\n\n Own Id: OTP-18812 Aux Id: ERIERL-997\n\n- Replaced unintentional Erlang Public License 1.1 headers in some files with\n the intended Apache License 2.0 header.\n\n Own Id: OTP-18815 Aux Id: PR-7780\n\n- Fix bug in `pg` if a client process both monitored a group/scope and joined a\n group. The termination of such process resulted in crash of the `pg` server\n process.\n\n Own Id: OTP-18833 Aux Id: GH-7625, PR-7659\n\n- Fix crash when using `file:consult` and the underlying file read returns an\n error while reading.\n\n Own Id: OTP-18873 Aux Id: PR-7831\n\n- Corrected gen_tcp_socket listen option handling.\n\n Own Id: OTP-18883 Aux Id: #7764","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add Windows support for DGRAM socket connect.\n\n Own Id: OTP-18762\n\n- Document the, previously opaque, types select_tag() and completion_tag().\n\n Own Id: OTP-18818 Aux Id: #7337","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 9.1 - Kernel Release Notes","ref":"notes.html#kernel-9-1"},{"type":"extras","doc":"- Fixed an issue with truncated crash slogans on failed emulator start.\n\n Own Id: OTP-18623 Aux Id: GH-7344\n\n- Fix shell:start_interactive function specification.\n\n Own Id: OTP-18628 Aux Id: GH-7280\n\n- Fix code:get_doc/1 to return missing, when it can't find erts instead of\n crashing.\n\n Own Id: OTP-18654 Aux Id: PR-7404\n\n- Function socket:close/1 could cause a VM crash on Windows.\n\n Own Id: OTP-18669 Aux Id: OTP-18029\n\n- Fix deadlock when `erl.exe` is used as part of a pipe on Windows and trying to\n set the encoding of the `standard_io` device.\n\n Own Id: OTP-18675 Aux Id: PR-7473 GH-7459\n\n- Expanded the documentation about how to use the `standard_io`,\n `standard_error` and `user` I/O devices.\n\n Added the types [`io:standard_io/0`](`t:io:standard_io/0`),\n `io:standard:error/0` and [`io:user/0`](`t:io:user/0`).\n\n Own Id: OTP-18676 Aux Id: PR-7473 GH-7459\n\n- Fix logger's overload protection mechanism to only fetch memory used by\n messages when needed.\n\n Own Id: OTP-18677 Aux Id: PR-7418 GH-7417\n\n- Fixed a number of socket-related issues causing incompatibilities with gen_tcp\n and gen_udp respectively.\n\n Own Id: OTP-18685\n\n- gen_tcp:connect with socket address and socket (inet-) backend fails because\n of missing callback function.\n\n Own Id: OTP-18707 Aux Id: #7530\n\n- The DNS RR cache used by \\`inet_res\\` has been fixed to preserve insert order,\n which is beneficial when the DNS server returns RRs in some specific order for\n e.g load balancing purposes.\n\n Own Id: OTP-18731 Aux Id: GH-7577, PR-7578\n\n- The options \\`reuseport\\`, \\`reuseport_lb\\` and \\`exclusiveaddruse\\` were\n accidentally not allowed for e.g \\`gen_udp:open/1,2\\`, which has now been\n corrected.\n\n Own Id: OTP-18734 Aux Id: OTP-18344, PR-6522, GH-6461, GH-7569\n\n- `gen_udp:recv/*` for Unix Domain Socket in binary mode and passive mode has\n been fixed to not crash.\n\n Own Id: OTP-18747 Aux Id: GH-7605\n\n- Fixed issue where cursor would not be placed at the end of the expression when\n navigating shell history.\n\n Own Id: OTP-18757 Aux Id: PR-7631","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Update gen_tcp_socket and gen_udp_socket to handle 'completion' (socket on\n Windows).\n\n Own Id: OTP-18586 Aux Id: OTP-18029\n\n- Add support for Unix Domain Sockets (only for STREAM sockets) on Windows for\n 'socket'.\n\n Own Id: OTP-18611 Aux Id: OTP-18029, #5024\n\n- Add basic support for socket ioctl on Windows.\n\n Own Id: OTP-18660\n\n- The [`file:location/0`](`t:file:location/0`) type is now exported.\n\n Own Id: OTP-18681\n\n- Add support for (Windows) socket option exclusiveaddruse.\n\n Own Id: OTP-18686\n\n- \\[socket] Add support for the 'nopush' option.\n\n Own Id: OTP-18687\n\n- Add support for socket option 'BSP STATE'.\n\n Own Id: OTP-18693\n\n- Add tcp socket options 'keepcnt', 'keepidle' and 'keepintvl'.\n\n Own Id: OTP-18698\n\n- Add support for misc (Windows) socket options ('max_msg_size' and 'maxdg').\n\n Own Id: OTP-18710\n\n- The keyboard shortcuts for the shell are now configurable.\n\n Own Id: OTP-18754 Aux Id: PR-7604 PR-7647\n\n- Optimized code_server to reduce repeated work when loading the same module\n concurrently.\n\n Own Id: OTP-18755 Aux Id: PR-7503","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 9.0.2 - Kernel Release Notes","ref":"notes.html#kernel-9-0-2"},{"type":"extras","doc":"- Fix bug where when you entered Alt+Enter in the terminal, the cursor would\n move to the last line, instead of moving to the next line.\n\n Own Id: OTP-18580 Aux Id: PR-7242\n\n- Fix so that the shell does not crash on startup when termcap is not available.\n\n Own Id: OTP-18624 Aux Id: GH-7296\n\n- Multiple socket:accept calls issue. When making multiple accept calls, only\n the last call is active.\n\n Own Id: OTP-18635 Aux Id: #7328\n\n- Fix the shell to ignore terminal delay when the terminal capabilities report\n that they should be used.\n\n Own Id: OTP-18636 Aux Id: PR-7352 GH-7308\n\n- Fix \"oldshell\" to echo characters while typing on Windows.\n\n Own Id: OTP-18637 Aux Id: PR-7359 GH-7324\n\n- Fix eof handling when reading from stdin when erlang is started using\n `-noshell`.\n\n Own Id: OTP-18640 Aux Id: PR-7384 GH-7368 GH-7286 GH-6881\n\n- On Windows, a call to the function socket:close, when there are waiting active\n calls to read, write or accept functions, could hang.\n\n Own Id: OTP-18646\n\n- Fix issues when reading or configuring `standard_io` on Windows when erl.exe\n is started using `-noshell` flag.\n\n Own Id: OTP-18649 Aux Id: GH-7261 PR-7400\n\n- gen_udp:connect with inet_backend = socket fails when the Address is a\n hostname (string or atom).\n\n Own Id: OTP-18650\n\n- Fixed problem which would cause shell to crash if particular escape sequence\n was written to stdout.\n\n Own Id: OTP-18651 Aux Id: PR-7242\n\n- Fixed problem where output would disappear if it was received after a prompt\n was written in the shell.\n\n Own Id: OTP-18652 Aux Id: PR-7242\n\n- Fix a crash where the location of erts could not be found in rebar3 dev\n builds.\n\n Own Id: OTP-18656 Aux Id: PR-7404 GH-7390\n\n- Introduce the KERNEL application parameter `standard_io_encoding` that can be\n used to set the default encoding for standard_io. This option needs to be set\n to `latin1` if the application wants to treat all input data as bytes rather\n than utf-8 encoded characters.\n\n Own Id: OTP-18657 Aux Id: GH-7230 PR-7384","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.0.1 - Kernel Release Notes","ref":"notes.html#kernel-9-0-1"},{"type":"extras","doc":"- The POSIX error `exdev` was sometimes incorrectly described as \"cross domain\n link\" in some error messages.\n\n Own Id: OTP-18578 Aux Id: GH-7213\n\n- Corrected the socket send function description (send with Timeout = nowait).\n The send function(s) could not return \\{ok, \\{RestData, SelectInfo\\}\\}\n\n Own Id: OTP-18584 Aux Id: #7238","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 9.0 - Kernel Release Notes","ref":"notes.html#kernel-9-0"},{"type":"extras","doc":"- Fixed a bug where duplicate keys were allowed in the .app file of an\n application. Duplicate keys are now rejected and the application will not\n start if they exist.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18210 Aux Id: GH-5877 PR-5878\n\n- Fix inconsistent handling in logger_formatter of the branched values in\n conditional branches. For example using `msg` in a conditional branch would\n not be formatted as it should before this fix.\n\n Own Id: OTP-18225 Aux Id: PR-6036\n\n- Fix the logger_std_h handler to log to standard_error if logging to\n standard_io fails for any reason.\n\n Own Id: OTP-18226 Aux Id: PR-6253\n\n- Fix the TLS distribution to work when starting Erlang in embedded mode and a\n connection is done before kernel is fully started.\n\n Own Id: OTP-18248 Aux Id: PR-6227 GH-6085\n\n- erl `-remsh` has been improved to provide better error reasons and work when\n using a shell without terminal support (that is an \"oldshell\").\n\n Own Id: OTP-18271 Aux Id: PR-6279\n\n- Fix logging of log events generated before kernel is started to not fail if\n the code for formatting those log messaged have not yet been loaded.\n\n Own Id: OTP-18286 Aux Id: PR-5955\n\n- `proc_lib:start*/*` has become synchronous when the started process fails.\n This requires that a failing process use a new function\n `proc_lib:init_fail/2,3`, or exits, to indicate failure. All OTP behaviours\n have been fixed to do this.\n\n All these start functions now consume the `'EXIT'` message from a process link\n for all error returns. Previously it was only the `start_link/*` functions\n that did this, and only when the started function exited, not when it used\n `init_ack/1,2` or `init_fail/2,3` to create the return value.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18471 Aux Id: GH-6339, PR-6843\n\n- Fixed a bug where `file:read(standard_io, ...)` unexpectedly returned `eof` in\n binary mode.\n\n Own Id: OTP-18486 Aux Id: PR-6881\n\n- Return type for `seq_trace:get_token/1` fixed.\n\n Own Id: OTP-18528 Aux Id: PR-7009\n\n- Looking up, connecting to and sending to a host with an empty name is now\n handled by trying to look up the address of the root domain, which fails.\n Previously some of these operations caused an internal exception, which\n contradicted type specifications.\n\n Own Id: OTP-18543 Aux Id: GH-6353\n\n- Replaced a regex with a special case handling of ANSI Select Graphic Rendition\n escape characters, to speed up io output that make use of these escape\n sequences.\n\n Own Id: OTP-18547 Aux Id: PR-7092","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The Erlang shell has been improved to support the following features:\n\n - Auto-complete variables, record names, record field names, map keys,\n function parameter types and filenames.\n - Open external editor in the shell (with C-o) to edit the current expression\n in an editor.\n - Support defining records (with types), functions and function typespecs, and\n custom types in the shell.\n - Do not save pager commands, and input to io:getline in history.\n\n Own Id: OTP-14835 Aux Id: PR-5924\n\n- The TTY/terminal subsystem has been rewritten by moving more code to Erlang\n from the old linked-in driver and implementing all the I/O primitives needed\n in a NIF instead.\n\n On Unix platforms the user should not notice a lot of difference, besides\n better handling of unicode characters and fixing of some long standing bugs.\n\n Windows users will notice that erl.exe has the same functionality as a normal\n Unix shell and that werl.exe has been removed and replaced with a symlink to\n erl.exe. This makes the Windows Erlang terminal experience identical to that\n of Unix.\n\n The re-write brings with it a number of bug fixes and feature additions:\n\n - The TTY is now reset when Erlang exits, fixing zsh to not break when\n terminating an Erlang session.\n - `standard_error` now uses the same unicode mode as `standard_io`.\n - Hitting backspace when searching the shell history with an empty search\n string no longer breaks the shell.\n - Tab expansion now works on remote nodes started using the JCL interface.\n - It is now possible to configure the shell slogan and the session slogans\n (that is the texts that appear when you start an Erlang shell). See the\n kernel documentation for more details.\n - Added shell:start_interactive for starting the interactive shell from a\n non-interactive Erlang session (for example an escript).\n - On Windows, when starting in detached mode the standard handler are now set\n to `nul` devices instead of being unset.\n - Standard I/O now always defaults to `unicode` mode if supported. Previously\n the default was `latin1` if the runtime system had been started with\n `-oldshell` or `-noshell` (for example in an `escript`). To send raw bytes\n over standard out, one now explicitly has to specify\n `io:setopts(standard_io, [{encoding, latin1}]).`\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17932 Aux Id: PR-6144 GH-3150 GH-3390 GH-4343 GH-4225\n\n- Add support for socket on Windows.\n\n - Pre release status.\n - Error codes not finalized.\n - No explicit support for Windows specific options (socket options, flags for\n read and write).\n - New async api for Windows (completion). See the `Asynchronous calls` chapter\n in the (Socket Usage) Users Guide.\n - To ensure platform independence, gen_tcp and gen_udp is _intended_ to be\n used (not yet updated).\n\n Own Id: OTP-18029\n\n- As announced since the release of OTP 24, support for:\n\n - version 4 node container types in the external term format are now\n mandatory. That is, references supporting up to 5 32-bit integer\n identifiers, and process and port identifiers with support for 64-bit data\n storage. The distribution flag\n [`DFLAG_V4_NC`](`e:erts:erl_dist_protocol.md#DFLAG_V4_NC`) is therefor now\n also mandatory. OTP has since OTP 24 supported this. Also note that the\n external format produced by `term_to_binary()` and `term_to_iovec()` will\n unconditionally produce pids, ports, and references supporting this larger\n format.\n - the [new link protocol](`e:erts:erl_dist_protocol.md#new_link_protocol`)\n introduced in OTP 23.3 is now mandatory. The distribution flag\n [`DFLAG_UNLINK_ID`](`e:erts:erl_dist_protocol.md#DFLAG_UNLINK_ID`) is\n therefor now also mandatory.\n\n Due to the above, OTP 26 nodes will refuse to connect to OTP nodes from\n releases prior to OTP 24.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18140 Aux Id: PR-6072\n\n- Support for Kernel TLS (kTLS), has been added to the SSL application, for TLS\n distribution (`-proto_dist inet_tls`), the SSL option `{ktls, true}`. Using\n this for general SSL sockets is uncomfortable, undocumented and not\n recommended since it requires very platform dependent raw options.\n\n This, for now, only works for some not too old Linux distributions. Roughly, a\n kernel 5.2.0 or later with support for UserLand Protocols and the kernel\n module `tls` is required.\n\n Own Id: OTP-18235 Aux Id: PR-6104, PR-5840\n\n- Add code:get_doc/2 which adds support to fetch documentation skeletons of\n functions using debug_info chunks instead of eep48 doc chunks.\n\n Own Id: OTP-18261 Aux Id: PR-5924\n\n- The Erlang shell's auto-completion when typing `tab` has been changed to\n happen after the editing current line instead of before it.\n\n This behaviour can be configured using a the `shell_expand_location` STDLIB\n configuration parameter.\n\n Own Id: OTP-18278 Aux Id: PR-6260\n\n- Typing `Ctrl+L` in a shell now clears the screen and redraws the current line\n instead of only redrawing the current line. To only redraw the current line,\n you must now type `Alt+L`. This brings the behaviour of `Ctrl+L` closer to how\n bash and other shells work.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18285 Aux Id: PR-6262\n\n- gen_server optimized by caching callback functions\n\n Own Id: OTP-18305 Aux Id: PR-5831\n\n- Prepare the `pg` communication protocol for upgrade. The plan is for OTP-28\n nodes to be able to use an upgraded `pg` protocol while still being able to\n talk with OTP 26 nodes.\n\n Own Id: OTP-18327 Aux Id: PR-6433\n\n- New `disk_log` log type `rotate`, where the log files are compressed upon\n rotation.\n\n Own Id: OTP-18331 Aux Id: ERIERL-870\n\n- The following `inet:setopts/2` options have been introduced:\n\n - **[`reuseport`](`m:inet#option-reuseport`)** - Reuse of local port. Load\n balancing may or may not be provided depending on underlying OS.\n\n - **[`reuseport_lb`](`m:inet#option-reuseport_lb`)** - Reuse of local port.\n Load balancing provided.\n\n - **[`exclusiveaddruse`](`m:inet#option-exclusiveaddruse`)** - Exclusive\n address/port usage on Windows. This socket option is Windows specific and\n will silently be ignored on other systems.\n\n The behavior of setting [`reuseaddr`](`m:inet#option-reuseaddr`) on Windows\n have changed in a _backwards incompatible_ way. The underlying `SO_REUSEADDR`\n socket option is now only set if both the `reusaddr` and the `reuseport`\n `inet` options have been set. This since the underlying `SO_REUSEADDR` socket\n option on Windows behaves similar to how BSD behaves if both the underlying\n socket options `SO_REUSEADDR` and `SO_REUSEPORT` have been set. See the\n documentation of the `reuseaddr` option for more information.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18344 Aux Id: PR-6522, PR-6944, OTP-18324, PR-6481, GH-6461\n\n- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18405 Aux Id:\n GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814\n\n- The function `file:pid2name/1` is deprecated and will be removed in\n Erlang/OTP 27.\n\n Own Id: OTP-18419\n\n- The modules Erlang DNS resolver `inet_res` and helper modules have been\n updated for RFC6891; to handle OPT RR with DNSSEC OK (DO) bit.\n\n Own Id: OTP-18442 Aux Id: PR-6786, GH-6606\n\n- Introduced `application:get_supervisor/1`.\n\n Own Id: OTP-18444 Aux Id: PR-6035\n\n- Handling of `on_load` modules during boot has been improved by adding an extra\n step in the boot order for embedded mode that runs all `on_load` handlers,\n instead of relying on explicit invocation of them, later, when the kernel\n supervision tree starts.\n\n This is mostly a code improvement and OTP internal simplification to avoid\n future bugs and to simplify code maintenance.\n\n Own Id: OTP-18447\n\n- Reduce contention on the code_server by doing the code preparation on the\n client.\n\n Own Id: OTP-18448 Aux Id: PR-6736\n\n- Added a mode to ensure_all_loaded, to start children application and their\n dependencies concurrently.\n\n Own Id: OTP-18451 Aux Id: PR-6737\n\n- Cache OTP boot code paths, to limit how many folders that are being accessed\n during a module lookup. Can be disabled with -cache_boot_path false. OTP boot\n code paths consists of ERL_LIB environment variables. The various otp/\\*/ebin\n folders. And the \\{path, ...\\} clauses in the init script.\n\n Own Id: OTP-18452 Aux Id: PR-6729\n\n- Erlang distribution code in Kernel and SSL has been refactored a bit to\n facilitate debugging and re-usability, which shouldn't have any noticeable\n effects on behaviour or performance.\n\n Own Id: OTP-18456\n\n- Add cache attribute to code path apis.\n\n Added an optional cache/nocache argument to all code:add_path*,\n code:set_path*, and code:replace_path\\* functions. These functions will then\n avoid doing file-accesses if they are cached. Cache can be cleared with\n code:clear_cache/0. Added code:del_paths/1 to make it easier to clear multiple\n paths.\n\n Own Id: OTP-18466 Aux Id: PR-6832\n\n- Deprecates `dbg:stop_clear/0` because it is simply a function alias to\n `dbg:stop/0`\n\n Own Id: OTP-18478 Aux Id: GH-6903\n\n- Improvements to code:ensure_modules_loaded/1: Previously it would prepare\n modules and then abandon references to said modules if they had on_load\n callbacks. This pull request makes it so they keep the references around and\n then serially load them without having to fetch the object code and prepare\n them again.\n\n Own Id: OTP-18484 Aux Id: PR-6844\n\n- The internal DNS resolver has been updated to handle DNS LOC RR:s (RFC 1876).\n This is an undocumented module, although still used by power users. See the\n source code.\n\n Own Id: OTP-18510 Aux Id: GH-6098, PR-6982\n\n- Reduced memory consumption in `global` when informing other nodes about lost\n connections.\n\n Own Id: OTP-18521 Aux Id: PR-7025\n\n- The `net_kernel`, `global`, and `global_group` servers now have\n [_fully asynchronous distributed signaling_](`m:erlang#process_flag_async_dist`)\n enabled all the time which prevents them from ever getting blocked on send of\n distributed signals.\n\n Documentation about blocking distributed signals has also been improved.\n\n Own Id: OTP-18533 Aux Id: PR-7061\n\n- Allow IPv6 addresses as host in `http` packets decoded by\n `erlang:decode_packet/3` and `gen_tcp` packet option. The IPv6 address should\n be enclosed within `[]` according to RFC2732.\n\n Own Id: OTP-18540 Aux Id: PR-6900\n\n- Remove deprecated functions in OTP-26\n\n Own Id: OTP-18542\n\n- Removed `code:is_module_native/1` since HiPE has been removed. It has since\n OTP 24 been deprecated and scheduled for removal in OTP 26.\n\n Removed `code:rehash/0` since the code path feature no longer is present. It\n has since OTP 19 been deprecated and has since OTP 24 been scheduled for\n removal in OTP 26.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18551 Aux Id: PR-7106\n\n- Added support for multiple line expressions and navigation in the shell. Added\n new keybindings:\n\n - navigate up (ctrl+up)/(alt+up)\n - navigate down (ctrl+down)/(alt+down)\n - insert newline in middle of line (alt+enter)\n - navigate top (alt+<)/(alt+shift+up)\n - navigate bottom (alt+>)/(alt+shift+down)\n - clear current expression (alt+c)\n - cancel search (alt+c)\n - opening editor on mac (option+o)/(alt+o)\n\n Modifies the prompt for new lines to make it clearer that the prompt has\n entered multi-line mode. Supports terminal with small window size, recommend\n not go lower than 7 rows and 40 columns. Modifies the search prompt to support\n multi-line statements. Redraw the prompt after continuing from JCL menu.\n\n Own Id: OTP-18575 Aux Id: PR-7169","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.5.4.3 - Kernel Release Notes","ref":"notes.html#kernel-8-5-4-3"},{"type":"extras","doc":"* Fixed gen_udp:open/2 type spec to include already supported module socket address types.\n\n Own Id: OTP-19050 Aux Id: OTP-18990","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.5.4.2 - Kernel Release Notes","ref":"notes.html#kernel-8-5-4-2"},{"type":"extras","doc":"- gen_tcp:connect with socket address and socket (inet-) backend fails because\n of missing callback function.\n\n Own Id: OTP-18707 Aux Id: #7530","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.5.4.1 - Kernel Release Notes","ref":"notes.html#kernel-8-5-4-1"},{"type":"extras","doc":"- Multiple socket:accept calls issue. When making multiple accept calls, only\n the last call is active.\n\n Own Id: OTP-18635 Aux Id: #7328\n\n- gen_udp:connect with inet_backend = socket fails when the Address is a\n hostname (string or atom).\n\n Own Id: OTP-18650","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.5.4 - Kernel Release Notes","ref":"notes.html#kernel-8-5-4"},{"type":"extras","doc":"- Fixed a bug on Windows where `file:read_file_info/1` would fail for files with\n corrupt metadata.\n\n Own Id: OTP-18348 Aux Id: GH-6356\n\n- Accept connection setup from OTP 23 and 24 nodes that are not using epmd.\n\n Own Id: OTP-18404 Aux Id: GH-6595, PR-6625","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.5.3 - Kernel Release Notes","ref":"notes.html#kernel-8-5-3"},{"type":"extras","doc":"- The tcp connect option 'bind_to_device' could not be used with inet_backend =\n 'socket'. 'inet' requires value type binarry() and 'socket' requires value\n type 'string()'.\n\n Own Id: OTP-18357 Aux Id: #6509\n\n- Minor issue processing options when calling gen_tcp:connect with a sockaddr()\n and inet_backend = socket.\n\n Own Id: OTP-18358 Aux Id: #6528","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.5.2 - Kernel Release Notes","ref":"notes.html#kernel-8-5-2"},{"type":"extras","doc":"- Fixed shutdown crash in gen_tcp socket backend, when the other end closed the\n socket.\n\n Own Id: OTP-18270 Aux Id: #6331\n\n- `erl_tar` can now read gzip-compressed tar files that are padded. There is a\n new option `compressed_one` for `file:open/2` that will read a single member\n from a gzip file,\n\n Own Id: OTP-18289 Aux Id: PR-6343\n\n- Fix `os:cmd` to not translate all exceptions thrown to `badarg`. For example\n `emfile` from `erlang:open_port` was translated to `badarg`.\n\n This bug has existed since Erlang/OTP 24.\n\n Own Id: OTP-18291 Aux Id: PR-6382\n\n- Spec for function net:if_names/0 incorrect\n\n Own Id: OTP-18296 Aux Id: OTP-16464\n\n- Missing ctrl option name transation for TOS and TTL (on FreeBSD) when using\n gen_udp with the 'socket' inet_backend.\n\n Own Id: OTP-18315\n\n- gen_udp:open/2 with option(s) add_membership or drop_membership would drop\n earlier options.\n\n Own Id: OTP-18323 Aux Id: #6476\n\n- The `inet:setopts/2` `{reuseaddr, true}` option will now be ignored on Windows\n unless the socket is an UDP socket. For more information see the documentation\n of the `reuseaddr` option part of the documentation of `inet:setopts/2`.\n\n Prior to OTP 25 the `{reuseaddr, true}` option was ignored for all sockets on\n Windows, but as of OTP 25.0 this was changed so that it was not ignored for\n any sockets.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18324 Aux Id: GH-6461, PR-6481","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The distribution socket option handling in `inet_tcp_dist` has been cleaned up\n to clarify which were mandatory and which just had default values.\n\n Own Id: OTP-18293\n\n- Improve warning message format for gen_tcp_socket.\n\n Own Id: OTP-18317","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.5.1 - Kernel Release Notes","ref":"notes.html#kernel-8-5-1"},{"type":"extras","doc":"- Listen sockets created with the socket module, leaked (erlang-) monitors.\n\n Own Id: OTP-18240 Aux Id: #6285\n\n- `m:peer` nodes failed to halt when the process supervising the control\n connection crashed. When an alternative control connection was used, this\n supervision process also quite frequently crashed when the `peer` node was\n stopped by the node that started it which caused the `peer` node to linger\n without ever halting.\n\n Own Id: OTP-18249 Aux Id: PR-6301","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.5 - Kernel Release Notes","ref":"notes.html#kernel-8-5"},{"type":"extras","doc":"- Fixed inconsistency bugs in `m:global` due to `nodeup`/`nodedown` messages not\n being delivered before/after traffic over connections. Also fixed various\n other inconsistency bugs and deadlocks in both `m:global_group` and `global`.\n\n As building blocks for these fixes, a new BIF `erlang:nodes/2` has been\n introduced and `net_kernel:monitor_nodes/2` has been extended.\n\n The [`-hidden`](`e:erts:erl_cmd.md#hidden`) and\n [`-connect_all`](`e:erts:erl_cmd.md#connect_all`) command line arguments did\n not work if multiple instances were present on the command line which has been\n fixed. The new kernel parameter [`connect_all`](kernel_app.md#connect_all) has\n also been introduced in order to replace the `-connect_all` command line\n argument.\n\n Own Id: OTP-17934 Aux Id: PR-6007\n\n- Fixed IPv6 multicast_if and membership socket options.\n\n Own Id: OTP-18091 Aux Id: #5789\n\n- Fixed issue with inet:getifaddrs hanging on pure IPv6 Windows\n\n Own Id: OTP-18102 Aux Id: #5904\n\n- The type specifications for `inet:getopts/2` and `inet:setopts/2` have been\n corrected regarding SCTP options.\n\n Own Id: OTP-18115 Aux Id: PR-5939\n\n- The type specifications for `inet:parse_*` have been tightened.\n\n Own Id: OTP-18121 Aux Id: PR-5972\n\n- Fix gen_tcp:connect/3 spec to include the inet_backend option.\n\n Own Id: OTP-18171 Aux Id: PR-6131\n\n- Fix bug where using a binary as the format when calling\n `logger:log(Level, Format, Args)` (or any other logging function) would cause\n a crash or incorrect logging.\n\n Own Id: OTP-18229 Aux Id: PR-6212","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add rudimentary debug feature (option) for the inet-driver based sockets, such\n as gen_tcp and gen_udp.\n\n Own Id: OTP-18032\n\n- Introduced the `hidden` and `dist_listen` options to `net_kernel:start/2`.\n\n Also documented the [`-dist_listen`](`e:erts:erl_cmd.md#dist_listen`) command\n line argument which was erroneously documented as a `kernel` parameter and not\n as a command line argument.\n\n Own Id: OTP-18107 Aux Id: PR-6009\n\n- Scope and group monitoring have been introduced in `m:pg`. For more\n information see the documentation of\n [`pg:monitor_scope()`](`pg:monitor_scope/0`),\n [`pg:monitor()`](`pg:monitor/1`), and [`pg:demonitor()`](`pg:demonitor/1`).\n\n Own Id: OTP-18163 Aux Id: PR-6058, PR-6275\n\n- A new function `global:disconnect/0` has been introduced with which one can\n cleanly disconnect a node from all other nodes in a cluster of `global` nodes.\n\n Own Id: OTP-18232 Aux Id: OTP-17843, PR-6264","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.4.2 - Kernel Release Notes","ref":"notes.html#kernel-8-4-2"},{"type":"extras","doc":"- A call to [`net_kernel:setopts(new, Opts)`](`net_kernel:setopts/2`) at the\n same time as a connection was being set up could cause a deadlock between the\n `net_kernel` process and the process setting up the connection.\n\n Own Id: OTP-18198 Aux Id: GH-6129, PR-6216","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.4.1 - Kernel Release Notes","ref":"notes.html#kernel-8-4-1"},{"type":"extras","doc":"- The DNS resolver `inet_res` has been fixed to ignore trailing dot difference\n in the request domain between the sent request and the received response, when\n validating a response.\n\n Own Id: OTP-18112 Aux Id: ERIERL-811\n\n- A bug in `inet_res` has been fixed where a missing internal `{ok,_}` wrapper\n caused `inet_res:resolve/*` to return a calculated host name instead of an\n `{ok,Msg}` tuple, when resolving an IP address or a host name that is an IP\n address string.\n\n Own Id: OTP-18122 Aux Id: GH-6015, PR-6020\n\n- The `erlang:is_alive()` BIF could return `true` before configured distribution\n service was available. This bug was introduced in OTP 25.0 ERTS version 13.0.\n\n The `erlang:monitor_node()` and `erlang:monitor()` BIFs could erroneously fail\n even though configured distribution service was available. This occurred if\n these BIFs were called after the distribution had been started using dynamic\n node name assignment but before the name had been assigned.\n\n Own Id: OTP-18124 Aux Id: OTP-17558, PR-6032\n\n- Added the missing mandatory `address/0` callback in the `gen_tcp_dist`\n example.\n\n Own Id: OTP-18136","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.4 - Kernel Release Notes","ref":"notes.html#kernel-8-4"},{"type":"extras","doc":"- The DNS resolver implementation has been rewritten to validate replies more\n thoroughly, and a bit optimized to create less garbage.\n\n Own Id: OTP-17323\n\n- The socket option 'reuseaddr' is _no longer_ ignored on Windows.\n\n Own Id: OTP-17447 Aux Id: GH-4819\n\n- Fix bug where using the atoms `string` or `report` as the format when calling\n `logger:log(Level, Format, Args)` (or any other logging function) would cause\n a crash or incorrect logging.\n\n Own Id: OTP-17551 Aux Id: GH-5071 PR-5075\n\n- As of OTP 25, `global` will by default prevent overlapping partitions due to\n network issues by actively disconnecting from nodes that reports that they\n have lost connections to other nodes. This will cause fully connected\n partitions to form instead of leaving the network in a state with overlapping\n partitions.\n\n Prevention of overlapping partitions can be disabled using the\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n `kernel(6)` parameter, making `global` behave like it used to do. This is,\n however, problematic for all applications expecting a fully connected network\n to be provided, such as for example `mnesia`, but also for `global` itself. A\n network of overlapping partitions might cause the internal state of `global`\n to become inconsistent. Such an inconsistency can remain even after such\n partitions have been brought together to form a fully connected network again.\n The effect on other applications that expects that a fully connected network\n is maintained may vary, but they might misbehave in very subtle hard to detect\n ways during such a partitioning. Since you might get hard to detect issues\n without this fix, you are _strongly_ advised _not_ to disable this fix. Also\n note that this fix _has_ to be enabled on _all_ nodes in the network in order\n to work properly.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17911 Aux Id: PR-5687, PR-5611, OTP-17843\n\n- Starting the helper program for name resolving; `inet_gethost`, has been\n improved to use an absolute file system path to ensure that the right program\n is started.\n\n If the helper program can not be started - the system now halts, to avoid\n running with a silently broken name resolver.\n\n Own Id: OTP-17958 Aux Id: OTP-17978\n\n- The type specification for `inet_res:getbyname/2,3` has been corrected to\n reflect that it can return peculiar `#hostent{}` records.\n\n Own Id: OTP-17986 Aux Id: PR-5412, PR-5803\n\n- `code:module_status/1` would always report BEAM files loaded from an archive\n as `modified`, and `code:modified_modules/0` would always return the name of\n all modules loaded from archives.\n\n Own Id: OTP-17990 Aux Id: GH-5801\n\n- In logger fix file handler shutdown delay by using erlang timers instead of\n the timer module's timers.\n\n Own Id: OTP-18001 Aux Id: GH-5780 PR-5829\n\n- Fix the meta data in log events generated by logger on failure to not contain\n the original log event's meta data.\n\n Own Id: OTP-18003 Aux Id: PR-5771\n\n- Fix logger file backend to re-create the log folder if it has been deleted.\n\n Own Id: OTP-18015 Aux Id: GH-5828 PR-5845\n\n- \\[socket] Encode of sockaddr has been improved.\n\n Own Id: OTP-18020\n\n- Fix `put_chars` requests to the io server with incomplete unicode data to exit\n with `no_translation` error.\n\n Own Id: OTP-18070 Aux Id: PR-5885","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The net module now works on Windows.\n\n Own Id: OTP-16464\n\n- An Erlang installation directory is now relocatable on the file system given\n that the paths in the installation's `RELEASES` file are paths that are\n relative to the installations root directory. The\n `` `release_handler:create_RELEASES/4 `` function can generate a `RELEASES`\n file with relative paths if its `RootDir` parameter is set to the empty\n string.\n\n Own Id: OTP-17304\n\n- The following distribution flags are now mandatory: `DFLAG_BIT_BINARIES`,\n `DFLAG_EXPORT_PTR_TAG`, `DFLAG_MAP_TAGS`, `DFLAG_NEW_FLOATS`, and\n `DFLAG_FUN_TAGS`. This mainly concerns libraries or application that implement\n the distribution protocol themselves.\n\n Own Id: OTP-17318 Aux Id: PR-4972\n\n- Fix `os:cmd` to work on Android OS.\n\n Own Id: OTP-17479 Aux Id: PR-4917\n\n- The configuration files [`.erlang`](`e:erts:erl_cmd.md`),\n [`.erlang.cookie`](`e:system:distributed.md`) and\n [`.erlang.crypt`](`m:beam_lib#module-erlang-crypt`) can now be located in the XDG\n Config Home directory.\n\n See the documentation for each file and `filename:basedir/2` for more details.\n\n Own Id: OTP-17554 Aux Id: GH-5016 PR-5408 OTP-17821\n\n- Dynamic node name improvements: `erlang:is_alive/0` changed to return true for\n pending dynamic node name and new function `net_kernel:get_state/0`.\n\n Own Id: OTP-17558 Aux Id: OTP-17538, PR-5111, GH-5402\n\n- The types for callback result types in `gen_statem` has bee augmented with\n arity 2 types where it is possible for a callback module to specify the type\n of the callback data, so the callback module can get type validation of it.\n\n Own Id: OTP-17589 Aux Id: PR-4926\n\n- The tagged tuple tests and fun-calls have been optimized and are now a little\n bit cheaper than previously.\n\n These optimizations become possible after making sure that all boxed terms\n have at least one word allocated after the arity word. This has been\n accomplished by letting all empty tuples refer to the same empty tuple literal\n which also reduces memory usage for empty tuples.\n\n Own Id: OTP-17608\n\n- A [`net_ticker_spawn_options`](kernel_app.md#net_ticker_spawn_options)\n `kernel` configuration parameter with which one can set spawn options for the\n distribution channel ticker processes has been introduced.\n\n Own Id: OTP-17617 Aux Id: PR-5069\n\n- The most, or at least the most used, `m:rpc` operations now require `m:erpc`\n support in order to communicate with other Erlang nodes. `erpc` was introduced\n in OTP 23. That is, `rpc` operations against Erlang nodes of releases prior to\n OTP 23 will fail.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17681 Aux Id: PR-5307\n\n- The new module `peer` supersedes the `slave` module. The `slave` module is now\n deprecated and will be removed in OTP 27.\n\n `peer` contains an extended and more robust API for starting erlang nodes.\n\n Own Id: OTP-17720 Aux Id: PR-5162\n\n- In order to make it easier for the user to manage multiple outstanding\n asynchronous `call` requests, new functionality utilizing request identifier\n collections have been introduced in\n [`erpc`](`t:erpc:request_id_collection/0`),\n [`gen_server`](`t:gen_server:request_id_collection/0`),\n [`gen_statem`](`t:gen_statem:request_id_collection/0`), and\n [`gen_event`](`t:gen_event:request_id_collection/0`).\n\n Own Id: OTP-17784 Aux Id: PR-5792\n\n- Type specifications have been added to the `gen_server`, and the documentation\n has been updated to utilize this.\n\n This surfaced a few type violations that has been corrected in `global`,\n `logger_olp` and `rpc`.\n\n Own Id: OTP-17915 Aux Id: PR-5751, GH-2375, GH-2690\n\n- IP address validation functions `is_ipv4_address/1`, `is_ipv6_address/1` and\n `is_ip_address/1` have been added to the module `inet` in Kernel.\n\n Own Id: OTP-17923 Aux Id: PR-5646\n\n- An API for multihomed SCTP connect has been added in the guise of\n `gen_sctp:connectx_init/*`\n\n Own Id: OTP-17951 Aux Id: PR-5656\n\n- \\[socket] Add encoding of the field hatype of the type sockaddr_ll (family\n 'packet').\n\n Own Id: OTP-17968 Aux Id: OTP-16464\n\n- Added support for configurable features as described in EEP-60. Features can\n be enabled/disabled during compilation with options\n (`-enable-feature Feature`, `-disable-feature Feature` and\n `+{feature, Feature, enable|disable}`) to `erlc` as well as with directives\n (`-feature(Feature, enable|disable).`) in the file. Similar options can be\n used to `erl` for enabling/disabling features allowed at runtime. The new\n `maybe` expression (EEP-49) is fully supported as the feature `maybe_expr`.\n The features support is documented in the reference manual.\n\n Own Id: OTP-17988","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.3.2.4 - Kernel Release Notes","ref":"notes.html#kernel-8-3-2-4"},{"type":"extras","doc":"- gen_tcp:connect with socket address and socket (inet-) backend fails because\n of missing callback function.\n\n Own Id: OTP-18707 Aux Id: #7530","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.3.2.3 - Kernel Release Notes","ref":"notes.html#kernel-8-3-2-3"},{"type":"extras","doc":"- Spec for function net:if_names/0 incorrect\n\n Own Id: OTP-18296 Aux Id: OTP-16464\n\n- Missing ctrl option name transation for TOS and TTL (on FreeBSD) when using\n gen_udp with the 'socket' inet_backend.\n\n Own Id: OTP-18315\n\n- The tcp connect option 'bind_to_device' could not be used with inet_backend =\n 'socket'. 'inet' requires value type binarry() and 'socket' requires value\n type 'string()'.\n\n Own Id: OTP-18357 Aux Id: #6509\n\n- Minor issue processing options when calling gen_tcp:connect with a sockaddr()\n and inet_backend = socket.\n\n Own Id: OTP-18358 Aux Id: #6528","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improve warning message format for gen_tcp_socket.\n\n Own Id: OTP-18317","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.3.2.2 - Kernel Release Notes","ref":"notes.html#kernel-8-3-2-2"},{"type":"extras","doc":"- A new function `global:disconnect/0` has been introduced with which one can\n cleanly disconnect a node from all other nodes in a cluster of `global` nodes.\n\n Own Id: OTP-18232 Aux Id: OTP-17843, PR-6264","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.3.2.1 - Kernel Release Notes","ref":"notes.html#kernel-8-3-2-1"},{"type":"extras","doc":"- A call to [`net_kernel:setopts(new, Opts)`](`net_kernel:setopts/2`) at the\n same time as a connection was being set up could cause a deadlock between the\n `net_kernel` process and the process setting up the connection.\n\n Own Id: OTP-18198 Aux Id: GH-6129, PR-6216","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.3.2 - Kernel Release Notes","ref":"notes.html#kernel-8-3-2"},{"type":"extras","doc":"- inet:getopts/2 for the 'raw' option for a socket created with inet-backend\n 'socket' failed.\n\n Own Id: OTP-18078 Aux Id: GH-5930\n\n- Corrected the behaviour of the shutdown function when using with the\n inet_backend = socket. It was not sufficiently compatible with the \"old\"\n gen_tcp.\n\n Own Id: OTP-18080 Aux Id: GH-5930","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.3.1 - Kernel Release Notes","ref":"notes.html#kernel-8-3-1"},{"type":"extras","doc":"- Fix failed accepted connection setup after previous established connection\n from same node closed down silently.\n\n Own Id: OTP-17979 Aux Id: ERIERL-780\n\n- Fixed a problem where typing Ctrl-R in the shell could hang if there were some\n problem with the history log file.\n\n Own Id: OTP-17981 Aux Id: PR-5791","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.3 - Kernel Release Notes","ref":"notes.html#kernel-8-3"},{"type":"extras","doc":"- Handling of `send_timeout` for `gen_tcp` has been corrected so that the\n timeout is honored also when sending 0 bytes.\n\n Own Id: OTP-17840\n\n- By default `global` does _not_ take any actions to restore a fully connected\n network when connections are lost due to network issues. This is problematic\n for all applications expecting a fully connected network to be provided, such\n as for example `mnesia`, but also for `global` itself. A network of\n overlapping partitions might cause the internal state of `global` to become\n inconsistent. Such an inconsistency can remain even after such partitions have\n been brought together to form a fully connected network again. The effect on\n other applications that expects that a fully connected network is maintained\n may vary, but they might misbehave in very subtle hard to detect ways during\n such a partitioning.\n\n In order to prevent such issues, we have introduced a _prevent overlapping\n partitions_ fix which can be enabled using the\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n `kernel(6)` parameter. When this fix has been enabled, `global` will actively\n disconnect from nodes that reports that they have lost connections to other\n nodes. This will cause fully connected partitions to form instead of leaving\n the network in a state with overlapping partitions. Note that this fix _has_\n to be enabled on _all_ nodes in the network in order to work properly. Since\n this quite substantially changes the behavior, this fix is currently disabled\n by default. Since you might get hard to detect issues without this fix you\n are, however, _strongly_ advised to enable this fix in order to avoid issues\n such as the ones described above. As of OTP 25 this fix will become enabled by\n default.\n\n Own Id: OTP-17843 Aux Id: ERIERL-732, PR-5611\n\n- Fix bug where `logger` would crash when logging a report including improper\n lists.\n\n Own Id: OTP-17851\n\n- Make `erlang:set_cookie` work for dynamic node names.\n\n Own Id: OTP-17902 Aux Id: GH-5402, PR-5670","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add support for using socket:sockaddr_in() and socket:sockaddr_in6() when\n using gen_sctp, gen_tcp and gen_udp. This will make it possible to use Link\n Local IPv6 addresses.\n\n Own Id: OTP-17455 Aux Id: GH-4852\n\n- A [`net_tickintensity`](kernel_app.md#net_tickintensity) `kernel` parameter\n has been introduced. It can be used to control the amount of ticks during a\n [`net_ticktime`](kernel_app.md#net_ticktime) period.\n\n A new `net_kernel:start/2` function has also been introduced in order to make\n it easier to add new options. The use of `net_kernel:start/1` has been\n deprecated.\n\n Own Id: OTP-17905 Aux Id: ERIERL-732, PR-5740\n\n- Improve documentation for the dynamic node name feature.\n\n Own Id: OTP-17918","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.2 - Kernel Release Notes","ref":"notes.html#kernel-8-2"},{"type":"extras","doc":"- socket:which_sockets( pid() ) uses wrong keyword when looking up socket owner\n ('ctrl' instead of 'owner').\n\n Own Id: OTP-17716\n\n- In epmd_ntop, the #if defined(EPMD6) conditional was inverted and it was only\n including the IPv6-specific code when EPMD6 was undefined. This was causing\n IPv6 addrs to be interpreted as IPv4 addrs and generating nonsense IPv4\n addresses as output.\n\n Several places were incorrectly using 'num_sockets' instead of 'i' to index\n into the iserv_addr array during error logging. This would result in a read\n into uninitialized data in the iserv_addr array.\n\n Thanks to John Eckersberg for providing this fix.\n\n Own Id: OTP-17730\n\n- Minor fix of the `erl_uds_dist` distribution module example.\n\n Own Id: OTP-17765 Aux Id: PR-5289\n\n- A bug has been fixed for the legacy TCP socket adaption module\n `gen_tcp_socket` where it did bind to a socket address when given a file\n descriptor, but should not.\n\n Own Id: OTP-17793 Aux Id: PR-5348, OTP-17451, PR-4787, GH-4680, PR-2989,\n OTP-17216\n\n- Improve the error printout when [`open_port/2`](`open_port/2`) fails because\n of invalid arguments.\n\n Own Id: OTP-17805 Aux Id: PR-5406\n\n- Calling socket:monitor/1 on an already closed socket should succeed and result\n in an immediate DOWN message. This has now been fixed.\n\n Own Id: OTP-17806\n\n- Fix the configuration option `logger_metadata` to work.\n\n Own Id: OTP-17807 Aux Id: PR-5418\n\n- Fix tls and non-tls distribution to use erl_epmd:address_please to figure out\n if IPv4 or IPv6 addresses should be used when connecting to the remote node.\n\n Before this fix, a dns lookup of the remote node hostname determined which IP\n version was to be used which meant that the hostname had to resolve to a valid\n ip address.\n\n Own Id: OTP-17809 Aux Id: PR-5337 GH-5334","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add `logger:reconfigure/0`.\n\n Own Id: OTP-17375 Aux Id: PR-4663 PR-5186\n\n- Add socket function ioctl/2,3,4 for socket device control.\n\n Own Id: OTP-17528\n\n- Add simple support for socknames/1 for gen_tcp_socket and gen_udp_socket.\n\n Own Id: OTP-17531\n\n- The types for callback result types in `gen_statem` has bee augmented with\n arity 2 types where it is possible for a callback module to specify the type\n of the callback data, so the callback module can get type validation of it.\n\n Own Id: OTP-17738 Aux Id: PR-4926, OTP-17589","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.1.3 - Kernel Release Notes","ref":"notes.html#kernel-8-1-3"},{"type":"extras","doc":"- The internal, undocumented, but used, module `inet_dns` has been fixed to\n handle mDNS high bit usage of the Class field.\n\n Code that uses the previously obsolete, undocumented and unused record field\n `#dns_rr.func` will need to be updated since that field is now used as a\n boolean flag for the mDNS high Class bit. Code that uses the also undocumented\n record `#dns_query` will need to be recompiled since a boolean field\n `#dns_query.unicast_response` has been added for the mDNS high Class bit.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17734 Aux Id: GH-5327, OTP-17659\n\n- The fix for Linux's behaviour when reconnecting an UDP socket in PR-5120\n released in OTP-24.1.2 has been refined to only dissolve the socket's\n connection before a connect if the socket is already connected, that is: only\n for a reconnect.\n\n This allows code to open a socket with an ephemeral port, get the port number\n and connect; without the port number changing (on Linux). This turned out to\n have at least one valid use case (besides test cases).\n\n Should one reconnect the socket then the port number may change, on Linux; it\n is a known quirk, which can be worked around by binding to a specific port\n number when opening the socket. If you can do without an ephemeral port, that\n is...\n\n Own Id: OTP-17736 Aux Id: GH-5279, PR-5120, OTP-17559","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.1.2 - Kernel Release Notes","ref":"notes.html#kernel-8-1-2"},{"type":"extras","doc":"- The undocumented DNS encode/decode module `inet_dns` has been cleaned up to\n handle the difference between \"symbolic\" and \"raw\" records in a more\n consistent manner.\n\n PR-5145/OTP-17584 introduced a change that contributed to an already existing\n confusion, which this correction should remedy.\n\n Own Id: OTP-17659 Aux Id: ERIERL-702","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.1.1 - Kernel Release Notes","ref":"notes.html#kernel-8-1-1"},{"type":"extras","doc":"- Add more info about the socket 'type' ('socket' or 'port') for the DOWN\n message when monitoring sockets.\n\n Own Id: OTP-17640","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.1 - Kernel Release Notes","ref":"notes.html#kernel-8-1"},{"type":"extras","doc":"- The extended error information has been corrected and improved for the\n following BIFs: [`binary_to_existing_atom/2`](`binary_to_existing_atom/2`),\n [`list_to_existing_atom/1`](`list_to_existing_atom/1`),\n `erlang:send_after/{3,4}`, and `erlang:start_timer/{3,4}`.\n\n Own Id: OTP-17449 Aux Id: GH-4900\n\n- Fixed rare bug that could cause net_kernel process to hang for ever. Have seen\n to happen with massive number of TLS connections while remote nodes are\n restarting. Bug exists since OTP-22.0.\n\n Own Id: OTP-17476 Aux Id: GH-4931, PR-4934\n\n- Improve handling of closed sockets for inet:info/1.\n\n Own Id: OTP-17492\n\n- This change fixes a performance problem introduced in pull-request #2675.\n Pull-request #2675 made so the system tried to start children of already\n started applications which is unnecessary. This change fixes this performance\n problem.\n\n Own Id: OTP-17519\n\n- Fix code:get_doc/1 to not crash when module is located in an escript.\n\n Own Id: OTP-17570 Aux Id: PR-5139 GH-4256 ERL-1261\n\n- Parsing of the result value in the native DNS resolver has been made more\n defensive against incorrect results.\n\n Own Id: OTP-17578 Aux Id: ERIERL-683\n\n- A bug in the option handling for the legacy socket adaptor, that is; when\n using `inet_backend = socket`, has been fixed. Now socket options are set\n before the bind() call so options regarding, for example address reuse have\n the desired effect.\n\n Own Id: OTP-17580 Aux Id: GH-5122\n\n- `inet:ntoa/1` has been fixed to not accept invalid numerical addresses.\n\n Own Id: OTP-17583 Aux Id: GH-5136\n\n- Parsing of DNS records has been improved for records of known types to not\n accept and present malformed ones in raw format.\n\n Own Id: OTP-17584 Aux Id: PR-5145\n\n- The `ip_mreq()` type for the `{ip,add_membership}` and `{ip,drop_membership}`\n socket options has been corrected to have an `interface` field instead of,\n incorrectly, an `address` field.\n\n Own Id: OTP-17590 Aux Id: PR-5170","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add simple utility function to display existing sockets i the erlang shell\n (socket:i/0).\n\n Own Id: OTP-17376 Aux Id: OTP-17157\n\n- gen_udp can now be configured to use the socket inet-backend (in the same way\n as gen_tcp).\n\n Own Id: OTP-17410\n\n- Functions `erlang:set_cookie(Cookie)` and `erlang:get_cookie(Node)` have been\n added for completeness and to facilitate configuring distributed nodes with\n different cookies.\n\n The documentation regarding distribution cookies has been improved to be less\n vague.\n\n Own Id: OTP-17538 Aux Id: GH-5063, PR-5111\n\n- A workaround has been implemented for Linux's quirky behaviour to not adjust\n the source IP address when connecting a connected (reconnecing) UDP socket.\n\n The workaround is to, on Linux, always dissolve any connection before\n connecting an UDP socket.\n\n Own Id: OTP-17559 Aux Id: GH-5092, PR-5120\n\n- Documented our recommendation against opening NFS-mounted files, FIFOs,\n devices, and similar using `file:open/2`.\n\n Own Id: OTP-17576 Aux Id: ERIERL-685","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 8.0.2 - Kernel Release Notes","ref":"notes.html#kernel-8-0-2"},{"type":"extras","doc":"- For `gen_tcp:connect/3,4` it is possible to specify a specific source port,\n which should be enough to bind the socket to an address with that port before\n connecting.\n\n Unfortunately that feature was lost in OTP-17216 that made it mandatory to\n specify the source address to get an address binding, and ignored a specified\n source port if no source address was specified.\n\n That bug has now been corrected.\n\n Own Id: OTP-17536 Aux Id: OTP-17216, ERIERL-677","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.0.1 - Kernel Release Notes","ref":"notes.html#kernel-8-0-1"},{"type":"extras","doc":"- Fix a race condition in Global.\n\n Own Id: OTP-16033 Aux Id: ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923\n\n- After a node restart with `init:restart/0,1`, the module `socket` was not\n usable because supporting tables had been cleared and not re-initialized. This\n has now been fixed.\n\n Handling of the \".\" domain as a search domain was incorrect and caused a crash\n in the DNS resolver `inet_res`, which has now been fixed.\n\n Own Id: OTP-17439 Aux Id: GH-4827, PR-4888, GH-4838\n\n- Handling of combinations of the `fd` option and binding to an address has been\n corrected, especially for the `local` address family.\n\n Own Id: OTP-17451 Aux Id: OTP-17374\n\n- Bug fixes and code cleanup for the new `socket` implementation, such as:\n\n Assertions on the result of demonitoring has been added in the NIF code, where\n appropriate.\n\n Internal state handling for socket close in the NIF code has been reviewed.\n\n Looping over `close()` for `EINTR` in the NIF code has been removed, since it\n is strongly discouraged on Linux and Posix is not clear about if it is\n allowed.\n\n The `inet_backend` temporary socket option for legacy `gen_tcp` sockets has\n been documented.\n\n The return value from `net:getaddrinfo/2` has been corrected: the `protocol`\n field is now an `t:atom/0`, instead of, incorrectly,\n [`list(atom())`](`t:list/1`). The documentation has also been corrected about\n this return type.\n\n Deferred close of a `socket:sendfile/*` file was broken and has been\n corrected.\n\n Some debug code, not enabled by default, in the socket NIF has been corrected\n to not accidentally core dump for debug printouts of more or less innocent\n events.\n\n Own Id: OTP-17452","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 8.0 - Kernel Release Notes","ref":"notes.html#kernel-8-0"},{"type":"extras","doc":"- A bug has been fixed for the internal `inet_res` resolver cache that handled a\n resolver configuration file status timer incorrectly and caused performance\n problems due to many unnecessary file system accesses.\n\n Own Id: OTP-14700 Aux Id: PR-2848\n\n- Change the value of the tag `head` returned by `disk_log:info/1` from\n `{ok, Head}` to just `Head`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16809 Aux Id: ERL-1313\n\n- Two options have been added to `erl_call`. The `-fetch_stdout` option fetches\n stdout data resulting from the code invoked by `erl_call`. The `-fetch_stdout`\n option disables printing of the result term. In order to implement the first\n of these two options a new function called `ei_xrpc_from` has been added to\n erl_interface. For details see the `erl_call` documentation and\n `erl_interface` documentation.\n\n Own Id: OTP-17132\n\n- Missing runtime dependencies has been added to this application.\n\n Own Id: OTP-17243 Aux Id: PR-4557\n\n- `inet:get_rc/0` has been corrected to return host entries as separate entries\n instead of (incorrectly) in a list within the list. This bug was introduced by\n OTP-16487 in OTP-23.0-rc1.\n\n Own Id: OTP-17262 Aux Id: GH-4588, PR-4604, OTP-16487\n\n- The type gen_tcp:option_name() had a duplicate pktoptions value.\n\n Own Id: OTP-17277\n\n- Fixed removal of empty groups from internal state in `pg`.\n\n Own Id: OTP-17286 Aux Id: PR-4619\n\n- `erl -remsh` now prints an error message when it fails to connect to the\n remote node.\n\n Own Id: OTP-17287 Aux Id: PR-4581\n\n- Fix bugs related to corrupt shell history files.\n\n Error messages printed by shell history are now logged as logger error reports\n instead of written to standard error.\n\n Own Id: OTP-17288 Aux Id: PR-4581\n\n- A logger warning is now issues when too many arguments are given to `-name` or\n `-sname`. Example: `erl -name a b`.\n\n Own Id: OTP-17315 Aux Id: GH-4626\n\n- The cache used by `inet_res` now, again, can handle multiple IP addresses per\n domain name, and thus fixes a bug introduced in PR-3041 (OTP-13126) and\n PR-2891 (OTP-14485).\n\n Own Id: OTP-17344 Aux Id: PR-4633, GH-4631, OTP-14485, OTP-12136\n\n- Sockets created with socket:accept not counted (socket:info/0).\n\n Own Id: OTP-17372\n\n- The `{fd, Fd}` option to `gen_tcp:listen/2` did not work for `inet_backend`\n `socket`, which has been fixed.\n\n Own Id: OTP-17374 Aux Id: PR-4787, GH-4680, PR-2989, OTP-17216","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The cache used by the DNS resolver `inet_res` has been improved to use ETS\n lookups instead of server calls. This is a considerable speed improvement for\n cache hits.\n\n Own Id: OTP-13126 Aux Id: PR-3041\n\n- The cache ETS table type for the internal DNS resolver `inet_res` has changed\n type (internally) to get better speed and atomicity.\n\n Own Id: OTP-14485 Aux Id: PR-2891\n\n- The experimental `socket` module can now use any protocol (by name) the OS\n supports. Suggested in PR-2641, implemented in PR-2670.\n\n Own Id: OTP-14601 Aux Id: PR-2641, PR-2670, OTP-16749\n\n- The DNS resolver `inet_res` has been updated to support CAA (RFC 6844) and URI\n (RFC 7553) records.\n\n Own Id: OTP-16517 Aux Id: PR-2827\n\n- A compatibility adaptor for `gen_tcp` to use the new `socket` API has been\n implemented (`gen_tcp_socket`). Used when setting the kernel application\n variable `inet_backend = socket`.\n\n Own Id: OTP-16611 Aux Id: OTP-16749\n\n- Extended error information for failing BIF calls as proposed in\n [EEP 54](https://github.com/erlang/eep/blob/master/eeps/eep-0054.md) has been\n implemented.\n\n When a BIF call from the Erlang shell fails, more information about which\n argument or arguments that were in error will be printed. The same extended\n error information will by `proc_lib`, `common_test`, and `qlc` when BIF calls\n fail.\n\n For applications that wish to provide the same extended error information,\n there are new functions `erl_error:format_exception/3` and\n `erl_error:format_exception/4`.\n\n There is a new [`error/3`](`error/3`) BIF that allows applications or\n libraries to provide extended error information in the same way for their own\n exceptions.\n\n Own Id: OTP-16686\n\n- The file server can now be bypassed in `file:delete/1,2` with the `raw`\n option.\n\n Own Id: OTP-16698 Aux Id: PR-2634\n\n- An example implementation of Erlang distribution over UDS using distribution\n processes has been introduced.\n\n Thanks to Jérôme de Bretagne\n\n Own Id: OTP-16703 Aux Id: PR-2620\n\n- The [_process alias_](`e:system:ref_man_processes.md#process-aliases`) feature\n as outlined by\n [EEP 53](https://github.com/erlang/eep/blob/master/eeps/eep-0053.md) has been\n introduced. It is introduced in order to provide a lightweight mechanism that\n can prevent late replies after timeout or connection loss. For more\n information, see EEP 53 and the documentation of the new\n [`alias/1`](`erlang:alias/1`) BIF and the new options to the\n [`monitor/3`](`erlang:monitor/3`) BIF.\n\n The `call` operation in the framework used by `gen_server`, `gen_statem`, and\n `gen_event` has been updated to utilize alias in order to prevent late\n responses. The `gen_statem` behavior still use a proxy process in the\n distributed case, since it has always prevented late replies and aliases won't\n work against pre OTP 24 nodes. The proxy process can be removed in OTP 26.\n\n The alias feature also made it possible to introduce new functions similar to\n the [`erpc:receive_response()`](`erpc:receive_response/2`) function in the gen\n behaviors, so the new functions\n [`gen_server:receive_response()`](`gen_server:receive_response/2`),\n [`gen_statem:receive_response()`](`gen_statem:receive_response/2`),\n [`gen_event:receive_response()`](`gen_event:receive_response/2`) have also\n been introduced.\n\n Own Id: OTP-16718 Aux Id: PR-2735\n\n- The experimental new socket API has been further developed. Some backwards\n incompatible changes with respect to OTP 23 have been made.\n\n The control message format has been changed so a decoded value is now in the\n 'value' field instead of in the 'data' field. The 'data' field now always\n contains binary data.\n\n Some type names have been changed regarding message headers and control\n message headers.\n\n `socket:bind/2` now returns plain `ok` instead of `{ok, Port}` which was only\n relevant for the `inet` and `inet6` address families and often not\n interesting. To find out which port was chosen use `socket:sockname/1`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16749 Aux Id: OTP-14601\n\n- New function `os:env/0` returns all OS environment variables as a list of\n 2-tuples.\n\n Own Id: OTP-16793 Aux Id: ERL-1332, PR-2740\n\n- Remove the support for distributed disk logs. The new function\n `disk_log:all/0` is to be used instead of `disk_log:accessible_logs/0`. The\n function `disk_log:close/1` is to be used instead of `disk_log:lclose/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16811\n\n- Expand the spec for `erl_epmd:listen_port_please/2` to mirror\n `erl_epmd:port_please/2`.\n\n Own Id: OTP-16947 Aux Id: PR-2781\n\n- A new erl parameter for specifying a file descriptor with configuration data\n has been added. This makes it possible to pass the parameter \"-configfd FD\"\n when executing the erl command. When this option is given, the system will try\n to read and parse configuration parameters from the file descriptor.\n\n Own Id: OTP-16952\n\n- The experimental HiPE application has been removed, together with all related\n functionality in other applications.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16963\n\n- The `pg2` module has been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16968\n\n- Accept references up to a size of 160-bits from remote nodes. This is the\n first step in an upgrade path toward using references up to 160-bits in a\n future OTP release.\n\n Own Id: OTP-17005 Aux Id: OTP-16718\n\n- Allow utf-8 binaries as parts of logger_formatter template.\n\n Own Id: OTP-17015\n\n- Let `disk_log:open/1` change the size if a wrap log is opened for the first\n time, that is, the disk log process does not exist, and the value of option\n `size` does not match the current size of the disk log.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17062 Aux Id: ERL-1418, GH-4469, ERIERL-537\n\n- Allow the shell history of an erlang node to be fetched and stores using a\n custom callback module. See `shell_history` configuration parameter in the\n [kernel documentation](kernel_app.md) for more details.\n\n Own Id: OTP-17103 Aux Id: PR-2949\n\n- The simple logger (used to log events that happen before kernel has been\n started) has been improved to print prettier error messages.\n\n Own Id: OTP-17106 Aux Id: PR-2885\n\n- `socket:sendfile/2,3,4,5` has been implemented, for platforms that support the\n underlying socket library call.\n\n Own Id: OTP-17154 Aux Id: OTP-16749\n\n- Add socket monitor(s) for all types sockets.\n\n Own Id: OTP-17155\n\n- Fix various issues with the gen_tcp_socket. Including documenting some\n incompatibilities.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17156\n\n- inet:i/0 now also shows existing gen_tcp compatibility sockets (based on\n 'socket').\n\n Own Id: OTP-17157\n\n- Added support in logger for setting primary metadata. The primary metadata is\n passed as a base metadata to all log events in the system. See\n [Metadata](logger_chapter.md#metadata) in the Logger chapter of the Kernel\n User's Guide for more details.\n\n Own Id: OTP-17181 Aux Id: PR-2457\n\n- Recognize new key 'optional_applications' in application resource files.\n\n Own Id: OTP-17189 Aux Id: PR-2675\n\n- The `Fun`'s passed to logger:log/2,3,4 can now return metadata that will only\n be fetched when needed. See [`logger:log/2,3,4`](`logger:log/2`) for more\n details.\n\n Own Id: OTP-17198 Aux Id: PR-2721\n\n- `erpc:multicall()` has been rewritten to be able to utilize the newly\n introduced and improved selective receive optimization.\n\n Own Id: OTP-17201 Aux Id: PR-4534\n\n- Add utility fiunction inet:info/1 to provide miscellaneous info about a\n socket.\n\n Own Id: OTP-17203 Aux Id: OTP-17156\n\n- The behaviour for `gen_tcp:connect/3,4` has been changed to not per default\n bind to an address, which allows the network stack to delay the address and\n port selection to when the remote address is known. This allows better port\n re-use, and thus enables far more outgoing connections, since the ephemeral\n port range no longer has to be a hard limit.\n\n There is a theoretical possibility that this behaviour change can affect the\n set of possible error values, or have other small implications on some\n platforms.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17216 Aux Id: PR-2989\n\n- An option `{nxdomain_reply, boolean()}` has been implemented in the DNS\n resolver `inet_res`. It is useful since an `nxdomain` error from a name server\n does contain the SOA record if the domain exists at all. This record is useful\n to determine a TTL for negative caching of the failed entry.\n\n Own Id: OTP-17266 Aux Id: PR-4564\n\n- Optimized lookup of local processes part of groups in `pg`.\n\n Own Id: OTP-17284 Aux Id: PR-4615\n\n- The return values from module `socket` functions `send()`, `sendto()`,\n `sendmsg()`, `sendfile()` and `recv()` has been changed to return a tuple\n tagged with `select` when a `SelectInfo` was returned, and not sometimes\n tagged with `ok`.\n\n This is a backwards incompatible change that improves usability for code using\n asynchronous operations.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-17355 Aux Id: OTP-17154\n\n- Fixed warnings in code matching on underscore prefixed variables.\n\n Own Id: OTP-17385 Aux Id: OTP-17123","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 7.3.1.7 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1-7"},{"type":"extras","doc":"- A new function `global:disconnect/0` has been introduced with which one can\n cleanly disconnect a node from all other nodes in a cluster of `global` nodes.\n\n Own Id: OTP-18232 Aux Id: OTP-17843, PR-6264","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 7.3.1.6 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1-6"},{"type":"extras","doc":"- A call to [`net_kernel:setopts(new, Opts)`](`net_kernel:setopts/2`) at the\n same time as a connection was being set up could cause a deadlock between the\n `net_kernel` process and the process setting up the connection.\n\n Own Id: OTP-18198 Aux Id: GH-6129, PR-6216","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 7.3.1.5 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1-5"},{"type":"extras","doc":"- By default `global` does _not_ take any actions to restore a fully connected\n network when connections are lost due to network issues. This is problematic\n for all applications expecting a fully connected network to be provided, such\n as for example `mnesia`, but also for `global` itself. A network of\n overlapping partitions might cause the internal state of `global` to become\n inconsistent. Such an inconsistency can remain even after such partitions have\n been brought together to form a fully connected network again. The effect on\n other applications that expects that a fully connected network is maintained\n may vary, but they might misbehave in very subtle hard to detect ways during\n such a partitioning.\n\n In order to prevent such issues, we have introduced a _prevent overlapping\n partitions_ fix which can be enabled using the\n [`prevent_overlapping_partitions`](kernel_app.md#prevent_overlapping_partitions)\n `kernel(6)` parameter. When this fix has been enabled, `global` will actively\n disconnect from nodes that reports that they have lost connections to other\n nodes. This will cause fully connected partitions to form instead of leaving\n the network in a state with overlapping partitions. Note that this fix _has_\n to be enabled on _all_ nodes in the network in order to work properly. Since\n this quite substantially changes the behavior, this fix is currently disabled\n by default. Since you might get hard to detect issues without this fix you\n are, however, _strongly_ advised to enable this fix in order to avoid issues\n such as the ones described above. As of OTP 25 this fix will become enabled by\n default.\n\n Own Id: OTP-17843 Aux Id: ERIERL-732, PR-5611\n\n- Fix failed accepted connection setup after previous established connection\n from same node closed down silently.\n\n Own Id: OTP-17979 Aux Id: ERIERL-780","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A [`net_tickintensity`](kernel_app.md#net_tickintensity) `kernel` parameter\n has been introduced. It can be used to control the amount of ticks during a\n [`net_ticktime`](kernel_app.md#net_ticktime) period.\n\n A new `net_kernel:start/2` function has also been introduced in order to make\n it easier to add new options. The use of `net_kernel:start/1` has been\n deprecated.\n\n Own Id: OTP-17905 Aux Id: ERIERL-732, PR-5740","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 7.3.1.4 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1-4"},{"type":"extras","doc":"- Parsing of the result value in the native DNS resolver has been made more\n defensive against incorrect results.\n\n Own Id: OTP-17578 Aux Id: ERIERL-683","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 7.3.1.3 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1-3"},{"type":"extras","doc":"- Fix code:get_doc/1 to not crash when module is located in an escript.\n\n Own Id: OTP-17570 Aux Id: PR-5139 GH-4256 ERL-1261","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 7.3.1.2 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1-2"},{"type":"extras","doc":"- Handling of the \".\" domain as a search domain was incorrect and caused a crash\n in the DNS resolver `inet_res`, which has now been fixed.\n\n Own Id: OTP-17473 Aux Id: GH-4838, OTP-17439\n\n- Fixed rare bug that could cause net_kernel process to hang for ever. Have seen\n to happen with massive number of TLS connections while remote nodes are\n restarting. Bug exists since OTP-22.0.\n\n Own Id: OTP-17476 Aux Id: GH-4931, PR-4934","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 7.3.1.1 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1-1"},{"type":"extras","doc":"- Fix a race condition in Global.\n\n Own Id: OTP-16033 Aux Id: ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 7.3.1 - Kernel Release Notes","ref":"notes.html#kernel-7-3-1"},{"type":"extras","doc":"- A bug in the Erlang DNS resolver has been fixed, where it could be made to\n bring down the kernel supervisor and thereby the whole node, when getting an\n incorrect (IN A reply to an IN CNAME query) reply from the DNS server and used\n the reply record's value without verifying its type.\n\n Own Id: OTP-17361","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 7.3 - Kernel Release Notes","ref":"notes.html#kernel-7-3"},{"type":"extras","doc":"- The range check for compression pointers in DNS encoding was faulty, which\n caused incorrect label compression encoding for very large DNS messages;\n larger than about 16 kBytes, such as AXFR responses. This more than 11 year\n old bug has now been corrected.\n\n Own Id: OTP-13641 Aux Id: PR-2959\n\n- Fix of internal links in the `erpc` documentation.\n\n Own Id: OTP-17202 Aux Id: PR-4516\n\n- Fix bug where complex seq_trace tokens (that is lists, tuples, maps etc) could\n becomes corrupted by the GC. The bug was introduced in OTP-21.\n\n Own Id: OTP-17209 Aux Id: PR-3039\n\n- When running Xref in the `modules` mode, the Debugger application would show\n up as a dependency for the Kernel applications.\n\n Own Id: OTP-17223 Aux Id: GH-4546, PR-4554","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- `m:erl_epmd` (the epmd client) will now try to reconnect to the local EPMD if\n the connection is broken.\n\n Own Id: OTP-17178 Aux Id: PR-3003","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 7.2.1 - Kernel Release Notes","ref":"notes.html#kernel-7-2-1"},{"type":"extras","doc":"- When using the DNS resolver option `servfail_retry_timeout` it did not honour\n the overall call time-out in e.g `inet_res:getbyname/3`. This misbehaviour has\n now been fixed. Also, the `servfail_retry_timeout` behaviour has been improved\n to only be enforced for servers that gives a servfail answer.\n\n Own Id: OTP-12960 Aux Id: ERIERL-598, PR-4509","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 7.2 - Kernel Release Notes","ref":"notes.html#kernel-7-2"},{"type":"extras","doc":"- The `apply` call's in `logger.hrl` are now called with `erlang` prefix to\n avoid clashed with local [`apply/3`](`apply/3`) functions.\n\n Own Id: OTP-16976 Aux Id: PR-2807\n\n- Fix memory leak in `pg`.\n\n Own Id: OTP-17034 Aux Id: PR-2866\n\n- Fix crash in `logger_proxy` due to stray `gen_server:call` replies not being\n handled. The stray replies come when logger is under heavy load and the flow\n control mechanism is reaching its limit.\n\n Own Id: OTP-17038\n\n- Fixed a bug in `erl_epmd:names()` that caused it to return the illegal return\n value `noport` instead of `{error, Reason}` where `Reason` is the actual error\n reason. This bug also propagated to `net_adm:names()`.\n\n This bug was introduced in `kernel` version 7.1 (OTP 23.1).\n\n Own Id: OTP-17054 Aux Id: ERL-1424","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add export of some resolver documented types.\n\n Own Id: OTP-16954 Aux Id: ERIERL-544\n\n- Add configurable retry timeout for resolver lookups.\n\n Own Id: OTP-16956 Aux Id: ERIERL-547\n\n- `gen_server:multi_call()` has been optimized in the special case of only\n calling the local node with timeout set to `infinity`.\n\n Own Id: OTP-17058 Aux Id: PR-2887","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 7.1 - Kernel Release Notes","ref":"notes.html#kernel-7-1"},{"type":"extras","doc":"- A fallback has been implemented for file:sendfile when using inet_backend\n socket\n\n Own Id: OTP-15187 Aux Id: ERL-1293\n\n- Make default TCP distribution honour option `backlog` in\n `inet_dist_listen_options`.\n\n Own Id: OTP-16694 Aux Id: PR-2625\n\n- Raw option handling for the experimental `gen_tcp_socket` backend was broken\n so that all raw options were ignored by for example `gen_tcp:listen/2`, a bug\n that now has been fixed. Reported by Jan Uhlig.\n\n Own Id: OTP-16743 Aux Id: ERL-1287\n\n- Accept fails with inet-backend socket.\n\n Own Id: OTP-16748 Aux Id: ERL-1284\n\n- Fixed various minor errors in the socket backend of gen_tcp.\n\n Own Id: OTP-16754\n\n- Correct `disk_log:truncate/1` to count the header. Also correct the\n documentation to state that `disk_log:truncate/1` can be used with external\n disk logs.\n\n Own Id: OTP-16768 Aux Id: ERL-1312\n\n- Fix erl_epmd:port_please/2,3 type specs to include all possible error values.\n\n Own Id: OTP-16783\n\n- Fix `erl -erl_epmd_port` to work properly. Before this fix it did not work at\n all.\n\n Own Id: OTP-16785\n\n- Fix typespec for internal function `erlang:seq_trace_info/1` to allow\n `t:term/0` as returned label. This in turn fixes so that calls to\n `seq_trace:get_token/1` can be correctly analyzer by dialyzer.\n\n Own Id: OTP-16823 Aux Id: PR-2722\n\n- Fix erroneous double registration of processes in `pg` when distribution is\n dynamically started.\n\n Own Id: OTP-16832 Aux Id: PR-2738","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Make (use of) the socket registry optional (still enabled by default). Its now\n possible to build OTP with the socket registry turned off, turn it off by\n setting an environment variable and controlling in runtime (via function calls\n and arguments when creating sockets).\n\n Own Id: OTP-16763\n\n- `erl -remsh nodename` no longer requires the hostname to be given when used\n together with dynamic nodenames.\n\n Own Id: OTP-16784","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 7.0 - Kernel Release Notes","ref":"notes.html#kernel-7-0"},{"type":"extras","doc":"- Fix race condition during shutdown when `shell_history` is enabled. The race\n condition would trigger crashes in `disk_log`.\n\n Own Id: OTP-16008 Aux Id: PR-2302\n\n- Fix the Erlang distribution to handle the scenario when a node connects that\n can handle message fragmentation but can not handle the atom cache. This bug\n only affects users that have implemented a custom distribution carrier. It has\n been present since OTP-21.\n\n The `DFLAG_FRAGMENT` distribution flag was added to the set of flags that can\n be rejected by a distribution implementation.\n\n Own Id: OTP-16284\n\n- Fix bug where a binary was not allowed to be the format string in calls to\n `logger:log`.\n\n Own Id: OTP-16395 Aux Id: PR-2444\n\n- Fix bug where `logger` would end up in an infinite loop when trying to log the\n crash of a handler or formatter.\n\n Own Id: OTP-16489 Aux Id: ERL-1134\n\n- `code:lib_dir/1` has been fixed to also return the lib dir for `erts`.\n\n This is been marked as an incompatibility for any application that depended on\n `{error,bad_name}` to be returned for `erts`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16502\n\n- The application `stop/1` callback was not called if the application master of\n the application terminated.\n\n Own Id: OTP-16504 Aux Id: PR-2328\n\n- Fix bug in `application:loaded_applications/0` that could cause it to fail\n with `badarg` if for example a concurrent upgrade/downgrade is running.\n\n Own Id: OTP-16627 Aux Id: PR-2601","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new module `m:erpc` has been introduced in the `kernel` application. The\n `erpc` module implements an enhanced subset of the operations provided by the\n `m:rpc` module. Enhanced in the sense that it makes it possible to distinguish\n between returned value, raised exceptions, and other errors. `erpc` also has\n better performance and scalability than the original `rpc` implementation.\n This by utilizing the newly introduced\n [`spawn_request()`](`erlang:spawn_request/5`) BIF. Also the `rpc` module\n benefits from these improvements by utilizing `erpc` when it is possible.\n\n This change has been marked as a potential incompatibility since\n [`rpc:block_call()`](`rpc:block_call/5`) now only is guaranteed to block other\n `block_call()` operations. The documentation previously claimed that it would\n block all `rpc` operations. This has however never been the case. It\n previously did not block node-local `block_call()` operations.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13450 Aux Id: OTP-15251\n\n- A client node can receive its node name dynamically from the node that it\n first connects to. This featured can by used by\n\n - starting with `erl -sname undefined`\n - erl_interface functions `ei_connect_init` and friends\n - `erl_call -R`\n\n Own Id: OTP-13812\n\n- Improved the printout of single line logger events for most of the OTP\n behaviours in STDLIB and Kernel. This includes `proc_lib`, `gen_server`,\n `gen_event`, `gen_statem`, `gen_fsm`, `supervisor`, `supervisor_bridge` and\n `application`.\n\n Improved the [`chars_limit`](`m:logger_formatter#chars_limit`) and\n [`depth`](`m:logger_formatter#depth`) handling in `proc_lib` and when\n formatting of exceptions.\n\n Own Id: OTP-15299\n\n- Remove usage and documentation of old requests of the I/O-protocol.\n\n Own Id: OTP-15695\n\n- Directories can now be opened by `file:open/2` when passing the `directory`\n option.\n\n Own Id: OTP-15835 Aux Id: PR-2212\n\n- The check of whether to log or not based on the log level in `logger` has been\n optimized by using `persistent_term` to store the log level.\n\n Own Id: OTP-15948 Aux Id: PR-2356\n\n- `file:read_file_info/2` can now be used on opened files and directories.\n\n Own Id: OTP-15956 Aux Id: PR-2231\n\n- The `-config` option to `erl` now can take multiple config files without\n repeating the `-config` option. Example:\n\n erl -config sys local\n\n Own Id: OTP-16148 Aux Id: PR-2373\n\n- Improved node connection setup handshake protocol. Made possible to agree on\n protocol version without dependence on `epmd` or other prior knowledge of peer\n node version. Also added exchange of node incarnation (\"creation\") values and\n expanded the distribution capability flag field from 32 to 64 bits.\n\n Own Id: OTP-16229\n\n- The possibility to run Erlang distribution without relying on EPMD has been\n extended. To achieve this a couple of new options to the inet distribution has\n been added.\n\n - **\\-dist_listen false** - Setup the distribution channel, but do not listen\n for incoming connection. This is useful when you want to use the current\n node to interact with another node on the same machine without it joining\n the entire cluster.\n\n - **\\-erl_epmd_port Port** - Configure a default port that the built-in EPMD\n client should return. This allows the local node to know the port to connect\n to for any other node in the cluster.\n\n The `erl_epmd` callback API has also been extended to allow returning `-1` as\n the creation which means that a random creation will be created by the node.\n\n In addition a new callback function called `listen_port_please` has been added\n that allows the callback to return which listen port the distribution should\n use. This can be used instead of `inet_dist_listen_min/max` if the listen port\n is to be fetched from an external service.\n\n Own Id: OTP-16250\n\n- A first EXPERIMENTAL module that is a `socket` backend to `gen_tcp` and `inet`\n has been implemented. Others will follow. Feedback will be appreciated.\n\n Own Id: OTP-16260 Aux Id: OTP-15403\n\n- The new experimental `socket` module has been moved to the Kernel application.\n\n Own Id: OTP-16312\n\n- Replace usage of deprecated function in the `group` module.\n\n Own Id: OTP-16345\n\n- Minor updates due to the new spawn improvements made.\n\n Own Id: OTP-16368 Aux Id: OTP-15251\n\n- Update of [sequential tracing](`m:seq_trace#whatis`) to also support other\n information transfers than message passing.\n\n Own Id: OTP-16370 Aux Id: OTP-15251, OTP-15232\n\n- `code:module_status/1` now accepts a list of modules. `code:module_status/0`,\n which returns the statuses for all loaded modules, has been added.\n\n Own Id: OTP-16402\n\n- `filelib:wildcard/1,2` is now twice as fast when a double star (`**`) is part\n of the pattern.\n\n Own Id: OTP-16419\n\n- A new implementation of distributed named process groups has been introduced.\n It is available in the `m:pg` module.\n\n Note that this `pg` module only has the name in common with the experimental\n `pg` module that was present in `stdlib` up until OTP 17.\n\n Thanks to Maxim Fedorov for the implementation.\n\n Own Id: OTP-16453 Aux Id: PR-2524\n\n- The `pg2` module has been deprecated. It has also been scheduled for removal\n in OTP 24.\n\n You are advised to replace the usage of `pg2` with the newly introduced `m:pg`\n module. `pg` has a similar API, but with a more scalable implementation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16455\n\n- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469\n\n- The internal hosts file resolver cache `inet_hosts` has been rewritten to\n behave better when the hosts file changes. For example the cache is updated\n per entry instead of cleared and reloaded so lookups do not temporarily fail\n during reloading, and; when multiple processes simultaneously request reload\n these are now folded into one instead of all done in sequence. Reported and\n first solution suggestion by Maxim Fedorov.\n\n Own Id: OTP-16487 Aux Id: PR-2516\n\n- Add `code:all_available/0` that can be used to get all available modules.\n\n Own Id: OTP-16494\n\n- As of OTP 23, the distributed `m:disk_log` feature has been deprecated. It has\n also been scheduled for removal in OTP 24.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16495\n\n- Add the function `code:fetch_docs/1` for fetching embedded documentation for\n aa Erlang module.\n\n Own Id: OTP-16499\n\n- Improve configure for the net nif, which should increase portability.\n\n Own Id: OTP-16530 Aux Id: OTP-16464\n\n- socket: Socket counters and socket global counters are now represented as maps\n (instead of property lists).\n\n Own Id: OTP-16535\n\n- The experimental socket module has gotten restrictions removed so now the\n 'seqpacket' socket type should work for any communication domain (protocol\n family) where the OS supports it, typically the Unix Domain.\n\n Own Id: OTP-16550 Aux Id: ERIERL-476\n\n- Allow using custom IO devices in `logger_std_h`.\n\n Own Id: OTP-16563 Aux Id: PR-2523\n\n- Added `file:del_dir_r/1` which deletes a directory together with all of its\n contents, similar to `rm -rf` on Unix systems.\n\n Own Id: OTP-16570 Aux Id: PR-2565\n\n- socket: By default the socket options rcvtimeo and sndtimeo are now disabled.\n To enable these, OTP now has to be built with the configure option\n --enable-esock-rcvsndtimeo\n\n Own Id: OTP-16620\n\n- The experimental gen_tcp compatibility code utilizing the socket module could\n loose buffered data when receiving a specified number of bytes. This bug has\n been fixed. Reported by Maksim Lapshin on bugs.erlang.org ERL-1234\n\n Own Id: OTP-16632 Aux Id: ERL-1234","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.5.2.5 - Kernel Release Notes","ref":"notes.html#kernel-6-5-2-5"},{"type":"extras","doc":"- By default `global` does _not_ take any actions to restore a fully connected\n network when connections are lost due to network issues. This is problematic\n for all applications expecting a fully connected network to be provided, such\n as for example `mnesia`, but also for `global` itself. A network of\n overlapping partitions might cause the internal state of `global` to become\n inconsistent. Such an inconsistency can remain even after such partitions have\n been brought together to form a fully connected network again. The effect on\n other applications that expects that a fully connected network is maintained\n may vary, but they might misbehave in very subtle hard to detect ways during\n such a partitioning.\n\n In order to prevent such issues, we have introduced a _prevent overlapping\n partitions_ fix which can be enabled using the\n `prevent_overlapping_partitions` `kernel(6)` parameter. When this fix has been\n enabled, `global` will actively disconnect from nodes that reports that they\n have lost connections to other nodes. This will cause fully connected\n partitions to form instead of leaving the network in a state with overlapping\n partitions. Note that this fix _has_ to be enabled on _all_ nodes in the\n network in order to work properly. Since this quite substantially changes the\n behavior, this fix is currently disabled by default. Since you might get hard\n to detect issues without this fix you are, however, _strongly_ advised to\n enable this fix in order to avoid issues such as the ones described above. As\n of OTP 25 this fix will become enabled by default.\n\n Own Id: OTP-17843 Aux Id: ERIERL-732, PR-5611","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A `net_tickintensity` `kernel` parameter has been introduced. It can be used\n to control the amount of ticks during a `net_ticktime` period.\n\n A new `net_kernel:start/2` function has also been introduced in order to make\n it easier to add new options. The use of `net_kernel:start/1` has been\n deprecated.\n\n Own Id: OTP-17905 Aux Id: ERIERL-732, PR-5740","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.5.2.4 - Kernel Release Notes","ref":"notes.html#kernel-6-5-2-4"},{"type":"extras","doc":"- Fixed rare bug that could cause net_kernel process to hang for ever. Have seen\n to happen with massive number of TLS connections while remote nodes are\n restarting. Bug exists since OTP-22.0.\n\n Own Id: OTP-17476 Aux Id: GH-4931, PR-4934","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.5.2.3 - Kernel Release Notes","ref":"notes.html#kernel-6-5-2-3"},{"type":"extras","doc":"- Fix a race condition in Global.\n\n Own Id: OTP-16033 Aux Id: ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.5.2.2 - Kernel Release Notes","ref":"notes.html#kernel-6-5-2-2"},{"type":"extras","doc":"- When running Xref in the `modules` mode, the Debugger application would show\n up as a dependency for the Kernel applications.\n\n Own Id: OTP-17223 Aux Id: GH-4546, PR-4554","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.5.2.1 - Kernel Release Notes","ref":"notes.html#kernel-6-5-2-1"},{"type":"extras","doc":"- Fix bug in `application:loaded_applications/0` that could cause it to fail\n with `badarg` if for example a concurrent upgrade/downgrade is running.\n\n Own Id: OTP-16627 Aux Id: PR-2601","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.5.2 - Kernel Release Notes","ref":"notes.html#kernel-6-5-2"},{"type":"extras","doc":"- The DNS resolver \\`inet_res\\` has been fixed to return the last intermediate\n error when subsequent requests times out.\n\n Own Id: OTP-16414 Aux Id: ERIERL-452\n\n- The prim_net nif (net/kernel) made use of an undefined atom, notsup. This has\n now been corrected.\n\n Own Id: OTP-16440\n\n- Fix a crash when attempting to log faults when loading files during early\n boot.\n\n Own Id: OTP-16491\n\n- Fix crash in logger when logging to a remote node during boot.\n\n Own Id: OTP-16493 Aux Id: ERIERL-459","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Improved `net_kernel` debug functionality.\n\n Own Id: OTP-16458 Aux Id: PR-2525","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.5.1 - Kernel Release Notes","ref":"notes.html#kernel-6-5-1"},{"type":"extras","doc":"- The 'socket state' info provided by the inet info function has been improved\n\n Own Id: OTP-16043 Aux Id: ERL-1036\n\n- Fix bug where `logger` would crash when starting when a very large log file\n needed to be rotated and compressed.\n\n Own Id: OTP-16145 Aux Id: ERL-1034\n\n- Fixed a bug causing actual nodedown reason reported by\n [`net_kernel:monitor_nodes(true, [nodedown_reason])`](`net_kernel:monitor_nodes/2`)\n to be lost and replaced by the reason `killed`.\n\n Own Id: OTP-16216\n\n- The documentation for `rpc:call/4,5/` has been updated to describe what\n happens when the called function throws or return an `'EXIT'` tuple.\n\n Own Id: OTP-16279 Aux Id: ERL-1066","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.5 - Kernel Release Notes","ref":"notes.html#kernel-6-5"},{"type":"extras","doc":"- The type specification for `gen_sctp:connect/4,5` has been corrected.\n\n Own Id: OTP-15344 Aux Id: ERL-947\n\n- Extra `-mode` flags given to `erl` are ignored with a warning.\n\n Own Id: OTP-15852\n\n- Fix type spec for `seq_trace:set_token/2`.\n\n Own Id: OTP-15858 Aux Id: ERL-700\n\n- `logger:compare_levels/2` would fail with a `badarg` exception if given the\n values `all` or `none` as any of the parameters. This is now corrected.\n\n Own Id: OTP-15942 Aux Id: PR-2301\n\n- Fix bug where the log file in `logger_std_h` would not be closed when the\n inode of the file changed. This would in turn cause a file descriptor leak\n when tools like logrotate are used.\n\n Own Id: OTP-15997 Aux Id: PR-2331\n\n- Fix a race condition in the debugging function `net_kernel:nodes_info/0`.\n\n Own Id: OTP-16022\n\n- Fix race condition when closing a file opened in `compressed` or\n `delayed_write` mode.\n\n Own Id: OTP-16023","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The possibility to send ancillary data, in particular the TOS field, has been\n added to `gen_udp:send/4,5`.\n\n Own Id: OTP-15747 Aux Id: ERIERL-294\n\n- If the log file was given with relative path, the standard logger handler\n (`logger_std_h`) would store the file name with relative path. If the current\n directory of the node was later changed, a new file would be created relative\n the new current directory, potentially failing with an `enoent` if the new\n directory did not exist. This is now corrected and `logger_std_h` always\n stores the log file name as an absolute path, calculated from the current\n directory at the time of the handler startup.\n\n Own Id: OTP-15850\n\n- Support local sockets with inet:i/0.\n\n Own Id: OTP-15935 Aux Id: PR-2299","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.4.1 - Kernel Release Notes","ref":"notes.html#kernel-6-4-1"},{"type":"extras","doc":"- `user`/`user_drv` could respond to io requests before they had been processed,\n which could cause data to be dropped if the emulator was halted soon after a\n call to `io:format/2`, such as in an escript.\n\n Own Id: OTP-15805","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.4 - Kernel Release Notes","ref":"notes.html#kernel-6-4"},{"type":"extras","doc":"- Fix so that when multiple `-sname` or `-name` are given to `erl` the first one\n is chosen. Before this fix distribution was not started at all when multiple\n name options were given.\n\n Own Id: OTP-15786 Aux Id: ERL-918\n\n- Fix `inet_res` configuration pointing to non-existing files to work again.\n This was broken in KERNEL-6.3 (OTP-21.3).\n\n Own Id: OTP-15806","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A simple socket API is provided through the socket module. This is a low level\n API that does _not_ replace gen\\_\\[tcp|udp|sctp]. It is intended to\n _eventually_ replace the inet driver, but not the high level gen-modules\n (gen_tcp, gen_udp and gen_sctp). It also provides a basic API that facilitates\n the implementation of other protocols, that is TCP, UDP and SCTP.\n\n Known issues are; No support for the Windows OS (currently).\n\n Own Id: OTP-14831\n\n- Improved the documentation for the linger option.\n\n Own Id: OTP-15491 Aux Id: PR-2019\n\n- Global no longer tries more than once when connecting to other nodes.\n\n Own Id: OTP-15607 Aux Id: ERIERL-280\n\n- The dist messages EXIT, EXIT2 and MONITOR_DOWN have been updated with new\n versions that send the reason term as part of the payload of the message\n instead of as part of the control message.\n\n The old versions are still present and can be used when communicating with\n nodes that don't support the new versions.\n\n Own Id: OTP-15611\n\n- Kernel configuration parameter `start_distribution = boolean()` is added. If\n set to `false`, the system is started with all distribution functionality\n disabled. Defaults to `true`.\n\n Own Id: OTP-15668 Aux Id: PR-2088\n\n- In OTP-21.3, a warning was introduced for duplicated applications/keys in\n configuration. This warning would be displayed both when the configuration was\n given as a file on system start, and during runtime via\n `application:set_env/1,2`.\n\n The warning is now changed to a `badarg` exception in\n `application:set_env/1,2`. If the faulty configuration is given in a\n configuration file on system start, the startup will fail.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15692 Aux Id: PR-2170","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.3.1.3 - Kernel Release Notes","ref":"notes.html#kernel-6-3-1-3"},{"type":"extras","doc":"- Fix bug where the log file in `logger_std_h` would not be closed when the\n inode of the file changed. This would in turn cause a file descriptor leak\n when tools like logrotate are used.\n\n Own Id: OTP-15997 Aux Id: PR-2331","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.3.1.2 - Kernel Release Notes","ref":"notes.html#kernel-6-3-1-2"},{"type":"extras","doc":"- The possibility to send ancillary data, in particular the TOS field, has been\n added to `gen_udp:send/4,5`.\n\n Own Id: OTP-15747 Aux Id: ERIERL-294","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.3.1.1 - Kernel Release Notes","ref":"notes.html#kernel-6-3-1-1"},{"type":"extras","doc":"- Fix type spec for `seq_trace:set_token/2`.\n\n Own Id: OTP-15858 Aux Id: ERL-700","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.3.1 - Kernel Release Notes","ref":"notes.html#kernel-6-3-1"},{"type":"extras","doc":"- Fixed a performance regression when reading files opened with the `compressed`\n flag.\n\n Own Id: OTP-15706 Aux Id: ERIERL-336","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.3 - Kernel Release Notes","ref":"notes.html#kernel-6-3"},{"type":"extras","doc":"- If for example the `/etc/hosts` did not come into existence until after the\n kernel application had started, its content was never read. This bug has now\n been corrected.\n\n Own Id: OTP-14702 Aux Id: PR-2066\n\n- Fix bug where doing `seq_trace:reset_trace()` while another process was doing\n a garbage collection could cause the run-time system to segfault.\n\n Own Id: OTP-15490\n\n- Fix `erl_epmd:port_please` spec to include `t:atom/0` and `t:string/0`.\n\n Own Id: OTP-15557 Aux Id: PR-2117\n\n- The Logger handler logger_std_h now keeps track of the inode of its log file\n in order to re-open the file if the inode changes. This may happen, for\n instance, if the log file is opened and saved by an editor.\n\n Own Id: OTP-15578 Aux Id: ERL-850\n\n- When user specific file modes are given to the logger handler `logger_std_h`,\n they were earlier accepted without any control. This is now changes, so Logger\n will adjust the file modes as follows:\n\n \\- If `raw` is not found in the list, it is added. \n \\- If none of `write`, `append` or `exclusive` are found in the list, `append`\n is added. \n \\- If none of `delayed_write` or `{delayed_write,Size,Delay}` are found in the\n list, `delayed_write` is added.\n\n Own Id: OTP-15602","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The standard logger handler, `logger_std_h`, now has a new internal feature\n for log rotation. The rotation scheme is as follows:\n\n The log file to which the handler currently writes always has the same name,\n i.e. the name which is configured for the handler. The archived files have the\n same name, but with extension \".N\", where N is an integer. The newest archive\n has extension \".0\", and the oldest archive has the highest number.\n\n The size at which the log file is rotated, and the number of archive files\n that are kept, is specified with the handler specific configuration parameters\n `max_no_bytes` and `max_no_files` respectively.\n\n Archives can be compressed, in which case they get a \".gz\" file extension\n after the integer. Compression is specified with the handler specific\n configuration parameter `compress_on_rotate`.\n\n Own Id: OTP-15479\n\n- The new functions `logger:i/0` and `logger:i/1` are added. These provide the\n same information as `logger:get_config/0` and other `logger:get_*_config`\n functions, but the information is more logically sorted and more readable.\n\n Own Id: OTP-15600\n\n- Logger is now protected against overload due to massive amounts of log events\n from the emulator or from remote nodes.\n\n Own Id: OTP-15601\n\n- Logger now uses os:system_time/1 instead of erlang:system_time/1 to generate\n log event timestamps.\n\n Own Id: OTP-15625\n\n- Add functions `application:set_env/1,2` and `application:set_env/2`. These\n take a list of application configuration parameters, and the behaviour is\n equivalent to calling `application:set_env/4` individually for each\n application/key combination, except it is more efficient.\n\n `set_env/1,2` warns about duplicated applications or keys. The warning is also\n emitted during boot, if applications or keys are duplicated within one\n configuration file, e.g. sys.config.\n\n Own Id: OTP-15642 Aux Id: PR-2164\n\n- Handler specific configuration parameters for the standard handler\n `logger_std_h` are changed to be more intuitive and more similar to the\n disk_log handler.\n\n Earlier there was only one parameter, `type`, which could have the values\n `standard_io`, `standard_error`, `{file,FileName}` or `{file,FileName,Modes}`.\n\n This is now changed, so the following parameters are allowed:\n\n `type = standard_io | standard_error | file` \n `file = file:filename()` \n `modes = [file:mode()]`\n\n All parameters are optional. `type` defaults to `standard_io`, unless a file\n name is given, in which case it defaults to `file`. If `type` is set to\n `file`, the file name defaults to the same as the handler id.\n\n The potential incompatibility is that `logger:get_config/0` and\n `logger:get_handler_config/1` now returns the new parameters, even if the\n configuration was set with the old variant, e.g. `#{type=>{file,FileName}}`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15662\n\n- The new configuration parameter `file_check` is added to the Logger handler\n `logger_std_h`. This parameter specifies how long (in milliseconds) the\n handler may wait before checking if the log file still exists and the inode is\n the same as when it was opened.\n\n The default value is 0, which means that this check is done prior to each\n write operation. Setting a higher number may improve performance, but adds the\n risk of losing log events.\n\n Own Id: OTP-15663","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.2.1 - Kernel Release Notes","ref":"notes.html#kernel-6-2-1"},{"type":"extras","doc":"- Setting the `recbuf` size of an inet socket the `buffer` is also automatically\n increased. Fix a bug where the auto adjustment of inet buffer size would be\n triggered even if an explicit inet buffer size had already been set.\n\n Own Id: OTP-15651 Aux Id: ERIERL-304","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.2 - Kernel Release Notes","ref":"notes.html#kernel-6-2"},{"type":"extras","doc":"- A new function, `logger:update_handler_config/3` is added, and the handler\n callback `changing_config` now has a new argument, `SetOrUpdate`, which\n indicates if the configuration change comes from `set_handler_config/2,3` or\n `update_handler_config/2,3`.\n\n This allows the handler to consistently merge the new configuration with the\n old (if the change comes from `update_handler_config/2,3`) or with the default\n (if the change comes from `set_handler_config/2,3`).\n\n The built-in handlers `logger_std_h` and `logger_disk_log_h` are updated\n accordingly. A bug which could cause inconsistency between the handlers'\n internal state and the stored configuration is also corrected.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15364\n\n- Fix fallback when custom erl_epmd client does not implement address_please.\n\n Own Id: OTP-15388 Aux Id: PR-1983\n\n- The logger ets table did not have the `read_concurrency` option. This is now\n added.\n\n Own Id: OTP-15453 Aux Id: ERL-782\n\n- During system start, logger has a simple handler which prints to stdout. After\n the kernel supervision is started, this handler is removed and replaced by the\n default handler. Due to a bug, logger earlier issued a debug printout saying\n it received an unexpected message, which was the EXIT message from the simple\n handler's process. This is now corrected. The simple handler's process now\n unlinks from the logger process before terminating.\n\n Own Id: OTP-15466 Aux Id: ERL-788\n\n- The logger handler `logger_std_h` would not re-create it's log file if it was\n removed. Due to this it could not be used with tools like 'logrotate'. This is\n now corrected.\n\n Own Id: OTP-15469","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A function `inet:getifaddrs/1` that takes a list with a namespace option has\n been added, for platforms that support that feature, for example Linux\n (only?).\n\n Own Id: OTP-15121 Aux Id: ERIERL-189, PR-1974\n\n- Added the `nopush` option for TCP sockets, which corresponds to `TCP_NOPUSH`\n on \\*BSD and `TCP_CORK` on Linux.\n\n This is also used internally in `file:sendfile` to reduce latency on\n subsequent send operations.\n\n Own Id: OTP-15357 Aux Id: ERL-698\n\n- Optimize handling of send_delay for tcp sockes to better work with the new\n pollthread implementation introduced in OTP-21.\n\n Own Id: OTP-15471 Aux Id: ERIERL-229","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.1.1 - Kernel Release Notes","ref":"notes.html#kernel-6-1-1"},{"type":"extras","doc":"- Fix bug causing net_kernel process crash on connection attempt from node with\n name identical to local node.\n\n Own Id: OTP-15438 Aux Id: ERL-781","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.1 - Kernel Release Notes","ref":"notes.html#kernel-6-1"},{"type":"extras","doc":"- The values `all` and `none` are documented as valid value for the Kernel\n configuration parameter `logger_level`, but would cause a crash during node\n start. This is now corrected.\n\n Own Id: OTP-15143\n\n- Fix some potential buggy behavior in how ticks are sent on inter node\n distribution connections. Tick is now sent to c-node even if there are unsent\n buffered data, as c-nodes need ticks in order to send reply ticks. The amount\n of sent data was also calculated wrongly when ticks were suppressed due to\n unsent buffered data.\n\n Own Id: OTP-15162 Aux Id: ERIERL-191\n\n- Non semantic change in dist_util.erl to silence dialyzer warning.\n\n Own Id: OTP-15170\n\n- Fixed `net_kernel:connect_node(node())` to return `true` (and do nothing) as\n it always has before OTP-21.0. Also documented this successful \"self connect\"\n as the expected behavior.\n\n Own Id: OTP-15182 Aux Id: ERL-643\n\n- The single_line option on logger_formatter would in some cases add an unwanted\n comma after the association arrows in a map. This is now corrected.\n\n Own Id: OTP-15228\n\n- Improved robustness of distribution connection setup. In OTP-21.0 a truly\n asynchronous connection setup was introduced. This is further improvement on\n that work to make the emulator more robust and also be able to recover in\n cases when involved Erlang processes misbehave.\n\n Own Id: OTP-15297 Aux Id: OTP-15279, OTP-15280","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new macro, `?LOG(Level,...)`, is added. This is equivalent to the existing\n `?LOG_ (...)` macros.\n\n A new variant of Logger report callback is added, which takes an extra\n argument containing options for size limiting and line breaks. Module\n `proc_lib` in `STDLIB` uses this for crash reports.\n\n Logger configuration is now checked a bit more for errors.\n\n Own Id: OTP-15132\n\n- The socket options `recvtos`, `recvttl`, `recvtclass` and `pktoptions` have\n been implemented in the socket modules. See the documentation for the\n `gen_tcp`, `gen_udp` and `inet` modules. Note that support for these in the\n runtime system is platform dependent. Especially for `pktoptions` which is\n very Linux specific and obsoleted by the RFCs that defined it.\n\n Own Id: OTP-15145 Aux Id: ERIERL-187\n\n- Add `logger:set_application_level/2` for setting the logger level of all\n modules in one application.\n\n Own Id: OTP-15146","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 6.0.1 - Kernel Release Notes","ref":"notes.html#kernel-6-0-1"},{"type":"extras","doc":"- Fixed bug in `net_kernel` that could cause an emulator crash if certain\n connection attempts failed. Bug exists since kernel-6.0 (OTP-21.0).\n\n Own Id: OTP-15280 Aux Id: ERIERL-226, OTP-15279","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 6.0 - Kernel Release Notes","ref":"notes.html#kernel-6-0"},{"type":"extras","doc":"- Clarify the documentation of `rpc:multicall/5`.\n\n Own Id: OTP-10551\n\n- The DNS resolver when getting econnrefused from a server retained an invalid\n socket so look up towards the next server(s) also failed.\n\n Own Id: OTP-13133 Aux Id: PR-1557\n\n- No resolver backend returns V4Mapped IPv6 addresses any more. This was\n inconsistent before, some did, some did not. To facilitate working with such\n addresses a new function `inet:ipv4_mapped_ipv6_address/1` has been added.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13761 Aux Id: ERL-503\n\n- The type specifications for [`file:posix/0`](`t:file:posix/0`) and\n [`inet:posix/0`](`t:inet:posix/0`) have been updated according to which errors\n file and socket operations should be able to return.\n\n Own Id: OTP-14019 Aux Id: ERL-550\n\n- Fix name resolving in IPv6 only environments when doing the initial\n distributed connection.\n\n Own Id: OTP-14501\n\n- File operations used to accept [filenames](`t:file:name_all/0`) containing\n null characters (integer value zero). This caused the name to be truncated and\n in some cases arguments to primitive operations to be mixed up. Filenames\n containing null characters inside the filename are now _rejected_ and will\n cause primitive file operations to fail.\n\n Also environment variable operations used to accept\n [names](`t:os:env_var_name/0`) and [values](`t:os:env_var_value/0`) of\n environment variables containing null characters (integer value zero). This\n caused operations to silently produce erroneous results. Environment variable\n names and values containing null characters inside the name or value are now\n _rejected_ and will cause environment variable operations to fail.\n\n Primitive environment variable operations also used to accept the `$=`\n character in environment variable names causing various problems. `$=`\n characters in environment variable names are now also _rejected_.\n\n Also `os:cmd/1` now reject null characters inside its\n [command](`t:os:os_command/0`).\n\n `erlang:open_port/2` will also reject null characters inside the port name\n from now on.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14543 Aux Id: ERL-370\n\n- `os:putenv` and `os:getenv` no longer access the process environment directly\n and instead work on a thread-safe emulation. The only observable difference is\n that it's _not_ kept in sync with libc `getenv(3)` / `putenv(3)`, so those who\n relied on that behavior in drivers or NIFs will need to add manual\n synchronization.\n\n On Windows this means that you can no longer resolve DLL dependencies by\n modifying the `PATH` just before loading the driver/NIF. To make this less of\n a problem, the emulator now adds the target DLL's folder to the DLL search\n path.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-14666\n\n- Fixed connection tick toward primitive hidden nodes (erl_interface) that could\n cause faulty tick timeout in rare cases when payload data is sent to hidden\n node but not received.\n\n Own Id: OTP-14681\n\n- Make group react immediately on an EXIT-signal from shell in e.g ssh.\n\n Own Id: OTP-14991 Aux Id: PR1705\n\n- Calls to `gen_tcp:send/2` on closed sockets now returns `{error, closed}`\n instead of `{error,enotconn}`.\n\n Own Id: OTP-15001\n\n- The `included_applications` key are no longer duplicated as application\n environment variable. Earlier, the included applications could be read both\n with `application:get[_all]_env(...)` and `application:get[_all]_key(...)`\n functions. Now, it can only be read with `application:get[_all]_key(...)`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15071\n\n- Owner and group changes through `file:write_file_info`, `file:change_owner`,\n and `file:change_group` will no longer report success on permission errors.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15118","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A new logging API is added to Erlang/OTP, see the `m:logger` manual page, and\n section [Logging](logger_chapter.md) in the Kernel User's Guide.\n\n Calls to `error_logger` are automatically redirected to the new API, and\n legacy error logger event handlers can still be used. It is, however,\n recommended to use the Logger API directly when writing new code.\n\n Notice the following potential incompatibilities:\n\n - Kernel configuration parameters `error_logger` still works, but is overruled\n if the default handler's output destination is configured with Kernel\n configuration parameter `logger`.\n\n In general, parameters for configuring error logger are overwritten by new\n parameters for configuring Logger.\n\n - The concept of SASL error logging is deprecated, meaning that by default the\n SASL application does not affect which log events are logged.\n\n By default, supervisor reports and crash reports are logged by the default\n Logger handler started by Kernel, and end up at the same destination\n (terminal or file) as other standard log event from Erlang/OTP.\n\n Progress reports are not logged by default, but can be enabled by setting\n the primary log level to info, for example with the Kernel configuration\n parameter `logger_level`.\n\n To obtain backwards compatibility with the SASL error logging functionality\n from earlier releases, set Kernel configuration parameter\n `logger_sasl_compatible` to `true`. This prevents the default Logger handler\n from logging any supervisor-, crash-, or progress reports. Instead, SASL\n adds a separate Logger handler during application start, which takes care of\n these log events. The SASL configuration parameters `sasl_error_logger` and\n `sasl_errlog_type` specify the destination (terminal or file) and severity\n level to log for these events.\n\n Since Logger is new in Erlang/OTP 21.0, we do reserve the right to introduce\n changes to the Logger API and functionality in patches following this release.\n These changes might or might not be backwards compatible with the initial\n version.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13295\n\n- The function `inet:i/0` has been documented.\n\n Own Id: OTP-13713 Aux Id: PR-1645\n\n- Typespecs for `netns` and `bind_to_device` options have been added to\n `gen_tcp`, `gen_udp` and `gen_sctp` functions.\n\n Own Id: OTP-14359 Aux Id: PR-1816\n\n- New functionality for implementation of alternative carriers for the Erlang\n distribution has been introduced. This mainly consists of support for usage of\n distribution controller processes (previously only ports could be used as\n distribution controllers). For more information see\n [ERTS User's Guide ➜ How to implement an Alternative Carrier for the Erlang Distribution ➜ Distribution Module](`e:erts:alt_dist.md#distribution-module`).\n\n Own Id: OTP-14459\n\n- `seq_trace` labels may now be any erlang term.\n\n Own Id: OTP-14899\n\n- The SSL distribution protocol `-proto inet_tls` has stopped setting the SSL\n option `server_name_indication`. New verify funs for client and server in\n `inet_tls_dist` has been added, not documented yet, that checks node name if\n present in peer certificate. Usage is still also yet to be documented.\n\n Own Id: OTP-14969 Aux Id: OTP-14465, ERL-598\n\n- Changed timeout of `gen_server` calls to `auth` server from default 5 seconds\n to `infinity`.\n\n Own Id: OTP-15009 Aux Id: ERL-601\n\n- The callback module passed as `-epmd_module` to erl has been expanded to be\n able to do name and port resolving.\n\n Documentation has also been added in the `m:erl_epmd` reference manual and\n ERTS User's Guide\n [How to Implement an Alternative Node Discovery for Erlang Distribution](`e:erts:alt_disco.md`).\n\n Own Id: OTP-15086 Aux Id: PR-1694\n\n- Included config file specified with relative path in sys.config are now first\n searched for relative to the directory of sys.config itself. If not found, it\n is also searched for relative to the current working directory. The latter is\n for backwards compatibility.\n\n Own Id: OTP-15137 Aux Id: PR-1838","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 5.4.3.2 - Kernel Release Notes","ref":"notes.html#kernel-5-4-3-2"},{"type":"extras","doc":"- Non semantic change in dist_util.erl to silence dialyzer warning.\n\n Own Id: OTP-15170","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.4.3.1 - Kernel Release Notes","ref":"notes.html#kernel-5-4-3-1"},{"type":"extras","doc":"- Fix some potential buggy behavior in how ticks are sent on inter node\n distribution connections. Tick is now sent to c-node even if there are unsent\n buffered data, as c-nodes need ticks in order to send reply ticks. The amount\n of sent data was calculated wrongly when ticks where suppressed due to unsent\n buffered data.\n\n Own Id: OTP-15162 Aux Id: ERIERL-191","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.4.3 - Kernel Release Notes","ref":"notes.html#kernel-5-4-3"},{"type":"extras","doc":"- Correct a few contracts.\n\n Own Id: OTP-14889\n\n- Reject loading modules with names containing directory separators ('/' or '\\\\'\n on Windows).\n\n Own Id: OTP-14933 Aux Id: ERL-564, PR-1716\n\n- Fix bug in handling of os:cmd/2 option max_size on windows.\n\n Own Id: OTP-14940","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.4.2 - Kernel Release Notes","ref":"notes.html#kernel-5-4-2"},{"type":"extras","doc":"- Add `os:cmd/2` that takes an options map as the second argument.\n\n Add `max_size` as an option to `os:cmd/2` that control the maximum size of the\n result that `os:cmd/2` will return.\n\n Own Id: OTP-14823","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.4.1 - Kernel Release Notes","ref":"notes.html#kernel-5-4-1"},{"type":"extras","doc":"- Refactored an internal API.\n\n Own Id: OTP-14784","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.4 - Kernel Release Notes","ref":"notes.html#kernel-5-4"},{"type":"extras","doc":"- Processes which did output after switching jobs (Ctrl+G) could be left forever\n stuck in the io request.\n\n Own Id: OTP-14571 Aux Id: ERL-472","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Lock counting can now be fully toggled at runtime in the lock counting\n emulator (`-emu_type lcnt`). Everything is enabled by default to match the old\n behavior, but specific categories can be toggled at will with minimal runtime\n overhead when disabled. Refer to the documentation on `lcnt:rt_mask/1` for\n details.\n\n Own Id: OTP-13170\n\n- `lcnt:collect` and `lcnt:clear` will no longer block all other threads in the\n runtime system.\n\n Own Id: OTP-14412\n\n- General Unicode improvements.\n\n Own Id: OTP-14462","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 5.3.1 - Kernel Release Notes","ref":"notes.html#kernel-5-3-1"},{"type":"extras","doc":"- The documentation for the 'quiet' option in disk_log:open/1 had an incorrect\n default value.\n\n Own Id: OTP-14498","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.3 - Kernel Release Notes","ref":"notes.html#kernel-5-3"},{"type":"extras","doc":"- Function `inet:ntoa/1` has been fixed to return lowercase letters according to\n RFC 5935 that has been approved after this function was written. Previously\n uppercase letters were returned so this may be a backwards incompatible change\n depending on how the returned address string is used.\n\n Function `inet:parse_address/1` has been fixed to accept %-suffixes on scoped\n addresses. The addresses does not work yet, but gives no parse errors.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13006 Aux Id: ERIERL-20, ERL-429\n\n- Fix bug where gethostname would incorrectly fail with enametoolong on Linux.\n\n Own Id: OTP-14310\n\n- Fix bug causing `code:is_module_native` to falsely return true when `local`\n call trace is enabled for the module.\n\n Own Id: OTP-14390\n\n- Add early reject of invalid node names from distributed nodes.\n\n Own Id: OTP-14426","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Since Unicode is now allowed in atoms an extra check is needed for node names,\n which are restricted to Latin-1.\n\n Own Id: OTP-13805\n\n- Replaced usage of deprecated symbolic [`time unit`](`t:erlang:time_unit/0`)\n representations.\n\n Own Id: OTP-13831 Aux Id: OTP-13735\n\n- `file:write_file(Name, Data, [raw])` would turn `Data` into a single binary\n before writing. This meant it could not take advantage of the `writev()`\n system call if it was given a list of binaries and told to write with `raw`\n mode.\n\n Own Id: OTP-13909\n\n- The performance of the `disk_log` has been somewhat improved in some corner\n cases (big items), and the documentation has been clarified.\n\n Own Id: OTP-14057 Aux Id: PR-1245\n\n- Functions for detecting changed code has been added. `code:modified_modules/0`\n returns all currently loaded modules that have changed on disk.\n `code:module_status/1` returns the status for a module. In the shell and in\n `c` module, `mm/0` is short for `code:modified_modules/0`, and `lm/0` reloads\n all currently loaded modules that have changed on disk.\n\n Own Id: OTP-14059\n\n- Introduce an event manager in Erlang to handle OS signals. A subset of OS\n signals may be subscribed to and those are described in the Kernel\n application.\n\n Own Id: OTP-14186\n\n- Sockets can now be bound to device (SO_BINDTODEVICE) on platforms where it is\n supported.\n\n This has been implemented e.g to support VRF-Lite under Linux; see\n [VRF ](https://www.kernel.org/doc/Documentation/networking/vrf.txt), and\n GitHub pull request [\\#1326](https://github.com/erlang/otp/pull/1326).\n\n Own Id: OTP-14357 Aux Id: PR-1326\n\n- Added option to store shell_history on disk so that the history can be reused\n between sessions.\n\n Own Id: OTP-14409 Aux Id: PR-1420\n\n- The size of crash reports created by `gen_server`, `gen_statem` and `proc_lib`\n is limited with aid of the Kernel application variable\n `error_logger_format_depth`. The purpose is to limit the size of the messages\n sent to the `error_logger` process when processes with huge message queues or\n states crash.\n\n The crash report generated by `proc_lib` includes the new tag\n `message_queue_len`. The neighbour report also includes the new tag\n `current_stacktrace`. Finally, the neighbour report no longer includes the\n tags `messages` and `dictionary`.\n\n The new function `error_logger:get_format_depth/0` can be used to retrieve the\n value of the Kernel application variable `error_logger_format_depth`.\n\n Own Id: OTP-14417\n\n- One of the ETS tables used by the `global` module is created with\n `{read_concurrency, true}` in order to reduce contention.\n\n Own Id: OTP-14419\n\n- Warnings have been added to the relevant documentation about not using\n un-secure distributed nodes in exposed environments.\n\n Own Id: OTP-14425","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 5.2 - Kernel Release Notes","ref":"notes.html#kernel-5-2"},{"type":"extras","doc":"- Fix a race during cleanup of os:cmd that would cause os:cmd to hang\n indefinitely.\n\n Own Id: OTP-14232 Aux Id: seq13275","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The functions in the '`file`' module that take a list of paths (e.g.\n `file:path_consult/2`) will now continue to search in the path if the path\n contains something that is not a directory.\n\n Own Id: OTP-14191\n\n- Two OTP processes that are known to receive many messages are 'rex' (used by\n 'rpc') and 'error_logger'. Those processes will now store unprocessed messages\n outside the process heap, which will potentially decrease the cost of garbage\n collections.\n\n Own Id: OTP-14192","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 5.1.1 - Kernel Release Notes","ref":"notes.html#kernel-5-1-1"},{"type":"extras","doc":"- `code:add_pathsa/1` and command line option `-pa` both revert the given list\n of directories when adding it at the beginning of the code path. This is now\n documented.\n\n Own Id: OTP-13920 Aux Id: ERL-267\n\n- Add lost runtime dependency to erts-8.1. This should have been done in\n kernel-5.1 (OTP-19.1) as it cannot run without at least erts-8.1 (OTP-19.1).\n\n Own Id: OTP-14003\n\n- Type and doc for gen\\_\\{tcp,udp,sctp\\}:controlling_process/2 has been\n improved.\n\n Own Id: OTP-14022 Aux Id: PR-1208","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.1 - Kernel Release Notes","ref":"notes.html#kernel-5-1"},{"type":"extras","doc":"- Fix a memory leak when calling seq_trace:get_system_tracer().\n\n Own Id: OTP-13742\n\n- Fix for the problem that when adding the ebin directory of an application to\n the code path, the `code:priv_dir/1` function returns an incorrect path to the\n priv directory of the same application.\n\n Own Id: OTP-13758 Aux Id: ERL-195\n\n- Fix code_server crash when adding code paths of two levels.\n\n Own Id: OTP-13765 Aux Id: ERL-194\n\n- Respect -proto_dist switch while connection to EPMD\n\n Own Id: OTP-13770 Aux Id: PR-1129\n\n- Fixed a bug where init:stop could deadlock if a process with infinite shutdown\n timeout (e.g. a supervisor) attempted to load code while terminating.\n\n Own Id: OTP-13802\n\n- Close stdin of commands run in os:cmd. This is a backwards compatibility fix\n that restores the behaviour of pre 19.0 os:cmd.\n\n Own Id: OTP-13867 Aux Id: seq13178","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add `net_kernel:setopts/2` and `net_kernel:getopts/2` to control options for\n distribution sockets in runtime.\n\n Own Id: OTP-13564\n\n- Rudimentary support for DSCP has been implemented in the guise of a `tclass`\n socket option for IPv6 sockets.\n\n Own Id: OTP-13582","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 5.0.2 - Kernel Release Notes","ref":"notes.html#kernel-5-0-2"},{"type":"extras","doc":"- When calling os:cmd from a process that has set trap_exit to true an 'EXIT'\n message would be left in the message queue. This bug was introduced in kernel\n vsn 5.0.1.\n\n Own Id: OTP-13813","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.0.1 - Kernel Release Notes","ref":"notes.html#kernel-5-0-1"},{"type":"extras","doc":"- Fix a os:cmd bug where creating a background job using & would cause os:cmd to\n hang until the background job terminated or closed its stdout and stderr file\n descriptors. This bug has existed from kernel 5.0.\n\n Own Id: OTP-13741","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 5.0 - Kernel Release Notes","ref":"notes.html#kernel-5-0"},{"type":"extras","doc":"- The handling of `on_load` functions has been improved. The major improvement\n is that if a code upgrade fails because the `on_load` function fails, the\n previous version of the module will now be retained.\n\n Own Id: OTP-12593\n\n- `rpc:call()` and `rpc:block_call()` would sometimes cause an exception (which\n was not mentioned in the documentation). This has been corrected so that\n `{badrpc,Reason}` will be returned instead.\n\n Own Id: OTP-13409\n\n- On Windows, for modules that were loaded early (such as the `lists` module),\n `code:which/1` would return the path with mixed slashes and backslashes, for\n example: `\"C:\\\\Program Files\\\\erl8.0/lib/stdlib-2.7/ebin/lists.beam\"`. This\n has been corrected.\n\n Own Id: OTP-13410\n\n- Make file:datasync use fsync instead of fdatasync on Mac OSX.\n\n Own Id: OTP-13411\n\n- The default chunk size for the fallback sendfile implementation, used on\n platforms that do not have a native sendfile, has been decreased in order to\n reduce connectivity issues.\n\n Own Id: OTP-13444\n\n- Large file writes (2Gb or more) could fail on some Unix platforms (for\n example, OS X and FreeBSD).\n\n Own Id: OTP-13461\n\n- A bug has been fixed where the DNS resolver inet_res did not refresh its view\n of the contents of for example resolv.conf immediately after start and hence\n then failed name resolution. Reported and fix suggested by Michal Ptaszek in\n GitHUB pull req #949.\n\n Own Id: OTP-13470 Aux Id: Pull #969\n\n- Fix process leak from global_group.\n\n Own Id: OTP-13516 Aux Id: PR-1008\n\n- The function `inet:gethostbyname/1` now honors the resolver option `inet6`\n instead of always looking up IPv4 addresses.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13622 Aux Id: PR-1065\n\n- The `Status` argument to `init:stop/1` is now sanity checked to make sure\n `erlang:halt` does not fail.\n\n Own Id: OTP-13631 Aux Id: PR-911","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add \\{line_delim, byte()\\} option to inet:setopts/2 and decode_packet/3\n\n Own Id: OTP-12837\n\n- Added `os:perf_counter/1`.\n\n The perf_counter is a very very cheap and high resolution timer that can be\n used to timestamp system events. It does not have monoticity guarantees, but\n should on most OS's expose a monotonous time.\n\n Own Id: OTP-12908\n\n- The os:cmd call has been optimized on unix platforms to be scale better with\n the number of schedulers.\n\n Own Id: OTP-13089\n\n- New functions that can load multiple modules at once have been added to the\n '`code`' module. The functions are `code:atomic_load/1`,\n `code:prepare_loading/1`, `code:finish_loading/1`, and\n `code:ensure_modules_loaded/1`.\n\n Own Id: OTP-13111\n\n- The code path cache feature turned out not to be very useful in practice and\n has been removed. If an attempt is made to enable the code path cache, there\n will be a warning report informing the user that the feature has been removed.\n\n Own Id: OTP-13191\n\n- When an attempt is made to start a distributed Erlang node with the same name\n as an existing node, the error message will be much shorter and easier to read\n than before. Example:\n\n `Protocol 'inet_tcp': the name somename@somehost seems to be in use by another Erlang node`\n\n Own Id: OTP-13294\n\n- The output of the default error logger is somewhat prettier and easier to\n read. The default error logger is used during start-up of the OTP system. If\n the start-up fails, the output will be easier to read.\n\n Own Id: OTP-13325\n\n- The functions `rpc:safe_multi_server_call/2,3` that were deprecated in R12B\n have been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-13449\n\n- Update the error reasons in dist_util, and show them in the logs if\n net_kernel:verbose(1) has been called.\n\n Own Id: OTP-13458\n\n- Experimental support for Unix Domain Sockets has been implemented. Read the\n sources if you want to try it out. Example:\n `gen_udp:open(0, [{ifaddr,{local,\"/tmp/socket\"}}])`. Documentation will be\n written after user feedback on the experimental API.\n\n Own Id: OTP-13572 Aux Id: PR-612\n\n- Allow heart to be configured to not kill the previous emulator before calling\n the HEART_COMMAND. This is done by setting the environment variable\n HEART_NO_KILL to TRUE.\n\n Own Id: OTP-13650","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 4.2 - Kernel Release Notes","ref":"notes.html#kernel-4-2"},{"type":"extras","doc":"- `code:load_abs([10100])` would bring down the entire runtime system and create\n a crash dump. Corrected to generate an error exception in the calling process.\n\n Also corrected specs for code loading functions and added more information in\n the documentation about the error reasons returned by code-loading functions.\n\n Own Id: OTP-9375\n\n- `gen_tcp:accept/2` was not\n [time warp safe](`e:erts:time_correction.md#time-warp-safe-code`). This since\n it used the same time as returned by `erlang:now/0` when calculating timeout.\n This has now been fixed.\n\n Own Id: OTP-13254 Aux Id: OTP-11997, OTP-13222\n\n- Correct the contract for `inet:getifaddrs/1`.\n\n Own Id: OTP-13335 Aux Id: ERL-95","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Time warp safety improvements.\n\n Introduced the options `monotonic_timestamp`, and `strict_monotonic_timestamp`\n to the trace, sequential trace, and system profile functionality. This since\n the already existing `timestamp` option is not time warp safe.\n\n Introduced the option `safe_fixed_monotonic_time` to `ets:info/2` and\n `dets:info/2`. This since the already existing `safe_fixed` option is not time\n warp safe.\n\n Own Id: OTP-13222 Aux Id: OTP-11997\n\n- Add validation callback for heart\n\n The erlang heart process may now have a validation callback installed. The\n validation callback will be executed, if present, before any heartbeat to\n heart port program. If the validation fails, or stalls, no heartbeat will be\n sent and the node will go down.\n\n With the option `'check_schedulers'` heart executes a responsiveness check of\n the schedulers before a heartbeat is sent to the port program. If the\n responsiveness check fails, the heartbeat will not be performed (as intended).\n\n Own Id: OTP-13250\n\n- Clarify documentation of `net_kernel:allow/1`\n\n Own Id: OTP-13299\n\n- EPMD supports both IPv4 and IPv6\n\n Also affects oldest supported windows version.\n\n Own Id: OTP-13364","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 4.1.1 - Kernel Release Notes","ref":"notes.html#kernel-4-1-1"},{"type":"extras","doc":"- Host name lookups though inet_res, the Erlang DNS resolver, are now done case\n insensitively according to RFC 4343. Patch by Holger Weiß.\n\n Own Id: OTP-12836\n\n- IPv6 distribution handler has been updated to share code with IPv4 so that all\n features are supported in IPv6 as well. A bug when using an IPv4 address as\n hostname has been fixed.\n\n Own Id: OTP-13040\n\n- Caching of host names in the internal DNS resolver inet_res has been made\n character case insensitive for host names according to RFC 4343.\n\n Own Id: OTP-13083\n\n- Cooked file mode buffering has been fixed so file:position/2 now works\n according to Posix on Posix systems i.e. when file:position/2 returns an error\n the file pointer is unaffected.\n\n The Windows system documentation, however, is unclear on this point so the\n documentation of file:position/2 still does not promise anything.\n\n Cooked file mode file:pread/2,3 and file:pwrite/2,3 have been corrected to\n honor character encoding like the combination of file:position/2 and\n file:read/2 or file:write/2 already does. This is probably not very useful\n since the character representation on the caller's side is latin1, period.\n\n Own Id: OTP-13155 Aux Id: PR#646","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add \\{line_delim, byte()\\} option to inet:setopts/2 and decode_packet/3\n\n Own Id: OTP-12837","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 4.1 - Kernel Release Notes","ref":"notes.html#kernel-4-1"},{"type":"extras","doc":"- A mechanism for limiting the amount of text that the built-in error logger\n events will produce has been introduced. It is useful for limiting both the\n size of log files and the CPU time used to produce them.\n\n This mechanism is experimental in the sense that it may be changed if it turns\n out that it does not solve the problem it is supposed to solve. In that case,\n there may be backward incompatible improvements to this mechanism.\n\n See the documentation for the config parameter `error_logger_format_depth` in\n the Kernel application for information about how to turn on this feature.\n\n Own Id: OTP-12864","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 4.0 - Kernel Release Notes","ref":"notes.html#kernel-4-0"},{"type":"extras","doc":"- Fix error handling in `file:read_line/1` for Unicode contents.\n\n Own Id: OTP-12144\n\n- Introduce `os:getenv/2` which is similar to `os:getenv/1` but returns the\n passed default value if the required environment variable is undefined.\n\n Own Id: OTP-12342\n\n- It is now possible to paste text in JCL mode (using Ctrl-Y) that has been\n copied in the previous shell session. Also a bug that caused the JCL mode to\n crash when pasting text has been fixed.\n\n Own Id: OTP-12673\n\n- Ensure that each segment of an IPv6 address when parsed from a string has a\n maximum of 4 hex digits\n\n Own Id: OTP-12773","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- New BIF: `erlang:get_keys/0`, lists all keys associated with the process\n dictionary. Note: `erlang:get_keys/0` is auto-imported.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12151 Aux Id: seq12521\n\n- The internal group to user_drv protocol has been changed to be synchronous in\n order to guarantee that output sent to a process implementing the user_drv\n protocol is printed before replying. This protocol is used by the\n standard_output device and the ssh application when acting as a client.\n\n This change changes the previous unlimited buffer when printing to standard_io\n and other devices that end up in user_drv to 1KB.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12240\n\n- The `inflateInit/2` and `deflateInit/6` functions now accepts a WindowBits\n argument equal to 8 and -8.\n\n Own Id: OTP-12564\n\n- Map error logger warnings to warning messages by default.\n\n Own Id: OTP-12755\n\n- Map beam error logger warnings to warning messages by default. Previously\n these messages were mapped to the error channel by default.\n\n Own Id: OTP-12781\n\n- gen_tcp:shutdown/2 is now asynchronous\n\n This solves the following problems with the old implementation:\n\n It doesn't block when the TCP peer is idle or slow. This is the expected\n behaviour when shutdown() is called: the caller needs to be able to continue\n reading from the socket, not be prevented from doing so.\n\n It doesn't truncate the output. The current version of gen_tcp:shutdown/2 will\n truncate any outbound data in the driver queue after about 10 seconds if the\n TCP peer is idle of slow. Worse yet, it doesn't even inform anyone that the\n data has been truncated: 'ok' is returned to the caller; and a FIN rather than\n an RST is sent to the TCP peer.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-12797\n\n- There are many cases where user code needs to be able to distinguish between a\n socket that was closed normally and one that was aborted. Setting the option\n \\{show_econnreset, true\\} enables the user to receive ECONNRESET errors on\n both active and passive sockets.\n\n Own Id: OTP-12843","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 3.2.0.1 - Kernel Release Notes","ref":"notes.html#kernel-3-2-0-1"},{"type":"extras","doc":"- The 'raw' socket option could not be used multiple times in one call to any\n e.g gen_tcp function because only one of the occurrences were used. This bug\n has been fixed, and also a small bug concerning propagating error codes from\n within inet:setopts/2.\n\n Own Id: OTP-11482 Aux Id: seq12872","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 3.2 - Kernel Release Notes","ref":"notes.html#kernel-3-2"},{"type":"extras","doc":"- A bug causing an infinite loop in hostname resolving has been corrected. To\n trigger this bug you would have to enter an bogus search method from a\n configuration file e.g .inetrc.\n\n Bug pinpointed by Emil Holmström\n\n Own Id: OTP-12133\n\n- The standard_error process now handles the getopts I/O protocol request\n correctly and stores its encoding in the same way as standard_io.\n\n Also, io:put_chars(standard_error, \\[oops]) could previously crash the\n standard_error process. This is now corrected.\n\n Own Id: OTP-12424","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Configuration parameters for the Kernel application that allows setting socket\n options for the distribution sockets have been added. See the application\n Kernel documentation; parameters 'inet_dist_listen_options' and\n 'inet_dist_connect_options'.\n\n Own Id: OTP-12476 Aux Id: OTP-12476","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 3.1 - Kernel Release Notes","ref":"notes.html#kernel-3-1"},{"type":"extras","doc":"- Make sure to install .hrl files when needed\n\n Own Id: OTP-12197\n\n- Removed the undocumented application environment variable 'raw_files' from the\n kernel application. This variable was checked (by call to\n application:get_env/2) each time a raw file was to be opened in the file\n module.\n\n Own Id: OTP-12276\n\n- A bug has been fixed when using the netns option to gen_udp, which\n accidentally only worked if it was the last option.\n\n Own Id: OTP-12314","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Updated documentation for inet buffer size options.\n\n Own Id: OTP-12296\n\n- Introduce new option 'raw' in file_info and link_info functions. This option\n allows the caller not to go through the file server for information about\n files guaranteed to be local.\n\n Own Id: OTP-12325","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 3.0.3 - Kernel Release Notes","ref":"notes.html#kernel-3-0-3"},{"type":"extras","doc":"- Accept inet:ip_address() in net_adm:names/1\n\n Own Id: OTP-12154","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 3.0.2 - Kernel Release Notes","ref":"notes.html#kernel-3-0-2"},{"type":"extras","doc":"- OTP-11850 fixed filelib:wildcard/1 to work with broken symlinks. This\n correction, however, introduced problems since symlinks were no longer\n followed for functions like filelib:ensure_dir/1, filelib:is_dir/1,\n filelib:file_size/1, etc. This is now corrected.\n\n Own Id: OTP-12054 Aux Id: seq12660","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 3.0.1 - Kernel Release Notes","ref":"notes.html#kernel-3-0-1"},{"type":"extras","doc":"- If the Config given to application_controller:change_application_data included\n other config files, it was only expanded for already existing (loaded)\n applications. If an upgrade added a new application which had config data in\n an included config file, the new application did not get correct config data.\n\n This is now changed so config data will be expanded for all applications.\n\n Own Id: OTP-11864\n\n- It was allowed to re-load pre-loaded modules such as `erlang`, but that could\n cause strange and unwanted things to happen, such as call\n [`apply/3`](`apply/3`) to loop. Pre-loaded modules are now sticky by default.\n (Thanks to Loïc Hoguin for reporting this bug.)\n\n `code:add_path(\"/ending/in/slash/\")` removes the trailing slash, adding\n `/ending/in/slash` to the code path. However,\n `code:del_path(\"/ending/in/slash/\")` would fail to remove the path since it\n did not remove the trailing slash. This has been fixed.\n\n Own Id: OTP-11913\n\n- Fix erts_debug:size/1 to handle Map sizes\n\n Own Id: OTP-11923\n\n- The documentation for `file:file_info/1` has been removed. The function itself\n was removed a long time ago.\n\n Own Id: OTP-11982","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 3.0 - Kernel Release Notes","ref":"notes.html#kernel-3-0"},{"type":"extras","doc":"- Fixed a deadlock possibility in terminate application\n\n Own Id: OTP-11171\n\n- Fixed bug where sendfile would return the wrong error code for a remotely\n closed socket if the socket was in passive mode. (Thanks to Vincent Siliakus\n for reporting the bug.)\n\n Own Id: OTP-11614\n\n- The new option `persistent` is added to `application:set_env/4` and\n `application:unset_env/3`. An environment key set with the `persistent` option\n will not be overridden by the ones configured in the application resource file\n on load. This means persistent values will stick after the application is\n loaded and also on application reload. (Thanks to José Valim)\n\n Own Id: OTP-11708\n\n- The spec for file:set_cwd/1 is modified to also accept binaries as arguments.\n This has always been allowed in the code, but it was not reflected in the spec\n since binaries are mostly used for raw file names. Raw file names are names\n that are not encoded according to file:native_name_encoding(), and these are\n not allowed in file:set_cwd/1. The spec is now, however, more allowing in\n order to avoid unnecessary dialyzer warnings. Raw file names will still fail\n in runtime with reason 'no_translation'. (Thanks to José Valim)\n\n Own Id: OTP-11787","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- heart:set_cmd/1 is updated to allow unicode code points > 255 in the given\n heart command\n\n Own Id: OTP-10843\n\n- Dialyzer's `unmatched_return` warnings have been corrected.\n\n Own Id: OTP-10908\n\n- Make erlang:open_port/2 spawn and spawn_executable handle unicode.\n\n Own Id: OTP-11105\n\n- Erlang/OTP has been ported to the realtime operating system OSE. The port\n supports both smp and non-smp emulator. For details around the port and how to\n started see the User's Guide in the ose application.\n\n Note that not all parts of Erlang/OTP has been ported.\n\n Notable things that work are: non-smp and smp emulators, OSE signal\n interaction, crypto, asn1, run_erl/to_erl, tcp, epmd, distribution and most if\n not all non-os specific functionality of Erlang.\n\n Notable things that does not work are: udp/sctp, os_mon, erl_interface,\n binding of schedulers.\n\n Own Id: OTP-11334\n\n- Add the \\{active,N\\} socket option for TCP, UDP, and SCTP, where N is an\n integer in the range -32768..32767, to allow a caller to specify the number of\n data messages to be delivered to the controlling process. Once the socket's\n delivered message count either reaches 0 or is explicitly set to 0 with\n inet:setopts/2 or by including \\{active,0\\} as an option when the socket is\n created, the socket transitions to passive (\\{active, false\\}) mode and the\n socket's controlling process receives a message to inform it of the\n transition. TCP sockets receive \\{tcp_passive,Socket\\}, UDP sockets receive\n \\{udp_passive,Socket\\} and SCTP sockets receive \\{sctp_passive,Socket\\}.\n\n The socket's delivered message counter defaults to 0, but it can be set using\n \\{active,N\\} via any gen_tcp, gen_udp, or gen_sctp function that takes socket\n options as arguments, or via inet:setopts/2. New N values are added to the\n socket's current counter value, and negative numbers can be used to reduce the\n counter value. Specifying a number that would cause the socket's counter value\n to go above 32767 causes an einval error. If a negative number is specified\n such that the counter value would become negative, the socket's counter value\n is set to 0 and the socket transitions to passive mode. If the counter value\n is already 0 and inet:setopts(Socket, \\[\\{active,0\\}]) is specified, the\n counter value remains at 0 but the appropriate passive mode transition message\n is generated for the socket.\n\n Thanks to Steve Vinoski\n\n Own Id: OTP-11368\n\n- A call to either the [`garbage_collect/1`](`garbage_collect/1`) BIF or the\n [`check_process_code/2`](`check_process_code/2`) BIF may trigger garbage\n collection of another processes than the process calling the BIF. The previous\n implementations performed these kinds of garbage collections without\n considering the internal state of the process being garbage collected. In\n order to be able to more easily and more efficiently implement yielding native\n code, these types of garbage collections have been rewritten. A garbage\n collection like this is now triggered by an asynchronous request signal, the\n actual garbage collection is performed by the process being garbage collected\n itself, and finalized by a reply signal to the process issuing the request.\n Using this approach processes can disable garbage collection and yield without\n having to set up the heap in a state that can be garbage collected.\n\n The [`garbage_collect/2`](`erlang:garbage_collect/2`), and\n [`check_process_code/3`](`erlang:check_process_code/3`) BIFs have been\n introduced. Both taking an option list as last argument. Using these, one can\n issue asynchronous requests.\n\n `code:purge/1` and `code:soft_purge/1` have been rewritten to utilize\n asynchronous `check_process_code` requests in order to parallelize work.\n\n Characteristics impact: A call to the\n [`garbage_collect/1`](`garbage_collect/1`) BIF or the\n [`check_process_code/2`](`check_process_code/2`) BIF will normally take longer\n time to complete while the system as a whole won't be as much negatively\n effected by the operation as before. A call to `code:purge/1` and\n `code:soft_purge/1` may complete faster or slower depending on the state of\n the system while the system as a whole won't be as much negatively effected by\n the operation as before.\n\n Own Id: OTP-11388 Aux Id: OTP-11535, OTP-11648\n\n- Add sync option to file:open/2.\n\n The sync option adds the POSIX O_SYNC flag to the open system call on\n platforms that support the flag or its equivalent, e.g.,\n FILE_FLAG_WRITE_THROUGH on Windows. For platforms that don't support it,\n file:open/2 returns \\{error, enotsup\\} if the sync option is passed in. Thank\n to Steve Vinoski and Joseph Blomstedt\n\n Own Id: OTP-11498\n\n- The contract of `inet:ntoa/1` has been corrected.\n\n Thanks to Max Treskin.\n\n Own Id: OTP-11730","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.16.4.1 - Kernel Release Notes","ref":"notes.html#kernel-2-16-4-1"},{"type":"extras","doc":"- When using gen_tcp:connect and the `fd` option with `port` and/or `ip`, the\n `port` and `ip` options were ignored. This has been fixed so that if `port`\n and/or `ip` is specified together with `fd` a bind is requested for that `fd`.\n If `port` and/or `ip` is not specified bind will not be called.\n\n Own Id: OTP-12061","title":"Known Bugs and Problems - Kernel Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Kernel 2.16.4 - Kernel Release Notes","ref":"notes.html#kernel-2-16-4"},{"type":"extras","doc":"- Fix the typespec for the inet:ifget/2 and inet:ifget/3 return value. Thanks to\n Ali Sabil.\n\n Own Id: OTP-11377\n\n- Fix various typos in erts, kernel and ssh. Thanks to Martin Hässler.\n\n Own Id: OTP-11414\n\n- Fix rpc multicall sample code. Thanks to Edwin Fine.\n\n Own Id: OTP-11471\n\n- Under rare circumstances a process calling `inet:close/1`, `gen_tcp:close/1`,\n `gen_udp:close/1`, or `gen_sctp:close/1` could hang in the call indefinitely.\n\n Own Id: OTP-11491","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add more SCTP errors as described in RFC 4960. Thanks to Artem Teslenko.\n\n Own Id: OTP-11379\n\n- Add new BIF os:unsetenv/1 which deletes an environment variable. Thanks to\n Martin Hässler.\n\n Own Id: OTP-11446","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.16.3 - Kernel Release Notes","ref":"notes.html#kernel-2-16-3"},{"type":"extras","doc":"- Fix indentation of User switch command help in Erlang shell. Thanks to Sylvain\n Benner.\n\n Own Id: OTP-11209","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The previous undocumented function ntoa/1 has been added to inet docs and\n exported in the inet module.\n\n Own Id: OTP-10676 Aux Id: OTP-10314\n\n- Fix typo in abcast() function comment. Thanks to Johannes Weissl.\n\n Own Id: OTP-11219\n\n- Add application:ensure_all_started/1-2. Thanks to Fred Hebert.\n\n Own Id: OTP-11250\n\n- Make edlin understand a few important control keys. Thanks to Stefan\n Zegenhagen.\n\n Own Id: OTP-11251\n\n- Cleanup of hipe_unified_loader, eliminating uses of is_subtype/2 in specs,\n change module-local void functions to return 'ok' instead of [] and made sure\n there are no dialyzer warnings with --Wunmatched_returns. Thanks to Kostis\n Sagonas.\n\n Own Id: OTP-11301","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.16.2 - Kernel Release Notes","ref":"notes.html#kernel-2-16-2"},{"type":"extras","doc":"- A bug in prim_inet has been corrected. If the port owner was killed at a bad\n time while closing the socket port the port could become orphaned hence\n causing port and socket leaking. Reported by Fred Herbert, Dmitry Belyaev and\n others.\n\n Own Id: OTP-10497 Aux Id: OTP-10562\n\n- A few bugs regarding case sensitivity for hostname resolution while using e.g\n the internal lookup types 'file' and 'dns' has been corrected. When looking up\n hostnames ASCII letters a-z are to be regarded as the same as A-Z according to\n RFC 4343 \"Domain Name System (DNS) Case Insensitivity Clarification\", and this\n was not always the case.\n\n Own Id: OTP-10689 Aux Id: seq12227","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Add `application:ensure_started/1,2`. It is equivavlent to\n `application:start/1,2` except it returns `ok` for already started\n applications.\n\n Own Id: OTP-10910\n\n- Optimize communication with file io server. Thanks to Anthony Ramine.\n\n Own Id: OTP-11040\n\n- Erlang source files with non-ASCII characters are now encoded in UTF-8\n (instead of latin1).\n\n Own Id: OTP-11041 Aux Id: OTP-10907\n\n- Optimization of simultaneous `inet_db` operations on the same socket by using\n a lock free implementation.\n\n Impact on the characteristics of the system: Improved performance.\n\n Own Id: OTP-11074\n\n- The `high_msgq_watermark` and `low_msgq_watermark` `inet` socket options\n introduced in OTP-R16A could only be set on TCP sockets. These options are now\n generic and can be set on all types of sockets.\n\n Own Id: OTP-11075 Aux Id: OTP-10336\n\n- Fix deep list argument error under Windows in os:cmd/1. Thanks to Aleksandr\n Vinokurov .\n\n Own Id: OTP-11104","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.16.1 - Kernel Release Notes","ref":"notes.html#kernel-2-16-1"},{"type":"extras","doc":"- A bug that could cause a crash with wrong reason has been corrected in the\n `application_controller` module.\n\n Own Id: OTP-10754\n\n- Fix `code:is_module_native/1` that sometimes in R16A returned false for hipe\n compiled modules containing BIFs such as `lists`.\n\n Own Id: OTP-10870\n\n- Respect `{exit_on_close,false}` option on tcp socket in non-passive mode when\n receiving fails (due to an ill-formed packet for example) by only doing a half\n close and still allow sending on the socket. (Thanks to Anthony Molinaro and\n Steve Vinoski for reporting the problem)\n\n Own Id: OTP-10879","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Slightly nicer error message when node start fails due to duplicate name.\n Thanks to Magnus Henoch.\n\n Own Id: OTP-10797\n\n- Miscellaneous updates due to Unicode support.\n\n Own Id: OTP-10820\n\n- Add a new function code:get_mode() can be used to detect how the code servers\n behaves. Thanks to Vlad Dumitrescu\n\n Own Id: OTP-10823\n\n- Fix type of error Reason on gen_tcp:send/2. Thanks to Sean Cribbs.\n\n Own Id: OTP-10839\n\n- `file:list_dir_all/1` and `file:read_link_all/1` that can handle raw file\n names have been added. See the User Guide for STDLIB for information about raw\n file names.\n\n Own Id: OTP-10852","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.16 - Kernel Release Notes","ref":"notes.html#kernel-2-16"},{"type":"extras","doc":"- It is no longer possible to have `{Mod,Vsn}` in the 'modules' list in a .app\n file.\n\n This was earlier possible, although never documented in the .app file\n reference manual. It was however visible in the documentation of\n `application:load/[1,2]`, where the same term as in a .app file can be used as\n the first argument.\n\n The possibility has been removed since the `Vsn` part was never used.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10417\n\n- The contract of `erl_ddll:format_error/1` has been corrected. (Thanks to\n Joseph Wayne Norton.)\n\n Own Id: OTP-10473\n\n- Change printout of application crash message on startup to formatted strings\n (Thanks to Serge Aleynikov)\n\n Own Id: OTP-10620\n\n- The type `ascii_string()` in the `base64` module has been corrected. The type\n [`file:file_info()`](`t:file:file_info/0`) has been cleaned up. The type\n [`file:fd()`](`t:file:fd/0`) has been made opaque in the documentation.\n\n Own Id: OTP-10624 Aux Id: kunagi-352 \\[263]","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Inet exported functionality\n\n inet:parse_ipv4_address/1, inet:parse_ipv4strict_address/1,\n inet:parse_ipv6_address/1, inet:parse_ipv6strict_address/1,\n inet:parse_address/1 and inet:parse_strict_address is now exported from the\n inet module.\n\n Own Id: OTP-8067 Aux Id: kunagi-274 \\[185]\n\n- A boolean socket option 'ipv6_v6only' for IPv6 sockets has been added. The\n default value of the option is OS dependent, so applications aiming to be\n portable should consider using `{ipv6_v6only,true}` when creating an `inet6`\n listening/destination socket, and if necessary also create an `inet` socket on\n the same port for IPv4 traffic. See the documentation.\n\n Own Id: OTP-8928 Aux Id: kunagi-193 \\[104]\n\n- Support for Unicode has been implemented.\n\n Own Id: OTP-10302\n\n- The documentation for `global:register_name/3` has been updated to mention\n that the use of `{Module,Function}` as the method argument (resolve function)\n is deprecated.\n\n Own Id: OTP-10419\n\n- Fixed bug where sendfile on oracle solaris would return an error when a\n partial send was done.\n\n Own Id: OTP-10549\n\n- The `error_handler` module will now call `'$handle_undefined_function'/2` if\n an attempt is made to call a non-existing function in a module that exists.\n See the documentation for `error_handler` module for details.\n\n Own Id: OTP-10617 Aux Id: kunagi-340 \\[251]\n\n- Where necessary a comment stating encoding has been added to Erlang files. The\n comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630\n\n- Do not return wrong terms unnecessarily. (Thanks to Kostis Sagonas.)\n\n Own Id: OTP-10662\n\n- Some examples overflowing the width of PDF pages have been corrected.\n\n Own Id: OTP-10665\n\n- Add file:allocate/3 operation\n\n This operation allows pre-allocation of space for files. It succeeds only on\n systems that support such operation. (Thanks to Filipe David Manana)\n\n Own Id: OTP-10680\n\n- Add application:get_key/3. The new function provides a default value for a\n configuration parameter. Thanks to Serge Aleynikov.\n\n Own Id: OTP-10694\n\n- Add search to Erlang shell's history. Thanks to Fred Herbert.\n\n Own Id: OTP-10739","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.15.3 - Kernel Release Notes","ref":"notes.html#kernel-2-15-3"},{"type":"extras","doc":"- Ensure 'erl_crash.dump' when asked for it. This will change erl_crash.dump\n behaviour.\n\n \\* Not setting ERL_CRASH_DUMP_SECONDS will now terminate beam immediately on a\n crash without writing a crash dump file.\n\n \\* Setting ERL_CRASH_DUMP_SECONDS to 0 will also terminate beam immediately on\n a crash without writing a crash dump file, i.e. same as not setting\n ERL_CRASH_DUMP_SECONDS environment variable.\n\n \\* Setting ERL_CRASH_DUMP_SECONDS to a negative value will let the beam wait\n indefinitely on the crash dump file being written.\n\n \\* Setting ERL_CRASH_DUMP_SECONDS to a positive value will let the beam wait\n that many seconds on the crash dump file being written.\n\n A positive value will set an alarm/timeout for restart both in beam and in\n heart if heart is running.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-10422 Aux Id: kunagi-250 \\[161]","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.15.2 - Kernel Release Notes","ref":"notes.html#kernel-2-15-2"},{"type":"extras","doc":"- Fixed issue where using controlling_process/2 with self() as the second\n argument caused the port to leak if self() crashes. (Thanks to Ricardo\n Catalinas Jiménez)\n\n Own Id: OTP-10094\n\n- When sending large files using the file:sendfile fallback file:sendfile would\n crash. This is now fixed.\n\n Own Id: OTP-10098\n\n- Fix rpc:call/5 for local calls with a finite Timeout (Thanks to Tomer\n Chachamu)\n\n Own Id: OTP-10149\n\n- fix escript/primary archive reloading\n\n If the mtime of an escript/primary archive file changes after being added to\n the code path, correctly reload the archive and update the cache. (Thanks to\n Tuncer Ayaz)\n\n Own Id: OTP-10151\n\n- Support added for home directories named with non-ASCII characters (codepoints\n above 127) on a system running in Unicode file mode (e.g. on MacOSX or Linux\n with startup arguments +fnu or +fna with the right LOCALE). Also environment\n variables with Unicode content are supported in applicable environments.\n\n Own Id: OTP-10160\n\n- Allow mixed IPv4 and IPv6 addresses to sctp_bindx\n\n Also allow mixed address families to bind, since the first address on a\n multihomed sctp socket must be bound with bind, while the rest are to be bound\n using sctp_bindx. At least Linux supports adding address of mixing families.\n Make inet_set_faddress function available also when HAVE_SCTP is not defined,\n since we use it to find an address for bind to be able to mix ipv4 and ipv6\n addresses. Thanks to Tomas Abrahamsson\n\n Own Id: OTP-10217","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Document inet options: high_watermark, priority, linger and a some other\n options that previously was undocumented.\n\n Own Id: OTP-10053\n\n- Remove bit8 option support from inet\n\n Own Id: OTP-10056\n\n- The type of the disk log header has been corrected. (Thanks to Niclas Eklund.)\n\n Own Id: OTP-10131","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.15.1 - Kernel Release Notes","ref":"notes.html#kernel-2-15-1"},{"type":"extras","doc":"- Driver output has been corrected so output of large binaries (> 4 GiB) now\n does not silently fail or crash the emulator, but either outputs the binary or\n fails the call. This means that writing a binary > 4 Gib to file now works but\n on e.g 64-bit Windows (that has scatter/gather I/O buffer segment lengths of\n 32 bits) fails. The behaviour may change in the future to always write the\n binary, in parts if necessary.\n\n Own Id: OTP-9820 Aux Id: OTP-9795\n\n- erts: minor fix for unnecessary condition erts: change SENDFILE_CHUNK_SIZE\n from signed to unsigned (Thanks to jovi zhang)\n\n Own Id: OTP-9872\n\n- Two contracts in `gen_sctp` have been corrected.\n\n Own Id: OTP-9874\n\n- If a process calls a module with an running on_load handler, the process is\n supposed to be suspended. But if the module with the on_load handler was\n loading used `code:load_binary/3`, the call would instead fail with an `undef`\n exception.\n\n Own Id: OTP-9875\n\n- File name and error reason is now returned if creation of a cookie fails.\n (Thanks to Magnus Henoch)\n\n Own Id: OTP-9954\n\n- Fix port leak in `zlib` when passing invalid data to\n `compress,uncompress,zip,unzip,gzip,gunzip`.\n\n Own Id: OTP-9981\n\n- Various typographical errors corrected in documentation for the global,\n error_logger, etop, lists, ets and supervisor modules and in the c_portdriver\n and kernel_app documentation. (Thanks to Ricardo Catalinas Jiménez)\n\n Own Id: OTP-9987\n\n- Fix returned error from gen_tcp:accept/1,2 when running out of ports.\n\n The \\{error, enfile\\} return value is badly misleading and confusing for this\n case, since the Posix ENFILE errno value has a well-defined meaning that has\n nothing to do with Erlang ports. The fix changes the return value to \\{error,\n system_limit\\}, which is consistent with e.g. various file(3) functions.\n inet:format_error/1 has also been updated to support system_limit in the same\n manner as file:format_error/1. (Thanks to Per Hedeland)\n\n Own Id: OTP-9990\n\n- `erts_debug:size/1` has been corrected to take sharing in the environment of\n funs into account. For funs it used to always give the same result as\n `erts_debug:flat_size/1`.\n\n Own Id: OTP-9991\n\n- In some cases when the process doing file:sendfile crashes while sending the\n file the efile_drv code would not clean up after itself correctly. This has\n now been fixed.\n\n Own Id: OTP-9993\n\n- On BSD based platforms file:sendfile would sometime go into an infinite loop\n when sending big files. This has now been fixed.\n\n Own Id: OTP-9994\n\n- While `disk_log` eagerly collects logged terms for better performance,\n collecting too much data may choke the system and cause huge binaries to be\n written.\n\n The problem was addressed in OTP-9764, but the situation was not improved in\n all cases.\n\n (Thanks to Richard Carlsson.)\n\n Own Id: OTP-9999 Aux Id: OTP-9764\n\n- The documentation of .app files incorrectly said that the default value for\n the `mod` parameter is `undefined`. This is now corrected to `[]`.\n\n Own Id: OTP-10002","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.15 - Kernel Release Notes","ref":"notes.html#kernel-2-15"},{"type":"extras","doc":"- Calls to `global:whereis_name/1` have been substituted for calls to\n `global:safe_whereis_name/1` since the latter is not safe at all.\n\n The reason for not doing this earlier is that setting a global lock masked out\n a bug concerning the restart of supervised children. The bug has now been\n fixed by a modification of `global:whereis_name/1`. (Thanks to Ulf Wiger for\n code contribution.)\n\n A minor race conditions in `gen_fsm:start*` has been fixed: if one of these\n functions returned `{error, Reason}` or ignore, the name could still be\n registered (either locally or in `global`. (This is the same modification as\n was done for gen_server in OTP-7669.)\n\n The undocumented function `global:safe_whereis_name/1` has been removed.\n\n Own Id: OTP-9212 Aux Id: seq7117, OTP-4174\n\n- Honor option `packet_size` for http packet parsing by both TCP socket and\n `erlang:decode_packet`. This gives the ability to accept HTTP headers larger\n than the default setting, but also avoid DoS attacks by accepting lines only\n up to whatever length you wish to allow. For consistency, packet type `line`\n also honor option `packet_size`. (Thanks to Steve Vinoski)\n\n Own Id: OTP-9389\n\n- `disk_log:reopen/2,3` and `disk_log:breopen/3` could return the error reason\n from `file:rename/2` rather than the reason `{file_error, Filename, Reason}`.\n This bug has been fixed.\n\n The message `{disk_log, Node, {error, disk_log_stopped}}` which according the\n documentation is sent upon failure to truncate or reopen a disk log was\n sometimes turned into a reply. This bug has been fixed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9508\n\n- Environment variable 'shutdown_timeout' is added to kernel application.\n Earlier, application_controller would hang forever if an application top\n supervisor did not terminate upon a shutdown request. If this new environment\n variable is set to a positive integer T, then application controller will now\n give up after T milliseconds and instead brutally kill the application. For\n backwards compatibility, the default value for shutdown_timeout is 'infinity'.\n\n Own Id: OTP-9540\n\n- Add '-callback' attributes in stdlib's behaviours\n\n Replace the behaviour_info(callbacks) export in stdlib's behaviours with\n -callback' attributes for all the callbacks. Update the documentation with\n information on the callback attribute Automatically generate 'behaviour_info'\n function from '-callback' attributes\n\n 'behaviour_info(callbacks)' is a special function that is defined in a module\n which describes a behaviour and returns a list of its callbacks.\n\n This function is now automatically generated using the '-callback' specs. An\n error is returned by lint if user defines both '-callback' attributes and the\n behaviour_info/1 function. If no type info is needed for a callback use a\n generic spec for it. Add '-callback' attribute to language syntax\n\n Behaviours may define specs for their callbacks using the familiar spec\n syntax, replacing the '-spec' keyword with '-callback'. Simple lint checks are\n performed to ensure that no callbacks are defined twice and all types referred\n are declared.\n\n These attributes can be then used by tools to provide documentation to the\n behaviour or find discrepancies in the callback definitions in the callback\n module.\n\n Add callback specs into 'application' module in kernel Add callback specs to\n tftp module following internet documentation Add callback specs to\n inets_service module following possibly deprecated comments\n\n Own Id: OTP-9621\n\n- make tab completion work in remote shells (Thanks to Mats Cronqvist)\n\n Own Id: OTP-9673\n\n- Add missing parenthesis in heart doc.\n\n Add missing spaces in the Reference Manual distributed section.\n\n In the HTML version of the doc those spaces are necessary to separate those\n words.\n\n Own Id: OTP-9693\n\n- Fixes net_kernel:get_net_ticktime() doc\n\n Adds missing description when \\`ignored' is returned. (Thanks to Ricardo\n Catalinas Jiménez )\n\n Own Id: OTP-9713\n\n- While `disk_log` eagerly collects logged terms for better performance,\n collecting too much data may choke the system and cause huge binaries to be\n written. In order to remedy the situation a (small) limit on the amount of\n data that is collected before writing to disk has been introduced.\n\n Own Id: OTP-9764\n\n- - Correct callback spec in application module\n - Refine warning about callback specs with extra ranges\n - Cleanup autoimport compiler directives\n - Fix Dialyzer's warnings in typer\n - Fix Dialyzer's warning for its own code\n - Fix bug in Dialyzer's behaviours analysis\n - Fix crash in Dialyzer\n - Variable substitution was not generalizing any unknown variables.\n\n Own Id: OTP-9776\n\n- Fix a crash when file:change_time/2,3 are called with invalid dates\n\n Calling file:change_time/2,3 with an invalid date tuple (e.g\n file:change_time(\"file.txt\", \\{undefined, undefined\\})) will cause\n file_server_2 to crash. error_logger will shutdown and the whole VM will stop.\n Change behavior to validate given dates on system boundaries. (i.e before\n issuing a server call).(Thanks to Ahmed Omar)\n\n Own Id: OTP-9785","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- An option list argument can now be passed to\n `file:read_file_info/2, file:read_link_info/2` and `file:write_file_info/3`\n and set time type information in the call. Valid options are\n `{time, local}, {time, universal}` and `{time, posix}`. In the case of `posix`\n time no conversions are made which makes the operation a bit faster.\n\n Own Id: OTP-7687\n\n- `file:list_dir/1,2` will now fill an buffer entire with filenames from the\n efile driver before sending it to an erlang process. This will speed up this\n file operation in most cases.\n\n Own Id: OTP-9023\n\n- gen_sctp:open/0-2 may now return \\{error,eprotonosupport\\} if SCTP is not\n supported\n\n gen_sctp:peeloff/1 has been implemented and creates a one-to-one socket which\n also are supported now\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9239\n\n- Sendfile has been added to the file module's API. sendfile/2 is used to read\n data from a file and send it to a tcp socket using a zero copying mechanism if\n available on that OS.\n\n Thanks to Tuncer Ayaz and Steve Vinovski for original implementation\n\n Own Id: OTP-9240\n\n- Tuple funs (a two-element tuple with a module name and a function) are now\n officially deprecated and will be removed in R16. Use '`fun M:F/A`' instead.\n To make you aware that your system uses tuple funs, the very first time a\n tuple fun is applied, a warning will be sent to the error logger.\n\n Own Id: OTP-9649","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.14.5 - Kernel Release Notes","ref":"notes.html#kernel-2-14-5"},{"type":"extras","doc":"- Fix type of Packet arg of gen_tcp:send/2 and gen_udp:send/4\n\n The type is marked as a binary() or a string() but in practice it can be an\n iodata(). The test suite was updated to confirm the gen_tcp/2 and\n gen_udp:send/4 functions accept iodata() (iolists) packets. (Thanks to Filipe\n David Manana)\n\n Own Id: OTP-9514\n\n- XML files have been corrected.\n\n Own Id: OTP-9550 Aux Id: OTP-9541","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The types and specifications of the inet modules have been improved.\n\n Own Id: OTP-9260\n\n- Types and specifications have been added.\n\n Own Id: OTP-9356\n\n- Contracts in STDLIB and Kernel have been improved and type errors have been\n corrected.\n\n Own Id: OTP-9485\n\n- Update documentation and specifications of some of the zlib functions.\n\n Own Id: OTP-9506","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.14.4 - Kernel Release Notes","ref":"notes.html#kernel-2-14-4"},{"type":"extras","doc":"- The send_timeout option in gen_tcp did not work properly in active mode or\n with \\{active,once\\} options. This is now corrected.\n\n Own Id: OTP-9145\n\n- Fixed various typos across the documentation (Thanks to Tuncer Ayaz)\n\n Own Id: OTP-9154\n\n- Fix typo in doc of rpc:pmap/3 (Thanks to Ricardo Catalinas Jiménez)\n\n Own Id: OTP-9168\n\n- A bug in inet_res, the specialized DNS resolver, has been corrected. A late\n answer with unfortunate timing could cause a runtime exception. Some code\n cleanup and improvements also tagged along. Thanks to Evegeniy Khramtsov for a\n pinpointing bug report and bug fix testing.\n\n Own Id: OTP-9221 Aux Id: OTP-8712","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Types and specifications have been added.\n\n Own Id: OTP-9268\n\n- Erlang types and specifications are used for documentation.\n\n Own Id: OTP-9272\n\n- Two opaque types that could cause warnings when running Dialyzer have been\n modified.\n\n Own Id: OTP-9337","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.14.3 - Kernel Release Notes","ref":"notes.html#kernel-2-14-3"},{"type":"extras","doc":"- `os:find_executable/{1,2}` will no longer return the path of a directory that\n happens to be in the PATH.\n\n Own Id: OTP-8983 Aux Id: seq11749\n\n- Fix -spec for file:write_file/3\n\n Change type for second parameter from binary() to iodata(), since the function\n explicitly takes steps to accept lists as well as binaries. (thanks to Magnus\n Henoch).\n\n Own Id: OTP-9067\n\n- Sanitize the specs of the code module\n\n After the addition of unicode_binary() to the file:filename() type, dialyzer\n started complaining about erroneous or incomplete specs in some functions of\n the 'code' module. The culprit was hard-coded information in erl_bif_types for\n functions of this module, which were not updated. Since these functions have\n proper specs these days and code duplication (pun intended) is never a good\n idea, their type information was removed from erl_bif_types.\n\n While doing this, some erroneous comments were fixed in the code module and\n also made sure that the code now runs without dialyzer warnings even when the\n -Wunmatched_returns option is used.\n\n Some cleanups were applied to erl_bif_types too.\n\n Own Id: OTP-9100\n\n- \\- Add spec for function that does not return - Strengthen spec - Introduce\n types to avoid duplication in specs - Add specs for functions that do not\n return - Add specs for behaviour callbacks - Simplify two specs\n\n Own Id: OTP-9127","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.14.2 - Kernel Release Notes","ref":"notes.html#kernel-2-14-2"},{"type":"extras","doc":"- The Erlang VM now supports Unicode filenames. The feature is turned on by\n default on systems where Unicode filenames are mandatory (Windows and MacOSX),\n but can be enabled on other systems with the '+fnu' emulator option. Enabling\n the Unicode filename feature on systems where it is not default is however\n considered experimental and not to be used for production. Together with the\n Unicode file name support, the concept of \"raw filenames\" is introduced, which\n means filenames provided without implicit unicode encoding translation. Raw\n filenames are provided as binaries, not lists. For further information, see\n stdlib users guide and the chapter about using Unicode in Erlang. Also see the\n file module manual page.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8887\n\n- There is now a new function inet:getifaddrs/0 modeled after C library function\n getifaddrs() on BSD and LInux that reports existing interfaces and their\n addresses on the host. This replaces the undocumented and unsupported\n inet:getiflist/0 and inet:ifget/2.\n\n Own Id: OTP-8926","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.14.1.1 - Kernel Release Notes","ref":"notes.html#kernel-2-14-1-1"},{"type":"extras","doc":"- In embedded mode, on_load handlers that called `code:priv_dir/1` or other\n functions in `code` would hang the system. Since the `crypto` application now\n contains an on_loader handler that calls `code:priv_dir/1`, including the\n `crypto` application in the boot file would prevent the system from starting.\n\n Also extended the `-init_debug` option to print information about on_load\n handlers being run to facilitate debugging.\n\n Own Id: OTP-8902 Aux Id: seq11703","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.14.1 - Kernel Release Notes","ref":"notes.html#kernel-2-14-1"},{"type":"extras","doc":"- Fixed: inet:setopts(S, \\[\\{linger,\\{true,2\\}\\}]) returned \\{error,einval\\} for\n SCTP sockets. The inet_drv had a bug when checking the option size.\n\n Own Id: OTP-8726 Aux Id: seq11617\n\n- gen_udp:connect/3 was broken for SCTP enabled builds. It did not detect remote\n end errors as it should.\n\n Own Id: OTP-8729\n\n- reference() has been substituted for ref() in the documentation.\n\n Own Id: OTP-8733\n\n- A bug introduced in kernel-2.13.5.3 has been fixed. If running\n `net_kernel:set_net_ticktime/1` twice within the `TransitionPerod` the second\n call caused the net_kernel process to crash with a `badmatch`.\n\n Own Id: OTP-8787 Aux Id: seq11657, OTP-8643\n\n- inet:getsockopt for SCTP sctp_default_send_param had a bug to not initialize\n required feilds causing random answers. It is now corrected.\n\n Own Id: OTP-8795 Aux Id: seq11655\n\n- For a socket in the HTTP packet mode, the return value from `gen_tcp:recv/2,3`\n if there is an error in the header will be `{ok,{http_error,String}}` instead\n of `{error,{http_error,String}}` to be consistent with `ssl:recv/2,3`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8831","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Even when configuring erlang with --enable-native-libs, the native code for\n modules loaded very early (such as lists) would not get loaded. This has been\n corrected. (Thanks to Paul Guyot.)\n\n Own Id: OTP-8750\n\n- The undocumented function inet:ifget/2 has been improved to return interface\n hardware address (MAC) on platforms supporting getaddrinfo() (such as BSD\n unixes). Note it still does not work on all platforms for example not Windows\n nor Solaris, so the function is still undocumented.\n\n Buffer overflow and field init bugs for inet:ifget/2 and inet:getservbyname/2\n has also been fixed.\n\n Thanks to Michael Santos.\n\n Own Id: OTP-8816\n\n- As a usability improvement the 'inet6' option to functions gen_tcp:listen/2,\n gen_tcp:connect/3-4, gen_udp:open/2 and gen_sctp:open/1-2 is now implicit if\n the address argument or the 'ip' option contain an IPv6 address (8-tuple).\n\n Own Id: OTP-8822","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.14 - Kernel Release Notes","ref":"notes.html#kernel-2-14"},{"type":"extras","doc":"- os:find_executable can now be fed with the complete name of the executable on\n Windows and still find it. I.e os:find_executable(\"werl.exe\") will work as\n os:find_executable(\"werl\").\n\n Own Id: OTP-3626\n\n- The shell's line editing has been improved to more resemble the behaviour of\n readline and other shells. (Thanks to Dave Peticolas)\n\n Own Id: OTP-8635\n\n- Under certain circumstances the net kernel could hang. (Thanks to Scott Lystig\n Fritchie.)\n\n Own Id: OTP-8643 Aux Id: seq11584\n\n- The kernel DNS resolver was leaking one or two ports if the DNS reply could\n not be parsed or if the resolver(s) caused noconnection type errors. Bug now\n fixed. A DNS specification borderline truncated reply triggering the port\n leakage bug has also been fixed.\n\n Own Id: OTP-8652","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- As of this version, the global name server no longer supports nodes running\n Erlang/OTP R11B.\n\n Own Id: OTP-8527\n\n- The file module's functions write,read and read_line now handles named\n io_servers like 'standard_io' and 'standard_error' correctly.\n\n Own Id: OTP-8611\n\n- The functions file:advise/4 and file:datasync/1 have been added. (Thanks to\n Filipe David Manana.)\n\n Own Id: OTP-8637\n\n- When exchanging groups between nodes `pg2` did not remove duplicated members.\n This bug was introduced in R13B03 (kernel-2.13.4).\n\n Own Id: OTP-8653\n\n- There is a new option 'exclusive' to file:open/2 that uses the OS O_EXCL flag\n where supported to open the file in exclusive mode.\n\n Own Id: OTP-8670","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.13.5.3 - Kernel Release Notes","ref":"notes.html#kernel-2-13-5-3"},{"type":"extras","doc":"- A bug introduced in Kernel 2.13.5.2 has been fixed.\n\n Own Id: OTP-8686 Aux Id: OTP-8643","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.13.5.2 - Kernel Release Notes","ref":"notes.html#kernel-2-13-5-2"},{"type":"extras","doc":"- Under certain circumstances the net kernel could hang. (Thanks to Scott Lystig\n Fritchie.)\n\n Own Id: OTP-8643 Aux Id: seq11584","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.13.5.1 - Kernel Release Notes","ref":"notes.html#kernel-2-13-5-1"},{"type":"extras","doc":"- A race condition in `os:cmd/1` could cause the caller to get stuck in\n `os:cmd/1` forever.\n\n Own Id: OTP-8502","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.13.5 - Kernel Release Notes","ref":"notes.html#kernel-2-13-5"},{"type":"extras","doc":"- A race bug affecting `pg2:get_local_members/1` has been fixed. The bug was\n introduced in R13B03.\n\n Own Id: OTP-8358\n\n- The loading of native code was not properly atomic in the SMP emulator, which\n could cause crashes. Also a per-MFA information table for the native code has\n now been protected with a lock since it turns that it could be accessed\n concurrently in the SMP emulator. (Thanks to Mikael Pettersson.)\n\n Own Id: OTP-8397\n\n- user.erl (used in oldshell) is updated to handle unicode in prompt strings\n (io:get_line/\\{1,2\\}). io_lib is also updated to format prompts with the 't'\n modifier (i.e. ~ts instead of ~s).\n\n Own Id: OTP-8418 Aux Id: OTP-8393\n\n- The resolver routines failed to look up the own node name as hostname, if the\n OS native resolver was erroneously configured, bug reported by Yogish Baliga,\n now fixed.\n\n The resolver routines now tries to parse the hostname as an IP string as most\n OS resolvers do, unless the native resolver is used.\n\n The DNS resolver inet_res and file resolver inet_hosts now do not read OS\n configuration files until they are needed. Since the native resolver is\n default, in most cases they are never needed.\n\n The DNS resolver's automatic updating of OS configuration file data\n (/etc/resolv.conf) now uses the 'domain' keyword as default search domain if\n there is no 'search' keyword.\n\n Own Id: OTP-8426 Aux Id: OTP-8381","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The expected return value for an on_load function has been changed. (See the\n section about code loading in the Reference manual.)\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-8339\n\n- Explicit top directories in archive files are now optional.\n\n For example, if an archive (app-vsn.ez) just contains an app-vsn/ebin/mod.beam\n file, the file info for the app-vsn and app-vsn/ebin directories are faked\n using the file info from the archive file as origin. The virtual directories\n can also be listed. For short, the top directories are virtual if they does\n not exist.\n\n Own Id: OTP-8387\n\n- `code:clash/0` now looks inside archives (.ez files). (Thanks to Tuncer Ayaz.)\n\n Own Id: OTP-8413\n\n- There are new `gen_sctp:connect_init/*` functions that initiate an SCTP\n connection without blocking for the result. The result is delivered\n asynchronously as an sctp_assoc_change event. (Thanks to Simon Cornish.)\n\n Own Id: OTP-8414","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.13.4 - Kernel Release Notes","ref":"notes.html#kernel-2-13-4"},{"type":"extras","doc":"- A link in `m:pg2` has been fixed. (Thanks to Christophe Romain.)\n\n Own Id: OTP-8198\n\n- A ticker process could potentially be blocked indefinitely trying to send a\n tick to a node not responding. If this happened, the connection would not be\n brought down as it should.\n\n Own Id: OTP-8218\n\n- A bug in `pg2` when members who died did not leave process groups has been\n fixed. (Thanks to Matthew Dempsky.)\n\n Own Id: OTP-8259","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the frames are removed.\n\n Own Id: OTP-8201\n\n- The top directory in archive files does not need to have a `-vsn` suffix\n anymore. For example if the archive file has the name like `mnesia-4.4.7.ez`\n the top directory in the archive can either be named `mnesia` or\n `mnesia-4.4.7`. If the archive file has a name like `mnesia.ez` the top\n directory in the archive must be named `mnesia` as earlier.\n\n Own Id: OTP-8266\n\n- The -on_load() directive can be used to run a function when a module is\n loaded. It is documented in the section about code loading in the Reference\n Manual.\n\n Own Id: OTP-8295","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.13.3 - Kernel Release Notes","ref":"notes.html#kernel-2-13-3"},{"type":"extras","doc":"- The DNS resolver client inet_res has been rewritten, documented and released.\n See inet_res(3) and Erts User's Guide: Inet configuration.\n\n It can formally not be incompatible with respect to earlier versions since\n there was no earlier official version. However it was used before and some\n details have changed.\n\n Configuration now initializes from /etc/resolv.conf and /etc/hosts on all unix\n platforms regardless of which distribution mode the node is started in. The\n directory (/etc) these files are supposed to reside in can be changed via an\n environment variable. These configuration file locations can also be changed\n in the inet configuration. The files are monitored for change and re-read,\n which makes a few resolver configuration variables out of application control.\n The /etc/hosts entries have now their own cache table that is shadowed (with\n lookup method 'file' is used) by the application configured host entries. This\n problem (that inet_res configuration only worked for distribution mode long\n names) was among other reported by Matthew O'Gorman many moons ago.\n\n The lookup methods are still 'native' only per default. Resolver configuration\n is done on all Unix platforms just to get a usable configuration for direct\n calls to inet_res.\n\n The functions `inet_res:nslookup/3..5` and `inet_res:nnslookup/4..4` are no\n longer recommended to use, instead use `inet_res:lookup/3..5` and\n `inet_res:resolve/3..5` which provide clearer argument types and the\n possibility to override options in the call.\n\n Users of previous unsupported versions of inet_res have included internal\n header files to get to the internal record definitions in order to examine DNS\n replies. This is still unsupported and there are access functions in inet_dns\n to use instead. These are documented in inet_res(3).\n\n Bug fix: a compression reference loop would make DNS message decoding loop\n forever. Problem reported by Florian Weimer.\n\n Bug fix and patch suggestion by Sergei Golovan: configuring IPv6 nameservers\n did not work. His patch (as he warned) created many UDP sockets; one per\n nameserver. This has been fixed in the released version.\n\n Improvement: `inet_res` is now EDNS0 capable. The current implementation is\n simple and does not probe and cache EDNS info for nameservers, which a fully\n capable implementation probably should do. EDNS has to be enabled via resolver\n configuration, and if a nameserver replies that it does not support EDNS,\n `inet_res` falls back to a regular DNS query.\n\n Improvement: now `inet_res` automatically falls back to TCP if it gets a\n truncated answer from a nameserver.\n\n Warning: some of the ancient and exotic record types handled by `inet_res` and\n `inet_dns` are not supported by current versions of BIND, so they could not be\n tested after the rewrite, with reasonable effort, e.g MD, MF, NULL, and SPF.\n The risk for bugs in these particular records is still low since their code is\n mostly shared with other tested record types.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7955 Aux Id: OTP-7107 OTP-6852\n\n- A TCP socket with option `{packet,4}` could crash the emulator if it received\n a packet header with a very large size value (>2Gb). The same bug caused\n `erlang:decode_packet/3` to return faulty values. (Thanks to Georgos Seganos.)\n\n Own Id: OTP-8102\n\n- The file module has now a read_line/1 function similar to the io:get_line/2,\n but with byte oriented semantics. The function file:read_line/1 works for raw\n files as well, but for good performance it is recommended to use it together\n with the 'read_ahead' option for raw file access.\n\n Own Id: OTP-8108","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.13.2 - Kernel Release Notes","ref":"notes.html#kernel-2-13-2"},{"type":"extras","doc":"- A bug when doing io:get_line (among other calls) from a file opened with\n encoding other than latin1, causing false unicode errors to occur, is now\n corrected.\n\n Own Id: OTP-7974","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Added functionality to get higher resolution timestamp from system. The\n erlang:now function returns a timestamp that's not always consistent with the\n actual operating system time (due to resilience against large time changes in\n the operating system). The function os:timestamp/0 is added to get a similar\n timestamp as the one being returned by erlang:now, but untouched by Erlangs\n time correcting and smoothing algorithms. The timestamp returned by\n os:timestamp is always consistent with the operating systems view of time,\n like the calendar functions for getting wall clock time, but with higher\n resolution. Example of usage can be found in the os manual page.\n\n Own Id: OTP-7971","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.13.1 - Kernel Release Notes","ref":"notes.html#kernel-2-13-1"},{"type":"extras","doc":"- Many concurrent calls to `os:cmd/1` will only block one scheduler thread at a\n time, making an smp emulator more responsive if the OS is slow forking\n processes.\n\n Own Id: OTP-7890 Aux Id: seq11219\n\n- Fixed hanging early RPC that did IO operation during node start.\n\n Own Id: OTP-7903 Aux Id: seq11224\n\n- The error behavior of gen_tcp and gen_udp has been corrected.\n gen_tcp:connect/3,4 and gen_udp:send/4 now returns \\{error,eafnosupport\\} for\n conflicting destination address versus socket address family. Other corner\n cases for IP address string host names combined with not using the native (OS)\n resolver (which is not default) has also been changed to return\n \\{error,nxdomain\\} instead of \\{error,einval\\}. Those changes just may\n surprise old existing code. gen_tcp:listen/2 and gen_udp:open/2 now fails for\n conflicting local address versus socket address family instead of trying to\n use an erroneous address. Problem reported by Per Hedeland.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7929","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Several glitches and performance issues in the Unicode and I/O-system\n implementation of R13A have been corrected.\n\n Own Id: OTP-7896 Aux Id: OTP-7648 OTP-7887\n\n- The unsupported DNS resolver client inet_res has now been improved to handle\n NAPTR queries.\n\n Own Id: OTP-7925 Aux Id: seq11231","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.13 - Kernel Release Notes","ref":"notes.html#kernel-2-13"},{"type":"extras","doc":"- The old Erlang DNS resolver inet_res has been corrected to handle TXT records\n with more than one character string. Patch courtesy of Geoff Cant.\n\n Own Id: OTP-7588\n\n- When chunk reading a disk log opened in read_only mode, bad terms could crash\n the disk log process.\n\n Own Id: OTP-7641 Aux Id: seq11090\n\n- `gen_tcp:send()` did sometimes (only observed on Solaris) return\n `{error,enotconn}` instead of the expected `{error,closed}` as the peer socket\n had been explicitly closed.\n\n Own Id: OTP-7647\n\n- The gen_sctp option sctp_peer_addr_params,\n #sctp_paddrparams\\{address=\\{IP,Port\\} was erroneously decoded in the inet\n driver. This bug has now been corrected.\n\n Own Id: OTP-7755","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Erlang programs can now access STDERR on platforms where such a file\n descriptor is available by using the io_server 'standard_error', i.e.\n io:format(standard_error,\"~s~n\",\\[ErrorMessage]),\n\n Own Id: OTP-6688\n\n- The format of the string returned by `erlang:system_info(system_version)` (as\n well as the first message when Erlang is started) has changed. The string now\n contains the both the OTP version number as well as the erts version number.\n\n Own Id: OTP-7649\n\n- As of this version, the global name server no longer supports nodes running\n Erlang/OTP R10B.\n\n Own Id: OTP-7661\n\n- A `{nodedown, Node}` message passed by the `net_kernel:monitor_nodes/X`\n functionality is now guaranteed to be sent after `Node` has been removed from\n the result returned by `erlang:nodes/Y`.\n\n Own Id: OTP-7725\n\n- The deprecated functions `erlang:fault/1`, `erlang:fault/2`, and\n `file:rawopen/2` have been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7812\n\n- Nodes belonging to different independent clusters can now co-exist on the same\n host with the help of a new environment variable setting ERL_EPMD_PORT.\n\n Own Id: OTP-7826\n\n- The copyright notices have been updated.\n\n Own Id: OTP-7851","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12.5.1 - Kernel Release Notes","ref":"notes.html#kernel-2-12-5-1"},{"type":"extras","doc":"- When chunk reading a disk log opened in read_only mode, bad terms could crash\n the disk log process.\n\n Own Id: OTP-7641 Aux Id: seq11090\n\n- Calling `gen_tcp:send()` from several processes on socket with option\n `send_timeout` could lead to much longer timeout than specified. The solution\n is a new socket option `{send_timeout_close,true}` that will do automatic\n close on timeout. Subsequent calls to send will then immediately fail due to\n the closed connection.\n\n Own Id: OTP-7731 Aux Id: seq11161","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.12.5 - Kernel Release Notes","ref":"notes.html#kernel-2-12-5"},{"type":"extras","doc":"- The documentation of `rpc:pmap/3` has been corrected. (Thanks to Kirill\n Zaborski.)\n\n Own Id: OTP-7537\n\n- The listen socket used for the distributed Erlang protocol now uses the socket\n option 'reuseaddr', which is useful when you force the listen port number\n using kernel options 'inet_dist_listen_min' and 'inet_dist_listen_max' and\n restarts a node with open connections.\n\n Own Id: OTP-7563\n\n- Fixed memory leak of unclosed TCP-ports. A gen_tcp:send() followed by a\n failing gen_tcp:recv() could in some cases cause the port to linger after\n being closed.\n\n Own Id: OTP-7615","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Processes spawned using `proc_lib` (including `gen_server` and other library\n modules that use `proc_lib`) no longer keep the entire argument list for the\n initial call, but only the arity.\n\n Also, if `proc_lib:spawn/1` is used to spawn a fun, the actual fun is not\n kept, but only module, function name, and arity of the function that\n implements the fun.\n\n The reason for the change is that keeping the initial fun (or a fun in an\n argument list), would prevent upgrading the code for the module. A secondary\n reason is that keeping the fun and function arguments could waste a\n significant amount of memory.\n\n The drawback with the change is that the crash reports will provide less\n precise information about the initial call (only `Module:Function/Arity`\n instead of `Module:Function(Arguments)`). The function\n `proc_lib:initial_call/1` still returns a list, but each argument has been\n replaced with a dummy atom.\n\n Own Id: OTP-7531 Aux Id: seq11036\n\n- `io:get_line/1` when reading from standard input is now substantially faster.\n There are also some minor performance improvements in `io:get_line/1` when\n reading from any file opened in binary mode. (Thanks to Fredrik Svahn.)\n\n Own Id: OTP-7542\n\n- There is now experimental support for loading of code from archive files. See\n the documentation of `code`, `init`, `erl_prim_loader `and `escript` for more\n info.\n\n The error handling of `escripts` has been improved.\n\n An `escript` may now set explicit arguments to the emulator, such as\n `-smp enabled`.\n\n An `escript` may now contain a precompiled beam file.\n\n An `escript` may now contain an archive file containing one or more\n applications (experimental).\n\n The internal module `code_aux` has been removed.\n\n Own Id: OTP-7548 Aux Id: otp-6622\n\n- `code:is_sticky/1` is now documented. (Thanks to Vlad Dumitrescu.)\n\n Own Id: OTP-7561\n\n- In the job control mode, the \"s\" and \"r\" commands now take an optional\n argument to specify which shell to start. (Thanks to Robert Virding.)\n\n Own Id: OTP-7617\n\n- `net_adm:world/0,1` could crash if called in an emulator that has not been\n started with either the `-sname` or `-name` option; now it will return an\n empty list. (Thanks to Edwin Fine.)\n\n Own Id: OTP-7618","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12.4 - Kernel Release Notes","ref":"notes.html#kernel-2-12-4"},{"type":"extras","doc":"- Large files are now handled on Windows, where the filesystem supports it.\n\n Own Id: OTP-7410","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- New BIF `erlang:decode_packet/3` that extracts a protocol packet from a\n binary. Similar to the socket option `{packet, Type}`. Also documented the\n socket packet type `http` and made it official. _NOTE_: The tuple format for\n `http` packets sent from an active socket has been changed in an incompatible\n way.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7404\n\n- Setting the `{active,once}` for a socket (using inets:setopts/2) is now\n specially optimized (because the `{active,once}` option is typically used much\n more frequently than other options).\n\n Own Id: OTP-7520","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12.3 - Kernel Release Notes","ref":"notes.html#kernel-2-12-3"},{"type":"extras","doc":"- SCTP_ADDR_CONFIRMED events are now handled by gen_sctp.\n\n Own Id: OTP-7276\n\n- When leaving a process group with `pg2:leave/2` the process was falsely\n assumed to be a member of the group. This bug has been fixed.\n\n Own Id: OTP-7277\n\n- In the Erlang shell, using up and down arrow keys, the wrong previous command\n could sometimes be retrieved.\n\n Own Id: OTP-7278\n\n- The documentation for `erlang:trace/3` has been corrected.\n\n Own Id: OTP-7279 Aux Id: seq10927\n\n- In the SMP emulator, there was small risk that `code:purge(Mod)` would kill a\n process that was running code in `Mod` and unload the module `Mod` before the\n process had terminated. `code:purge(Mod)` now waits for confirmation (using\n `erlang:monitor/2`) that the process has been killed before proceeding.\n\n Own Id: OTP-7282\n\n- `zlib:inflate` failed when the size of the inflated data was an exact multiple\n of the internal buffer size (4000 bytes by default).\n\n Own Id: OTP-7359","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Additional library directories can now be specified in the environment\n variable ERL_LIBS. See the manual page for the `code` module. (Thanks to Serge\n Aleynikov.)\n\n Own Id: OTP-6940\n\n- crypto and zlib drivers improved to allow concurrent smp access.\n\n Own Id: OTP-7262\n\n- There is a new function `init:stop/1` which can be used to shutdown the system\n cleanly AND generate a non-zero exit status or crash dump. (Thanks to Magnus\n Froberg.)\n\n Own Id: OTP-7308\n\n- The `hide` option for [`open_port/2`](`open_port/2`) is now documented.\n (Thanks to Richard Carlsson.)\n\n Own Id: OTP-7358","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12.2.1 - Kernel Release Notes","ref":"notes.html#kernel-2-12-2-1"},{"type":"extras","doc":"- `os:cmd/1` on unix platforms now use `/bin/sh` as shell instead of looking for\n `sh` in the `PATH` environment.\n\n Own Id: OTP-7283","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12.2 - Kernel Release Notes","ref":"notes.html#kernel-2-12-2"},{"type":"extras","doc":"- A bug caused by a race condition involving `disk_log` and `pg2` has been\n fixed.\n\n Own Id: OTP-7209 Aux Id: seq10890\n\n- The beta testing module `gen_sctp` now supports active mode as stated in the\n documentation. Active mode is still rather untested, and there are some issues\n about what should be the right semantics for `gen_sctp:connect/5`. In\n particular: should it be blocking or non-blocking or choosable. There is a\n high probability it will change semantics in a (near) future patch.\n\n Try it, give comments and send in bug reports\\!\n\n Own Id: OTP-7225","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- `erlang:system_info/1` now accepts the `logical_processors`, and\n `debug_compiled` arguments. For more info see the, `m:erlang` documentation.\n\n The scale factor returned by `test_server:timetrap_scale_factor/0` is now also\n effected if the emulator uses a larger amount of scheduler threads than the\n amount of logical processors on the system.\n\n Own Id: OTP-7175\n\n- Updated the documentation for `erlang:function_exported/3` and `io:format/2`\n functions to no longer state that those functions are kept mainly for\n backwards compatibility.\n\n Own Id: OTP-7186\n\n- A process executing the `processes/0` BIF can now be preempted by other\n processes during its execution. This in order to disturb the rest of the\n system as little as possible. The returned result is, of course, still a\n consistent snapshot of existing processes at a time during the call to\n `processes/0`.\n\n The documentation of the `processes/0` BIF and the\n [`is_process_alive/1`](`is_process_alive/1`) BIF have been updated in order to\n clarify the difference between an existing process and a process that is\n alive.\n\n Own Id: OTP-7213\n\n- [`tuple_size/1`](`tuple_size/1`) and [`byte_size/1`](`byte_size/1`) have been\n substituted for [`size/1`](`size/1`) in the documentation.\n\n Own Id: OTP-7244","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12.1.2 - Kernel Release Notes","ref":"notes.html#kernel-2-12-1-2"},{"type":"extras","doc":"- The `{allocator_sizes, Alloc}` and `alloc_util_allocators` arguments are now\n accepted by `erlang:system_info/1`. For more information see the `m:erlang`\n documentation.\n\n Own Id: OTP-7167","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12.1.1 - Kernel Release Notes","ref":"notes.html#kernel-2-12-1-1"},{"type":"extras","doc":"- Fixed a problem in group that could cause the ssh server to lose answers or\n hang.\n\n Own Id: OTP-7185 Aux Id: seq10871","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.12.1 - Kernel Release Notes","ref":"notes.html#kernel-2-12-1"},{"type":"extras","doc":"- file:read/2 and file:consult_stream/1,3 did not use an empty prompt on I/O\n devices. This bug has now been corrected.\n\n Own Id: OTP-7013\n\n- The sctp driver has been updated to work against newer lksctp packages e.g\n 1.0.7 that uses the API spelling change adaption -> adaptation. Older lksctp\n (1.0.6) still work. The erlang API in gen_sctp.erl and inet_sctp.hrl now\n spells 'adaptation' regardless of the underlying C API.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7120","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The documentation has been updated so as to reflect the last updates of the\n Erlang shell as well as the minor modifications of the control sequence `p` of\n the `io_lib` module.\n\n Superfluous empty lines have been removed from code examples and from Erlang\n shell examples.\n\n Own Id: OTP-6944 Aux Id: OTP-6554, OTP-6911\n\n- [`tuple_size/1`](`tuple_size/1`) and [`byte_size/1`](`byte_size/1`) have been\n substituted for [`size/1`](`size/1`).\n\n Own Id: OTP-7009","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.12 - Kernel Release Notes","ref":"notes.html#kernel-2-12"},{"type":"extras","doc":"- A bug for raw files when reading 0 bytes returning 'eof' instead of empty data\n has been corrected.\n\n Own Id: OTP-6291 Aux Id: OTP-6967\n\n- A bug in gen_udp:fdopen reported by David Baird and also found by Dialyzer has\n been fixed.\n\n Own Id: OTP-6836 Aux Id: OTP-6594\n\n- Calling `error_logger:tty(true)` multiple times does not give multiple error\n log printouts.\n\n Own Id: OTP-6884 Aux Id: seq10767\n\n- The global name server now ignores `nodeup` messages when the command line\n flag `-connect_all false` has been used. (Thanks to Trevor Woollacott.)\n\n Own Id: OTP-6931\n\n- file:write_file/3, file:write/2 and file:read/2 could crash (contrary to\n documentation) for odd enough file system problems, e.g write to full file\n system. This bug has now been corrected.\n\n In this process the file module has been rewritten to produce better error\n codes. Posix error codes now originate from the OS file system calls or are\n generated only for very similar causes (for example 'enomem' is generated if a\n memory allocation fails, and 'einval' is generated if the file handle in\n Erlang is a file handle but currently invalid).\n\n More Erlang-ish error codes are now generated. For example `{error,badarg}` is\n now returned from `file:close/1` if the argument is not of a file handle type.\n See file(3).\n\n The possibility to write a single byte using `file:write/2` instead of a list\n or binary of one byte, contradictory to the documentation, has been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6967 Aux Id: OTP-6597 OTP-6291\n\n- Monitor messages produced by the system monitor functionality, and garbage\n collect trace messages could contain erroneous heap and/or stack sizes when\n the actual heaps and/or stacks were huge.\n\n As of erts version 5.6 the `large_heap` option to\n `erlang:system_monitor/[1,2]` has been modified. The monitor message is sent\n if the sum of the sizes of all memory blocks allocated for all heap\n generations is equal to or larger than the specified size. Previously the\n monitor message was sent if the memory block allocated for the youngest\n generation was equal to or larger than the specified size.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6974 Aux Id: seq10796\n\n- `inet:getopts/2` returned random values on Windows Vista.\n\n Own Id: OTP-7003","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Minor documentation corrections for file:pread/2 and file:pread/3.\n\n Own Id: OTP-6853\n\n- The deprecated functions `file:file_info/1`, `init:get_flag/1`,\n `init:get_flags/0`, and `init:get_args/0` have been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6886\n\n- Contract directives for modules in Kernel and STDLIB.\n\n Own Id: OTP-6895\n\n- The functions io:columns/0, io:columns/1, io:rows/0 and io:rows/1 are added to\n allow the user to get information about the terminal geometry. The shell takes\n some advantage of this when formatting output. For regular files and other\n io-devices where height and width are not applicable, the functions return\n \\{error,enotsup\\}.\n\n Potential incompatibility: If one has written a custom io-handler, the handler\n has to either return an error or take care of io-requests regarding terminal\n height and width. Usually that is no problem as io-handlers, as a rule of\n thumb, should give an error reply when receiving unknown io-requests, instead\n of crashing.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6933\n\n- The undocumented and unsupported functions `inet:ip_to_bytes/1`,\n `inet:ip4_to_bytes/1`, `inet:ip6_to_bytes/1`, and `inet:bytes_to_ip6/16` have\n been removed.\n\n Own Id: OTP-6938\n\n- Added new checksum combine functions to `zlib`. And fixed a bug in\n `zlib:deflate`. Thanks Matthew Dempsky.\n\n Own Id: OTP-6970\n\n- The [`spawn_monitor/1`](`spawn_monitor/1`) and\n [`spawn_monitor/3`](`spawn_monitor/3`) BIFs are now auto-imported (i.e. they\n no longer need an `erlang:` prefix).\n\n Own Id: OTP-6975\n\n- All functions in the `code` module now fail with an exception if they are\n called with obviously bad arguments, such as a tuple when an atom was\n expected. Some functions now also fail for undocumented argument types (for\n instance, `ensure_loaded/1` now only accepts an atom as documented; it used to\n accept a string too).\n\n Dialyzer will generally emit warnings for any calls that use undocumented\n argument types. Even if the call happens to still work in R12B, you should\n correct your code. A future release will adhere to the documentation.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6983","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.5.2 - Kernel Release Notes","ref":"notes.html#kernel-2-11-5-2"},{"type":"extras","doc":"- The kernel parameter dist_auto_connect once could fail to block a node if\n massive parallel sends were issued during a transient failure of network\n communication\n\n Own Id: OTP-6893 Aux Id: seq10753","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.11.5.1 - Kernel Release Notes","ref":"notes.html#kernel-2-11-5-1"},{"type":"extras","doc":"- The internal (rarely used) DNS resolver has been modified to not use the\n domain search list when asked to resolve an absolute name; a name with a\n terminating dot. There was also a bug causing it to create malformed DNS\n queries for absolute names that has been corrected, correction suggested by\n Scott Lystig Fritchie. The code has also been corrected to look up cached RRs\n in the same search order as non-cached, now allows having the root domain\n among the search domains, and can now actually do a zone transfer request.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6806 Aux Id: seq10714 EABln35459\n\n- zlib:close/1 would leave an EXIT message in the message queue if the calling\n process had the trap_exit flag enabled.\n\n Own Id: OTP-6811","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The documentation of [`process_flag(priority, Level)`](`process_flag/2`) has\n been updated, see the `m:erlang` documentation.\n\n Own Id: OTP-6745 Aux Id: OTP-6715","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.5 - Kernel Release Notes","ref":"notes.html#kernel-2-11-5"},{"type":"extras","doc":"- The shell has been updated to fix the following flaws: Shell process exit left\n you with an unresponsive initial shell if not using oldshell. Starting a\n restricted shell with a nonexisting callback module resulted in a shell where\n no commands could be used, not even init:stop/0. Fun's could not be used as\n parameters to local shell functions (in shell_default or user_default) when\n restricted_shell was active.\n\n Own Id: OTP-6537\n\n- The undocumented feature gen_tcp:fdopen/2 was broken in R11B-4. It is now\n fixed again.\n\n Own Id: OTP-6615\n\n- Corrected cancellation of timers in three places in the inet_res module.\n (Problem found by Dialyzer.)\n\n Own Id: OTP-6676","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Corrected protocol layer flue for socket options SO_LINGER, SO_SNDBUF and\n SO_RCVBUF, for SCTP.\n\n Own Id: OTP-6625 Aux Id: OTP-6336\n\n- The behaviour of the inet option \\{active,once\\} on peer close is improved and\n documented.\n\n Own Id: OTP-6681\n\n- The inet option send_timeout for connection oriented sockets is added to allow\n for timeouts in communicating send requests to the underlying TCP stack.\n\n Own Id: OTP-6684 Aux Id: seq10637 OTP-6681\n\n- Minor Makefile changes.\n\n Own Id: OTP-6689 Aux Id: OTP-6742\n\n- The documentation of [`process_flag(priority, Level)`](`process_flag/2`) has\n been updated, see the `m:erlang` documentation.\n\n Own Id: OTP-6715","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.4.2 - Kernel Release Notes","ref":"notes.html#kernel-2-11-4-2"},{"type":"extras","doc":"- process_flag/2 accepts the new flag `sensitive`.\n\n Own Id: OTP-6592 Aux Id: seq10555","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.4.1 - Kernel Release Notes","ref":"notes.html#kernel-2-11-4-1"},{"type":"extras","doc":"- A bug in gen_udp:open that broke the 'fd' option has been fixed.\n\n Own Id: OTP-6594 Aux Id: seq10619","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.11.4 - Kernel Release Notes","ref":"notes.html#kernel-2-11-4"},{"type":"extras","doc":"- Added a warning to the documentation for the `error_logger` functions\n `error_msg/1,2`, `warning_msg/1,2` and `info_msg/1,2` that calling these\n function with bad arguments can crash the standard event handler.\n\n Own Id: OTP-4575 Aux Id: seq7693\n\n- A bug in `inet_db` concerning getting the resolver option `retry` has been\n corrected.\n\n Own Id: OTP-6380 Aux Id: seq10534\n\n- Names registered by calling `global:register_name()` or\n `global:re_register_name()` were not always unregistered when the registering\n or registered process died. This bug has been fixed.\n\n Own Id: OTP-6428\n\n- When setting the kernel configuration parameter `error_logger` to `false`, the\n documentation stated that \"No error logger handler is installed\". This is\n true, but error logging is not turned off, as the initial, primitive error\n logger event handler is kept, printing raw event messages to tty.\n\n Changing this behavior can be viewed as a backward incompatible change.\n Instead a new value `silent` for the configuration parameter has been added,\n which ensures that error logging is completely turned off.\n\n Own Id: OTP-6445\n\n- Clarified the documentation for `code:lib_dir/1` and `code:priv_dir/1`. The\n functions traverse the names of the code path, they do not search the actual\n directories.\n\n Own Id: OTP-6466\n\n- `io:setopts` returned `{error,badarg}`, when called with only an `expand_fun`\n argument. (Thanks to igwan.)\n\n Own Id: OTP-6508","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- An interface towards the SCTP Socket API Extensions has been implemented.It is\n an Open Source patch courtesy of Serge Aleynikov and Leonid Timochouk. The\n Erlang code parts has been adapted by the OTP team, changing the Erlang API\n somewhat.\n\n The Erlang interface consists of the module `gen_sctp` and an include file\n `-include_lib(\"kernel/include/inet_sctp.hrl\").` for option record definitions.\n The `gen_sctp` module is documented.\n\n The delivered Open Source patch, before the OTP team rewrites, was written\n according to\n [http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13](http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13)\n and was claimed to work fine, tested on Linux Fedora Core 5.0 (kernel\n 2.6.15-2054 or later) and on Solaris 10 and 11. The OTP team rewrites used the\n same standard document but might have accidentally broken some functionality.\n If so, it will soon be patched to working state. The tricky parts in C and the\n general design has essentially not changed. During the rewrites the code was\n hand tested on SuSE Linux Enterprise Server 10, and briefly on Solaris 10.\n Feedbach on code and docs is very much appreciated.\n\n The SCTP interface is in beta state. It has only been hand tested and has no\n automatic test suites in OTP meaning everything is most certainly not tested.\n Socket active mode is broken. IPv6 is not tested. The documentation has been\n reworked due to the API changes, but has not been proofread after this.\n\n Thank you from the OTP team to Serge Aleynikov and Leonid Timochouk for a\n valuable contribution. We hope we have not messed it up too much.\n\n Own Id: OTP-6336\n\n- A `{minor_version,Version}` option is now recognized by\n [`term_to_binary/2`](`term_to_binary/2`). \\{minor_version,1\\} will cause\n floats to be encoded in an exact and more space-efficient way compared to the\n previous encoding.\n\n Own Id: OTP-6434\n\n- Monitoring of nodes has been improved. Now the following properties apply to\n `net_kernel:monitor_nodes/[1,2]`:\n\n - `nodeup` messages will be delivered before delivery of any message from the\n remote node passed through the newly established connection.\n - `nodedown` messages will not be delivered until all messages from the remote\n node that have been passed through the connection have been delivered.\n - Subscriptions can also be made before the `net_kernel` server has been\n started.\n\n Own Id: OTP-6481\n\n- Setting and getting socket options in a \"raw\" fashion is now allowed. Using\n this feature will inevitably produce non portable code, but will allow setting\n ang getting arbitrary uncommon options on TCP stacks that do have them.\n\n Own Id: OTP-6519\n\n- Dialyzer warnings have been eliminated.\n\n Own Id: OTP-6523\n\n- The documentation for `file:delete/1` and `file:set_cwd/1` has been updated to\n clarify what happens if the input arguments are of an incorrect type.\n\n Own Id: OTP-6535","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.3.1 - Kernel Release Notes","ref":"notes.html#kernel-2-11-3-1"},{"type":"extras","doc":"- An erroneous packet size could be used for the first messages passed through a\n newly established connection between two Erlang nodes. This could cause\n messages to be discarded, or termination of the connection.\n\n Own Id: OTP-6473","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.11.3 - Kernel Release Notes","ref":"notes.html#kernel-2-11-3"},{"type":"extras","doc":"- On Unix, the `unix:cmd/1` function could leave an 'EXIT' message in the\n message queue for the calling process That problem was more likely to happen\n in an SMP emulator.\n\n Own Id: OTP-6368","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- More interfaces are added in erl_ddll, to support different usage scenarios.\n\n Own Id: OTP-6307 Aux Id: OTP-6234\n\n- Locks set by calling `global:set_lock()` were not always deleted when the\n locking process died. This bug has been fixed.\n\n Own Id: OTP-6341 Aux Id: seq10445","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.2 - Kernel Release Notes","ref":"notes.html#kernel-2-11-2"},{"type":"extras","doc":"- Behavior in case of disappeared nodes when using he dist_auto_connect once got\n changed in R11B-1. The timeouts regarding normal distributed operations is now\n reverted to the old (pre R11B-1).\n\n Own Id: OTP-6258 Aux Id: OTP-6200, seq10449\n\n- Start-up problems for the internal process used by the `inet:gethostbyname()`\n functions were eliminated. If the internal process (`inet_gethost_native`) had\n not previously been started, and if several processes at the same time called\n one of the `inet:gethostbyname()` functions, the calls could fail.\n\n Own Id: OTP-6286","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Code cleanup: the old internal obsolete file_server has been removed. It was\n only used when communicating with R7 and older nodes.\n\n Own Id: OTP-6245\n\n- Trying to open a non-existent or badly formed disk log no longer results in a\n crash report. In particular, `ets:file2tab/1` reports no error when the\n argument is not a well-formed disk log file. (The return value has not been\n changed, it is still an error tuple.)\n\n Own Id: OTP-6278 Aux Id: seq10421\n\n- There are new BIFs `erlang:spawn_monitor/1,3`, and the new option `monitor`\n for `spawn_opt/2,3,4,5`.\n\n The `observer_backend` module has been updated to handle the new BIFs.\n\n Own Id: OTP-6281\n\n- To help Dialyzer find more bugs, many functions in the Kernel and STDLIB\n applications now only accept arguments of the type that is documented.\n\n For instance, the functions `lists:prefix/2` and `lists:suffix/2` are\n documented to only accept lists as their arguments, but they actually accepted\n anything and returned `false`. That has been changed so that the functions\n cause an exception if one or both arguments are not lists.\n\n Also, the `string:strip/3` function is documented to take a character argument\n that is a character to strip from one or both ends of the string. Given a list\n instead of a character, it used to do nothing, but will now cause an\n exception.\n\n Dialyzer will find most cases where those functions are passed arguments of\n the wrong type.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-6295","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.1.1 - Kernel Release Notes","ref":"notes.html#kernel-2-11-1-1"},{"type":"extras","doc":"- There is now an option read_packets for UDP sockets that sets the maximum\n number of UDP packets that will be read for each invocation of the socket\n driver.\n\n Own Id: OTP-6249 Aux Id: seq10452","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11.1 - Kernel Release Notes","ref":"notes.html#kernel-2-11-1"},{"type":"extras","doc":"- In R11B-0, the erl_ddll server process is always started. Despite that, the\n configuration parameter `start_ddll` for the Kernel application was still\n obeyed, which would cause the erl_ddll server to be started TWICE (and the\n system shutting down as a result). In this release, `start_ddll` is no longer\n used and its documentation has been removed.\n\n Own Id: OTP-6163\n\n- The kernel option \\{dist_auto_connect,once\\} could block out nodes that had\n never been connected, causing persistent partitioning of networks.\n Furthermore, partial restarts of networks could cause inconsistent global name\n databases. Both problems are now solved.\n\n Own Id: OTP-6200 Aux Id: seq10377","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Late arriving tcp_closed and udp_closed messages are now removed from the\n message queue of a process calling gen_tcp:close/1, gen_udp:close/1, and\n inet:close/1.\n\n Own Id: OTP-6197","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.11 - Kernel Release Notes","ref":"notes.html#kernel-2-11"},{"type":"extras","doc":"- When repairing a disk log with a corrupt index file (caused by for instance a\n hard disk failure) the old contents of the index file is kept unmodified. This\n will make repeated attempts to open the disk log fail every time.\n\n Own Id: OTP-5558 Aux Id: seq9823\n\n- Previously [`unlink/1`](`unlink/1`) and `erlang:demonitor/2` behaved\n completely asynchronous. This had one undesirable effect, though. You could\n never know when you were guaranteed _not_ to be affected by a link that you\n had unlinked or a monitor that you had demonitored.\n\n The new behavior of [`unlink/1`](`unlink/1`) and `erlang:demonitor/2` can be\n viewed as two operations performed atomically. Asynchronously send an unlink\n signal or a demonitor signal, and ignore any future results of the link or\n monitor.\n\n _NOTE_: This change can cause some obscure code to fail which previously did\n not. For example, the following code might hang:\n\n ```erlang\n Mon = erlang:monitor(process, Pid),\n %% ...\n exit(Pid, bang),\n erlang:demonitor(Mon),\n receive\n {'DOWN', Mon, process, Pid, _} -> ok\n %% We were previously guaranteed to get a down message\n %% (since we exited the process ourself), so we could\n %% in this case leave out:\n %% after 0 -> ok\n end,\n ```\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-5772\n\n- The behavior when an application fails to start and possibly causes the\n runtime system to halt has been cleaned up, including fixing some minor bugs.\n\n `application_controller` should now always terminate with a non-nested string,\n meaning the slogan in an `erl_crash.dump` should always be easy to read.\n\n `init` now makes sure that the slogan passed to `erlang:halt/1` does not\n exceed the maximum allowed length.\n\n Redundant calls to [`list_to_atom/1`](`list_to_atom/1`) has been removed from\n the primitive `error_logger` event handler. (Thanks Serge Aleynikov for\n pointing this out).\n\n The changes only affects the contents of the error messages and crashdump file\n slogan.\n\n Own Id: OTP-5964\n\n- The `erl_ddll` server is now started when OTP is started and placed under the\n Kernel supervisor. This fixes several minor issues. It used to be started on\n demand.\n\n The documentation for the `start` and `stop` functions in the `erl_ddll`\n module has been removed, as those functions are not meant to be used by other\n applications.\n\n Furthermore, the `erl_ddll:stop/1` function no longer terminates the\n `erl_ddll` server, as that would terminate the entire runtime system.\n\n Own Id: OTP-6033","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Removed some unused functions from `application_master`.\n\n Own Id: OTP-3889\n\n- Global no longer allows the registration of a process under more than one\n name. If the old (buggy) behavior is desired the Kernel application variable\n `global_multi_name_action` can be given the value `allow`.\n\n Own Id: OTP-5640 Aux Id: OTP-5603\n\n- The (slightly misleading) warnings that was shown when the `erlang.erl` file\n was compiled has been eliminated.\n\n Own Id: OTP-5947\n\n- The `auth` module API is deprecated.\n\n Own Id: OTP-6037\n\n- Added `erlang:demonitor/2`, making it possible to at the same time flush a\n received `'DOWN'` message, if there is one. See `m:erlang`.\n\n Own Id: OTP-6100 Aux Id: OTP-5772","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.13 - Kernel Release Notes","ref":"notes.html#kernel-2-10-13"},{"type":"extras","doc":"- Large files (more than 2 GBytes) are now handled on Solaris 8.\n\n Own Id: OTP-5849 Aux Id: seq10157\n\n- During startup, a garbage `{'DOWN', ...}` message was left by\n `inet_gethost_native`, that caused problems for the starting code server.\n\n Own Id: OTP-5978 Aux Id: OTP-5974","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- `global` now makes several attempts to connect nodes when maintaining the\n fully connected network. More than one attempt is sometimes needed under very\n heavy load.\n\n Own Id: OTP-5889\n\n- `erl_epmd` now explicitly sets the timeout to `infinity` when calling\n `gen_server:call`. The old timeout of 15 seconds could time out under very\n heavy load.\n\n Own Id: OTP-5959\n\n- Corrected the start of code server to use reference-tagged tuples to ensure\n that an unexpected message sent to the parent process does not cause a halt of\n the system. Also removed the useless `start/*` functions in both `code.erl`\n and `code_server.erl` and no longer exports the `init` function from\n `code_server.erl`.\n\n Own Id: OTP-5974 Aux Id: seq10243, OTP-5978","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.12 - Kernel Release Notes","ref":"notes.html#kernel-2-10-12"},{"type":"extras","doc":"- A bug in `global` has been fixed: the locker process added `nonode@nohost` to\n the list of nodes to lock. This could happen before any nodes got known to the\n global name server. Depending on net configuration the symptom was a delay.\n\n Own Id: OTP-5792 Aux Id: OTP-5563\n\n- If an `.app` file is missing, the error reason returned by\n `application:load/1` has been corrected to\n `{\"no such file or directory\", \"FILE.app\"}`, instead of the less informative\n `{\"unknown POSIX error\",\"FILE.app\"}`.\n\n Own Id: OTP-5809\n\n- Bug fixes: `disk_log:accessible_logs/0` no longer reports all `pg2` process\n groups as distributed disk logs; `disk_log:pid2name/1` did not recognize\n processes of distributed disk logs.\n\n Own Id: OTP-5810\n\n- The functions `file:consult/1`, `file:path_consult/2`, `file:eval/1,2`,\n `file:path_eval/2,3`, `file:script/1,2`, `file:path_script/2,3` now return\n correct line numbers in error tuples.\n\n Own Id: OTP-5814\n\n- If there were user-defined variables in the boot script, and their values were\n not provided using the `-boot_var` option, the emulator would refuse to start\n with a confusing error message. Corrected to show a clear, understandable\n message.\n\n The `prim_file` module was modified to not depend on the `lists` module, to\n make it possible to start the emulator using a user-defined loader. (Thanks to\n Martin Bjorklund.)\n\n Own Id: OTP-5828 Aux Id: seq10151\n\n- Minor corrections in the description of open modes. (Thanks to Richard\n Carlsson.)\n\n Own Id: OTP-5856","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- `application_controller` now terminates with the actual error reason, instead\n of `shutdown`. This means that the crash dump now should be somewhat more\n informative, in the case where the runtime system is terminated due to an\n error in an application.\n\n Example: If the (permanent) application `app1` fails to start, the slogan now\n will be:\n \"`Kernel pid terminated (application_controller) ({application_start_failure,app1,{shutdown, {app1,start,[normal,[]]}}})`\"\n\n rather than the previous\n \"`Kernel pid terminated (application_controller) (shutdown)`\".\n\n Own Id: OTP-5811","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.11.1 - Kernel Release Notes","ref":"notes.html#kernel-2-10-11-1"},{"type":"extras","doc":"- Timers could sometimes timeout too early. This bug has now been fixed.\n\n Automatic cancellation of timers created by `erlang:send_after(Time,` pid(),\n Msg), and `erlang:start_timer(Time,` pid(), Msg) has been introduced. Timers\n created with the receiver specified by a pid, will automatically be cancelled\n when the receiver exits. For more information see the `m:erlang` man page.\n\n In order to be able to maintain a larger amount of timers without increasing\n the maintenance cost, the internal timer wheel and bif timer table have been\n enlarged.\n\n Also a number of minor bif timer optimizations have been implemented.\n\n Own Id: OTP-5795 Aux Id: OTP-5090, seq8913, seq10139, OTP-5782","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Documentation improvements:\n\n \\- documentation for `erlang:link/1` corrected\n\n \\- command line flag `-code_path_cache` added\n\n \\- `erl` command line flags clarifications\n\n \\- `m:net_kernel` clarifications\n\n Own Id: OTP-5847","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.11 - Kernel Release Notes","ref":"notes.html#kernel-2-10-11"},{"type":"extras","doc":"- Several bug fixes and improvements in the global name registration facility\n (see `m:global`):\n\n - the name resolving procedure did not always unlink no longer registered\n processes;\n - the global name could sometimes hang when a `nodedown` was immediately\n followed by a `nodeup`;\n - global names were not always unregistered when a node went down;\n - it is now possible to set and delete locks at the same time as the global\n name server is resolving names--the handling of global locks has been\n separated from registration of global names;\n\n As of this version, `global` no longer supports nodes running Erlang/OTP R7B\n or earlier.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-5563\n\n- The functions `global:set_lock/3` and `global:trans/4` now accept the value\n `0` (zero) of the `Retries` argument.\n\n Own Id: OTP-5737\n\n- The `inet:getaddr(Addr, Family)` no longer validates the `Addr` argument if it\n is a 4 or 8 tuple containing the IP address, except for the size of the tuple\n and that it contains integers in the correct range.\n\n The reason for the change is that validation could cause the following\n sequence of calls to fail:\n\n `{ok,Addr} = inet:getaddr(localhost, inet6), gen_tcp:connect(Addr, 7, [inet6])`\n\n Own Id: OTP-5743","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The previously undocumented and UNSUPPORTED `zlib` module has been updated in\n an incompatible way and many bugs have been corrected. It is now also\n documented.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-5715\n\n- Added `application` interface functions `which_applications/1`, `set_env/4`\n and `unset_env/3`, which take an additional `Timeout` argument. To be used in\n situations where the standard gen_server timeout (5000ms) is not adequate.\n\n Own Id: OTP-5724 Aux Id: seq10083\n\n- Improved documentation regarding synchronized start of applications with\n included applications (using start phases and `application_starter`).\n\n Own Id: OTP-5754\n\n- New socket options `priority` and `tos` for platforms that support them\n (currently only Linux).\n\n Own Id: OTP-5756\n\n- The global name server has been optimized when it comes to maintaining a fully\n connected network.\n\n Own Id: OTP-5770","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.10.1 - Kernel Release Notes","ref":"notes.html#kernel-2-10-10-1"},{"type":"extras","doc":"- The native resolver has gotten an control API for extended debugging and soft\n restart. It is: `inet_gethost_native:control(Control)` \n `Control = {debug_level,Level} | soft_restart` \n `Level = integer() in the range 0-4`.\n\n Own Id: OTP-5751 Aux Id: EABln25013","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.10.10 - Kernel Release Notes","ref":"notes.html#kernel-2-10-10"},{"type":"extras","doc":"- If several processes (at the same node) simultaneously tried to start the same\n distributed application, this could lead to `application:start` returning an\n erroneous value, or even hang.\n\n Own Id: OTP-5606 Aux Id: seq9838","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The manual pages for most of the Kernel and some of the STDLIB modules have\n been updated, in particular regarding type definitions.\n\n The documentation of the return value for `erts:info/1` has been corrected.\n\n The documentation for `erlang:statistics/1` now lists all possible arguments.\n\n Own Id: OTP-5360\n\n- When the native resolver fails a `gethostbyaddr` lookup, `nxdomain` should be\n returned. There should be no attempt to fallback on a routine that succeeds if\n only the syntax of the IP address is valid. This has been fixed.\n\n Own Id: OTP-5598 Aux Id: OTP-5576\n\n- Replaced some tuple funs with the new `fun M:F/A` construct.\n\n The high-order functions in the `lists` module no longer accept bad funs under\n any circumstances. '`lists:map(bad_fun, [])`' used to return '`[]`' but now\n causes an exception.\n\n Unused, broken compatibility code in the `ets` module was removed. (Thanks to\n Dialyzer.)\n\n Eliminated 5 discrepancies found by Dialyzer in the Appmon application.\n\n Own Id: OTP-5633\n\n- The possibility to have comments following the list of tuples in a config file\n (file specified with the `-config` flag) has been added.\n\n Own Id: OTP-5661 Aux Id: seq10003","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.9 - Kernel Release Notes","ref":"notes.html#kernel-2-10-9"},{"type":"extras","doc":"- '`erl -config sys.config`' would fail to start if the `sys.config` file did\n not contain any whitespace at all after the dot. (Thanks to Anders Nygren.)\n\n Own Id: OTP-5543\n\n- A bug regarding tcp sockets which results in hanging `gen_tcp:send/2` has been\n corrected. To encounter this bug you needed one process that read from a\n socket, one that wrote more date than the reader read out so the sender got\n suspended, and then the reader closed the socket. (Reported and diagnosed by\n Alexey Shchepin.)\n\n Corrected a bug in the (undocumented and unsupported) option `{packet,http}`\n for `gen_tcp.` (Thanks to Claes Wikstrom and Luke Gorrie.)\n\n Updated the documentation regarding the second argument to `gen_tcp:recv/2`,\n the `Length` to receive.\n\n Own Id: OTP-5582 Aux Id: seq9839","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- At startup, the Erlang resolver hosts table was used to look up the name of\n the local (and possibly stand alone) host. This was incorrect. The configured\n resolver method is now used for this purpose.\n\n Own Id: OTP-5393\n\n- The `erlang:port_info/1` BIF is now documented. Minor corrections of the\n documentation for `erlang:port_info/2`.\n\n Added a note to the documentation of the `math` module that all functions are\n not available on all platforms.\n\n Added more information about the `+c` option in the `erl` man page in the ERTS\n documentation.\n\n Own Id: OTP-5555\n\n- The new `fun M:F/A` construct creates a fun that refers to the latest version\n of `M:F/A.` This syntax is meant to replace tuple funs `{M,F}` which have many\n problems.\n\n The new type test [`is_function(Fun,A)`](`is_function/2`) (which may be used\n in guards) test whether `Fun` is a fun that can be applied with `A` arguments.\n (Currently, `Fun` can also be a tuple fun.)\n\n Own Id: OTP-5584\n\n- According to the documentation `global` implements the equivalent of\n [`register/2`](`register/2`), which returns `badarg` if a process is already\n registered. As it turns out there is no check in `global` if a process is\n registered under more than one name. If some process is accidentally or by\n design given several names, it is possible that the name registry becomes\n inconsistent due to the way the resolve function is called when name clashes\n are discovered (see `register_name/3` in `m:global`).\n\n In OTP R11B `global` will not allow the registration of a process under more\n than one name. To help finding code where `no` will be returned, a Kernel\n application variable, `global_multi_name_action`, is hereby introduced.\n Depending on its value (`info`, `warning`, or `error`), messages are sent to\n the error logger when `global` discovers that some process is given more than\n one name. The variable only affects the node where it is defined.\n\n Own Id: OTP-5603","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.8 - Kernel Release Notes","ref":"notes.html#kernel-2-10-8"},{"type":"extras","doc":"- In case of a DNS lookup loop, `inet_db:getbyname` ends up building an infinite\n list. This has been fixed.\n\n Own Id: OTP-5449\n\n- When doing an `inet6` name lookup on an IPv4 address it was possible to get an\n address on IPv4 format back. This has been corrected. Some other minor\n inconsistencies regarding IPv6 name lookup have also been corrected.\n\n Own Id: OTP-5576","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.7 - Kernel Release Notes","ref":"notes.html#kernel-2-10-7"},{"type":"extras","doc":"- Under certain circumstances the `net_kernel` could emit spurious nodedown\n messages. This bug has been fixed.\n\n Own Id: OTP-5396\n\n- Removed description of the `keep_zombies` configuration parameter in the\n `kernel` man page.\n\n Own Id: OTP-5497","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Eliminated Dialyzer warnings (caused by dead code) in the `init` and\n `prim_file` modules.\n\n Own Id: OTP-5496\n\n- `inet_config` now also checks the environment variable `ERL_INETRC` for a\n possible user configuration file. See the ERTS User's Guide for details.\n\n Own Id: OTP-5512","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.6 - Kernel Release Notes","ref":"notes.html#kernel-2-10-6"},{"type":"extras","doc":"- The `c` option for the `+B` flag has been introduced which makes it possible\n to use Ctrl-C (Ctrl-Break on Windows) to interrupt the shell process rather\n than to invoke the emulator break handler. All new `+B` options are also\n supported on Windows (werl) as of now. Furthermore, Ctrl-C on Windows has now\n been reserved for copying text (what Ctrl-Ins was used for previously).\n Ctrl-Break should be used for break handling. Lastly, the documentation of the\n system flags has been updated.\n\n Own Id: OTP-5388\n\n- The possibility to start the Erlang shell in parallel with the rest of the\n system was reintroduced for backwards compatibility in STDLIB 1.13.1. The flag\n to be used for this is now called `async_shell_start` and has been documented.\n New shells started from the JCL menu are not synchronized with `init` anymore.\n This makes it possible to start a new shell (e.g. for debugging purposes) even\n if the initial shell has not come up.\n\n Own Id: OTP-5406 Aux Id: OTP-5218","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.5 - Kernel Release Notes","ref":"notes.html#kernel-2-10-5"},{"type":"extras","doc":"- Documentation for `erlang:binary_to_float/1` deleted. The BIF itself was\n removed several releases ago.\n\n Updated documentation for [`apply/2`](`apply/2`) and [`apply/3`](`apply/3`).\n\n Own Id: OTP-5391","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- `net_kernel:monitor_nodes/2` which takes a flag and an option list has been\n added. By use of `net_kernel:monitor_nodes/2` one can subscribe for\n `nodeup/nodedown` messages with extra information. It is now possible to\n monitor hidden nodes, and get `nodedown` reason. See the `m:net_kernel`\n documentation for more information.\n\n Own Id: OTP-5374","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.4 - Kernel Release Notes","ref":"notes.html#kernel-2-10-4"},{"type":"extras","doc":"- The application master for an application now terminates the application\n faster, which reduces the risk for timeouts in other parts of the system.\n\n Own Id: OTP-5363 Aux Id: EABln19084\n\n- A BIF `erlang:raise/3` has been added. See the manual for details. It is\n intended for internal system programming only, advanced error handling.\n\n Own Id: OTP-5376 Aux Id: OTP-5257","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Kernel 2.10.3 - Kernel Release Notes","ref":"notes.html#kernel-2-10-3"},{"type":"extras","doc":"- With the `-eval` flag (`erl -eval Expr`), an arbitrary expression can be\n evaluated during system initialization. This is documented in `m:init`.\n\n Own Id: OTP-5260\n\n- The unsupported and undocumented modules `socks5`, `socks5_auth`,\n `socks5_tcp`, and `socks5_udp` have been removed.\n\n Own Id: OTP-5266","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Kernel 2.10.1 - Kernel Release Notes","ref":"notes.html#kernel-2-10-1"},{"type":"extras","doc":"- The Pman 'trace shell' functionality was broken and has now been fixed.\n Furthermore, Pman could not correctly find the pid of the active shell if more\n than one shell process was running on the node. This has also been corrected.\n\n Own Id: OTP-5191\n\n- The documentation for the `auth:open/1` function which no longer exists has\n been removed. (Thanks to Miguel Barreiro.)\n\n Own Id: OTP-5208\n\n- Corrected the `crc32/3` function in the undocumented and unsupported `zlib`\n module.\n\n Own Id: OTP-5227","title":"Fixed Bugs and Malfunctions - Kernel Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- You can now start Erlang with the `-rsh` flag which gives you a remote initial\n shell instead of a local one. Example:\n\n ```text\n erl -sname this_node -rsh other_node@other_host\n ```\n\n Own Id: OTP-5210\n\n- If `/etc/hosts` specified two hosts with the same IP address (on separate\n lines), only the last host would be registered by inet_db during inet\n configuration. This has been corrected now so that both aliases are registered\n with the same IP address.\n\n Own Id: OTP-5212 Aux Id: seq7128\n\n- The documentation for BIFs that take I/O lists have been clarified. Those are\n [`list_to_binary/1`](`list_to_binary/1`),\n [`port_command/2`](`port_command/2`), [`port_control/3`](`port_control/3`).\n\n Documentation for all `is_*` BIFs (such as [`is_atom/1`](`is_atom/1`)) has\n been added.\n\n Removed the documentation for `erlang:float_to_binary/2` which was removed\n from the run-time system several releases ago.\n\n Own Id: OTP-5222","title":"Improvements and New Features - Kernel Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"\n# Introduction","title":"Introduction","ref":"introduction_chapter.html"},{"type":"extras","doc":"The Kernel application has all the code necessary to run the Erlang runtime\nsystem: file servers, code servers, and so on.\n\nThe Kernel application is the first application started. It is mandatory in the\nsense that the minimal system based on Erlang/OTP consists of Kernel and STDLIB.\nKernel contains the following functional areas:\n\n- Start, stop, supervision, configuration, and distribution of applications\n- Code loading\n- Logging\n- Global name service\n- Supervision of Erlang/OTP\n- Communication with sockets\n- Operating system interface","title":"Scope - Introduction","ref":"introduction_chapter.html#scope"},{"type":"extras","doc":"It is assumed that the reader is familiar with the Erlang programming language.","title":"Prerequisites - Introduction","ref":"introduction_chapter.html#prerequisites"},{"type":"extras","doc":"\n# Socket Usage","title":"Socket Usage","ref":"socket_usage.html"},{"type":"extras","doc":"The socket interface (module) is basically a \"thin\" layer on top of the OS\nsocket interface. It is assumed that, unless you have special needs,\ngen\\_\\[tcp|udp|sctp] should be sufficient (when they become available).\n\nNote that just because we have a documented and described option, it does _not_\nmean that the OS supports it. So its recommended that the user reads the\nplatform specific documentation for the option used.","title":"Introduction - Socket Usage","ref":"socket_usage.html#introduction"},{"type":"extras","doc":"Some functions allow for an _asynchronous_ call\n([`accept/2`](`m:socket#accept-nowait`),\n[`connect/3`](`m:socket#connect-nowait`), [`recv/3,4`](`m:socket#recv-nowait`),\n[`recvfrom/3,4`](`m:socket#recvfrom-nowait`),\n[`recvmsg/2,3,5`](`m:socket#recvmsg-nowait`),\n[`send/3,4`](`m:socket#send-nowait`), [`sendmsg/3,4`](`m:socket#sendmsg-nowait`)\nand [`sendto/4,5`](`m:socket#sendto-nowait`)). This is achieved by setting the\n`Timeout` argument to `nowait`. For instance, if calling the\n[`recv/3`](`m:socket#recv-nowait`) function with Timeout set to `nowait` (i.e.\n`recv(Sock, 0, nowait)`) when there is actually nothing to read, it will return\nwith:\n\n- **On Unix** - `{select, `[`SelectInfo`](`t:socket:select_info/0`)`}`\n\n `SelectInfo` contains the [`SelectHandle`](`t:socket:select_handle/0`).\n\n- **On Windows** -\n `{completion, `[`CompletionInfo`](`t:socket:completion_info/0`)`}`\n\n `CompletionInfo` contains the\n [`CompletionHandle`](`t:socket:completion_handle/0`).\n\nWhen data eventually arrives a 'select' or 'completion' message will be sent to\nthe caller:\n\n- **On Unix** - `{'$socket', socket(), select, SelectHandle}`\n\n The caller can then make another call to the recv function and now expect\n data.\n\n Note that all other users are _locked out_ until the 'current user' has called\n the function (recv in this case). So either immediately call the function or\n [`cancel`](`socket:cancel/2`).\n\n- **On Windows** -\n `{'$socket', socket(), completion, {CompletionHandle, CompletionStatus}}`\n\n The `CompletionStatus` contains the result of the operation (read).\n\nThe user must also be prepared to receive an abort message:\n\n- `{'$socket', socket(), abort, Info}`\n\nIf the operation is aborted for whatever reason (e.g. if the socket is closed\n\"by someone else\"). The `Info` part contains the abort reason (in this case that\nthe socket has been closed `Info = {SelectHandle, closed}`).\n\nThe general form of the 'socket' message is:\n\n- `{'$socket', Sock :: socket(), Tag :: atom(), Info :: term()}`\n\nWhere the format of `Info` is a function of `Tag`:\n\n| _Tag_ | _Info value type_ |\n| ---------- | ----------------------------------------- |\n| select | select_handle() |\n| completion | \\{completion_handle(), CompletionStatus\\} |\n| abort | \\{select_handle(), Reason :: term()\\} |\n\n_Table: socket message info value type_\n\nThe `select_handle()` is the same as was returned in the\n[`SelectInfo`](`t:socket:select_info/0`).\n\nThe `completion_handle()` is the same as was returned in the\n[`CompletionInfo`](`t:socket:completion_info/0`).","title":"Asynchronous calls - Socket Usage","ref":"socket_usage.html#asynchronous-calls"},{"type":"extras","doc":"The _socket registry_ is how we keep track of sockets. There are two functions\nthat can be used for interaction: `socket:number_of/0` and\n`socket:which_sockets/1`.\n\nIn systems which create and delete _many_ sockets dynamically, it (the socket\nregistry) could become a bottleneck. For such systems, there are a couple of\nways to control the use of the socket registry.\n\nFirstly, its possible to effect the global default value when building OTP from\nsource with the two configure options:\n\n```text\n--enable-esock-socket-registry (default) | --disable-esock-socket-registry\n```\n\nSecond, its possible to effect the global default value by setting the\nenvironment variable `ESOCK_USE_SOCKET_REGISTRY` (boolean) before starting the\nerlang.\n\nThird, its possible to alter the global default value in runtime by calling the\nfunction [`use_registry/1`](`socket:use_registry/1`).\n\nAnd finally, its possible to override the global default when creating a socket\n(with [`open/2`](`socket:open/2`) and [`open/4`](`socket:open/4`)) by providing\nthe attribute `use_registry` (boolean) in the their `Opts` argument (which\neffects _that_ specific socket).","title":"Socket Registry - Socket Usage","ref":"socket_usage.html#socket-registry"},{"type":"extras","doc":"This example is intended to show how to create a simple (echo) server\n(and client).\n\n```erlang\n-module(example).\n\n-export([client/2, client/3]).\n-export([server/0, server/1, server/2]).\n\n\n%% ======================================================================\n\n%% === Client ===\n\nclient(#{family := Family} = ServerSockAddr, Msg)\n when is_list(Msg) orelse is_binary(Msg) ->\n {ok, Sock} = socket:open(Family, stream, default),\n ok = maybe_bind(Sock, Family),\n ok = socket:connect(Sock, ServerSockAddr),\n client_exchange(Sock, Msg);\n\nclient(ServerPort, Msg)\n when is_integer(ServerPort) andalso (ServerPort > 0) ->\n Family = inet, % Default\n Addr = get_local_addr(Family), % Pick an address\n SockAddr = #{family => Family,\n\t\t addr => Addr,\n\t\t port => ServerPort},\n client(SockAddr, Msg).\n\nclient(ServerPort, ServerAddr, Msg)\n when is_integer(ServerPort) andalso (ServerPort > 0) andalso\n is_tuple(ServerAddr) ->\n Family = which_family(ServerAddr),\n SockAddr = #{family => Family,\n\t\t addr => ServerAddr,\n\t\t port => ServerPort},\n client(SockAddr, Msg).\n\n%% Send the message to the (echo) server and wait for the echo to come back.\nclient_exchange(Sock, Msg) when is_list(Msg) ->\n client_exchange(Sock, list_to_binary(Msg));\nclient_exchange(Sock, Msg) when is_binary(Msg) ->\n ok = socket:send(Sock, Msg, infinity),\n {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),\n ok.\n\n\n%% ======================================================================\n\n%% === Server ===\n\nserver() ->\n %% Make system choose port (and address)\n server(0).\n\n%% This function return the port and address that it actually uses,\n%% in case server/0 or server/1 (with a port number) was used to start it.\n\nserver(#{family := Family, addr := Addr, port := _} = SockAddr) ->\n {ok, Sock} = socket:open(Family, stream, tcp),\n ok = socket:bind(Sock, SockAddr),\n ok = socket:listen(Sock),\n {ok, #{port := Port}} = socket:sockname(Sock),\n Acceptor = start_acceptor(Sock),\n {ok, {Port, Addr, Acceptor}};\n\nserver(Port) when is_integer(Port) ->\n Family = inet, % Default\n Addr = get_local_addr(Family), % Pick an address\n SockAddr = #{family => Family,\n\t\t addr => Addr,\n\t\t port => Port},\n server(SockAddr).\n\nserver(Port, Addr)\n when is_integer(Port) andalso (Port >= 0) andalso\n is_tuple(Addr) ->\n Family = which_family(Addr),\n SockAddr = #{family => Family,\n\t\t addr => Addr,\n\t\t port => Port},\n server(SockAddr).\n\n\n%% --- Echo Server - Acceptor ---\n\nstart_acceptor(LSock) ->\n Self = self(),\n {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end),\n receive\n\t{'DOWN', MRef, process, Pid, Info} ->\n\t erlang:error({failed_starting_acceptor, Info});\n\t{Pid, started} ->\n\t %% Transfer ownership\n\t socket:setopt(LSock, otp, owner, Pid),\n\t Pid ! {self(), continue},\n\t erlang:demonitor(MRef),\n\t Pid\n end.\n \nacceptor_init(Parent, LSock) ->\n Parent ! {self(), started},\n receive\n\t{Parent, continue} ->\n\t ok\n end,\n acceptor_loop(LSock).\n\nacceptor_loop(LSock) ->\n case socket:accept(LSock, infinity) of\n\t{ok, ASock} ->\n\t start_handler(ASock),\n\t acceptor_loop(LSock);\n\t{error, Reason} ->\n\t erlang:error({accept_failed, Reason})\n end.\n\n\n%% --- Echo Server - Handler ---\n\nstart_handler(Sock) ->\n Self = self(),\n {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end),\n receive\n\t{'DOWN', MRef, process, Pid, Info} ->\n\t erlang:error({failed_starting_handler, Info});\n\t{Pid, started} ->\n\t %% Transfer ownership\n\t socket:setopt(Sock, otp, owner, Pid),\n\t Pid ! {self(), continue},\n\t erlang:demonitor(MRef),\n\t Pid\n end.\n\nhandler_init(Parent, Sock) ->\n Parent ! {self(), started},\n receive\n\t{Parent, continue} ->\n\t ok\n end,\n handler_loop(Sock, undefined).\n\n%% No \"ongoing\" reads\n%% The use of 'nowait' here is clearly *overkill* for this use case,\n%% but is intended as an example of how to use it.\nhandler_loop(Sock, undefined) ->\n case socket:recv(Sock, 0, nowait) of\n\t{ok, Data} ->\n\t echo(Sock, Data),\n\t handler_loop(Sock, undefined);\n\n\t{select, SelectInfo} ->\n\t handler_loop(Sock, SelectInfo);\n\n\t{completion, CompletionInfo} ->\n\t handler_loop(Sock, CompletionInfo);\n\n\t{error, Reason} ->\n\t erlang:error({recv_failed, Reason})\n end;\n\n%% This is the standard (asyncronous) behaviour.\nhandler_loop(Sock, {select_info, recv, SelectHandle}) ->\n receive\n\t{'$socket', Sock, select, SelectHandle} ->\n\t case socket:recv(Sock, 0, nowait) of\n\t\t{ok, Data} ->\n\t\t echo(Sock, Data),\n\t\t handler_loop(Sock, undefined);\n\n\t\t{select, NewSelectInfo} ->\n\t\t handler_loop(Sock, NewSelectInfo);\n\n\t\t{error, Reason} ->\n\t\t erlang:error({recv_failed, Reason})\n\t end\n end;\n\n%% This is the (asyncronous) behaviour on platforms that support 'completion',\n%% currently only Windows.\nhandler_loop(Sock, {completion_info, recv, CompletionHandle}) ->\n receive\n\t{'$socket', Sock, completion, {CompletionHandle, CompletionStatus}} ->\n\t case CompletionStatus of\n\t\t{ok, Data} ->\n\t\t echo(Sock, Data),\n\t\t handler_loop(Sock, undefined);\n\t\t{error, Reason} ->\n\t\t erlang:error({recv_failed, Reason})\n\t end\n end.\n\necho(Sock, Data) when is_binary(Data) ->\n ok = socket:send(Sock, Data, infinity),\n io:format(\"** ECHO **\"\n\t \"~n~s~n\", [binary_to_list(Data)]).\n\n\n%% ======================================================================\n\n%% === Utility functions ===\n\nmaybe_bind(Sock, Family) ->\n maybe_bind(Sock, Family, os:type()).\n\nmaybe_bind(Sock, Family, {win32, _}) ->\n Addr = get_local_addr(Family),\n SockAddr = #{family => Family,\n addr => Addr,\n port => 0},\n socket:bind(Sock, SockAddr);\nmaybe_bind(_Sock, _Family, _OS) ->\n ok.\n\n%% The idea with this is extract a \"usable\" local address\n%% that can be used even from *another* host. And doing\n%% so using the net module.\n\nget_local_addr(Family) ->\n Filter =\n\tfun(#{addr := #{family := Fam},\n\t flags := Flags}) ->\n\t\t(Fam =:= Family) andalso (not lists:member(loopback, Flags));\n\t (_) ->\n\t\tfalse\n\tend,\n {ok, [SockAddr|_]} = net:getifaddrs(Filter),\n #{addr := #{addr := Addr}} = SockAddr,\n Addr.\n\nwhich_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 4) ->\n inet;\nwhich_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 8) ->\n inet6.\n```\n\n\n[](){: #socket_options }","title":"Example - Socket Usage","ref":"socket_usage.html#example"},{"type":"extras","doc":"Options for level `otp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ------------------- | ------------------------------------------------------------- | ----- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------- |\n| assoc_id | integer() | no | yes | type = seqpacket, protocol = sctp, is an association |\n| debug | boolean() | yes | yes | none |\n| iow | boolean() | yes | yes | none |\n| controlling_process | pid() | yes | yes | none |\n| rcvbuf | default \\| pos_integer() \\| \\{pos_integer(), pos_ineteger()\\} | yes | yes | The tuple format is _not_ allowed on Windows. 'default' only valid for set. The tuple form is only valid for type 'stream' and protocol 'tcp'. |\n| rcvctrlbuf | default \\| pos_integer() | yes | yes | default only valid for set |\n| sndctrlbuf | default \\| pos_integer() | yes | yes | default only valid for set |\n| fd | integer() | no | yes | none |\n| use_registry | boolean() | no | yes | the value is set when the socket is created, by a call to [`open/2`](`socket:open/2`) or [`open/4`](`socket:open/4`). |\n\n_Table: option levels_\n\nOptions for level `socket`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ---------------- | ----------------- | ----- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| acceptconn | boolean() | no | yes | none |\n| bindtodevice | string() | yes | yes | Before Linux 3.8, this socket option could be set, but not get. Only works for some socket types (e.g. `inet`). If empty value is set, the binding is removed. |\n| broadcast | boolean() | yes | yes | type = dgram |\n| bsp_state | map() | no | yes | Windows only |\n| debug | integer() | yes | yes | may require admin capability |\n| domain | domain() | no | yes | _Not_ on FreeBSD (for instance) |\n| dontroute | boolean() | yes | yes | none |\n| exclusiveaddruse | boolean() | yes | yes | Windows only |\n| keepalive | boolean() | yes | yes | none |\n| linger | abort \\| linger() | yes | yes | none |\n| maxdg | integer() | no | yes | Windows only |\n| max_msg_size | integer() | no | yes | Windows only |\n| oobinline | boolean() | yes | yes | none |\n| peek_off | integer() | yes | yes | domain = local (unix). Currently disabled due to a possible infinite loop when calling recv(\\[peek]) the second time. |\n| priority | integer() | yes | yes | none |\n| protocol | protocol() | no | yes | _Not_ on (some) Darwin (for instance) |\n| rcvbuf | non_neg_integer() | yes | yes | none |\n| rcvlowat | non_neg_integer() | yes | yes | none |\n| rcvtimeo | timeval() | yes | yes | This option is not normally supported (see why below). OTP has to be explicitly built with the `--enable-esock-rcvsndtime` configure option for this to be available. Since our implementation is _nonblocking_, its unknown if and how this option works, or even if it may cause malfunctions. Therefore, we do not recommend setting this option. Instead, use the `Timeout` argument to, for instance, the [`recv/3`](`socket:recv/3`) function. |\n| reuseaddr | boolean() | yes | yes | none |\n| reuseport | boolean() | yes | yes | domain = inet \\| inet6 |\n| sndbuf | non_neg_integer() | yes | yes | none |\n| sndlowat | non_neg_integer() | yes | yes | not changeable on Linux |\n| sndtimeo | timeval() | yes | yes | This option is not normally supported (see why below). OTP has to be explicitly built with the `--enable-esock-rcvsndtime` configure option for this to be available. Since our implementation is _nonblocking_, its unknown if and how this option works, or even if it may cause malfunctions. Therefore, we do not recommend setting this option. Instead, use the `Timeout` argument to, for instance, the [`send/3`](`socket:send/3`) function. |\n| timestamp | boolean() | yes | yes | none |\n| type | type() | no | yes | none |\n\n_Table: socket options_\n\nOptions for level `ip`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ---------------------- | --------------------- | ----- | ----- | ---------------------------------------------------------- |\n| add_membership | ip_mreq() | yes | no | none |\n| add_source_membership | ip_mreq_source() | yes | no | none |\n| block_source | ip_mreq_source() | yes | no | none |\n| drop_membership | ip_mreq() | yes | no | none |\n| drop_source_membership | ip_mreq_source() | yes | no | none |\n| freebind | boolean() | yes | yes | none |\n| hdrincl | boolean() | yes | yes | type = raw |\n| minttl | integer() | yes | yes | type = raw |\n| msfilter | null \\| ip_msfilter() | yes | no | none |\n| mtu | integer() | no | yes | type = raw |\n| mtu_discover | ip_pmtudisc() | yes | yes | none |\n| multicast_all | boolean() | yes | yes | none |\n| multicast_if | any \\| ip4_address() | yes | yes | none |\n| multicast_loop | boolean() | yes | yes | none |\n| multicast_ttl | uint8() | yes | yes | none |\n| nodefrag | boolean() | yes | yes | type = raw |\n| pktinfo | boolean() | yes | yes | type = dgram |\n| recvdstaddr | boolean() | yes | yes | type = dgram |\n| recverr | boolean() | yes | yes | none |\n| recvif | boolean() | yes | yes | type = dgram \\| raw |\n| recvopts | boolean() | yes | yes | type =/= stream |\n| recvorigdstaddr | boolean() | yes | yes | none |\n| recvttl | boolean() | yes | yes | type =/= stream |\n| retopts | boolean() | yes | yes | type =/= stream |\n| router_alert | integer() | yes | yes | type = raw |\n| sendsrcaddr | boolean() | yes | yes | none |\n| tos | ip_tos() | yes | yes | some high-priority levels may require superuser capability |\n| transparent | boolean() | yes | yes | requires admin capability |\n| ttl | integer() | yes | yes | none |\n| unblock_source | ip_mreq_source() | yes | no | none |\n\n_Table: ip options_\n\nOptions for level `ipv6`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ---------------------- | ------------------ | ----- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| addrform | inet | yes | no | allowed only for IPv6 sockets that are connected and bound to a v4-mapped-on-v6 address |\n| add_membership | ipv6_mreq() | yes | no | none |\n| authhdr | boolean() | yes | yes | type = dgram \\| raw, obsolete? |\n| drop_membership | ipv6_mreq() | yes | no | none |\n| dstopts | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| flowinfo | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| hoplimit | boolean() | yes | yes | type = dgram \\| raw. On some platforms (e.g. FreeBSD) is used to set in order to get `hoplimit` as a control message heeader. On others (e.g. Linux), `recvhoplimit` is set in order to get `hoplimit`. |\n| hopopts | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| mtu | boolean() | yes | yes | Get: Only after the socket has been connected |\n| mtu_discover | ipv6_pmtudisc() | yes | yes | none |\n| multicast_hops | default \\| uint8() | yes | yes | none |\n| multicast_if | integer() | yes | yes | type = dgram \\| raw |\n| multicast_loop | boolean() | yes | yes | none |\n| recverr | boolean() | yes | yes | none |\n| recvhoplimit | boolean() | yes | yes | type = dgram \\| raw. On some platforms (e.g. Linux), `recvhoplimit` is set in order to get `hoplimit` |\n| recvpktinfo \\| pktinfo | boolean() | yes | yes | type = dgram \\| raw. On some platforms (e.g. FreeBSD) is used to set in order to get `hoplimit` as a control message heeader. On others (e.g. Linux), `recvhoplimit` is set in order to get `hoplimit`. |\n| recvtclass | boolean() | yes | yes | type = dgram \\| raw. On some platforms is used to set (=true) in order to get the `tclass` control message heeader. On others, `tclass` is set in order to get `tclass` control message heeader. |\n| router_alert | integer() | yes | yes | type = raw |\n| rthdr | boolean() | yes | yes | type = dgram \\| raw, requires superuser privileges to update |\n| tclass | integer() | yes | yes | Set the traffic class associated with outgoing packets. RFC3542. |\n| unicast_hops | default \\| uint8() | yes | yes | none |\n| v6only | boolean() | yes | no | none |\n\n_Table: ipv6 options_\n\nOptions for level `tcp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ------------- | ------------ | ----- | ----- | -------------------------------------------------------------------------------------------------------- |\n| congestion | string() | yes | yes | none |\n| cork | boolean() | yes | yes | 'nopush' one some platforms (FreeBSD) |\n| keepcnt | integer() | yes | yes | On Windows (at least), it is illegal to set to a value greater than 255. |\n| keepidle | integer() | yes | yes | none |\n| keepintvl | integer() | yes | yes | none |\n| maxseg | integer() | yes | yes | Set not allowed on all platforms. |\n| nodelay | boolean() | yes | yes | none |\n| nopush | boolean() | yes | yes | 'cork' on some platforms (Linux). On Darwin this has a different meaning than on, for instance, FreeBSD. |\n\n_Table: tcp options_\n\nOptions for level `udp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ------------- | ------------ | ----- | ----- | --------------------------------- |\n| cork | boolean() | yes | yes | none |\n\n_Table: udp options_\n\nOptions for level `sctp`:\n\n| _Option Name_ | _Value Type_ | _Set_ | _Get_ | _Other Requirements and comments_ |\n| ----------------- | ---------------------- | ----- | ----- | --------------------------------- |\n| associnfo | sctp_assocparams() | yes | yes | none |\n| autoclose | non_neg_integer() | yes | yes | none |\n| disable_fragments | boolean() | yes | yes | none |\n| events | sctp_event_subscribe() | yes | no | none |\n| initmsg | sctp_initmsg() | yes | yes | none |\n| maxseg | non_neg_integer() | yes | yes | none |\n| nodelay | boolean() | yes | yes | none |\n| rtoinfo | sctp_rtoinfo() | yes | yes | none |\n\n_Table: sctp options_","title":"Socket Options - Socket Usage","ref":"socket_usage.html#socket-options"},{"type":"extras","doc":"\n# Logging\n\nErlang provides a standard API for logging through `Logger`, which is part of\nthe Kernel application. Logger consists of the API for issuing log events, and a\ncustomizable backend where log handlers, filters and formatters can be plugged\nin.\n\nBy default, the Kernel application installs one log handler at system start.\nThis handler is named `default`. It receives and processes standard log events\nproduced by the Erlang runtime system, standard behaviours and different\nErlang/OTP applications. The log events are by default written to the terminal.\n\nYou can also configure the system so that the default handler prints log events\nto a single file, or to a set of wrap logs via `m:disk_log`.\n\nBy configuration, you can also modify or disable the default handler, replace it\nby a custom handler, and install additional handlers.","title":"Logging","ref":"logger_chapter.html"},{"type":"extras","doc":"A _log event_ consists of a _log level_, the _message_ to be logged, and\n_metadata_.\n\nThe Logger backend forwards log events from the API, first through a set of\n_primary filters_, then through a set of secondary filters attached to each log\nhandler. The secondary filters are in the following named _handler filters_.\n\nEach filter set consists of a _log level check_, followed by zero or more\n_filter functions_.\n\nThe following figure shows a conceptual overview of Logger. The figure shows two\nlog handlers, but any number of handlers can be installed.\n\n```mermaid\n---\ntitle: Conceptual Overview\n---\nflowchart TD\n DB[(Config DB)]\n API ---> ML[Module Level Global Level Global Filters]\n API -.Update configuration.-> DB\n ML -.-> DB\n ML ---> HL1[Hander Level Handler Filter]\n ML ---> HL2[Hander Level Handler Filter]\n HL1 ---> HC1[Handler Callback]\n HL2 ---> HC2[Handler Callback]\n HL1 -.-> DB\n HL2 -.-> DB\n subgraph Legend\n direction LR\n start1[ ] -->|Log event flow| stop1[ ]\n style start1 height:0px;\n style stop1 height:0px;\n start2[ ] -.->|Look up configuration| stop2[ ]\n style start2 height:0px;\n style stop2 height:0px;\n end\n```\n\nLog levels are expressed as atoms. Internally in Logger, the atoms are mapped to\ninteger values, and a log event passes the log level check if the integer value\nof its log level is less than or equal to the currently configured log level.\nThat is, the check passes if the event is equally or more severe than the\nconfigured level. See section [Log Level](#log-level) for a\nlisting and description of all log levels.\n\nThe primary log level can be overridden by a log level configured per module.\nThis is to, for instance, allow more verbose logging from a specific part of the\nsystem.\n\nFilter functions can be used for more sophisticated filtering than the log level\ncheck provides. A filter function can stop or pass a log event, based on any of\nthe event's contents. It can also modify all parts of the log event. See section\n[Filters](#filters) for more details.\n\nIf a log event passes through all primary filters and all handler filters for a\nspecific handler, Logger forwards the event to the _handler callback_. The\nhandler formats and prints the event to its destination. See section\n[Handlers](#handlers) for more details.\n\nEverything up to and including the call to the handler callbacks is executed on\nthe client process, that is, the process where the log event was issued. It is\nup to the handler implementation if other processes are involved or not.\n\nThe handlers are called in sequence, and the order is not defined.","title":"Overview - Logging","ref":"logger_chapter.html#overview"},{"type":"extras","doc":"The API for logging consists of a set of [macros](`m:logger#module-macros`), and a set\nof functions on the form `logger:Level/1,2,3`, which are all shortcuts for\n[`logger:log(Level,Arg1[,Arg2[,Arg3]])`](`logger:log/2`).\n\nThe macros are defined in `logger.hrl`, which is included in a module with the\ndirective\n\n```erlang\n-include_lib(\"kernel/include/logger.hrl\").\n```\n\nThe difference between using the macros and the exported functions is that\nmacros add location (originator) information to the metadata, and performs lazy\nevaluation by wrapping the logger call in a case statement, so it is only\nevaluated if the log level of the event passes the primary log level check.","title":"Logger API - Logging","ref":"logger_chapter.html#logger-api"},{"type":"extras","doc":"The log level indicates the severity of a event. In accordance with the Syslog\nprotocol, [RFC 5424](https://www.ietf.org/rfc/rfc5424.txt), eight log levels can\nbe specified. The following table lists all possible log levels by name (atom),\ninteger value, and description:\n\n| **Level** | **Integer** | **Description** |\n| --------- | ----------- | --------------------------------- |\n| emergency | 0 | system is unusable |\n| alert | 1 | action must be taken immediately |\n| critical | 2 | critical conditions |\n| error | 3 | error conditions |\n| warning | 4 | warning conditions |\n| notice | 5 | normal but significant conditions |\n| info | 6 | informational messages |\n| debug | 7 | debug-level messages |\n\n_Table: Log Levels_\n\nNotice that the integer value is only used internally in Logger. In the API, you\nmust always use the atom. To compare the severity of two log levels, use\n`logger:compare_levels/2`.","title":"Log Level - Logging","ref":"logger_chapter.html#log-level"},{"type":"extras","doc":"The log message contains the information to be logged. The message can consist\nof a format string and arguments (given as two separate parameters in the Logger\nAPI), a string or a report.\n\nExample, format string and arguments:\n\n```erlang\nlogger:error(\"The file does not exist: ~ts\",[Filename])\n```\n\nExample, string:\n\n```erlang\nlogger:notice(\"Something strange happened!\")\n```\n\nA report, which is either a map or a key-value list, is the preferred way to log\nusing Logger as it makes it possible for different backends to filter and format\nthe log event as it needs to.\n\nExample, report:\n\n```erlang\n?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })\n```\n\nReports can be accompanied by a _report callback_ specified in the log event's\n[metadata](#metadata). The report callback is a convenience\nfunction that the [formatter](#formatters) can use to convert\nthe report to a format string and arguments, or directly to a string. The\nformatter can also use its own conversion function, if no callback is provided,\nor if a customized formatting is desired.\n\nThe report callback must be a fun with one or two arguments. If it takes one\nargument, this is the report itself, and the fun returns a format string and\narguments:\n\n```erlang\nfun((logger:report()) -> {io:format(),[term()]})\n```\n\nIf it takes two arguments, the first is the report, and the second is a map\ncontaining extra data that allows direct conversion to a string:\n\n```erlang\nfun((logger:report(),logger:report_cb_config()) -> unicode:chardata())\n```\n\nThe fun must obey the `depth` and `chars_limit` parameters provided in the\nsecond argument, as the formatter cannot do anything useful of these parameters\nwith the returned string. The extra data also contains a field named\n`single_line`, indicating if the printed log message may contain line breaks or\nnot. This variant is used when the formatting of the report depends on the size\nor single line parameters.\n\nExample, report, and metadata with report callback:\n\n```erlang\nlogger:debug(#{got => connection_request, id => Id, state => State},\n #{report_cb => fun(R) -> {\"~p\",[R]} end})\n```\n\nThe log message can also be provided through a fun for lazy evaluation. The fun\nis only evaluated if the primary log level check passes, and is therefore\nrecommended if it is expensive to generate the message. The lazy fun must return\na string, a report, or a tuple with format string and arguments.","title":"Log Message - Logging","ref":"logger_chapter.html#log-message"},{"type":"extras","doc":"Metadata contains additional data associated with a log message. Logger inserts\nsome metadata fields by default, and the client can add custom metadata in three\ndifferent ways:\n\n- **Set primary metadata** - Primary metadata applies is the base metadata given\n to all log events. At startup it can be set using the kernel configuration\n parameter [logger_metadata](kernel_app.md#logger_metadata). At run-time it can\n be set and updated using `logger:set_primary_config/1` and\n `logger:update_primary_config/1` respectively.\n\n- **Set process metadata** - Process metadata is set and updated with\n `logger:set_process_metadata/1` and `logger:update_process_metadata/1`,\n respectively. This metadata applies to the process on which these calls are\n made, and Logger adds the metadata to all log events issued on that process.\n\n- **Add metadata to a specific log event** - Metadata associated with one\n specific log event is given as the last parameter to the log macro or Logger\n API function when the event is issued. For example:\n\n ```text\n ?LOG_ERROR(\"Connection closed\",#{context => server})\n ```\n\nSee the description of the `t:logger:metadata/0` type for information about\nwhich default keys Logger inserts, and how the different metadata maps are\nmerged.","title":"Metadata - Logging","ref":"logger_chapter.html#metadata"},{"type":"extras","doc":"Filters can be primary, or attached to a specific handler. Logger calls the\nprimary filters first, and if they all pass, it calls the handler filters for\neach handler. Logger calls the handler callback only if all filters attached to\nthe handler in question also pass.\n\nA filter is defined as:\n\n```text\n{FilterFun, Extra}\n```\n\nwhere `FilterFun` is a function of arity 2, and `Extra` is any term. When\napplying the filter, Logger calls the function with the log event as the first\nargument, and the value of `Extra` as the second argument. See\n`t:logger:filter/0` for type definitions.\n\nThe filter function can return `stop`, `ignore` or the (possibly modified) log\nevent.\n\nIf `stop` is returned, the log event is immediately discarded. If the filter is\nprimary, no handler filters or callbacks are called. If it is a handler filter,\nthe corresponding handler callback is not called, but the log event is forwarded\nto filters attached to the next handler, if any.\n\nIf the log event is returned, the next filter function is called with the\nreturned value as the first argument. That is, if a filter function modifies the\nlog event, the next filter function receives the modified event. The value\nreturned from the last filter function is the value that the handler callback\nreceives.\n\nIf the filter function returns `ignore`, it means that it did not recognize the\nlog event, and thus leaves to other filters to decide the event's destiny.\n\nThe configuration option `filter_default` specifies the behaviour if all filter\nfunctions return `ignore`, or if no filters exist. `filter_default` is by\ndefault set to `log`, meaning that if all existing filters ignore a log event,\nLogger forwards the event to the handler callback. If `filter_default` is set to\n`stop`, Logger discards such events.\n\nPrimary filters are added with `logger:add_primary_filter/2` and removed with\n`logger:remove_primary_filter/1`. They can also be added at system start via the\nKernel configuration parameter [`logger`](#logger_parameter).\n\nHandler filters are added with `logger:add_handler_filter/3` and removed with\n`logger:remove_handler_filter/2`. They can also be specified directly in the\nconfiguration when adding a handler with `logger:add_handler/3` or via the\nKernel configuration parameter [`logger`](#logger_parameter).\n\nTo see which filters are currently installed in the system, use\n`logger:get_config/0`, or `logger:get_primary_config/0` and\n`logger:get_handler_config/1`. Filters are listed in the order they are applied,\nthat is, the first filter in the list is applied first, and so on.\n\nFor convenience, the following built-in filters exist:\n\n- **`logger_filters:domain/2`** - Provides a way of filtering log events based\n on a `domain` field in `Metadata`.\n\n- **`logger_filters:level/2`** - Provides a way of filtering log events based on\n the log level.\n\n- **`logger_filters:progress/2`** - Stops or allows progress reports from\n `supervisor` and `application_controller`.\n\n- **`logger_filters:remote_gl/2`** - Stops or allows log events originating from\n a process that has its group leader on a remote node.","title":"Filters - Logging","ref":"logger_chapter.html#filters"},{"type":"extras","doc":"A handler is defined as a module exporting at least the following callback\nfunction:\n\n```text\nlog(LogEvent, Config) -> term()\n```\n\nThis function is called when a log event has passed through all primary filters,\nand all handler filters attached to the handler in question. The function call\nis executed on the client process, and it is up to the handler implementation if\nother processes are involved or not.\n\nLogger allows adding multiple instances of a handler callback. That is, if a\ncallback module implementation allows it, you can add multiple handler instances\nusing the same callback module. The different instances are identified by unique\nhandler identities.\n\nIn addition to the mandatory callback function `log/2`, a handler module can\nexport the optional callback functions `adding_handler/1`, `changing_config/3`,\n`filter_config/1`, and `removing_handler/1`. See `m:logger_handler` for more\ninformation about these function.\n\nThe following built-in handlers exist:\n\n- **`logger_std_h`** - This is the default handler used by OTP. Multiple\n instances can be started, and each instance will write log events to a given\n destination, terminal or file.\n\n- **`logger_disk_log_h`** - This handler behaves much like `logger_std_h`,\n except it uses `m:disk_log` as its destination.\n\n- **`error_logger`{: #ErrorLoggerManager }** - This handler is provided for\n backwards compatibility only. It is not started by default, but will be\n automatically started the first time an `error_logger` event handler is added\n with\n [`error_logger:add_report_handler/1,2`](`error_logger:add_report_handler/1`).\n\n The old `error_logger` event handlers in STDLIB and SASL still exist, but they\n are not added by Erlang/OTP 21.0 or later.","title":"Handlers - Logging","ref":"logger_chapter.html#handlers"},{"type":"extras","doc":"A formatter can be used by the handler implementation to do the final formatting\nof a log event, before printing to the handler's destination. The handler\ncallback receives the formatter information as part of the handler\nconfiguration, which is passed as the second argument to\n[`HModule:log/2`](`c:logger_handler:log/2`).\n\nThe formatter information consist of a formatter module, `FModule` and its\nconfiguration, `FConfig`. `FModule` must export the following function, which\ncan be called by the handler:\n\n```text\nformat(LogEvent,FConfig)\n\t-> FormattedLogEntry\n```\n\nThe formatter information for a handler is set as a part of its configuration\nwhen the handler is added. It can also be changed during runtime with\n[`logger:set_handler_config(HandlerId,formatter,{Module,FConfig})` ](`logger:set_handler_config/3`),\nwhich overwrites the current formatter information, or with\n[`logger:update_formatter_config/2,3`](`logger:update_formatter_config/2`),\nwhich only modifies the formatter configuration.\n\nIf the formatter module exports the optional callback function\n[`check_config(FConfig)`](`c:logger_formatter:check_config/1`), Logger calls\nthis function when the formatter information is set or modified, to verify the\nvalidity of the formatter configuration.\n\nIf no formatter information is specified for a handler, Logger uses\n`logger_formatter` as default. See the `m:logger_formatter` manual page for more\ninformation about this module.","title":"Formatters - Logging","ref":"logger_chapter.html#formatters"},{"type":"extras","doc":"At system start, Logger is configured through Kernel configuration parameters.\nThe parameters that apply to Logger are described in section\n[Kernel Configuration Parameters](#kernel-configuration-parameters).\nExamples are found in section\n[Configuration Examples](#configuration-examples).\n\nDuring runtime, Logger configuration is changed via API functions. See section\n[Configuration API Functions](`m:logger#configuration-api-functions`) in the `m:logger`\nmanual page.","title":"Configuration - Logging","ref":"logger_chapter.html#configuration"},{"type":"extras","doc":"Logger API functions that apply to the primary Logger configuration are:\n\n- [`get_primary_config/0`](`logger:get_primary_config/0`)\n- [`set_primary_config/1,2`](`logger:set_primary_config/1`)\n- [`update_primary_config/1`](`logger:update_primary_config/1`)\n- [`add_primary_filter/2`](`logger:add_primary_filter/2`)\n- [`remove_primary_filter/1`](`logger:remove_primary_filter/1`)\n\nThe primary Logger configuration is a map with the following keys:\n\n- **`level = `{: #primary_level }`t:logger:level/0` ` | all | none`** - Specifies\n the primary log level, that is, log event that are equally or more severe than\n this level, are forwarded to the primary filters. Less severe log events are\n immediately discarded.\n\n See section [Log Level](#log-level) for a listing and\n description of possible log levels.\n\n The initial value of this option is set by the Kernel configuration parameter\n [`logger_level`](#logger_level). It is changed during runtime\n with\n [`logger:set_primary_config(level,Level)`](`logger:set_primary_config/2`).\n\n Defaults to `notice`.\n\n- **`filters = [{FilterId,Filter}]`** - Specifies the primary filters.\n\n - `FilterId = ` `t:logger:filter_id/0`\n - `Filter = ` `t:logger:filter/0`\n\n The initial value of this option is set by the Kernel configuration parameter\n [`logger`](#logger_parameter). During runtime, primary\n filters are added and removed with `logger:add_primary_filter/2` and\n `logger:remove_primary_filter/1`, respectively.\n\n See section [Filters](#filters) for more detailed\n information.\n\n Defaults to `[]`.\n\n- **`filter_default = log | stop`** - Specifies what happens to a log event if\n all filters return `ignore`, or if no filters exist.\n\n See section [Filters](#filters) for more information about\n how this option is used.\n\n Defaults to `log`.\n\n- **`metadata = `[`metadata()`](`t:logger:metadata/0`)** - The primary metadata\n to be used for all log calls.\n\n See section [Metadata](#metadata) for more information about\n how this option is used.\n\n Defaults to `#{}`.","title":"Primary Logger Configuration - Logging","ref":"logger_chapter.html#primary-logger-configuration"},{"type":"extras","doc":"Logger API functions that apply to handler configuration are:\n\n- [`get_handler_config/0,1`](`logger:get_handler_config/0`)\n- [`set_handler_config/2,3`](`logger:set_handler_config/2`)\n- [`update_handler_config/2,3`](`logger:update_handler_config/2`)\n- [`add_handler_filter/3`](`logger:add_handler_filter/3`)\n- [`remove_handler_filter/2`](`logger:remove_handler_filter/2`)\n- [`update_formatter_config/2,3`](`logger:update_formatter_config/2`)\n\nThe configuration for a handler is a map with the following keys:\n\n- **`id =` `t:logger_handler:id/0`** - Automatically inserted by Logger. The\n value is the same as the `HandlerId` specified when adding the handler, and it\n cannot be changed.\n\n- **`module = module()`** - Automatically inserted by Logger. The value is the\n same as the `Module` specified when adding the handler, and it cannot be\n changed.\n\n- **`level =` `t:logger:level/0` ` | all | none`** - Specifies the log level for\n the handler, that is, log events that are equally or more severe than this\n level, are forwarded to the handler filters for this handler.\n\n See section [Log Level](#log-level) for a listing and\n description of possible log levels.\n\n The log level is specified when adding the handler, or changed during runtime\n with, for instance,\n [`logger:set_handler_config(HandlerId,level,Level)`](`logger:set_handler_config/3`).\n\n Defaults to `all`.\n\n- **`filters = [{FilterId,Filter}]`** - Specifies the handler filters.\n\n - `FilterId = ` `t:logger:filter_id/0`\n - `Filter = ` `t:logger:filter/0`\n\n Handler filters are specified when adding the handler, or added or removed\n during runtime with `logger:add_handler_filter/3` and\n `logger:remove_handler_filter/2`, respectively.\n\n See [Filters](#filters) for more detailed information.\n\n Defaults to `[]`.\n\n- **`filter_default = log | stop`** - Specifies what happens to a log event if\n all filters return `ignore`, or if no filters exist.\n\n See section [Filters](#filters) for more information about\n how this option is used.\n\n Defaults to `log`.\n\n- **`formatter = {FormatterModule,FormatterConfig}`** - Specifies a formatter\n that the handler can use for converting the log event term to a printable\n string.\n\n - `FormatterModule = module()`\n - `FormatterConfig =` `t:logger:formatter_config/0`\n\n The formatter information is specified when adding the handler. The formatter\n configuration can be changed during runtime with\n [`logger:update_formatter_config/2,3`](`logger:update_formatter_config/2`), or\n the complete formatter information can be overwritten with, for instance,\n `logger:set_handler_config/3`.\n\n See section [Formatters](#formatters) for more detailed\n information.\n\n Defaults to `{logger_formatter,DefaultFormatterConfig}`. See the\n `m:logger_formatter` manual page for information about this formatter and its\n default configuration.\n\n- **`config = term()`** - Handler specific configuration, that is, configuration\n data related to a specific handler implementation.\n\n The configuration for the built-in handlers is described in the\n `m:logger_std_h` and [`logger_disk_log_h` ](`m:logger_disk_log_h`)manual\n pages.\n\nNotice that `level` and `filters` are obeyed by Logger itself before forwarding\nthe log events to each handler, while `formatter` and all handler specific\noptions are left to the handler implementation.","title":"Handler Configuration - Logging","ref":"logger_chapter.html#handler-configuration"},{"type":"extras","doc":"The following Kernel configuration parameters apply to Logger:\n\n- **`logger = [Config]`{: #logger_parameter }** - Specifies the configuration\n for [Logger](`m:logger`), except the primary log level, which is specified\n with [`logger_level`](#logger_level), and the compatibility\n with [SASL Error Logging](`e:sasl:error_logging.md`), which is specified with\n [`logger_sasl_compatible`](#logger_sasl_compatible).\n\n With this parameter, you can modify or disable the default handler, add custom\n handlers and primary logger filters, set log levels per module, and modify the\n [proxy](#logger-proxy) configuration.\n\n `Config` is any (zero or more) of the following:\n\n - **`{handler, default, undefined}`** - Disables the default handler. This\n allows another application to add its own default handler.\n\n Only one entry of this type is allowed.\n\n - **`{handler, HandlerId, Module, HandlerConfig}`** - If `HandlerId` is\n `default`, then this entry modifies the default handler, equivalent to\n calling\n\n ```text\n \t\tlogger:remove_handler(default)\n\n ```\n\n followed by\n\n ```erlang\n \t\tlogger:add_handler(default, Module, HandlerConfig)\n\n ```\n\n For all other values of `HandlerId`, this entry adds a new handler,\n equivalent to calling\n\n ```erlang\n \t\tlogger:add_handler(HandlerId, Module, HandlerConfig)\n\n ```\n\n Multiple entries of this type are allowed.\n\n - **`{filters, FilterDefault, [Filter]}`** - Adds the specified primary\n filters.\n\n - `FilterDefault = log | stop`\n - `Filter = {FilterId, {FilterFun, FilterConfig}}`\n\n Equivalent to calling\n\n ```erlang\n \t\tlogger:add_primary_filter(FilterId, {FilterFun, FilterConfig})\n\n ```\n\n for each `Filter`.\n\n `FilterDefault` specifies the behaviour if all primary filters return\n `ignore`, see section [Filters](#filters).\n\n Only one entry of this type is allowed.\n\n - **`{module_level, Level, [Module]}`** - Sets module log level for the given\n modules. Equivalent to calling\n\n ```erlang\n \t\tlogger:set_module_level(Module, Level)\n ```\n\n for each `Module`.\n\n Multiple entries of this type are allowed.\n\n - **`{proxy, ProxyConfig}`** - Sets the proxy configuration, equivalent to\n calling\n\n ```text\n \t\tlogger:set_proxy_config(ProxyConfig)\n\n ```\n\n Only one entry of this type is allowed.\n\n See section [Configuration Examples](#configuration-examples) for\n examples using the `logger` parameter for system configuration.\n\n- **`logger_metadata = map()`{: #logger_metadata }** - Specifies the primary\n metadata. See the [`kernel(6)`](kernel_app.md#logger_metadata) manual page for\n more information about this parameter.\n\n- **`logger_level = Level`{: #logger_level }** - Specifies the primary log\n level. See the [`kernel(6)`](kernel_app.md#logger_level) manual page for more\n information about this parameter.\n\n- **`logger_sasl_compatible = true | false`{: #logger_sasl_compatible }** -\n Specifies Logger's compatibility with\n [SASL Error Logging](`e:sasl:error_logging.md`). See the\n [`kernel(6)`](kernel_app.md#logger_sasl_compatible) manual page for more\n information about this parameter.","title":"Kernel Configuration Parameters - Logging","ref":"logger_chapter.html#kernel-configuration-parameters"},{"type":"extras","doc":"The value of the Kernel configuration parameter `logger` is a list of tuples. It\nis possible to write the term on the command line when starting an erlang node,\nbut as the term grows, a better approach is to use the system configuration\nfile. See the [`config(4)`](config.md) manual page for more information about\nthis file.\n\nEach of the following examples shows a simple system configuration file that\nconfigures Logger according to the description.\n\nModify the default handler to print to a file instead of\n[`standard_io`](`t:io:standard_io/0`):\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h, % {handler, HandlerId, Module,\n #{config => #{file => \"log/erlang.log\"}}} % Config}\n ]}]}].\n```\n\nModify the default handler to print each log event as a single line:\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{formatter => {logger_formatter, #{single_line => true}}}}\n ]}]}].\n```\n\nModify the default handler to print the pid of the logging process for each log\nevent:\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{formatter => {logger_formatter,\n #{template => [time,\" \",pid,\" \",msg,\"\\n\"]}}}}\n ]}]}].\n```\n\nModify the default handler to only print errors and more severe log events to\n\"log/erlang.log\", and add another handler to print all log events to\n\"log/debug.log\".\n\n```erlang\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{level => error,\n config => #{file => \"log/erlang.log\"}}},\n {handler, info, logger_std_h,\n #{level => debug,\n config => #{file => \"log/debug.log\"}}}\n ]}]}].\n```","title":"Configuration Examples - Logging","ref":"logger_chapter.html#configuration-examples"},{"type":"extras","doc":"Logger provides backwards compatibility with `error_logger` in the following\nways:\n\n- **API for Logging** - The `error_logger` API still exists, but should only be\n used by legacy code. It will be removed in a later release.\n\n Calls to [`error_logger:error_report/1,2`](`error_logger:error_report/1`),\n [`error_logger:error_msg/1,2`](`error_logger:error_msg/1`), and corresponding\n functions for warning and info messages, are all forwarded to Logger as calls\n to [`logger:log(Level,Report,Metadata)`](`logger:log/3`).\n\n `Level = error | warning | info` and is taken from the function name. `Report`\n contains the actual log message, and `Metadata` contains additional\n information which can be used for creating backwards compatible events for\n legacy `error_logger` event handlers, see section\n [Legacy Event Handlers](#legacy_event_handlers).\n\n- **Output Format** - To get log events on the same format as produced by\n `error_logger_tty_h` and `error_logger_file_h`, use the default formatter,\n `logger_formatter`, with configuration parameter `legacy_header` set to\n `true`. This is the default configuration of the `default` handler started by\n Kernel.\n\n- **Default Format of Log Events from OTP** - By default, all log events\n originating from within OTP, except the former so called \"SASL reports\", look\n the same as before.\n\n- **[](){: #sasl_reports } SASL Reports** \n By SASL reports we mean supervisor reports, crash reports and progress\n reports.\n\n Prior to Erlang/OTP 21.0, these reports were only logged when the SASL\n application was running, and they were printed through SASL's own event\n handlers `sasl_report_tty_h` and `sasl_report_file_h`.\n\n The destination of these log events was configured by\n [SASL configuration parameters](`e:sasl:sasl_app.md#deprecated_error_logger_config`).\n\n Due to the specific event handlers, the output format slightly differed from\n other log events.\n\n As of Erlang/OTP 21.0, the concept of SASL reports is removed, meaning that\n the default behaviour is as follows:\n\n - Supervisor reports, crash reports, and progress reports are no longer\n connected to the SASL application.\n - Supervisor reports and crash reports are issued as `error` level log events,\n and are logged through the default handler started by Kernel.\n - Progress reports are issued as `info` level log events, and since the\n default primary log level is `notice`, these are not logged by default. To\n enable printing of progress reports, set the\n [primary log level](#primary_level) to `info`.\n - The output format is the same for all log events.\n\n If the old behaviour is preferred, the Kernel configuration parameter\n [`logger_sasl_compatible`](kernel_app.md#logger_sasl_compatible) can be set to\n `true`. The\n [SASL configuration parameters](`e:sasl:sasl_app.md#deprecated_error_logger_config`)\n can then be used as before, and the SASL reports will only be printed if the\n SASL application is running, through a second log handler named `sasl`.\n\n All SASL reports have a metadata field `domain` which is set to `[otp,sasl]`.\n This field can be used by filters to stop or allow the log events.\n\n See section [SASL User's Guide](`e:sasl:error_logging.md`) for more\n information about the old SASL error logging functionality.\n\n- **[](){: #legacy_event_handlers } Legacy Event Handlers** \n To use event handlers written for `error_logger`, just add your event handler\n with\n\n ```text\n error_logger:add_report_handler/1,2.\n ```\n\n This automatically starts the error logger event manager, and adds\n `error_logger` as a handler to Logger, with the following configuration:\n\n ```erlang\n #{level => info,\n filter_default => log,\n filters => []}.\n ```\n\n > #### Note {: .info }\n >\n > This handler ignores events that do not originate from the `error_logger`\n > API, or from within OTP. This means that if your code uses the Logger API\n > for logging, then your log events will be discarded by this handler.\n >\n > The handler is not overload protected.","title":"Backwards Compatibility with error_logger - Logging","ref":"logger_chapter.html#backwards-compatibility-with-error_logger"},{"type":"extras","doc":"Logger does, to a certain extent, check its input data before forwarding a log\nevent to filters and handlers. It does, however, not evaluate report callbacks,\nor check the validity of format strings and arguments. This means that all\nfilters and handlers must be careful when formatting the data of a log event,\nmaking sure that it does not crash due to bad input data or faulty callbacks.\n\nIf a filter or handler still crashes, Logger will remove the filter or handler\nin question from the configuration, and print a short error message to the\nterminal. A debug event containing the crash reason and other details is also\nissued.\n\nSee section [Log Message](#log-message) for more information\nabout report callbacks and valid forms of log messages.","title":"Error Handling - Logging","ref":"logger_chapter.html#error-handling"},{"type":"extras","doc":"When starting an Erlang node, the default behaviour is that all log events on\nlevel `notice` or more severe, are logged to the terminal via the default\nhandler. To also log info events, you can either change the primary log level to\n`info`:\n\n```text\n1> logger:set_primary_config(level, info).\nok\n```\n\nor set the level for one or a few modules only:\n\n```erlang\n2> logger:set_module_level(mymodule, info).\nok\n```\n\nThis allows info events to pass through to the default handler, and be printed\nto the terminal as well. If there are many info events, it can be useful to\nprint these to a file instead.\n\nFirst, set the log level of the default handler to `notice`, preventing it from\nprinting info events to the terminal:\n\n```erlang\n3> logger:set_handler_config(default, level, notice).\nok\n```\n\nThen, add a new handler which prints to file. You can use the handler module\n`m:logger_std_h`, and configure it to log to file:\n\n```erlang\n4> Config = #{config => #{file => \"./info.log\"}, level => info}.\n#{config => #{file => \"./info.log\"},level => info}\n5> logger:add_handler(myhandler, logger_std_h, Config).\nok\n```\n\nSince `filter_default` defaults to `log`, this handler now receives all log\nevents. If you want info events only in the file, you must add a filter to stop\nall non-info events. The built-in filter `logger_filters:level/2` can do this:\n\n```erlang\n6> logger:add_handler_filter(myhandler, stop_non_info,\n {fun logger_filters:level/2, {stop, neq, info}}).\nok\n```\n\nSee section [Filters](#filters) for more information about the\nfilters and the `filter_default` configuration parameter.","title":"Example: Add a handler to log info events to file - Logging","ref":"logger_chapter.html#example-add-a-handler-to-log-info-events-to-file"},{"type":"extras","doc":"`m:logger_handler` describes the callback functions that can be implemented for\na Logger handler.\n\nA handler callback module must export:\n\n- `log(Log, Config)`\n\nIt can optionally also export some, or all, of the following:\n\n- `adding_handler(Config)`\n- `removing_handler(Config)`\n- `changing_config(SetOrUpdate, OldConfig, NewConfig)`\n- `filter_config(Config)`\n\nWhen a handler is added, by for example a call to\n[`logger:add_handler(Id, HModule, Config)`](`logger:add_handler/3`), Logger\nfirst calls `HModule:adding_handler(Config)`. If this function returns\n`{ok,Config1}`, Logger writes `Config1` to the configuration database, and the\n`logger:add_handler/3` call returns. After this, the handler is installed and\nmust be ready to receive log events as calls to `HModule:log/2`.\n\nA handler can be removed by calling\n[`logger:remove_handler(Id)`](`logger:remove_handler/1`). Logger calls\n`HModule:removing_handler(Config)`, and removes the handler's configuration from\nthe configuration database.\n\nWhen [`logger:set_handler_config/2,3`](`logger:set_handler_config/2`) or\n[`logger:update_handler_config/2,3`](`logger:update_handler_config/2`) is\ncalled, Logger calls\n`HModule:changing_config(SetOrUpdate, OldConfig, NewConfig)`. If this function\nreturns `{ok,NewConfig1}`, Logger writes `NewConfig1` to the configuration\ndatabase.\n\nWhen `logger:get_config/0` or\n[`logger:get_handler_config/0,1`](`logger:get_handler_config/0`) is called,\nLogger calls `HModule:filter_config(Config)`. This function must return the\nhandler configuration where internal data is removed.\n\nA simple handler that prints to the terminal can be implemented as follows:\n\n```erlang\n-module(myhandler1).\n-export([log/2]).\n\nlog(LogEvent, #{formatter := {FModule, FConfig}}) ->\n io:put_chars(FModule:format(LogEvent, FConfig)).\n```\n\nNotice that the above handler does not have any overload protection, and all log\nevents are printed directly from the client process.\n\nFor information and examples of overload protection, please refer to section\n[Protecting the Handler from Overload](#overload_protection),\nand the implementation of `m:logger_std_h` and\n[`logger_disk_log_h` ](`m:logger_disk_log_h`).\n\nThe following is a simpler example of a handler which logs to a file through one\nsingle process:\n\n```erlang\n-module(myhandler2).\n-export([adding_handler/1, removing_handler/1, log/2]).\n-export([init/1, handle_call/3, handle_cast/2, terminate/2]).\n\nadding_handler(Config) ->\n MyConfig = maps:get(config,Config,#{file => \"myhandler2.log\"}),\n {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),\n {ok, Config#{config => MyConfig#{pid => Pid}}}.\n\nremoving_handler(#{config := #{pid := Pid}}) ->\n gen_server:stop(Pid).\n\nlog(LogEvent,#{config := #{pid := Pid}} = Config) ->\n gen_server:cast(Pid, {log, LogEvent, Config}).\n\ninit(#{file := File}) ->\n {ok, Fd} = file:open(File, [append, {encoding, utf8}]),\n {ok, #{file => File, fd => Fd}}.\n\nhandle_call(_, _, State) ->\n {reply, {error, bad_request}, State}.\n\nhandle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->\n do_log(Fd, LogEvent, Config),\n {noreply, State}.\n\nterminate(_Reason, #{fd := Fd}) ->\n _ = file:close(Fd),\n ok.\n\ndo_log(Fd, LogEvent, #{formatter := {FModule, FConfig}}) ->\n String = FModule:format(LogEvent, FConfig),\n io:put_chars(Fd, String).\n```\n\n[](){: #overload_protection }","title":"Example: Implement a handler - Logging","ref":"logger_chapter.html#example-implement-a-handler"},{"type":"extras","doc":"The default handlers, `m:logger_std_h` and `m:logger_disk_log_h`, feature an\noverload protection mechanism, which makes it possible for the handlers to\nsurvive, and stay responsive, during periods of high load (when huge numbers of\nincoming log requests must be handled). The mechanism works as follows:","title":"Protecting the Handler from Overload - Logging","ref":"logger_chapter.html#protecting-the-handler-from-overload"},{"type":"extras","doc":"The handler process keeps track of the length of its message queue and takes\nsome form of action when the current length exceeds a configurable threshold.\nThe purpose is to keep the handler in, or to as quickly as possible get the\nhandler into, a state where it can keep up with the pace of incoming log events.\nThe memory use of the handler must never grow larger and larger, since that will\neventually cause the handler to crash. These three thresholds, with associated\nactions, exist:\n\n- **`sync_mode_qlen`** - As long as the length of the message queue is lower\n than this value, all log events are handled asynchronously. This means that\n the client process sending the log event, by calling a log function in the\n [Logger API](#logger-api), does not wait for a response from\n the handler but continues executing immediately after the event is sent. It is\n not affected by the time it takes the handler to print the event to the log\n device. If the message queue grows larger than this value, the handler starts\n handling log events synchronously instead, meaning that the client process\n sending the event must wait for a response. When the handler reduces the\n message queue to a level below the `sync_mode_qlen` threshold, asynchronous\n operation is resumed. The switch from asynchronous to synchronous mode can\n slow down the logging tempo of one, or a few, busy senders, but cannot protect\n the handler sufficiently in a situation of many busy concurrent senders.\n\n Defaults to `10` messages.\n\n- **`drop_mode_qlen`** - When the message queue grows larger than this\n threshold, the handler switches to a mode in which it drops all new events\n that senders want to log. Dropping an event in this mode means that the call\n to the log function never results in a message being sent to the handler, but\n the function returns without taking any action. The handler keeps logging the\n events that are already in its message queue, and when the length of the\n message queue is reduced to a level below the threshold, synchronous or\n asynchronous mode is resumed. Notice that when the handler activates or\n deactivates drop mode, information about it is printed in the log.\n\n Defaults to `200` messages.\n\n- **`flush_qlen`** - If the length of the message queue grows larger than this\n threshold, a flush (delete) operation takes place. To flush events, the\n handler discards the messages in the message queue by receiving them in a loop\n without logging. Client processes waiting for a response from a synchronous\n log request receive a reply from the handler indicating that the request is\n dropped. The handler process increases its priority during the flush loop to\n make sure that no new events are received during the operation. Notice that\n after the flush operation is performed, the handler prints information in the\n log about how many events have been deleted.\n\n Defaults to `1000` messages.\n\nFor the overload protection algorithm to work properly, it is required that:\n\n`sync_mode_qlen = 1`\n\nTo disable certain modes, do the following:\n\n- If `sync_mode_qlen` is set to `0`, all log events are handled synchronously.\n That is, asynchronous logging is disabled.\n- If `sync_mode_qlen` is set to the same value as `drop_mode_qlen`, synchronous\n mode is disabled. That is, the handler always runs in asynchronous mode,\n unless dropping or flushing is invoked.\n- If `drop_mode_qlen` is set to the same value as `flush_qlen`, drop mode is\n disabled and can never occur.\n\nDuring high load scenarios, the length of the handler message queue rarely grows\nin a linear and predictable way. Instead, whenever the handler process is\nscheduled in, it can have an almost arbitrary number of messages waiting in the\nmessage queue. It is for this reason that the overload protection mechanism is\nfocused on acting quickly, and quite drastically, such as immediately dropping\nor flushing messages, when a large queue length is detected.\n\nThe values of the previously listed thresholds can be specified by the user.\nThis way, a handler can be configured to, for example, not drop or flush\nmessages unless the message queue length of the handler process grows extremely\nlarge. Notice that large amounts of memory can be required for the node under\nsuch circumstances. Another example of user configuration is when, for\nperformance reasons, the client processes must never be blocked by synchronous\nlog requests. It is possible, perhaps, that dropping or flushing events is still\nacceptable, since it does not affect the performance of the client processes\nsending the log events.\n\nA configuration example:\n\n```erlang\nlogger:add_handler(my_standard_h, logger_std_h,\n #{config => #{file => \"./system_info.log\",\n sync_mode_qlen => 100,\n drop_mode_qlen => 1000,\n flush_qlen => 2000}}).\n```","title":"Message Queue Length - Logging","ref":"logger_chapter.html#message-queue-length"},{"type":"extras","doc":"Large bursts of log events - many events received by the handler under a short\nperiod of time - can potentially cause problems, such as:\n\n- Log files grow very large, very quickly.\n- Circular logs wrap too quickly so that important data is overwritten.\n- Write buffers grow large, which slows down file sync operations.\n\nFor this reason, both built-in handlers offer the possibility to specify the\nmaximum number of events to be handled within a certain time frame. With this\nburst control feature enabled, the handler can avoid choking the log with\nmassive amounts of printouts. The configuration parameters are:\n\n- **`burst_limit_enable`** - Value `true` enables burst control and `false`\n disables it.\n\n Defaults to `true`.\n\n- **`burst_limit_max_count`** - This is the maximum number of events to handle\n within a `burst_limit_window_time` time frame. After the limit is reached,\n successive events are dropped until the end of the time frame.\n\n Defaults to `500` events.\n\n- **`burst_limit_window_time`** - See the previous description of\n `burst_limit_max_count`.\n\n Defaults to `1000` milliseconds.\n\nA configuration example:\n\n```erlang\nlogger:add_handler(my_disk_log_h, logger_disk_log_h,\n #{config => #{file => \"./my_disk_log\",\n burst_limit_enable => true,\n burst_limit_max_count => 20,\n burst_limit_window_time => 500}}).\n```","title":"Controlling Bursts of Log Requests - Logging","ref":"logger_chapter.html#controlling-bursts-of-log-requests"},{"type":"extras","doc":"It is possible that a handler, even if it can successfully manage peaks of high\nload without crashing, can build up a large message queue, or use a large amount\nof memory. The overload protection mechanism includes an automatic termination\nand restart feature for the purpose of guaranteeing that a handler does not grow\nout of bounds. The feature is configured with the following parameters:\n\n- **`overload_kill_enable`** - Value `true` enables the feature and `false`\n disables it.\n\n Defaults to `false`.\n\n- **`overload_kill_qlen`** - This is the maximum allowed queue length. If the\n message queue grows larger than this, the handler process is terminated.\n\n Defaults to `20000` messages.\n\n- **`overload_kill_mem_size`** - This is the maximum memory size that the\n handler process is allowed to use. If the handler grows larger than this, the\n process is terminated.\n\n Defaults to `3000000` bytes.\n\n- **`overload_kill_restart_after`** - If the handler is terminated, it restarts\n automatically after a delay specified in milliseconds. The value `infinity`\n prevents restarts.\n\n Defaults to `5000` milliseconds.\n\nIf the handler process is terminated because of overload, it prints information\nabout it in the log. It also prints information about when a restart has taken\nplace, and the handler is back in action.\n\n> #### Note {: .info }\n>\n> The sizes of the log events affect the memory needs of the handler. For\n> information about how to limit the size of log events, see the\n> `m:logger_formatter` manual page.","title":"Terminating an Overloaded Handler - Logging","ref":"logger_chapter.html#terminating-an-overloaded-handler"},{"type":"extras","doc":"The Logger proxy is an Erlang process which is part of the Kernel application's\nsupervision tree. During startup, the proxy process registers itself as the\n`system_logger`, meaning that log events produced by the emulator are sent to\nthis process.\n\nWhen a log event is issued on a process which has its group leader on a remote\nnode, Logger automatically forwards the log event to the group leader's node. To\nachieve this, it first sends the log event as an Erlang message from the\noriginal client process to the proxy on the local node, and the proxy in turn\nforwards the event to the proxy on the remote node.\n\nWhen receiving a log event, either from the emulator or from a remote node, the\nproxy calls the Logger API to log the event.\n\nThe proxy process is overload protected in the same way as described in section\n[Protecting the Handler from Overload](#overload_protection),\nbut with the following default values:\n\n```erlang\n #{sync_mode_qlen => 500,\n drop_mode_qlen => 1000,\n flush_qlen => 5000,\n burst_limit_enable => false,\n overload_kill_enable => false}\n```\n\nFor log events from the emulator, synchronous message passing mode is not\napplicable, since all messages are passed asynchronously by the emulator. Drop\nmode is achieved by setting the `system_logger` to `undefined`, forcing the\nemulator to drop events until it is set back to the proxy pid again.\n\nThe proxy uses `erlang:send_nosuspend/2` when sending log events to a remote\nnode. If the message could not be sent without suspending the sender, it is\ndropped. This is to avoid blocking the proxy process.","title":"Logger Proxy - Logging","ref":"logger_chapter.html#logger-proxy"},{"type":"extras","doc":"`m:disk_log`, `m:erlang`, `m:error_logger`, `m:logger`, `m:logger_disk_log_h`,\n`m:logger_filters`, `m:logger_formatter`, `m:logger_std_h`,\n[`sasl(6)`](`e:sasl:sasl_app.md`)","title":"See Also - Logging","ref":"logger_chapter.html#see-also"},{"type":"extras","doc":"\n# Logging Cookbook\n\nUsing and especially configuring Logger can be difficult at times as there are\nmany different options that can be changed and often more than one way to\nachieve the same result. This User's Guide tries to help by giving many\ndifferent examples of how you can use logger.\n\nFor more examples of practical use-cases of using Logger, Fred Hebert's blog\npost\n[Erlang/OTP 21's new logger](https://ferd.ca/erlang-otp-21-s-new-logger.html) is\na great starting point.\n\n> #### Note {: .info }\n>\n> If you find that some common Logger usage is missing from this guide, please\n> open a pull request on github with the suggested addition","title":"Logging Cookbook","ref":"logger_cookbook.html"},{"type":"extras","doc":"","title":"Get Logger information - Logging Cookbook","ref":"logger_cookbook.html#get-logger-information"},{"type":"extras","doc":"```erlang\n1> logger:i(primary).\nPrimary configuration:\n Level: notice\n Filter Default: log\n Filters:\n (none)\n```\n\nIt is also possible to fetch the configuration using\n[`logger:get_primary_config()`](`logger:get_primary_config/0`).\n\n#### See also\n\n- [logger:i()](`logger:i/0`)\n- [Configuration](logger_chapter.md#configuration) in the Logging User's Guide","title":"Print the primary Logger configurations. - Logging Cookbook","ref":"logger_cookbook.html#print-the-primary-logger-configurations"},{"type":"extras","doc":"```erlang\n2> logger:i(handlers).\nHandler configuration:\n Id: default\n Module: logger_std_h\n Level: all\n Formatter:\n Module: logger_formatter\n Config:\n legacy_header: true\n single_line: false\n Filter Default: stop\n Filters:\n Id: remote_gl\n Fun: fun logger_filters:remote_gl/2\n Arg: stop\n Id: domain\n Fun: fun logger_filters:domain/2\n Arg: {log,super,[otp,sasl]}\n Id: no_domain\n Fun: fun logger_filters:domain/2\n Arg: {log,undefined,[]}\n Handler Config:\n burst_limit_enable: true\n burst_limit_max_count: 500\n burst_limit_window_time: 1000\n drop_mode_qlen: 200\n filesync_repeat_interval: no_repeat\n flush_qlen: 1000\n overload_kill_enable: false\n overload_kill_mem_size: 3000000\n overload_kill_qlen: 20000\n overload_kill_restart_after: 5000\n sync_mode_qlen: 10\n type: standard_io\n```\n\nYou can also print the configuration of a specific handler using\n[`logger:i(HandlerName)`](`logger:i/1`), or fetch the configuration using\n[`logger:get_handler_config()`](`logger:get_handler_config/0`), or\n[`logger:get_handler_config(HandlerName)`](`logger:get_handler_config/1`) for a\nspecific handler.\n\n#### See also\n\n- [`logger:i()`](`logger:i/0`)\n- [Configuration](logger_chapter.md#configuration) in the Logging User's Guide","title":"Print the configuration of all handlers. - Logging Cookbook","ref":"logger_cookbook.html#print-the-configuration-of-all-handlers"},{"type":"extras","doc":"","title":"Configure the Logger - Logging Cookbook","ref":"logger_cookbook.html#configure-the-logger"},{"type":"extras","doc":"In OTP-21 the default primary log level is `notice`. The means that many log\nmessages are by default not printed. This includes the progress reports of\nsupervisors. In order to get progress reports you need to raise the primary log\nlevel to `info`\n\n```erlang\n$ erl -kernel logger_level info\n=PROGRESS REPORT==== 4-Nov-2019::16:33:11.742069 ===\n application: kernel\n started_at: nonode@nohost\n=PROGRESS REPORT==== 4-Nov-2019::16:33:11.746546 ===\n application: stdlib\n started_at: nonode@nohost\nEshell V10.5.3 (abort with ^G)\n1>\n```","title":"Where did my progress reports go? - Logging Cookbook","ref":"logger_cookbook.html#where-did-my-progress-reports-go"},{"type":"extras","doc":"In order to fit better into your existing logging infrastructure Logger can\nformat its logging messages any way you want to. Either you can use the built-in\nformatter, or you can build your own.","title":"Configure Logger formatter - Logging Cookbook","ref":"logger_cookbook.html#configure-logger-formatter"},{"type":"extras","doc":"Since single line logging is the default of the built-in formatter you only have\nto provide the empty map as the configuration. The example below uses the\n`sys.config` to change the formatter configuration.\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{ formatter => {logger_formatter, #{ }}}}]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, an error\").\n1962-10-03T11:07:47.466763-04:00 error: Oh noes, an error\n```\n\nHowever, if you just want to change it for the current session you can also do\nthat.\n\n```erlang\n1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).\nok\n2> logger:error(\"Oh noes, another error\").\n1962-10-04T15:34:02.648713-04:00 error: Oh noes, another error\n```\n\n#### See also\n\n- [logger_formatter's Configuration](`t:logger_formatter:config/0`)\n- [Formatters](logger_chapter.md#formatters) in the Logging User's Guide\n- `logger:set_handler_config/3`","title":"Single line configuration - Logging Cookbook","ref":"logger_cookbook.html#single-line-configuration"},{"type":"extras","doc":"You can change what is printed to the log by using the formatter template:\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{ formatter => {logger_formatter,\n #{ template => [time,\" \", file,\":\",line,\" \",level,\": \",msg,\"\\n\"] }}}}]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, more errors\",#{ file => \"shell.erl\", line => 1 }).\n1962-10-05T07:37:44.104241+02:00 shell.erl:1 error: Oh noes, more errors\n```\n\nNote that file and line have to be added in the metadata by the caller of\n`logger:log/3` as otherwise Logger will not know from where it was called. The\nfile and line number are automatically added if you use the `?LOG_ERROR` macros\nin `kernel/include/logger.hrl`.\n\n#### See also\n\n- [logger_formatter's Configuration](`t:logger_formatter:config/0`)\n- [logger_formatter's Template](`t:logger_formatter:template/0`)\n- [Logger Macros](`m:logger#module-macros`)\n- [Metadata](logger_chapter.md#metadata) in the Logging User's Guide","title":"Add file and line number to log entries - Logging Cookbook","ref":"logger_cookbook.html#add-file-and-line-number-to-log-entries"},{"type":"extras","doc":"","title":"Configuring handlers - Logging Cookbook","ref":"logger_cookbook.html#configuring-handlers"},{"type":"extras","doc":"Instead of printing the logs to stdout we print them to a rotating file log.\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger,\n [{handler, default, logger_std_h,\n #{ config => #{ file => \"log/erlang.log\",\n max_no_bytes => 4096,\n max_no_files => 5},\n formatter => {logger_formatter, #{}}}}]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, even more errors\").\nok\n2> erlang:halt().\n$ cat log/erlang.log\n2019-10-07T11:47:16.837958+02:00 error: Oh noes, even more errors\n```\n\n#### See also\n\n- `m:logger_std_h`\n- [Handlers](logger_chapter.md#handlers) in the Logging User's Guide","title":"Print logs to a file - Logging Cookbook","ref":"logger_cookbook.html#print-logs-to-a-file"},{"type":"extras","doc":"Add a handler that prints `debug` log events to a file, while the default\nhandler prints only up to `notice` level events to standard out.\n\n```erlang\n$ cat sys.config\n[{kernel,\n [{logger_level, all},\n {logger,\n [{handler, default, logger_std_h,\n #{ level => notice }},\n {handler, debug, logger_std_h,\n #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],\n config => #{ file => \"log/debug.log\" } }}\n ]}]}].\n$ erl -config sys\nEshell V10.5.1 (abort with ^G)\n1> logger:error(\"Oh noes, even more errors\").\n=ERROR REPORT==== 9-Oct-2019::14:40:54.784162 ===\nOh noes, even more errors\nok\n2> logger:debug(\"A debug event\").\nok\n3> erlang:halt().\n$ cat log/debug.log\n2019-10-09T14:41:03.680541+02:00 debug: A debug event\n```\n\nIn the configuration above we first raise the primary log level to max in order\nfor the debug log events to get to the handlers. Then we configure the default\nhandler to only log notice and below events, the default log level for a handler\nis `all`. Then the debug handler is configured with a filter to stop any log\nmessage that is not a debug level message.\n\nIt is also possible to do the same changes in an already running system using\nthe `logger` module. Then you do like this:\n\n```erlang\n$ erl\n1> logger:set_handler_config(default, level, notice).\nok\n2> logger:add_handler(debug, logger_std_h, #{\n filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],\n config => #{ file => \"log/debug.log\" } }).\nok\n3> logger:set_primary_config(level, all).\nok\n```\n\nIt is important that you do not raise the primary log level before adjusting the\ndefault handler's level as otherwise your standard out may be flooded by debug\nlog messages.\n\n#### See also\n\n- `m:logger_std_h`\n- [Filters](logger_chapter.md#filters) in the Logging User's Guide","title":"Debug only handler - Logging Cookbook","ref":"logger_cookbook.html#debug-only-handler"},{"type":"extras","doc":"","title":"Logging - Logging Cookbook","ref":"logger_cookbook.html#logging"},{"type":"extras","doc":"The simplest way to log something is by using the Logger macros and give a\nreport to the macro. For example if you want to log an error:\n\n```erlang\n?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).\n```\n\nThis will print the following in the default log:\n\n```text\n=ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===\n dst: {8,8,4,4}\n src: {8,8,8,8}\n status: 418\n what: http_error\n```\n\nor the below if you use a single line formatter:\n\n```text\n2019-10-10T12:14:11.921843+02:00 error: dst: {8,8,4,4}, src: {8,8,8,8}, status: 418, what: http_error\n```\n\n#### See also\n\n- [Log Message](logger_chapter.md#log-message) in the Logging User's Guide","title":"What to log and how - Logging Cookbook","ref":"logger_cookbook.html#what-to-log-and-how"},{"type":"extras","doc":"If you want to do structured logging, but still want to have some control of how\nthe final log message is formatted you can give a `report_cb` as part of the\nmetadata with your log event.\n\n```erlang\nReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->\n {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),\n {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),\n {\"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n\",\n [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}\n end,\n?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP },\n #{ report_cb => ReportCB }).\n```\n\nThis will print the following:\n\n```text\n=ERROR REPORT==== 10-Oct-2019::13:29:02.230863 ===\nWhat: http_error\nStatus: 418\nSrc: 8.8.8.8 (dns.google)\nDst: 192.121.151.106 (erlang.org)\n```\n\nNote that the order that things are printed have changed, and also I added a\nreverse-dns lookup of the IP address. This will not print as nicely when using a\nsingle line formatter, however you can also use a report_cb fun with 2 arguments\nwhere the second argument is the formatting options.\n\n#### See also\n\n- [Log Message](logger_chapter.md#log-message) in the Logging User's Guide\n- [Logger Report Callbacks](`t:logger:report_cb/0`)","title":"Report call-backs and printing of events - Logging Cookbook","ref":"logger_cookbook.html#report-call-backs-and-printing-of-events"},{"type":"extras","doc":"Filters are used to remove or change log events before they reach the handlers.","title":"Filters - Logging Cookbook","ref":"logger_cookbook.html#filters"},{"type":"extras","doc":"If we only want debug messages from a specific process it is possible to do this\nwith a filter like this:\n\n```erlang\n%% Initial setup to use a filter for the level filter instead of the primary level\nPrimaryLevel = maps:get(level, logger:get_primary_config()),\nok = logger:add_primary_filter(primary_level,\n {fun logger_filters:level/2, {log, gteq, PrimaryLevel}}),\nlogger:set_primary_config(filter_default, stop),\nlogger:set_primary_config(level, all),\n\n%% Test that things work as they should\nlogger:notice(\"Notice should be logged\"),\nlogger:debug(\"Should not be logged\"),\n\n%% Add the filter to allow PidToLog to send debug events\nPidToLog = self(),\nPidFilter = fun(LogEvent, _) when PidToLog =:= self() -> LogEvent;\n (_LogEvent, _) -> ignore end,\nok = logger:add_primary_filter(pid, {PidFilter,[]}),\nlogger:debug(\"Debug should be logged\").\n```\n\nThere is a bit of setup needed to allow filters to decide whether a specific\nprocess should be allowed to log. This is because the default primary log level\nis notice and it is enforced before the primary filters. So in order for the pid\nfilter to be useful we have to raise the primary log level to `all` and then add\na level filter that only lets certain messages at or greater than notice\nthrough. When the setup is done, it is simple to add a filter that allows a\ncertain pid through.\n\nNote that doing the primary log level filtering through a filter and not through\nthe level is quite a lot more expensive, so make sure to test that your system\ncan handle the extra load before you enable it on a production node.\n\n#### See also\n\n- [Filters](logger_chapter.md#filters) in the Logging User's Guide\n- `logger_filters:level/2`\n- `logger:set_primary_config/2`","title":"Process filters - Logging Cookbook","ref":"logger_cookbook.html#process-filters"},{"type":"extras","doc":"Domains are used to specify which subsystem a certain log event originates from.\nThe default handler will by default only log events with the domain `[otp]` or\nwithout a domain. If you would like to include SSL log events into the default\nhandler log you could do this:\n\n```erlang\n1> logger:add_handler_filter(default,ssl_domain,\n {fun logger_filters:domain/2,{log,sub,[otp,ssl]}}).\n2> application:ensure_all_started(ssl).\n{ok,[crypto,asn1,public_key,ssl]}\n3> ssl:connect(\"www.erlang.org\",443,[{log_level,debug}]).\n%% lots of text\n```\n\n#### See also\n\n- [Filters](logger_chapter.md#filters) in the Logging User's Guide\n- `logger_filters:domain/2`\n- `logger:set_primary_config/2`","title":"Domains - Logging Cookbook","ref":"logger_cookbook.html#domains"},{"type":"extras","doc":"\n# EEP-48: Documentation storage and format\n\nThis User's Guide describes the documentation storage format initially described\nin [EEP-48](https://www.erlang.org/erlang-enhancement-proposals/eep-0048.html).\nBy standardizing how API documentation is stored, it will be possible to write\ntools that work across languages.\n\nTo fetch the EEP-48 documentation for a module, use `code:get_doc/1`.\n\nTo render the EEP-48 documentation for an Erlang module, use\n`shell_docs:render/2`.","title":"EEP-48: Documentation storage and format","ref":"eep48_chapter.html"},{"type":"extras","doc":"To look for documentation for a module named `example`, a tool should:\n\nLook for `example.beam` in the code path, parse the BEAM file, and retrieve the\n`Docs` chunk. If the chunk is not available, it should look for `\"example.beam\"`\nin the code path and find the `doc/chunks/example.chunk` file in the application\nthat defines the `example` module. If no `.chunk` file exists,\ndocumentation is not available.\n\nThe choice of using a chunk or the filesystem is completely up to the language\nor library. In both cases, the documentation can be added or removed at any\nmoment by stripping the `Docs` chunk (using `m:beam_lib`) or by removing the\n`doc/chunks` directory.\n\nFor example, languages such as Elixir and LFE attach the `Docs` chunk at\ncompilation time, which can be controlled via a compiler flag, while\nother languages might want to generate the documentation separate from\nthe compilation of the source code.","title":"The \"Docs\" storage - EEP-48: Documentation storage and format","ref":"eep48_chapter.html#the-docs-storage"},{"type":"extras","doc":"In both storages, the documentation is written in the exactly same format: an\nErlang term serialized to binary via\n[`term_to_binary/1`](`erlang:term_to_binary/1`). The term can be optionally\ncompressed when serialized. It must follow the type specification below:\n\n```erlang\n{docs_v1,\n Anno :: erl_anno:anno(),\n BeamLanguage :: atom(),\n Format :: binary(),\n ModuleDoc :: #{DocLanguage := DocValue} | none | hidden,\n Metadata :: map(),\n Docs ::\n [{{Kind, Name, Arity},\n Anno :: erl_anno:anno(),\n Signature :: [binary()],\n Doc :: #{DocLanguage := DocValue} | none | hidden,\n Metadata :: map()\n }]} when DocLanguage :: binary(),\n DocValue :: binary() | term()\n```\n\nwhere in the root tuple we have:\n\n- **`Anno`** - annotation (line, column, file) of the definition itself (see\n `m:erl_anno`)\n\n- **`BeamLanguage`** - an atom representing the language, for example: `erlang`,\n `elixir`, `lfe`, `alpaca`, and so on\n\n- **`Format`** - the mime type of the documentation, such as `<<\"text/markdown\">>`\n or `<<\"application/erlang+html\">>`. For details of the format used by Erlang\n see the [`EEP-48 Chapter`](`e:edoc:doc_storage.md`) in EDoc's User's\n Guide.\n\n- **`ModuleDoc`** - a map with the documentation language as key, such as\n `<<\"en\">>` or `<<\"pt_BR\">>`, and the documentation as a binary value. It can\n be atom `none` if no documentation exists or the atom `hidden` if\n documentation has been explicitly disabled for this entry.\n\n- **`Metadata`** - a map of atom keys with any term as value. This can be used to\n add annotations like the `authors` of a module, `deprecated`, or anything else\n a language or documentation tool finds relevant.\n\n- **`Docs`** - a list of documentation for other entities (such as functions and\n types) in the module.\n\nFor each entry in Docs, we have:\n\n- **`{Kind, Name, Arity}`** - the kind, name and arity identifying the function,\n callback, type, and so on. The official entities are: `function`, `type`, and\n `callback`. Other languages will add their own. For instance, Elixir and LFE\n might add `macro`.\n\n- **`Anno`** - annotation (line, column, file) of the module documentation or of\n the definition itself (see `m:erl_anno`).\n\n- **`Signature`** - the signature of the entity. It is is a list of binaries.\n Each entry represents a binary in the signature that can be joined with\n whitespace or newline. For example,\n `[<<\"binary_to_atom(Binary, Encoding)\">>, <<\"when is_binary(Binary)\">>]` can\n be rendered as a single line or two lines. It exists exclusively for\n exhibition purposes.\n\n- **`Doc`** - a map with the documentation language as key, such as `<<\"en\">>` or\n `<<\"pt_BR\">>`, and the documentation as a value. The documentation can either be\n a binary or any Erlang term, both described by `Format`. If it is an Erlang\n term, then `Format` must be `<<\"application/erlang+SUFFIX\">>`, such as\n `<<\"application/erlang+html\">>` when the documentation is an Erlang\n representation of an HTML document. `Doc` can also be atom `none`\n if no documentation exists or the atom `hidden` if documentation has been\n explicitly disabled for this entry.\n\n- **`Metadata`** - a map of atom keys with any term as value.\n\nThis shared format is the heart of the EEP as it is what effectively allows\ncross-language collaboration.\n\nThe Metadata field exists to allow languages, tools, and libraries to add custom\ninformation to each entry. This EEP documents the following metadata keys:\n\n- **`authors := [binary()]`** - a list of authors as binaries.\n\n- **`cross_references := [module() | {module(), {Kind, Name, Arity}}]`** - a\n list of modules or module entries that can be used as cross references when\n generating documentation.\n\n- **`deprecated := binary()`** - when present, it means the current entry is\n deprecated with a binary that represents the reason for deprecation and a\n recommendation to replace the deprecated code.\n\n- **`since := binary()`** - a binary representing the version such entry was\n added, such as `<<\"1.3.0\">>` or `<<\"20.0\">>`.\n\n- **`edit_url := binary()`** - a binary representing a URL to change the\n documentation itself.\n\nAny key may be added to Metadata at any time. Keys that are frequently used by\nthe community can be standardized in future versions.","title":"The \"Docs\" format - EEP-48: Documentation storage and format","ref":"eep48_chapter.html#the-docs-format"},{"type":"extras","doc":"`m:erl_anno`, `m:shell_docs`,\n[`EEP-48 Chapter in EDoc's User's Guide`](`e:edoc:doc_storage.md`),\n`code:get_doc/1`","title":"See Also - EEP-48: Documentation storage and format","ref":"eep48_chapter.html#see-also"},{"type":"extras","doc":"\n# app\n\nApplication resource file.","title":"app","ref":"app.html"},{"type":"extras","doc":"The _application resource file_ specifies the resources an application uses, and\nhow the application is started. There must always be one application resource\nfile called `Application.app` for each application `Application` in the system.\n\nThe file is read by the application controller when an application is\nloaded/started. It is also used by the functions in `systools`, for example when\ngenerating start scripts.","title":"Description - app","ref":"app.html#description"},{"type":"extras","doc":"The application resource file is to be called `Application.app`, where\n`Application` is the application name. The file is to be located in directory\n`ebin` for the application.\n\nThe file must contain a single Erlang term, which is called an _application\nspecification_:\n\n```erlang\n{application, Application,\n [{description, Description},\n {id, Id},\n {vsn, Vsn},\n {modules, Modules},\n {maxP, MaxP},\n {maxT, MaxT},\n {registered, Names},\n {included_applications, Apps},\n {optional_applications, Apps},\n {applications, Apps},\n {env, Env},\n {mod, Start},\n {start_phases, Phases},\n {runtime_dependencies, RTDeps}]}.\n\n Value Default\n ----- -------\nApplication atom() -\nDescription string() \"\"\nId string() \"\"\nVsn string() \"\"\nModules [Module] []\nMaxP int() infinity\nMaxT int() infinity\nNames [Name] []\nApps [App] []\nEnv [{Par,Val}] []\nStart {Module,StartArgs} []\nPhases [{Phase,PhaseArgs}] undefined\nRTDeps [ApplicationVersion] []\n\nModule = Name = App = Par = Phase = atom()\nVal = StartArgs = PhaseArgs = term()\nApplicationVersion = string()\n```\n\n- **`Application`** - Application name.\n\nFor the application controller, all keys are optional. The respective default\nvalues are used for any omitted keys.\n\nThe functions in `systools` require more information. If they are used, the\nfollowing keys are mandatory:\n\n- `description`\n- `vsn`\n- `modules`\n- `registered`\n- `applications`\n\nThe other keys are ignored by `systools`.\n\n- **`description`** - A one-line description of the application.\n\n- **`id`** - Product identification, or similar.\n\n- **`vsn`** - Version of the application.\n\n- **`modules`** - All modules introduced by this application. `systools` uses\n this list when generating start scripts and tar files. A module can only be\n defined in one application.\n\n- **`maxP`** - _Deprecated - is ignored_\n\n Maximum number of processes allowed in the application.\n\n- **`maxT`** - Maximum time, in milliseconds, that the application is allowed to\n run. After the specified time, the application terminates automatically.\n\n- **`registered`** - All names of registered processes started in this\n application. `systools` uses this list to detect name clashes between\n different applications.\n\n- **`included_applications`** - All applications included by this application.\n When this application is started, all included applications are loaded\n automatically, but not started, by the application controller. It is assumed\n that the top-most supervisor of the included application is started by a\n supervisor of this application.\n\n- **`applications`** - All applications that must be started before this\n application. If an application is also listed in `optional_applications`, then\n the application is not required to exist (but if it exists, it is also\n guaranteed to be started before this one).\n\n `systools` uses this list to generate correct start scripts. Defaults to the\n empty list, but notice that all applications have dependencies to (at least)\n Kernel and STDLIB.\n\n- **`optional_applications`** - A list of `applications` that are optional. Note\n if you want an optional dependency to be automatically started before the\n current application whenever it is available, it must be listed on both\n `applications` and `optional_applications`.\n\n- **`env`** - Configuration parameters used by the application. The value of a\n configuration parameter is retrieved by calling `application:get_env/1,2`. The\n values in the application resource file can be overridden by values in a\n configuration file (see [`config(4)`](config.md)) or by command-line flags\n (see [`erts:erl(1)`](`e:erts:erl_cmd.md`)).\n\n- **`mod`** - Specifies the application callback module and a start argument,\n see `m:application`.\n\n Key `mod` is necessary for an application implemented as a supervision tree,\n otherwise the application controller does not know how to start it. `mod` can\n be omitted for applications without processes, typically code libraries, for\n example, STDLIB.\n\n- **`start_phases`** - A list of start phases and corresponding start arguments\n for the application. If this key is present, the application master, in\n addition to the usual call to `Module:start/2`, also calls\n `Module:start_phase(Phase,Type,PhaseArgs)` for each start phase defined by key\n `start_phases`. Only after this extended start procedure,\n `application:start(Application)` returns.\n\n Start phases can be used to synchronize startup of an application and its\n included applications. In this case, key `mod` must be specified as follows:\n\n ```erlang\n {mod, {application_starter,[Module,StartArgs]}}\n ```\n\n The application master then calls `Module:start/2` for the primary\n application, followed by calls to `Module:start_phase/3` for each start phase\n (as defined for the primary application), both for the primary application and\n for each of its included applications, for which the start phase is defined.\n\n This implies that for an included application, the set of start phases must be\n a subset of the set of phases defined for the primary application. For more\n information, see [OTP Design Principles](`e:system:applications.md`).\n\n- **`runtime_dependencies`{: #runtime_dependencies }** - A list of application\n versions that the application depends on. An example of such an application\n version is `\"kernel-3.0\"`. Application versions specified as runtime\n dependencies are minimum requirements. That is, a larger application version\n than the one specified in the dependency satisfies the requirement. For\n information about how to compare application versions, see section\n [Versions](`e:system:versions.md`) in the System Principles User's Guide.\n\n Notice that the application version specifies a source code version. One more,\n indirect, requirement is that the installed binary application of the\n specified version is built so that it is compatible with the rest of the\n system.\n\n Some dependencies can only be required in specific runtime scenarios. When\n such optional dependencies exist, these are specified and documented in the\n corresponding \"App\" documentation of the specific application.","title":"File Syntax - app","ref":"app.html#file-syntax"},{"type":"extras","doc":"`m:application`, `m:systools`","title":"See Also - app","ref":"app.html#see-also"},{"type":"extras","doc":"\n# config\n\nConfiguration file.","title":"config","ref":"config.html"},{"type":"extras","doc":"A _configuration file_ contains values for configuration parameters for the\napplications in the system. The `erl` command-line argument\n[`-config Name`](`e:erts:erl_cmd.md#config`) tells the system to use data in the\nsystem configuration file `Name.config`.\n\nThe erl command-line argument [`-configfd`](`e:erts:erl_cmd.md#configfd`) works\nthe same way as the `-config` option but specifies a file descriptor to read\nconfiguration data from instead of a file.\n\nThe configuration data from configuration files and file descriptors are read in\nthe same order as they are given on the command line. For example,\n`erl -config a -configfd 3 -config b -configfd 4` would cause the system to read\nconfiguration data in the following order `a.config`, file descriptor `3`,\n`b.config`, and file descriptor `4`. If a configuration parameter is specified\nmore than once in the given files and file descriptors, the last one overrides\nthe previous ones.\n\nConfiguration parameter values in a configuration file or file descriptor\noverride the values in the application resource files (see [`app(4)`](app.md)).\nThe values in the configuration file are always overridden by command-line flags\n(see [`erts:erl(1)`](`e:erts:erl_cmd.md`)).\n\nThe value of a configuration parameter is retrieved by calling\n`application:get_env/1,2`.","title":"Description - config","ref":"config.html#description"},{"type":"extras","doc":"The configuration file is to be called `Name.config`, where `Name` is any name.\n\nFile `.config` contains a single Erlang term and has the following syntax:\n\n```erlang\n[{Application1, [{Par11, Val11}, ...]},\n ...\n {ApplicationN, [{ParN1, ValN1}, ...]}].\n```\n\n- **`Application = atom()`** - Application name.\n\n- **`Par = atom()`** - Name of a configuration parameter.\n\n- **`Val = term()`** - Value of a configuration parameter.","title":"File Syntax - config","ref":"config.html#file-syntax"},{"type":"extras","doc":"When starting Erlang in embedded mode, it is assumed that exactly one system\nconfiguration file is used, named `sys.config`. This file is to be located in\n`$ROOT/releases/Vsn`, where `$ROOT` is the Erlang/OTP root installation\ndirectory and `Vsn` is the release version.\n\nRelease handling relies on this assumption. When installing a new release\nversion, the new `sys.config` is read and used to update the application's\nconfigurations.\n\nThis means that specifying another `.config` file, or more `.config` files,\nleads to an inconsistent update of application configurations. There is,\nhowever, a way to point out other config files from a `sys.config`. How to do\nthis is described in the next section.","title":"sys.config - config","ref":"config.html#sys-config"},{"type":"extras","doc":"There is a way to include other configuration files from a `sys.config` file and\nfrom a configuration that comes from a file descriptor that has been pointed out\nwith the [`-configfd`](`e:erts:erl_cmd.md#configfd`) command-line argument.\n\nThe syntax for including files can be described by the\n[Erlang type language](`e:system:typespec.md`) like this:\n\n```text\n[{Application, [{Par, Val}]} | IncludeFile].\n```\n\n- **`IncludeFile = string()`** - Name of a `.config` file. The extension\n `.config` can be omitted. It is recommended to use absolute paths. If a\n relative path is used in a `sys.config`, `IncludeFile` is searched, first,\n relative to the `sys.config` directory, then relative to the current working\n directory of the emulator. If a relative path is used in a `-configfd`\n configuration, `IncludeFile` is searched, first, relative to the dictionary\n containing the [boot script](`e:sasl:script.md`) (see also the\n [`-boot`](`e:erts:erl_cmd.md#boot`) command-line argument) for the emulator,\n then relative to the current working directory of the emulator. This makes it\n possible to use `sys.config` for pointing out other `.config` files in a\n release or in a node started manually using `-config` or `-configfd` with the\n same result whatever the current working directory is.\n\nWhen traversing the contents of a `sys.config` or a `-configfd` configuration\nand a filename is encountered, its contents are read and merged with the result\nso far. When an application configuration tuple `{Application, Env}` is found,\nit is merged with the result so far. Merging means that new parameters are added\nand existing parameter values are overwritten.\n\n_Example:_\n\n```text\nsys.config:\n\n[\"/home/user/myconfig1\"\n {myapp,[{par1,val1},{par2,val2}]},\n \"/home/user/myconfig2\"].\n\nmyconfig1.config:\n\n[{myapp,[{par0,val0},{par1,val0},{par2,val0}]}].\n\nmyconfig2.config:\n\n[{myapp,[{par2,val3},{par3,val4}]}].\n```\n\nThis yields the following environment for `myapp`:\n\n```text\n[{par0,val0},{par1,val1},{par2,val3},{par3,val4}]\n```\n\nThe run-time system will abort before staring up if an include file specified in\n`sys.config` or a `-configfd` configuration does not exist, or is erroneous.\nHowever, installing a new release version will not fail if there is an error\nwhile loading an include file, but an error message is returned and the\nerroneous file is ignored.","title":"Including Files from sys.config and -configfd Configurations - config","ref":"config.html#including-files-from-sys-config-and-configfd-configurations"},{"type":"extras","doc":"[`app(4)`](app.md), [`erts:erl(1)`](`e:erts:erl_cmd.md`),\n[OTP Design Principles](`e:system:design_principles.md`)","title":"See Also - config","ref":"config.html#see-also"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/kernel-10.2/doc/html/eep48_chapter.html b/prs/9277/lib/kernel-10.2/doc/html/eep48_chapter.html index 9ba4d6499a584..70db70261d059 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/eep48_chapter.html +++ b/prs/9277/lib/kernel-10.2/doc/html/eep48_chapter.html @@ -154,20 +154,20 @@

                In both storages, the documentation is written in the exactly same format: an Erlang term serialized to binary via term_to_binary/1. The term can be optionally -compressed when serialized. It must follow the type specification below:

                {docs_v1,
                - Anno :: erl_anno:anno(),
                - BeamLanguage :: atom(),
                - Format :: binary(),
                - ModuleDoc :: #{DocLanguage := DocValue} | none | hidden,
                - Metadata :: map(),
                +compressed when serialized. It must follow the type specification below:

                {docs_v1,
                + Anno :: erl_anno:anno(),
                + BeamLanguage :: atom(),
                + Format :: binary(),
                + ModuleDoc :: #{DocLanguage := DocValue} | none | hidden,
                + Metadata :: map(),
                  Docs ::
                -   [{{Kind, Name, Arity},
                -     Anno :: erl_anno:anno(),
                -     Signature :: [binary()],
                -     Doc :: #{DocLanguage := DocValue} | none | hidden,
                -     Metadata :: map()
                -    }]} when DocLanguage :: binary(),
                -             DocValue :: binary() | term()

                where in the root tuple we have:

                • Anno - annotation (line, column, file) of the definition itself (see + [{{Kind, Name, Arity}, + Anno :: erl_anno:anno(), + Signature :: [binary()], + Doc :: #{DocLanguage := DocValue} | none | hidden, + Metadata :: map() + }]} when DocLanguage :: binary(), + DocValue :: binary() | term()

                where in the root tuple we have:

                • Anno - annotation (line, column, file) of the definition itself (see erl_anno)

                • BeamLanguage - an atom representing the language, for example: erlang, elixir, lfe, alpaca, and so on

                • Format - the mime type of the documentation, such as <<"text/markdown">> or <<"application/erlang+html">>. For details of the format used by Erlang diff --git a/prs/9277/lib/kernel-10.2/doc/html/erl_epmd.html b/prs/9277/lib/kernel-10.2/doc/html/erl_epmd.html index 24d2e1457d9d3..a74d06724d8f0 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/erl_epmd.html +++ b/prs/9277/lib/kernel-10.2/doc/html/erl_epmd.html @@ -361,8 +361,8 @@

                  names(Host)

                  Called by net_adm:names/0. Host defaults to the localhost. Returns the names and associated port numbers of the Erlang nodes that epmd registered at the specified host. Returns {error, address} if epmd is not -operational.

                  Example:

                  (arne@dunn)1> erl_epmd:names(localhost).
                  -{ok,[{"arne",40262}]}
                  +operational.

                  Example:

                  (arne@dunn)1> erl_epmd:names(localhost).
                  +{ok,[{"arne",40262}]}
                  diff --git a/prs/9277/lib/kernel-10.2/doc/html/erpc.html b/prs/9277/lib/kernel-10.2/doc/html/erpc.html index 1c4c26696e197..c063e5bdc2fb2 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/erpc.html +++ b/prs/9277/lib/kernel-10.2/doc/html/erpc.html @@ -1221,20 +1221,20 @@

                  multicall(Nodes, Module, Function, Args, Ti selective receive optimization which removes the need to scan the message queue from the beginning in order to find a matching message. The send_request()/receive_response() combination can, however, not utilize this -optimization.

                  my_multicall(Nodes, Module, Function, Args) ->
                  -  ReqIds = lists:map(fun (Node) ->
                  -                       erpc:send_request(Node, Module, Function, Args)
                  +optimization.

                  my_multicall(Nodes, Module, Function, Args) ->
                  +  ReqIds = lists:map(fun (Node) ->
                  +                       erpc:send_request(Node, Module, Function, Args)
                                        end,
                  -                     Nodes),
                  -  lists:map(fun (ReqId) ->
                  +                     Nodes),
                  +  lists:map(fun (ReqId) ->
                                 try
                  -                {ok, erpc:receive_response(ReqId, infinity)}
                  +                {ok, erpc:receive_response(ReqId, infinity)}
                                 catch
                                   Class:Reason ->
                  -                  {Class, Reason}
                  +                  {Class, Reason}
                                 end
                               end,
                  -            ReqIds).

                  If an erpc operation fails, but it is unknown if the function is/will be + ReqIds).

                  If an erpc operation fails, but it is unknown if the function is/will be applied (that is, a timeout, connection loss, or an improper Nodes list), the caller will not receive any further information about the result if/when the applied function completes. If the applied function communicates with the @@ -1392,9 +1392,9 @@

                  receive_response(RequestId, Timeout)

                  performance. call() can utilize a selective receive optimization which removes the need to scan the message queue from the beginning in order to find a matching message. The send_request()/receive_response() combination can, -however, not utilize this optimization.

                  my_call(Node, Module, Function, Args, Timeout) ->
                  -  RequestId = erpc:send_request(Node, Module, Function, Args),
                  -  erpc:receive_response(RequestId, Timeout).

                  If the erpc operation fails, but it is unknown if the function is/will be +however, not utilize this optimization.

                  my_call(Node, Module, Function, Args, Timeout) ->
                  +  RequestId = erpc:send_request(Node, Module, Function, Args),
                  +  erpc:receive_response(RequestId, Timeout).

                  If the erpc operation fails, but it is unknown if the function is/will be applied (that is, a timeout, or a connection loss), the caller will not receive any further information about the result if/when the applied function completes. If the applied function explicitly communicates with the calling process, such @@ -1697,9 +1697,9 @@

                  send_request/4

                  performance. call() can utilize a selective receive optimization which removes the need to scan the message queue from the beginning in order to find a matching message. The send_request()/receive_response() combination can, -however, not utilize this optimization.

                  my_call(Node, Module, Function, Args, Timeout) ->
                  -  RequestId = erpc:send_request(Node, Module, Function, Args),
                  -  erpc:receive_response(RequestId, Timeout).

                  Fails with an {erpc, badarg} error exception if:

                  • Node is not an atom.
                  • Module is not an atom.
                  • Function is not an atom.
                  • Args is not a list. Note that the list is not verified to be a proper list +however, not utilize this optimization.

                    my_call(Node, Module, Function, Args, Timeout) ->
                    +  RequestId = erpc:send_request(Node, Module, Function, Args),
                    +  erpc:receive_response(RequestId, Timeout).

                    Fails with an {erpc, badarg} error exception if:

                    • Node is not an atom.
                    • Module is not an atom.
                    • Function is not an atom.
                    • Args is not a list. Note that the list is not verified to be a proper list at the client side.

                    Note

                    You cannot make any assumptions about the process that will perform the apply(). It may be a server, or a freshly spawned process.

                    Equivalent to erpc:send_request(Node, erlang, apply, [Fun,[]]), Label, RequestIdCollection).

                    Fails with an {erpc, badarg} error exception if:

                    • Node is not an atom.
                    • Fun is not a fun of zero arity.
                    • RequestIdCollection is detected not to be request identifier collection.

                    Note

                    You cannot make any assumptions about the process that will perform the diff --git a/prs/9277/lib/kernel-10.2/doc/html/file.html b/prs/9277/lib/kernel-10.2/doc/html/file.html index 4099232924c3b..3cc82bbf6c267 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/file.html +++ b/prs/9277/lib/kernel-10.2/doc/html/file.html @@ -180,31 +180,31 @@

                    improve performance for small reads and writes. However, the overhead won't disappear completely and it's best to keep the number of file operations to a minimum. As a contrived example, the following function writes 4MB in 2.5 -seconds when tested:

                    create_file_slow(Name) ->
                    -    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    -    create_file_slow_1(Fd, 4 bsl 20),
                    -    file:close(Fd).
                    +seconds when tested:

                    create_file_slow(Name) ->
                    +    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    +    create_file_slow_1(Fd, 4 bsl 20),
                    +    file:close(Fd).
                     
                    -create_file_slow_1(_Fd, 0) ->
                    +create_file_slow_1(_Fd, 0) ->
                         ok;
                    -create_file_slow_1(Fd, M) ->
                    -    ok = file:write(Fd, <<0>>),
                    -    create_file_slow_1(Fd, M - 1).

                    The following functionally equivalent code writes 128 bytes per call to +create_file_slow_1(Fd, M) -> + ok = file:write(Fd, <<0>>), + create_file_slow_1(Fd, M - 1).

                    The following functionally equivalent code writes 128 bytes per call to write/2 and so does the same work in 0.08 seconds, which is roughly 30 times -faster:

                    create_file(Name) ->
                    -    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    -    create_file_1(Fd, 4 bsl 20),
                    -    file:close(Fd),
                    +faster:

                    create_file(Name) ->
                    +    {ok, Fd} = file:open(Name, [raw, write, delayed_write, binary]),
                    +    create_file_1(Fd, 4 bsl 20),
                    +    file:close(Fd),
                         ok.
                     
                    -create_file_1(_Fd, 0) ->
                    +create_file_1(_Fd, 0) ->
                         ok;
                    -create_file_1(Fd, M) when M >= 128 ->
                    -    ok = file:write(Fd, <<0:(128)/unit:8>>),
                    -    create_file_1(Fd, M - 128);
                    -create_file_1(Fd, M) ->
                    -    ok = file:write(Fd, <<0:(M)/unit:8>>),
                    -    create_file_1(Fd, M - 1).

                    When writing data it's generally more efficient to write a list of binaries +create_file_1(Fd, M) when M >= 128 -> + ok = file:write(Fd, <<0:(128)/unit:8>>), + create_file_1(Fd, M - 128); +create_file_1(Fd, M) -> + ok = file:write(Fd, <<0:(M)/unit:8>>), + create_file_1(Fd, M - 1).

                    When writing data it's generally more efficient to write a list of binaries rather than a list of integers. It is not needed to flatten a deep list before writing. On Unix hosts, scatter output, which writes a set of buffers in one operation, is used when possible. In this way @@ -2016,8 +2016,8 @@

                    consult(Filename)

                    For a list of typical error codes, see open/2.

                  • {error, {Line, Mod, Term}} - An error occurred when interpreting the Erlang terms in the file. To convert the three-element tuple to an English description of the error, use format_error/1.

                  Example:

                  f.txt:  {person, "kalle", 25}.
                  -        {person, "pelle", 30}.
                  1> file:consult("f.txt").
                  -{ok,[{person,"kalle",25},{person,"pelle",30}]}

                  The encoding of Filename can be set by a comment, as described in + {person, "pelle", 30}.

                1> file:consult("f.txt").
                +{ok,[{person,"kalle",25},{person,"pelle",30}]}

                The encoding of Filename can be set by a comment, as described in epp.

                @@ -3374,7 +3374,7 @@

                read_file_info(File, Opts)

                Retrieves information about a file. Returns {ok, FileInfo} if successful, otherwise {error, Reason}.

                FileInfo is a record file_info, defined in the Kernel include file file.hrl. -Include the following directive in the module from which the function is called:

                -include_lib("kernel/include/file.hrl").

                The time type returned in atime, mtime, and ctime is dependent on the time +Include the following directive in the module from which the function is called:

                -include_lib("kernel/include/file.hrl").

                The time type returned in atime, mtime, and ctime is dependent on the time type set in Opts :: {time, Type} as follows:

                • local - Returns local time.

                • universal - Returns universal time.

                • posix - Returns seconds since or before Unix time epoch, which is 1970-01-01 00:00 UTC.

                Default is {time, local}.

                If the option raw is set, the file server is not called and only information about local files is returned. Note that this will break this module's atomicity @@ -4064,7 +4064,7 @@

                write_file_info(Filename, FileInfo, Opts)Changes file information. Returns ok if successful, otherwise {error, Reason}.

                FileInfo is a record file_info, defined in the Kernel include file file.hrl. Include the following directive in the module from -which the function is called:

                -include_lib("kernel/include/file.hrl").

                The time type set in atime, mtime, and ctime depends on the time type set +which the function is called:

                -include_lib("kernel/include/file.hrl").

                The time type set in atime, mtime, and ctime depends on the time type set in Opts :: {time, Type} as follows:

                • local - Interprets the time set as local.

                • universal - Interprets it as universal time.

                • posix - Must be seconds since or before Unix time epoch, which is 1970-01-01 00:00 UTC.

                Default is {time, local}.

                If the option raw is set, the file server is not called and only information about local files is returned.

                The following fields are used from the record, if they are specified:

                • atime = date_time/0 | non_neg_integer/0 - The last time the file was diff --git a/prs/9277/lib/kernel-10.2/doc/html/gen_sctp.html b/prs/9277/lib/kernel-10.2/doc/html/gen_sctp.html index 641baf50bc2fb..ce33cf3b38020 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/gen_sctp.html +++ b/prs/9277/lib/kernel-10.2/doc/html/gen_sctp.html @@ -136,7 +136,7 @@

                  lksctp-tools-1.0.6

                • Briefly on Solaris 10
                • SUSE Linux Enterprise Server 10 Service Pack 1 (x86_64) kernel 2.6.16.54-0.2.3-smp with lksctp-tools-1.0.7
                • FreeBSD 8.2

                This module was written for one-to-many style sockets (type seqpacket). With the addition of peeloff/2, one-to-one style sockets (type stream) -were introduced.

                Record definitions for this module can be found using:

                -include_lib("kernel/include/inet_sctp.hrl").

                These record definitions use the "new" spelling 'adaptation', +were introduced.

                Record definitions for this module can be found using:

                -include_lib("kernel/include/inet_sctp.hrl").

                These record definitions use the "new" spelling 'adaptation', not the deprecated 'adaption', regardless of which spelling the underlying C API uses.

                @@ -184,31 +184,31 @@

                will instead immediately return with e.g. {error, eagain} if this option has been set to true. Defaults to false.

              • {sctp_module, module()} - Overrides which callback module is used. -Defaults to inet_sctp for IPv4 and inet6_sctp for IPv6.

              • {sctp_rtoinfo, #sctp_rtoinfo{}}

                #sctp_rtoinfo{
                -      assoc_id = assoc_id(),
                -      initial  = integer(),
                -      max      = integer(),
                -      min      = integer()
                -}

                Determines retransmission time-out parameters, in milliseconds, for the +Defaults to inet_sctp for IPv4 and inet6_sctp for IPv6.

              • {sctp_rtoinfo, #sctp_rtoinfo{}}

                #sctp_rtoinfo{
                +      assoc_id = assoc_id(),
                +      initial  = integer(),
                +      max      = integer(),
                +      min      = integer()
                +}

                Determines retransmission time-out parameters, in milliseconds, for the association(s) specified by assoc_id.

                assoc_id = 0 (default) indicates the whole endpoint. See RFC 2960 and Sockets API Extensions for SCTP -for the exact semantics of the field values.

              • {sctp_associnfo, #sctp_assocparams{}}

                #sctp_assocparams{
                -      assoc_id                 = assoc_id(),
                -      asocmaxrxt               = integer(),
                -      number_peer_destinations = integer(),
                -      peer_rwnd                = integer(),
                -      local_rwnd               = integer(),
                -      cookie_life              = integer()
                -}

                Determines association parameters for the association(s) specified by +for the exact semantics of the field values.

              • {sctp_associnfo, #sctp_assocparams{}}

                #sctp_assocparams{
                +      assoc_id                 = assoc_id(),
                +      asocmaxrxt               = integer(),
                +      number_peer_destinations = integer(),
                +      peer_rwnd                = integer(),
                +      local_rwnd               = integer(),
                +      cookie_life              = integer()
                +}

                Determines association parameters for the association(s) specified by assoc_id.

                assoc_id = 0 (default) indicates the whole endpoint. See Sockets API Extensions for SCTP -for the discussion of their semantics. Rarely used.

              • {sctp_initmsg, #sctp_initmsg{}}

                #sctp_initmsg{
                -     num_ostreams   = integer(),
                -     max_instreams  = integer(),
                -     max_attempts   = integer(),
                -     max_init_timeo = integer()
                -}

                Determines the default parameters that this socket tries to negotiate +for the discussion of their semantics. Rarely used.

              • {sctp_initmsg, #sctp_initmsg{}}

                #sctp_initmsg{
                +     num_ostreams   = integer(),
                +     max_instreams  = integer(),
                +     max_attempts   = integer(),
                +     max_init_timeo = integer()
                +}

                Determines the default parameters that this socket tries to negotiate with its peer while establishing an association with it. Is to be set after open/* but before the first connect/*. #sctp_initmsg{} can also be used as ancillary data with the first call of @@ -225,52 +225,52 @@

                performance reasons only.

              • {sctp_i_want_mapped_v4_addr, true|false} - Turns on|off automatic mapping of IPv4 addresses into IPv6 ones (if the socket address family is AF_INET6).

              • {sctp_maxseg, integer()} - Determines the maximum chunk size if message -fragmentation is used. If 0, the chunk size is limited by the Path MTU only.

              • {sctp_primary_addr, #sctp_prim{}}

                #sctp_prim{
                -      assoc_id = assoc_id(),
                -      addr     = {IP, Port}
                -}
                - IP = ip_address()
                - Port = port_number()

                For the association specified by assoc_id, {IP,Port} must be one of the +fragmentation is used. If 0, the chunk size is limited by the Path MTU only.

              • {sctp_primary_addr, #sctp_prim{}}

                #sctp_prim{
                +      assoc_id = assoc_id(),
                +      addr     = {IP, Port}
                +}
                + IP = ip_address()
                + Port = port_number()

                For the association specified by assoc_id, {IP,Port} must be one of the peer addresses. This option determines that the specified address is treated -by the local SCTP stack as the primary address of the peer.

              • {sctp_set_peer_primary_addr, #sctp_setpeerprim{}}

                #sctp_setpeerprim{
                -      assoc_id = assoc_id(),
                -      addr     = {IP, Port}
                -}
                - IP = ip_address()
                - Port = port_number()

                When set, informs the peer to use {IP, Port} as the primary address of the -local endpoint for the association specified by assoc_id.

              • {sctp_adaptation_layer, #sctp_setadaptation{}}

                #sctp_setadaptation{
                -      adaptation_ind = integer()
                -}

                When set, requests that the local endpoint uses the value specified by +by the local SCTP stack as the primary address of the peer.

              • {sctp_set_peer_primary_addr, #sctp_setpeerprim{}}

                #sctp_setpeerprim{
                +      assoc_id = assoc_id(),
                +      addr     = {IP, Port}
                +}
                + IP = ip_address()
                + Port = port_number()

                When set, informs the peer to use {IP, Port} as the primary address of the +local endpoint for the association specified by assoc_id.

              • {sctp_adaptation_layer, #sctp_setadaptation{}}

                #sctp_setadaptation{
                +      adaptation_ind = integer()
                +}

                When set, requests that the local endpoint uses the value specified by adaptation_ind as the Adaptation Indication parameter for establishing new associations. For details, see RFC 2960 and -Sockets API Extensions for SCTP.

              • {sctp_peer_addr_params, #sctp_paddrparams{}}

                #sctp_paddrparams{
                -      assoc_id   = assoc_id(),
                -      address    = {IP, Port},
                -      hbinterval = integer(),
                -      pathmaxrxt = integer(),
                -      pathmtu    = integer(),
                -      sackdelay  = integer(),
                -      flags      = list()
                -}
                -IP = ip_address()
                -Port = port_number()

                Determines various per-address parameters for the association specified by +Sockets API Extensions for SCTP.

              • {sctp_peer_addr_params, #sctp_paddrparams{}}

                #sctp_paddrparams{
                +      assoc_id   = assoc_id(),
                +      address    = {IP, Port},
                +      hbinterval = integer(),
                +      pathmaxrxt = integer(),
                +      pathmtu    = integer(),
                +      sackdelay  = integer(),
                +      flags      = list()
                +}
                +IP = ip_address()
                +Port = port_number()

                Determines various per-address parameters for the association specified by assoc_id and the peer address address (the SCTP protocol supports multi-homing, so more than one address can correspond to a specified association).

                • hbinterval - Heartbeat interval, in milliseconds

                • pathmaxrxt - Maximum number of retransmissions before this address is considered unreachable (and an alternative address is selected)

                • pathmtu - Fixed Path MTU, if automatic discovery is disabled (see flags below)

                • sackdelay - Delay, in milliseconds, for SAC messages (if the delay is -enabled, see flags below)

                • flags - The following flags are available:

                  • hb_enable - Enables heartbeat

                  • hb_disable - Disables heartbeat

                  • hb_demand - Initiates heartbeat immediately

                  • pmtud_enable - Enables automatic Path MTU discovery

                  • pmtud_disable - Disables automatic Path MTU discovery

                  • sackdelay_enable - Enables SAC delay

                  • sackdelay_disable - Disables SAC delay

              • {sctp_default_send_param, #sctp_sndrcvinfo{}}

                #sctp_sndrcvinfo{
                -      stream     = integer(),
                -      ssn        = integer(),
                -      flags      = list(),
                -      ppid       = integer(),
                -      context    = integer(),
                -      timetolive = integer(),
                -      tsn        = integer(),
                -      cumtsn     = integer(),
                -      assoc_id   = assoc_id()
                -}

                #sctp_sndrcvinfo{} is used both in this socket option, and as +enabled, see flags below)

              • flags - The following flags are available:

                • hb_enable - Enables heartbeat

                • hb_disable - Disables heartbeat

                • hb_demand - Initiates heartbeat immediately

                • pmtud_enable - Enables automatic Path MTU discovery

                • pmtud_disable - Disables automatic Path MTU discovery

                • sackdelay_enable - Enables SAC delay

                • sackdelay_disable - Disables SAC delay

            • {sctp_default_send_param, #sctp_sndrcvinfo{}}

              #sctp_sndrcvinfo{
              +      stream     = integer(),
              +      ssn        = integer(),
              +      flags      = list(),
              +      ppid       = integer(),
              +      context    = integer(),
              +      timetolive = integer(),
              +      tsn        = integer(),
              +      cumtsn     = integer(),
              +      assoc_id   = assoc_id()
              +}

              #sctp_sndrcvinfo{} is used both in this socket option, and as ancillary data while sending or receiving SCTP messages. When set as an option, it provides default values for subsequent send calls on the association specified by assoc_id.

              assoc_id = 0 (default) indicates the whole endpoint.

              The following fields typically must be specified by the sender:

              • sinfo_stream - Stream number (0-base) within the association to send @@ -279,7 +279,7 @@

                data

              • eof - Gracefully shuts down the current association, with flushing of unsent data

              Other fields are rarely used. For complete information, see RFC 2960 and -Sockets API Extensions for SCTP.

          • {sctp_events, #sctp_event_subscribe{}}

            #sctp_event_subscribe{
            +Sockets API Extensions for SCTP.

        • {sctp_events, #sctp_event_subscribe{}}

          #sctp_event_subscribe{
                   data_io_event          = true | false,
                   association_event      = true | false,
                   address_event          = true | false,
          @@ -288,42 +288,42 @@ 

          shutdown_event = true | false, partial_delivery_event = true | false, adaptation_layer_event = true | false -}

          This option determines which SCTP Events that are to be +}

    This option determines which SCTP Events that are to be received (through recv/*) along with the data. The only exception is data_io_event, which enables or disables receiving of #sctp_sndrcvinfo{} ancillary data, not events. By default, all flags except adaptation_layer_event are enabled, although sctp_data_io_event and association_event are used by the driver -itself and not exported to the user level.

  • {sctp_delayed_ack_time, #sctp_assoc_value{}}

    #sctp_assoc_value{
    -      assoc_id    = assoc_id(),
    -      assoc_value = integer()
    -}

    Rarely used. Determines the ACK time (specified by assoc_value, in +itself and not exported to the user level.

  • {sctp_delayed_ack_time, #sctp_assoc_value{}}

    #sctp_assoc_value{
    +      assoc_id    = assoc_id(),
    +      assoc_value = integer()
    +}

    Rarely used. Determines the ACK time (specified by assoc_value, in milliseconds) for the specified association or the whole endpoint if -assoc_value = 0 (default).

  • {sctp_status, #sctp_status{}}

    #sctp_status{
    -      assoc_id            = assoc_id(),
    -      state               = atom(),
    -      rwnd                = integer(),
    -      unackdata           = integer(),
    -      penddata            = integer(),
    -      instrms             = integer(),
    -      outstrms            = integer(),
    -      fragmentation_point = integer(),
    -      primary             = #sctp_paddrinfo{}
    -}

    This option is read-only. It determines the status of the SCTP association +assoc_value = 0 (default).

  • {sctp_status, #sctp_status{}}

    #sctp_status{
    +      assoc_id            = assoc_id(),
    +      state               = atom(),
    +      rwnd                = integer(),
    +      unackdata           = integer(),
    +      penddata            = integer(),
    +      instrms             = integer(),
    +      outstrms            = integer(),
    +      fragmentation_point = integer(),
    +      primary             = #sctp_paddrinfo{}
    +}

    This option is read-only. It determines the status of the SCTP association specified by assoc_id. The following are the possible values of state (the state designations are mostly self-explanatory):

    • sctp_state_empty - Default. Means that no other state is active.

    • sctp_state_closed

    • sctp_state_cookie_wait

    • sctp_state_cookie_echoed

    • sctp_state_established

    • sctp_state_shutdown_pending

    • sctp_state_shutdown_sent

    • sctp_state_shutdown_received

    • sctp_state_shutdown_ack_sent

    Semantics of the other fields:

    • sstat_rwnd - Current receiver window size of the association

    • sstat_unackdata - Number of unacked data chunks

    • sstat_penddata - Number of data chunks pending receipt

    • sstat_instrms - Number of inbound streams

    • sstat_outstrms - Number of outbound streams

    • sstat_fragmentation_point - Message size at which SCTP fragmentation occurs

    • sstat_primary - Information on the current primary peer address (see -below for the format of #sctp_paddrinfo{})

  • {sctp_get_peer_addr_info, #sctp_paddrinfo{}}

    #sctp_paddrinfo{
    -      assoc_id  = assoc_id(),
    -      address   = {IP, Port},
    +below for the format of #sctp_paddrinfo{})

  • {sctp_get_peer_addr_info, #sctp_paddrinfo{}}

    #sctp_paddrinfo{
    +      assoc_id  = assoc_id(),
    +      address   = {IP, Port},
           state     = inactive | active | unconfirmed,
    -      cwnd      = integer(),
    -      srtt      = integer(),
    -      rto       = integer(),
    -      mtu       = integer()
    -}
    -IP = ip_address()
    -Port = port_number()

    This option is read-only. It determines the parameters specific to + cwnd = integer(), + srtt = integer(), + rto = integer(), + mtu = integer() +} +IP = ip_address() +Port = port_number()

  • This option is read-only. It determines the parameters specific to the peer address specified by address within the association specified by assoc_id. Field address fmust be set by the caller; all other fields are filled in on return. If assoc_id = 0 (default), the address @@ -337,119 +337,119 @@

    SCTP Examples

    Example of an Erlang SCTP server that receives SCTP messages -and prints them on the standard output:

    -module(sctp_server).
    +and prints them on the standard output:

    -module(sctp_server).
     
    --export([server/0,server/1,server/2]).
    --include_lib("kernel/include/inet.hrl").
    --include_lib("kernel/include/inet_sctp.hrl").
    -
    -server() ->
    -    server(any, 2006).
    -
    -server([Host,Port]) when is_list(Host), is_list(Port) ->
    -    {ok, #hostent{h_addr_list = [IP|_]}} = inet:gethostbyname(Host),
    -    io:format("~w -> ~w~n", [Host, IP]),
    -    server([IP, list_to_integer(Port)]).
    -
    -server(IP, Port) when is_tuple(IP) orelse IP == any orelse IP == loopback,
    -                      is_integer(Port) ->
    -    {ok,S} = gen_sctp:open(Port, [{recbuf,65536}, {ip,IP}]),
    -    io:format("Listening on ~w:~w. ~w~n", [IP,Port,S]),
    -    ok     = gen_sctp:listen(S, true),
    -    server_loop(S).
    -
    -server_loop(S) ->
    -    case gen_sctp:recv(S) of
    -    {error, Error} ->
    -        io:format("SCTP RECV ERROR: ~p~n", [Error]);
    +-export([server/0,server/1,server/2]).
    +-include_lib("kernel/include/inet.hrl").
    +-include_lib("kernel/include/inet_sctp.hrl").
    +
    +server() ->
    +    server(any, 2006).
    +
    +server([Host,Port]) when is_list(Host), is_list(Port) ->
    +    {ok, #hostent{h_addr_list = [IP|_]}} = inet:gethostbyname(Host),
    +    io:format("~w -> ~w~n", [Host, IP]),
    +    server([IP, list_to_integer(Port)]).
    +
    +server(IP, Port) when is_tuple(IP) orelse IP == any orelse IP == loopback,
    +                      is_integer(Port) ->
    +    {ok,S} = gen_sctp:open(Port, [{recbuf,65536}, {ip,IP}]),
    +    io:format("Listening on ~w:~w. ~w~n", [IP,Port,S]),
    +    ok     = gen_sctp:listen(S, true),
    +    server_loop(S).
    +
    +server_loop(S) ->
    +    case gen_sctp:recv(S) of
    +    {error, Error} ->
    +        io:format("SCTP RECV ERROR: ~p~n", [Error]);
         Data ->
    -        io:format("Received: ~p~n", [Data])
    +        io:format("Received: ~p~n", [Data])
         end,
    -    server_loop(S).

    Example of an Erlang SCTP client interacting with the above server. + server_loop(S).

    Example of an Erlang SCTP client interacting with the above server. Note that in this example the client creates an association with the server with 5 outbound streams. Therefore, sending of "Test 0" over stream 0 succeeds, but sending of "Test 5" over stream 5 fails. The client then aborts the association, which results in that -the corresponding event is received on the server side.

    -module(sctp_client).
    +the corresponding event is received on the server side.

    -module(sctp_client).
     
    --export([client/0, client/1, client/2]).
    --include_lib("kernel/include/inet.hrl").
    --include_lib("kernel/include/inet_sctp.hrl").
    -
    -client() ->
    -    client([localhost]).
    -
    -client([Host]) ->
    -    client(Host, 2006);
    -
    -client([Host, Port]) when is_list(Host), is_list(Port) ->
    -    client(Host,list_to_integer(Port)),
    -    init:stop().
    -
    -client(Host, Port) when is_integer(Port) ->
    -    {ok,S}     = gen_sctp:open(),
    -    {ok,Assoc} = gen_sctp:connect
    -        (S, Host, Port, [{sctp_initmsg,#sctp_initmsg{num_ostreams=5}}]),
    -    io:format("Connection Successful, Assoc=~p~n", [Assoc]),
    -
    -    io:write(gen_sctp:send(S, Assoc, 0, <<"Test 0">>)),
    -    io:nl(),
    -    timer:sleep(10000),
    -    io:write(gen_sctp:send(S, Assoc, 5, <<"Test 5">>)),
    -    io:nl(),
    -    timer:sleep(10000),
    -    io:write(gen_sctp:abort(S, Assoc)),
    -    io:nl(),
    -
    -    timer:sleep(1000),
    -    gen_sctp:close(S).

    A simple Erlang SCTP client that uses the connect_init API:

    -module(ex3).
    +-export([client/0, client/1, client/2]).
    +-include_lib("kernel/include/inet.hrl").
    +-include_lib("kernel/include/inet_sctp.hrl").
    +
    +client() ->
    +    client([localhost]).
    +
    +client([Host]) ->
    +    client(Host, 2006);
    +
    +client([Host, Port]) when is_list(Host), is_list(Port) ->
    +    client(Host,list_to_integer(Port)),
    +    init:stop().
    +
    +client(Host, Port) when is_integer(Port) ->
    +    {ok,S}     = gen_sctp:open(),
    +    {ok,Assoc} = gen_sctp:connect
    +        (S, Host, Port, [{sctp_initmsg,#sctp_initmsg{num_ostreams=5}}]),
    +    io:format("Connection Successful, Assoc=~p~n", [Assoc]),
    +
    +    io:write(gen_sctp:send(S, Assoc, 0, <<"Test 0">>)),
    +    io:nl(),
    +    timer:sleep(10000),
    +    io:write(gen_sctp:send(S, Assoc, 5, <<"Test 5">>)),
    +    io:nl(),
    +    timer:sleep(10000),
    +    io:write(gen_sctp:abort(S, Assoc)),
    +    io:nl(),
    +
    +    timer:sleep(1000),
    +    gen_sctp:close(S).

    A simple Erlang SCTP client that uses the connect_init API:

    -module(ex3).
     
    --export([client/4]).
    --include_lib("kernel/include/inet.hrl").
    --include_lib("kernel/include/inet_sctp.hrl").
    -
    -client(Peer1, Port1, Peer2, Port2)
    -  when is_tuple(Peer1), is_integer(Port1), is_tuple(Peer2), is_integer(Port2) ->
    -    {ok,S}     = gen_sctp:open(),
    -    SctpInitMsgOpt = {sctp_initmsg,#sctp_initmsg{num_ostreams=5}},
    -    ActiveOpt = {active, true},
    -    Opts = [SctpInitMsgOpt, ActiveOpt],
    -    ok = gen_sctp:connect(S, Peer1, Port1, Opts),
    -    ok = gen_sctp:connect(S, Peer2, Port2, Opts),
    -    io:format("Connections initiated~n", []),
    -    client_loop(S, Peer1, Port1, undefined, Peer2, Port2, undefined).
    -
    -client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2, AssocId2) ->
    +-export([client/4]).
    +-include_lib("kernel/include/inet.hrl").
    +-include_lib("kernel/include/inet_sctp.hrl").
    +
    +client(Peer1, Port1, Peer2, Port2)
    +  when is_tuple(Peer1), is_integer(Port1), is_tuple(Peer2), is_integer(Port2) ->
    +    {ok,S}     = gen_sctp:open(),
    +    SctpInitMsgOpt = {sctp_initmsg,#sctp_initmsg{num_ostreams=5}},
    +    ActiveOpt = {active, true},
    +    Opts = [SctpInitMsgOpt, ActiveOpt],
    +    ok = gen_sctp:connect(S, Peer1, Port1, Opts),
    +    ok = gen_sctp:connect(S, Peer2, Port2, Opts),
    +    io:format("Connections initiated~n", []),
    +    client_loop(S, Peer1, Port1, undefined, Peer2, Port2, undefined).
    +
    +client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2, AssocId2) ->
         receive
    -        {sctp, S, Peer1, Port1, {_Anc, SAC}}
    -          when is_record(SAC, sctp_assoc_change), AssocId1 == undefined ->
    -            io:format("Association 1 connect result: ~p. AssocId: ~p~n",
    -                      [SAC#sctp_assoc_change.state,
    -                       SAC#sctp_assoc_change.assoc_id]),
    -            client_loop(S, Peer1, Port1, SAC#sctp_assoc_change.assoc_id,
    -                        Peer2, Port2, AssocId2);
    -
    -        {sctp, S, Peer2, Port2, {_Anc, SAC}}
    -          when is_record(SAC, sctp_assoc_change), AssocId2 == undefined ->
    -            io:format("Association 2 connect result: ~p. AssocId: ~p~n",
    -                      [SAC#sctp_assoc_change.state, SAC#sctp_assoc_change.assoc_id]),
    -            client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2,
    -                       SAC#sctp_assoc_change.assoc_id);
    -
    -        {sctp, S, Peer1, Port1, Data} ->
    -            io:format("Association 1: received ~p~n", [Data]),
    -            client_loop(S, Peer1, Port1, AssocId1,
    -                        Peer2, Port2, AssocId2);
    -
    -        {sctp, S, Peer2, Port2, Data} ->
    -            io:format("Association 2: received ~p~n", [Data]),
    -            client_loop(S, Peer1, Port1, AssocId1,
    -                        Peer2, Port2, AssocId2);
    +        {sctp, S, Peer1, Port1, {_Anc, SAC}}
    +          when is_record(SAC, sctp_assoc_change), AssocId1 == undefined ->
    +            io:format("Association 1 connect result: ~p. AssocId: ~p~n",
    +                      [SAC#sctp_assoc_change.state,
    +                       SAC#sctp_assoc_change.assoc_id]),
    +            client_loop(S, Peer1, Port1, SAC#sctp_assoc_change.assoc_id,
    +                        Peer2, Port2, AssocId2);
    +
    +        {sctp, S, Peer2, Port2, {_Anc, SAC}}
    +          when is_record(SAC, sctp_assoc_change), AssocId2 == undefined ->
    +            io:format("Association 2 connect result: ~p. AssocId: ~p~n",
    +                      [SAC#sctp_assoc_change.state, SAC#sctp_assoc_change.assoc_id]),
    +            client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2,
    +                       SAC#sctp_assoc_change.assoc_id);
    +
    +        {sctp, S, Peer1, Port1, Data} ->
    +            io:format("Association 1: received ~p~n", [Data]),
    +            client_loop(S, Peer1, Port1, AssocId1,
    +                        Peer2, Port2, AssocId2);
    +
    +        {sctp, S, Peer2, Port2, Data} ->
    +            io:format("Association 2: received ~p~n", [Data]),
    +            client_loop(S, Peer1, Port1, AssocId1,
    +                        Peer2, Port2, AssocId2);
     
             Other ->
    -            io:format("Other ~p~n", [Other]),
    -            client_loop(S, Peer1, Port1, AssocId1,
    -                        Peer2, Port2, AssocId2)
    +            io:format("Other ~p~n", [Other]),
    +            client_loop(S, Peer1, Port1, AssocId1,
    +                        Peer2, Port2, AssocId2)
     
         after 5000 ->
                 ok
    @@ -1450,16 +1450,16 @@ 

    connect(Socket, Addr, Port, Opts, Timeout)<

    The result of connect/* is an #sctp_assoc_change{} event that contains, in particular, the new Association ID: -l

    #sctp_assoc_change{
    -      state             = atom(),
    -      error             = integer(),
    -      outbound_streams  = integer(),
    -      inbound_streams   = integer(),
    -      assoc_id          = assoc_id()
    -}

    The number of outbound and inbound streams for the association -can be set by giving an sctp_initmsg option to connect as in:

    connect(Socket, Ip, Port>,
    -      [{sctp_initmsg,#sctp_initmsg{num_ostreams=OutStreams,
    -                                   max_instreams=MaxInStreams}}])

    All options Opt are set on the socket before the association is attempted. +l

    #sctp_assoc_change{
    +      state             = atom(),
    +      error             = integer(),
    +      outbound_streams  = integer(),
    +      inbound_streams   = integer(),
    +      assoc_id          = assoc_id()
    +}

    The number of outbound and inbound streams for the association +can be set by giving an sctp_initmsg option to connect as in:

    connect(Socket, Ip, Port>,
    +      [{sctp_initmsg,#sctp_initmsg{num_ostreams=OutStreams,
    +                                   max_instreams=MaxInStreams}}])

    All options Opt are set on the socket before the association is attempted. If an option record has undefined field values, the options record is first read from the socket for those values. In effect, Opt option records only need to define field values to change @@ -1943,7 +1943,7 @@

    open/1

    and with reasonably large kernel and driver buffers.

    When the socket is in passive mode, data can be received through the recv/1,2 calls.

    When the socket is in active mode, -data received data is delivered to the controlling process as messages:

    {sctp, Socket, FromIP, FromPort, {AncData, Data}}

    See recv/1,2 for a description of the message fields.

    Note

    This message format unfortunately differs slightly from the +data received data is delivered to the controlling process as messages:

    {sctp, Socket, FromIP, FromPort, {AncData, Data}}

    See recv/1,2 for a description of the message fields.

    Note

    This message format unfortunately differs slightly from the gen_udp message format with ancillary data, and from the recv/1,2 return tuple format.

    @@ -2205,39 +2205,39 @@

    recv(Socket, Timeout)

    Possible SCTP events

    -
    • #sctp_sndrcvinfo{}

    • #sctp_assoc_change{}

    • #sctp_paddr_change{
      -      addr      = {ip_address(),port()},
      -      state     = atom(),
      -      error     = integer(),
      -      assoc_id  = assoc_id()
      -}

      Indicates change of the status of the IP address of the peer specified by +

      • #sctp_sndrcvinfo{}

      • #sctp_assoc_change{}

      • #sctp_paddr_change{
        +      addr      = {ip_address(),port()},
        +      state     = atom(),
        +      error     = integer(),
        +      assoc_id  = assoc_id()
        +}

        Indicates change of the status of the IP address of the peer specified by addr within association assoc_id. Possible values of state (mostly self-explanatory) include:

        • addr_unreachable

        • addr_available

        • addr_removed

        • addr_added

        • addr_made_prim

        • addr_confirmed

        In case of an error (for example, addr_unreachable), the field error provides more diagnostics. In such cases, event #sctp_paddr_change{} is automatically converted into an error term returned by recv. The error field value can be converted -into a string using error_string/1.

      • #sctp_send_failed{
        +into a string using error_string/1.

      • #sctp_send_failed{
               flags     = true | false,
        -      error     = integer(),
        -      info      = #sctp_sndrcvinfo{},
        -      assoc_id  = assoc_id()
        -      data      = binary()
        -}

        The sender can receive this event if a send operation fails.

        • flags - A Boolean specifying if the data has been transmitted + error = integer(), + info = #sctp_sndrcvinfo{}, + assoc_id = assoc_id() + data = binary() +}

    The sender can receive this event if a send operation fails.

    In the current implementation of the Erlang/SCTP binding, this event is -internally converted into an error term returned by recv/*.

  • #sctp_adaptation_event{
    -      adaptation_ind = integer(),
    -      assoc_id       = assoc_id()
    -}

    Delivered when a peer sends an adaptation layer indication parameter +internally converted into an error term returned by recv/*.

  • #sctp_adaptation_event{
    +      adaptation_ind = integer(),
    +      assoc_id       = assoc_id()
    +}

    Delivered when a peer sends an adaptation layer indication parameter (configured through option sctp_adaptation_layer). Notie that with the current implementation of the Erlang/SCTP binding, -this event is disabled by default.

  • #sctp_pdapi_event{
    +this event is disabled by default.

  • #sctp_pdapi_event{
           indication = sctp_partial_delivery_aborted,
    -      assoc_id   = assoc_id()
    -}

    A partial delivery failure. In the current implementation + assoc_id = assoc_id() +}

    A partial delivery failure. In the current implementation of the Erlang/SCTP binding, this event is internally converted into an error term returned by recv/*.

  • diff --git a/prs/9277/lib/kernel-10.2/doc/html/gen_tcp.html b/prs/9277/lib/kernel-10.2/doc/html/gen_tcp.html index dc4b4fd8d4b4a..23feb809b6e88 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/gen_tcp.html +++ b/prs/9277/lib/kernel-10.2/doc/html/gen_tcp.html @@ -130,27 +130,27 @@

    Interface to TCP/IP sockets.

    This module provides functions for communicating over TCP/IP protocol sockets.

    The following code fragment is a simple example of a client connecting to a -server at port 5678, transferring a binary, and closing the connection:

    client() ->
    +server at port 5678, transferring a binary, and closing the connection:

    client() ->
         SomeHostInNet = "localhost", % to make it runnable on one machine
    -    {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,
    -                                 [binary, {packet, 0}]),
    -    ok = gen_tcp:send(Sock, "Some Data"),
    -    ok = gen_tcp:close(Sock).

    At the other end, a server is listening on port 5678, accepts the connection, -and receives the binary:

    server() ->
    -    {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},
    -                                        {active, false}]),
    -    {ok, Sock} = gen_tcp:accept(LSock),
    -    {ok, Bin} = do_recv(Sock, []),
    -    ok = gen_tcp:close(Sock),
    -    ok = gen_tcp:close(LSock),
    +    {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,
    +                                 [binary, {packet, 0}]),
    +    ok = gen_tcp:send(Sock, "Some Data"),
    +    ok = gen_tcp:close(Sock).

    At the other end, a server is listening on port 5678, accepts the connection, +and receives the binary:

    server() ->
    +    {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},
    +                                        {active, false}]),
    +    {ok, Sock} = gen_tcp:accept(LSock),
    +    {ok, Bin} = do_recv(Sock, []),
    +    ok = gen_tcp:close(Sock),
    +    ok = gen_tcp:close(LSock),
         Bin.
     
    -do_recv(Sock, Bs) ->
    -    case gen_tcp:recv(Sock, 0) of
    -        {ok, B} ->
    -            do_recv(Sock, [Bs, B]);
    -        {error, closed} ->
    -            {ok, list_to_binary(Bs)}
    +do_recv(Sock, Bs) ->
    +    case gen_tcp:recv(Sock, 0) of
    +        {ok, B} ->
    +            do_recv(Sock, [Bs, B]);
    +        {error, closed} ->
    +            {ok, list_to_binary(Bs)}
         end.

    For more examples, see section Examples.

    Note

    Functions that create sockets can take an optional option; {inet_backend, Backend} that, if specified, has to be the first option. This selects the implementation backend towards the platform's socket API.

    This is a temporary option that will be ignored in a future release.

    The default is Backend = inet that selects the traditional inet_drv.c @@ -189,48 +189,48 @@

    a single listening socket. Function start/2 takes the number of worker processes and the port number on which to listen for incoming connections. If LPort is specified as 0, an ephemeral port number is used, which is why the -start function returns the actual port number allocated:

    start(Num,LPort) ->
    -    case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of
    -        {ok, ListenSock} ->
    -            start_servers(Num,ListenSock),
    -            {ok, Port} = inet:port(ListenSock),
    +start function returns the actual port number allocated:

    start(Num,LPort) ->
    +    case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of
    +        {ok, ListenSock} ->
    +            start_servers(Num,ListenSock),
    +            {ok, Port} = inet:port(ListenSock),
                 Port;
    -        {error,Reason} ->
    -            {error,Reason}
    +        {error,Reason} ->
    +            {error,Reason}
         end.
     
    -start_servers(0,_) ->
    +start_servers(0,_) ->
         ok;
    -start_servers(Num,LS) ->
    -    spawn(?MODULE,server,[LS]),
    -    start_servers(Num-1,LS).
    -
    -server(LS) ->
    -    case gen_tcp:accept(LS) of
    -        {ok,S} ->
    -            loop(S),
    -            server(LS);
    +start_servers(Num,LS) ->
    +    spawn(?MODULE,server,[LS]),
    +    start_servers(Num-1,LS).
    +
    +server(LS) ->
    +    case gen_tcp:accept(LS) of
    +        {ok,S} ->
    +            loop(S),
    +            server(LS);
             Other ->
    -            io:format("accept returned ~w - goodbye!~n",[Other]),
    +            io:format("accept returned ~w - goodbye!~n",[Other]),
                 ok
         end.
     
    -loop(S) ->
    -    inet:setopts(S,[{active,once}]),
    +loop(S) ->
    +    inet:setopts(S,[{active,once}]),
         receive
    -        {tcp,S,Data} ->
    -            Answer = process(Data), % Not implemented in this example
    -            gen_tcp:send(S,Answer),
    -            loop(S);
    -        {tcp_closed,S} ->
    -            io:format("Socket ~w closed [~w]~n",[S,self()]),
    +        {tcp,S,Data} ->
    +            Answer = process(Data), % Not implemented in this example
    +            gen_tcp:send(S,Answer),
    +            loop(S);
    +        {tcp_closed,S} ->
    +            io:format("Socket ~w closed [~w]~n",[S,self()]),
                 ok
    -    end.

    Example of a simple client:

    client(PortNo,Message) ->
    -    {ok,Sock} = gen_tcp:connect("localhost",PortNo,[{active,false},
    -                                                    {packet,2}]),
    -    gen_tcp:send(Sock,Message),
    -    A = gen_tcp:recv(Sock,0),
    -    gen_tcp:close(Sock),
    +    end.

    Example of a simple client:

    client(PortNo,Message) ->
    +    {ok,Sock} = gen_tcp:connect("localhost",PortNo,[{active,false},
    +                                                    {packet,2}]),
    +    gen_tcp:send(Sock,Message),
    +    A = gen_tcp:recv(Sock,0),
    +    gen_tcp:close(Sock),
         A.

    The send call does not accept a time-out option because time-outs on send is handled through socket option send_timeout. The behavior of a send operation with no receiver is mainly defined by the underlying TCP stack and the network @@ -240,32 +240,32 @@

    does not get any acknowledge for each message it sends, but has to rely on the send time-out option to detect that the other end is unresponsive. Option send_timeout can be used when connecting:

    ...
    -{ok,Sock} = gen_tcp:connect(HostAddress, Port,
    -                            [{active,false},
    -                             {send_timeout, 5000},
    -                             {packet,2}]),
    -                loop(Sock), % See below
    -...

    In the loop where requests are handled, send time-outs can now be detected:

    loop(Sock) ->
    +{ok,Sock} = gen_tcp:connect(HostAddress, Port,
    +                            [{active,false},
    +                             {send_timeout, 5000},
    +                             {packet,2}]),
    +                loop(Sock), % See below
    +...

    In the loop where requests are handled, send time-outs can now be detected:

    loop(Sock) ->
         receive
    -        {Client, send_data, Binary} ->
    -            case gen_tcp:send(Sock,[Binary]) of
    -                {error, timeout} ->
    -                    io:format("Send timeout, closing!~n",
    -                              []),
    -                    handle_send_timeout(), % Not implemented here
    -                    Client ! {self(),{error_sending, timeout}},
    +        {Client, send_data, Binary} ->
    +            case gen_tcp:send(Sock,[Binary]) of
    +                {error, timeout} ->
    +                    io:format("Send timeout, closing!~n",
    +                              []),
    +                    handle_send_timeout(), % Not implemented here
    +                    Client ! {self(),{error_sending, timeout}},
                         %% Usually, it's a good idea to give up in case of a
                         %% send timeout, as you never know how much actually
                         %% reached the server, maybe only a packet header?!
    -                    gen_tcp:close(Sock);
    -                {error, OtherSendError} ->
    -                    io:format("Some other error on socket (~p), closing",
    -                              [OtherSendError]),
    -                    Client ! {self(),{error_sending, OtherSendError}},
    -                    gen_tcp:close(Sock);
    +                    gen_tcp:close(Sock);
    +                {error, OtherSendError} ->
    +                    io:format("Some other error on socket (~p), closing",
    +                              [OtherSendError]),
    +                    Client ! {self(),{error_sending, OtherSendError}},
    +                    gen_tcp:close(Sock);
                     ok ->
    -                    Client ! {self(), data_sent},
    -                    loop(Sock)
    +                    Client ! {self(), data_sent},
    +                    loop(Sock)
                 end
         end.

    Usually it suffices to detect time-outs on receive, as most protocols include some sort of acknowledgment from the server, but if the protocol is strictly one diff --git a/prs/9277/lib/kernel-10.2/doc/html/gen_udp.html b/prs/9277/lib/kernel-10.2/doc/html/gen_udp.html index c3a10d422bf9f..3ae5c1ac3d62c 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/gen_udp.html +++ b/prs/9277/lib/kernel-10.2/doc/html/gen_udp.html @@ -960,8 +960,8 @@

    open(Port, Opts)

    Leaves a multicast group.

  • option/0 - See inet:setopts/2.

  • UDP packets are sent with this socket using send(Socket, ...). When UDP packets arrive to the Socket's UDP port, and the socket is in an active mode, the packets are delivered as messages to the -controlling process (socket owner):

    {udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data
    -{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data

    PeerIP and PeerPort are the address from which Packet was sent. +controlling process (socket owner):

    {udp, Socket, PeerIP, PeerPort, Packet} % Without ancillary data
    +{udp, Socket, PeerIP, PeerPort, AncData, Packet} % With ancillary data

    PeerIP and PeerPort are the address from which Packet was sent. Packet is a list of bytes ([byte/0] if option list is active and a binary/0 if option binaryis active (they are mutually exclusive).

    The message contains an AncData field only if any of the socket @@ -969,8 +969,8 @@

    open(Port, Opts)

    recvtclass or recvttl are active.

    When a socket in {active, N} mode (see inet:setopts/2 for details), transitions to passive ({active, false}) mode (N counts down to 0), -the controlling process is notified by a message on this form:

    {udp_passive, Socket}

    If the OS protocol stack reports an error for the socket, the following -message is sent to the controlling process:

    {udp_error, Socket, Reason}

    Reason is mostly a POSIX Error Code.

    If the socket is in passive mode (not in an active mode), received data +the controlling process is notified by a message on this form:

    {udp_passive, Socket}

    If the OS protocol stack reports an error for the socket, the following +message is sent to the controlling process:

    {udp_error, Socket, Reason}

    Reason is mostly a POSIX Error Code.

    If the socket is in passive mode (not in an active mode), received data can be retrieved with therecv/2,3](recv/2) calls. Note that incoming UDP packets that are longer than the receive buffer option specifies can be truncated without warning.

    The default value for the receive buffer option is {recbuf, 8192}.

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/global_group.html b/prs/9277/lib/kernel-10.2/doc/html/global_group.html index 2ea3edd3d4b93..76f225c4b8891 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/global_group.html +++ b/prs/9277/lib/kernel-10.2/doc/html/global_group.html @@ -132,7 +132,7 @@

    groups. Each global group has its own global namespace, see global.

    The main advantage of dividing systems into global groups is that the background load decreases while the number of nodes to be updated is reduced when manipulating globally registered names.

    The Kernel configuration parameter global_groups -defines the global groups:

    {global_groups, [GroupTuple :: group_tuple()]}

    For the processes and nodes to run smoothly using the global group +defines the global groups:

    {global_groups, [GroupTuple :: group_tuple()]}

    For the processes and nodes to run smoothly using the global group functionality, the following criteria must be met:

    • An instance of the global group server, global_group, must be running on each node. The processes are automatically started and synchronized when a node is started.
    • All involved nodes must agree on the global group definition, otherwise the diff --git a/prs/9277/lib/kernel-10.2/doc/html/inet.html b/prs/9277/lib/kernel-10.2/doc/html/inet.html index bd9ba6c58d990..b948b26e29efb 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/inet.html +++ b/prs/9277/lib/kernel-10.2/doc/html/inet.html @@ -151,19 +151,19 @@

      or as a tuple {150, 236, 20, 73}.

      IPv4 address examples:

      Address          ip_address()
       -------          ------------
       127.0.0.1        {127,0,0,1}
      -192.168.42.2     {192,168,42,2}

      IPv6 address examples:

      Address          ip_address()
      +192.168.42.2     {192,168,42,2}

      IPv6 address examples:

      Address          ip_address()
       -------          ------------
      -::1             {0,0,0,0,0,0,0,1}
      -::192.168.42.2  {0,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
      +::1             {0,0,0,0,0,0,0,1}
      +::192.168.42.2  {0,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
       ::FFFF:192.168.42.2
      -                {0,0,0,0,0,16#FFFF,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
      +                {0,0,0,0,0,16#FFFF,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
       3ffe:b80:1f8d:2:204:acff:fe17:bf38
      -                {16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}
      +                {16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}
       fe80::204:acff:fe17:bf38
      -                {16#fe80,0,0,0,16#204,16#acff,16#fe17,16#bf38}

      Function parse_address/1 can be useful:

      1> inet:parse_address("192.168.42.2").
      -{ok,{192,168,42,2}}
      -2> inet:parse_address("::FFFF:192.168.42.2").
      -{ok,{0,0,0,0,0,65535,49320,10754}}

      + {16#fe80,0,0,0,16#204,16#acff,16#fe17,16#bf38}

    Function parse_address/1 can be useful:

    1> inet:parse_address("192.168.42.2").
    +{ok,{192,168,42,2}}
    +2> inet:parse_address("::FFFF:192.168.42.2").
    +{ok,{0,0,0,0,0,65535,49320,10754}}

    @@ -965,7 +965,7 @@

    hostent()

    A record describing a host; name and address.

    Corresponds to the C: struct hostent as returned by for example -gethostbyname(3).

    The record is defined in the Kernel include file "inet.hrl".

    Add the following directive to the module:

    -include_lib("kernel/include/inet.hrl").
    +gethostbyname(3).

    The record is defined in the Kernel include file "inet.hrl".

    Add the following directive to the module:

    -include_lib("kernel/include/inet.hrl").
    @@ -2132,8 +2132,8 @@

    getopts(Socket, Options)

    this information, you need to know the following:

    • The numeric value of protocol level IPPROTO_TCP
    • The numeric value of option TCP_INFO
    • The size of struct tcp_info
    • The size and offset of the specific field

    By inspecting the headers or writing a small C program, it is found that IPPROTO_TCP is 6, TCP_INFO is 11, the structure size is 92 (bytes), the offset of tcpi_sacked is 28 bytes, and the value is a 32-bit integer. The -following code can be used to retrieve the value:

    get_tcpi_sacked(Sock) ->
    -    {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),
    +following code can be used to retrieve the value:

    get_tcpi_sacked(Sock) ->
    +    {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),
         <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info,
         TcpiSacked.

    Preferably, you would check the machine type, the operating system, and the Kernel version before executing anything similar to this code.

    @@ -2485,7 +2485,7 @@

    monitor(Socket)

    Start a socket monitor.

    If the Socket to monitor doesn't exist or when the monitor is triggered, -a 'DOWN' message is sent that has the following pattern:

    	    {'DOWN', MonitorRef, Type, Object, Info}
    • MonitorRef - The return value from this function.

    • Type - The type of socket, can be one of the following +a 'DOWN' message is sent that has the following pattern:

      	    {'DOWN', MonitorRef, Type, Object, Info}
      • MonitorRef - The return value from this function.

      • Type - The type of socket, can be one of the following atom/0s: port or socket.

      • Object - The monitored entity, the socket, which triggered the event.

      • Info - Either the termination reason of the socket or nosock (the Socket did not exist when this function was called).

      Making several calls to inet:monitor/1 for the same Socket is not an error; one monitor is created per call.

      The monitor is triggered when the socket is closed in any way such as diff --git a/prs/9277/lib/kernel-10.2/doc/html/inet_res.html b/prs/9277/lib/kernel-10.2/doc/html/inet_res.html index 3643c612066ed..9939a1ff5d5b4 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/inet_res.html +++ b/prs/9277/lib/kernel-10.2/doc/html/inet_res.html @@ -179,15 +179,15 @@

      Example

      This access functions example shows how lookup/3 can be implemented using -resolve/3 from outside the module:

      example_lookup(Name, Class, Type) ->
      -    case inet_res:resolve(Name, Class, Type) of
      -        {ok,Msg} ->
      -            [inet_dns:rr(RR, data)
      -             || RR <- inet_dns:msg(Msg, anlist),
      -                 inet_dns:rr(RR, type) =:= Type,
      -                 inet_dns:rr(RR, class) =:= Class];
      -        {error,_} ->
      -            []
      +resolve/3 from outside the module:

      example_lookup(Name, Class, Type) ->
      +    case inet_res:resolve(Name, Class, Type) of
      +        {ok,Msg} ->
      +            [inet_dns:rr(RR, data)
      +             || RR <- inet_dns:msg(Msg, anlist),
      +                 inet_dns:rr(RR, type) =:= Type,
      +                 inet_dns:rr(RR, class) =:= Class];
      +        {error,_} ->
      +            []
            end.
    @@ -594,57 +594,57 @@

    dns_msg()

    A DNS message.

    This is the start of a hierarchy of opaque data structures that can be examined with access functions in inet_dns, which return lists of {Field,Value} tuples. The arity 2 functions return the value -for a specified field.

    dns_msg() = DnsMsg
    -    inet_dns:msg(DnsMsg) ->
    -        [ {header, dns_header()}
    -        | {qdlist, dns_query()}
    -        | {anlist, dns_rr()}
    -        | {nslist, dns_rr()}
    -        | {arlist, dns_rr()} ]
    -    inet_dns:msg(DnsMsg, header) -> dns_header() % for example
    -    inet_dns:msg(DnsMsg, Field) -> Value
    -
    -dns_header() = DnsHeader
    -    inet_dns:header(DnsHeader) ->
    -        [ {id, integer()}
    -        | {qr, boolean()}
    -        | {opcode, query | iquery | status | integer()}
    -        | {aa, boolean()}
    -        | {tc, boolean()}
    -        | {rd, boolean()}
    -        | {ra, boolean()}
    -        | {pr, boolean()}
    -        | {rcode, integer(0..16)} ]
    -    inet_dns:header(DnsHeader, Field) -> Value
    -
    -query_type() = axfr | mailb | maila | any | dns_rr_type()
    -
    -dns_query() = DnsQuery
    -    inet_dns:dns_query(DnsQuery) ->
    -        [ {domain, dns_name()}
    -        | {type, query_type()}
    -        | {class, dns_class()} ]
    -    inet_dns:dns_query(DnsQuery, Field) -> Value
    -
    -dns_rr() = DnsRr
    -    inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields
    -    DnsRrFields = [ {domain, dns_name()}
    -                  | {type, dns_rr_type()}
    -                  | {class, dns_class()}
    -                  | {ttl, integer()}
    -                  | {data, dns_data()} ]
    -    DnsRrOptFields = [ {domain, dns_name()}
    -                     | {type, opt}
    -                     | {udp_payload_size, integer()}
    -                     | {ext_rcode, integer()}
    -                     | {version, integer()}
    -                     | {z, integer()}
    -                     | {data, dns_data()} ]
    -    inet_dns:rr(DnsRr, Field) -> Value

    There is an information function for the types above:

    inet_dns:record_type(dns_msg()) -> msg;
    -inet_dns:record_type(dns_header()) -> header;
    -inet_dns:record_type(dns_query()) -> dns_query;
    -inet_dns:record_type(dns_rr()) -> rr;
    -inet_dns:record_type(_) -> undefined.

    So, inet_dns:(inet_dns:record_type(X))(X) converts any of these data +for a specified field.

    dns_msg() = DnsMsg
    +    inet_dns:msg(DnsMsg) ->
    +        [ {header, dns_header()}
    +        | {qdlist, dns_query()}
    +        | {anlist, dns_rr()}
    +        | {nslist, dns_rr()}
    +        | {arlist, dns_rr()} ]
    +    inet_dns:msg(DnsMsg, header) -> dns_header() % for example
    +    inet_dns:msg(DnsMsg, Field) -> Value
    +
    +dns_header() = DnsHeader
    +    inet_dns:header(DnsHeader) ->
    +        [ {id, integer()}
    +        | {qr, boolean()}
    +        | {opcode, query | iquery | status | integer()}
    +        | {aa, boolean()}
    +        | {tc, boolean()}
    +        | {rd, boolean()}
    +        | {ra, boolean()}
    +        | {pr, boolean()}
    +        | {rcode, integer(0..16)} ]
    +    inet_dns:header(DnsHeader, Field) -> Value
    +
    +query_type() = axfr | mailb | maila | any | dns_rr_type()
    +
    +dns_query() = DnsQuery
    +    inet_dns:dns_query(DnsQuery) ->
    +        [ {domain, dns_name()}
    +        | {type, query_type()}
    +        | {class, dns_class()} ]
    +    inet_dns:dns_query(DnsQuery, Field) -> Value
    +
    +dns_rr() = DnsRr
    +    inet_dns:rr(DnsRr) -> DnsRrFields | DnsRrOptFields
    +    DnsRrFields = [ {domain, dns_name()}
    +                  | {type, dns_rr_type()}
    +                  | {class, dns_class()}
    +                  | {ttl, integer()}
    +                  | {data, dns_data()} ]
    +    DnsRrOptFields = [ {domain, dns_name()}
    +                     | {type, opt}
    +                     | {udp_payload_size, integer()}
    +                     | {ext_rcode, integer()}
    +                     | {version, integer()}
    +                     | {z, integer()}
    +                     | {data, dns_data()} ]
    +    inet_dns:rr(DnsRr, Field) -> Value

    There is an information function for the types above:

    inet_dns:record_type(dns_msg()) -> msg;
    +inet_dns:record_type(dns_header()) -> header;
    +inet_dns:record_type(dns_query()) -> dns_query;
    +inet_dns:record_type(dns_rr()) -> rr;
    +inet_dns:record_type(_) -> undefined.

    So, inet_dns:(inet_dns:record_type(X))(X) converts any of these data structures into a {Field,Value} list.

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/kernel.epub b/prs/9277/lib/kernel-10.2/doc/html/kernel.epub index f3ded47635721..03c2df182a796 100644 Binary files a/prs/9277/lib/kernel-10.2/doc/html/kernel.epub and b/prs/9277/lib/kernel-10.2/doc/html/kernel.epub differ diff --git a/prs/9277/lib/kernel-10.2/doc/html/logger.html b/prs/9277/lib/kernel-10.2/doc/html/logger.html index 0834b1a30e622..e0a7d72caaec0 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/logger.html +++ b/prs/9277/lib/kernel-10.2/doc/html/logger.html @@ -130,18 +130,18 @@

    API module for Logger, the standard logging facility in Erlang/OTP.

    This module implements the main API for logging in Erlang/OTP. To create a log event, use the API functions or the log -macros, for example:

    ?LOG_ERROR("error happened because: ~p", [Reason]).   % With macro
    -logger:error("error happened because: ~p", [Reason]). % Without macro

    To configure the Logger backend, use +macros, for example:

    ?LOG_ERROR("error happened because: ~p", [Reason]).   % With macro
    +logger:error("error happened because: ~p", [Reason]). % Without macro

    To configure the Logger backend, use Kernel configuration parameters or configuration functions in the Logger API.

    By default, the Kernel application installs one log handler at system start. This handler is named default. It receives and processes standard log events produced by the Erlang runtime system, standard behaviours and different Erlang/OTP applications. The log events are by default printed to the terminal.

    If you want your systems logs to be printed to a file instead, you must configure the default handler to do so. The simplest way is to include the -following in your sys.config:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{config => #{file => "path/to/file.log"}}}]}]}].

    For more information about:

    @@ -2431,12 +2431,12 @@

    log(Level, FunOrFormat, Args, Metadata)

    %% A plain string with expensive metadata
    -1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
    +1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
     %% An expensive report
    -2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
    +2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
     %% A plain string with expensive metadata and normal metadata
    -3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[],
    -               #{ meta => data }).

    When metadata is given both as an argument and returned from the fun they are +3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[], + #{ meta => data }).

    When metadata is given both as an argument and returned from the fun they are merged. If equal keys exists the values are taken from the metadata returned by the fun.

    @@ -2759,26 +2759,26 @@

    add_handlers/1

    consistent no matter which handler the system uses. Normal usage is to add a call to logger:add_handlers/1 just after the processes that the handler needs are started, and pass the application's logger configuration as the argument. -For example:

    -behaviour(application).
    -start(_, []) ->
    -    case supervisor:start_link({local, my_sup}, my_sup, []) of
    -        {ok, Pid} ->
    -            ok = logger:add_handlers(my_app),
    -            {ok, Pid, []};
    +For example:

    -behaviour(application).
    +start(_, []) ->
    +    case supervisor:start_link({local, my_sup}, my_sup, []) of
    +        {ok, Pid} ->
    +            ok = logger:add_handlers(my_app),
    +            {ok, Pid, []};
             Error -> Error
          end.

    This reads the logger configuration parameter from the my_app application and starts the configured handlers. The contents of the configuration use the same rules as the logger handler configuration.

    If the handler is meant to replace the default handler, the Kernel's default handler have to be disabled before the new handler is added. A sys.config file -that disables the Kernel handler and adds a custom handler could look like this:

    [{kernel,
    -  [{logger,
    +that disables the Kernel handler and adds a custom handler could look like this:

    [{kernel,
    +  [{logger,
         %% Disable the default Kernel handler
    -    [{handler, default, undefined}]}]},
    - {my_app,
    -  [{logger,
    +    [{handler, default, undefined}]}]},
    + {my_app,
    +  [{logger,
         %% Enable this handler as the default
    -    [{handler, default, my_handler, #{}}]}]}].
    +
    [{handler, default, my_handler, #{}}]}]}].
    @@ -3733,8 +3733,8 @@

    update_formatter_config(HandlerId, Formatte -

    Update the formatter configuration for the specified handler.

    The new configuration is merged with the existing formatter configuration.

    To overwrite the existing configuration without any merge, use

    set_handler_config(HandlerId, formatter,
    -	      {FormatterModule, FormatterConfig}).
    +

    Update the formatter configuration for the specified handler.

    The new configuration is merged with the existing formatter configuration.

    To overwrite the existing configuration without any merge, use

    set_handler_config(HandlerId, formatter,
    +	      {FormatterModule, FormatterConfig}).

    @@ -3797,8 +3797,8 @@

    update_handler_config(HandlerId, Config)

    Update configuration data for the specified handler. This function behaves as if -it was implemented as follows:

    {ok, {_, Old}} = logger:get_handler_config(HandlerId),
    -logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use +it was implemented as follows:

    {ok, {_, Old}} = logger:get_handler_config(HandlerId),
    +logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use set_handler_config/2 .

    @@ -3891,8 +3891,8 @@

    update_primary_config(Config)

    Update primary configuration data for Logger. This function behaves as if it was -implemented as follows:

    Old = logger:get_primary_config(),
    -logger:set_primary_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use +implemented as follows:

    Old = logger:get_primary_config(),
    +logger:set_primary_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use set_primary_config/1 .

    @@ -3924,7 +3924,7 @@

    update_process_metadata(Meta)

    Set or update metadata to use when logging from current process

    If process metadata exists for the current process, this function behaves as if -it was implemented as follows:

    logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

    If no process metadata exists, the function behaves as +it was implemented as follows:

    logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

    If no process metadata exists, the function behaves as set_process_metadata/1 .

    @@ -3956,8 +3956,8 @@

    update_proxy_config(Config)

    Update configuration data for the Logger proxy. This function behaves as if it -was implemented as follows:

    Old = logger:get_proxy_config(),
    -logger:set_proxy_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use +was implemented as follows:

    Old = logger:get_proxy_config(),
    +logger:set_proxy_config(maps:merge(Old, Config)).

    To overwrite the existing configuration without any merge, use set_proxy_config/1 .

    For more information about the proxy, see section Logger Proxy in the Kernel User's Guide.

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/logger_chapter.html b/prs/9277/lib/kernel-10.2/doc/html/logger_chapter.html index ab66c67cc4f92..d507e11e19648 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/logger_chapter.html +++ b/prs/9277/lib/kernel-10.2/doc/html/logger_chapter.html @@ -190,7 +190,7 @@

    The API for logging consists of a set of macros, and a set of functions on the form logger:Level/1,2,3, which are all shortcuts for logger:log(Level,Arg1[,Arg2[,Arg3]]).

    The macros are defined in logger.hrl, which is included in a module with the -directive

    -include_lib("kernel/include/logger.hrl").

    The difference between using the macros and the exported functions is that +directive

    -include_lib("kernel/include/logger.hrl").

    The difference between using the macros and the exported functions is that macros add location (originator) information to the metadata, and performs lazy evaluation by wrapping the logger call in a case statement, so it is only evaluated if the log level of the event passes the primary log level check.

    @@ -212,23 +212,23 @@

    The log message contains the information to be logged. The message can consist of a format string and arguments (given as two separate parameters in the Logger -API), a string or a report.

    Example, format string and arguments:

    logger:error("The file does not exist: ~ts",[Filename])

    Example, string:

    logger:notice("Something strange happened!")

    A report, which is either a map or a key-value list, is the preferred way to log +API), a string or a report.

    Example, format string and arguments:

    logger:error("The file does not exist: ~ts",[Filename])

    Example, string:

    logger:notice("Something strange happened!")

    A report, which is either a map or a key-value list, is the preferred way to log using Logger as it makes it possible for different backends to filter and format -the log event as it needs to.

    Example, report:

    ?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })

    Reports can be accompanied by a report callback specified in the log event's +the log event as it needs to.

    Example, report:

    ?LOG_ERROR(#{ user => joe, filename => Filename, reason => enoent })

    Reports can be accompanied by a report callback specified in the log event's metadata. The report callback is a convenience function that the formatter can use to convert the report to a format string and arguments, or directly to a string. The formatter can also use its own conversion function, if no callback is provided, or if a customized formatting is desired.

    The report callback must be a fun with one or two arguments. If it takes one argument, this is the report itself, and the fun returns a format string and -arguments:

    fun((logger:report()) -> {io:format(),[term()]})

    If it takes two arguments, the first is the report, and the second is a map -containing extra data that allows direct conversion to a string:

    fun((logger:report(),logger:report_cb_config()) -> unicode:chardata())

    The fun must obey the depth and chars_limit parameters provided in the +arguments:

    fun((logger:report()) -> {io:format(),[term()]})

    If it takes two arguments, the first is the report, and the second is a map +containing extra data that allows direct conversion to a string:

    fun((logger:report(),logger:report_cb_config()) -> unicode:chardata())

    The fun must obey the depth and chars_limit parameters provided in the second argument, as the formatter cannot do anything useful of these parameters with the returned string. The extra data also contains a field named single_line, indicating if the printed log message may contain line breaks or not. This variant is used when the formatting of the report depends on the size -or single line parameters.

    Example, report, and metadata with report callback:

    logger:debug(#{got => connection_request, id => Id, state => State},
    -             #{report_cb => fun(R) -> {"~p",[R]} end})

    The log message can also be provided through a fun for lazy evaluation. The fun +or single line parameters.

    Example, report, and metadata with report callback:

    logger:debug(#{got => connection_request, id => Id, state => State},
    +             #{report_cb => fun(R) -> {"~p",[R]} end})

    The log message can also be provided through a fun for lazy evaluation. The fun is only evaluated if the primary log level check passes, and is therefore recommended if it is expensive to generate the message. The lazy fun must return a string, a report, or a tuple with format string and arguments.

    @@ -416,14 +416,14 @@

    allows another application to add its own default handler.

    Only one entry of this type is allowed.

  • {handler, HandlerId, Module, HandlerConfig} - If HandlerId is default, then this entry modifies the default handler, equivalent to calling

            logger:remove_handler(default)
    -

    followed by

            logger:add_handler(default, Module, HandlerConfig)
    +

    followed by

            logger:add_handler(default, Module, HandlerConfig)
     

    For all other values of HandlerId, this entry adds a new handler, -equivalent to calling

            logger:add_handler(HandlerId, Module, HandlerConfig)
    +equivalent to calling

            logger:add_handler(HandlerId, Module, HandlerConfig)
     

    Multiple entries of this type are allowed.

  • {filters, FilterDefault, [Filter]} - Adds the specified primary -filters.

    • FilterDefault = log | stop

    • Filter = {FilterId, {FilterFun, FilterConfig}}

    Equivalent to calling

            logger:add_primary_filter(FilterId, {FilterFun, FilterConfig})
    +filters.

    • FilterDefault = log | stop

    • Filter = {FilterId, {FilterFun, FilterConfig}}

    Equivalent to calling

            logger:add_primary_filter(FilterId, {FilterFun, FilterConfig})
     

    for each Filter.

    FilterDefault specifies the behaviour if all primary filters return ignore, see section Filters.

    Only one entry of this type is allowed.

  • {module_level, Level, [Module]} - Sets module log level for the given -modules. Equivalent to calling

            logger:set_module_level(Module, Level)

    for each Module.

    Multiple entries of this type are allowed.

  • {proxy, ProxyConfig} - Sets the proxy configuration, equivalent to +modules. Equivalent to calling

            logger:set_module_level(Module, Level)

    for each Module.

    Multiple entries of this type are allowed.

  • {proxy, ProxyConfig} - Sets the proxy configuration, equivalent to calling

            logger:set_proxy_config(ProxyConfig)
     

    Only one entry of this type is allowed.

  • See section Configuration Examples for examples using the logger parameter for system configuration.

  • logger_metadata = map() - Specifies the primary @@ -446,31 +446,31 @@

    file. See the config(4) manual page for more information about this file.

    Each of the following examples shows a simple system configuration file that configures Logger according to the description.

    Modify the default handler to print to a file instead of -standard_io:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,  % {handler, HandlerId, Module,
    -      #{config => #{file => "log/erlang.log"}}}  % Config}
    -    ]}]}].

    Modify the default handler to print each log event as a single line:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{formatter => {logger_formatter, #{single_line => true}}}}
    -    ]}]}].

    Modify the default handler to print the pid of the logging process for each log -event:

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{formatter => {logger_formatter,
    -                        #{template => [time," ",pid," ",msg,"\n"]}}}}
    -    ]}]}].

    Modify the default handler to only print errors and more severe log events to +standard_io:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,  % {handler, HandlerId, Module,
    +      #{config => #{file => "log/erlang.log"}}}  % Config}
    +    ]}]}].

    Modify the default handler to print each log event as a single line:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{formatter => {logger_formatter, #{single_line => true}}}}
    +    ]}]}].

    Modify the default handler to print the pid of the logging process for each log +event:

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{formatter => {logger_formatter,
    +                        #{template => [time," ",pid," ",msg,"\n"]}}}}
    +    ]}]}].

    Modify the default handler to only print errors and more severe log events to "log/erlang.log", and add another handler to print all log events to -"log/debug.log".

    [{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{level => error,
    -        config => #{file => "log/erlang.log"}}},
    -     {handler, info, logger_std_h,
    -      #{level => debug,
    -        config => #{file => "log/debug.log"}}}
    -    ]}]}].

    +"log/debug.log".

    [{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{level => error,
    +        config => #{file => "log/erlang.log"}}},
    +     {handler, info, logger_std_h,
    +      #{level => debug,
    +        config => #{file => "log/debug.log"}}}
    +    ]}]}].

    @@ -511,9 +511,9 @@

    This field can be used by filters to stop or allow the log events.

    See section SASL User's Guide for more information about the old SASL error logging functionality.

  • Legacy Event Handlers
    To use event handlers written for error_logger, just add your event handler with

    error_logger:add_report_handler/1,2.

    This automatically starts the error logger event manager, and adds -error_logger as a handler to Logger, with the following configuration:

    #{level => info,
    +error_logger as a handler to Logger, with the following configuration:

    #{level => info,
       filter_default => log,
    -  filters => []}.

    Note

    This handler ignores events that do not originate from the error_logger + filters => []}.

    Note

    This handler ignores events that do not originate from the error_logger API, or from within OTP. This means that if your code uses the Logger API for logging, then your log events will be discarded by this handler.

    The handler is not overload protected.

  • @@ -539,19 +539,19 @@

    level notice or more severe, are logged to the terminal via the default handler. To also log info events, you can either change the primary log level to info:

    1> logger:set_primary_config(level, info).
    -ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
    +ok

    or set the level for one or a few modules only:

    2> logger:set_module_level(mymodule, info).
     ok

    This allows info events to pass through to the default handler, and be printed to the terminal as well. If there are many info events, it can be useful to print these to a file instead.

    First, set the log level of the default handler to notice, preventing it from -printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
    +printing info events to the terminal:

    3> logger:set_handler_config(default, level, notice).
     ok

    Then, add a new handler which prints to file. You can use the handler module -logger_std_h, and configure it to log to file:

    4> Config = #{config => #{file => "./info.log"}, level => info}.
    -#{config => #{file => "./info.log"},level => info}
    -5> logger:add_handler(myhandler, logger_std_h, Config).
    +logger_std_h, and configure it to log to file:

    4> Config = #{config => #{file => "./info.log"}, level => info}.
    +#{config => #{file => "./info.log"},level => info}
    +5> logger:add_handler(myhandler, logger_std_h, Config).
     ok

    Since filter_default defaults to log, this handler now receives all log events. If you want info events only in the file, you must add a filter to stop -all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    -                             {fun logger_filters:level/2, {stop, neq, info}}).
    +all non-info events. The built-in filter logger_filters:level/2 can do this:

    6> logger:add_handler_filter(myhandler, stop_non_info,
    +                             {fun logger_filters:level/2, {stop, neq, info}}).
     ok

    See section Filters for more information about the filters and the filter_default configuration parameter.

    @@ -576,48 +576,48 @@

    database.

    When logger:get_config/0 or logger:get_handler_config/0,1 is called, Logger calls HModule:filter_config(Config). This function must return the -handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    --export([log/2]).
    +handler configuration where internal data is removed.

    A simple handler that prints to the terminal can be implemented as follows:

    -module(myhandler1).
    +-export([log/2]).
     
    -log(LogEvent, #{formatter := {FModule, FConfig}}) ->
    -    io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log +log(LogEvent, #{formatter := {FModule, FConfig}}) -> + io:put_chars(FModule:format(LogEvent, FConfig)).

    Notice that the above handler does not have any overload protection, and all log events are printed directly from the client process.

    For information and examples of overload protection, please refer to section Protecting the Handler from Overload, and the implementation of logger_std_h and logger_disk_log_h .

    The following is a simpler example of a handler which logs to a file through one -single process:

    -module(myhandler2).
    --export([adding_handler/1, removing_handler/1, log/2]).
    --export([init/1, handle_call/3, handle_cast/2, terminate/2]).
    +single process:

    -module(myhandler2).
    +-export([adding_handler/1, removing_handler/1, log/2]).
    +-export([init/1, handle_call/3, handle_cast/2, terminate/2]).
     
    -adding_handler(Config) ->
    -    MyConfig = maps:get(config,Config,#{file => "myhandler2.log"}),
    -    {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),
    -    {ok, Config#{config => MyConfig#{pid => Pid}}}.
    +adding_handler(Config) ->
    +    MyConfig = maps:get(config,Config,#{file => "myhandler2.log"}),
    +    {ok, Pid} = gen_server:start(?MODULE, MyConfig, []),
    +    {ok, Config#{config => MyConfig#{pid => Pid}}}.
     
    -removing_handler(#{config := #{pid := Pid}}) ->
    -    gen_server:stop(Pid).
    +removing_handler(#{config := #{pid := Pid}}) ->
    +    gen_server:stop(Pid).
     
    -log(LogEvent,#{config := #{pid := Pid}} = Config) ->
    -    gen_server:cast(Pid, {log, LogEvent, Config}).
    +log(LogEvent,#{config := #{pid := Pid}} = Config) ->
    +    gen_server:cast(Pid, {log, LogEvent, Config}).
     
    -init(#{file := File}) ->
    -    {ok, Fd} = file:open(File, [append, {encoding, utf8}]),
    -    {ok, #{file => File, fd => Fd}}.
    +init(#{file := File}) ->
    +    {ok, Fd} = file:open(File, [append, {encoding, utf8}]),
    +    {ok, #{file => File, fd => Fd}}.
     
    -handle_call(_, _, State) ->
    -    {reply, {error, bad_request}, State}.
    +handle_call(_, _, State) ->
    +    {reply, {error, bad_request}, State}.
     
    -handle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->
    -    do_log(Fd, LogEvent, Config),
    -    {noreply, State}.
    +handle_cast({log, LogEvent, Config}, #{fd := Fd} = State) ->
    +    do_log(Fd, LogEvent, Config),
    +    {noreply, State}.
     
    -terminate(_Reason, #{fd := Fd}) ->
    -    _ = file:close(Fd),
    +terminate(_Reason, #{fd := Fd}) ->
    +    _ = file:close(Fd),
         ok.
     
    -do_log(Fd, LogEvent, #{formatter := {FModule, FConfig}}) ->
    -    String = FModule:format(LogEvent, FConfig),
    -    io:put_chars(Fd, String).

    +do_log(Fd, LogEvent, #{formatter := {FModule, FConfig}}) -> + String = FModule:format(LogEvent, FConfig), + io:put_chars(Fd, String).

    @@ -683,11 +683,11 @@

    performance reasons, the client processes must never be blocked by synchronous log requests. It is possible, perhaps, that dropping or flushing events is still acceptable, since it does not affect the performance of the client processes -sending the log events.

    A configuration example:

    logger:add_handler(my_standard_h, logger_std_h,
    -                   #{config => #{file => "./system_info.log",
    +sending the log events.

    A configuration example:

    logger:add_handler(my_standard_h, logger_std_h,
    +                   #{config => #{file => "./system_info.log",
                                      sync_mode_qlen => 100,
                                      drop_mode_qlen => 1000,
    -                                 flush_qlen => 2000}}).

    + flush_qlen => 2000}}).

    @@ -701,11 +701,11 @@

    disables it.

    Defaults to true.

  • burst_limit_max_count - This is the maximum number of events to handle within a burst_limit_window_time time frame. After the limit is reached, successive events are dropped until the end of the time frame.

    Defaults to 500 events.

  • burst_limit_window_time - See the previous description of -burst_limit_max_count.

    Defaults to 1000 milliseconds.

  • A configuration example:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    -                   #{config => #{file => "./my_disk_log",
    +burst_limit_max_count.

    Defaults to 1000 milliseconds.

    A configuration example:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    +                   #{config => #{file => "./my_disk_log",
                                      burst_limit_enable => true,
                                      burst_limit_max_count => 20,
    -                                 burst_limit_window_time => 500}}).

    + burst_limit_window_time => 500}}).

    @@ -741,11 +741,11 @@

    forwards the event to the proxy on the remote node.

    When receiving a log event, either from the emulator or from a remote node, the proxy calls the Logger API to log the event.

    The proxy process is overload protected in the same way as described in section Protecting the Handler from Overload, -but with the following default values:

        #{sync_mode_qlen => 500,
    +but with the following default values:

        #{sync_mode_qlen => 500,
           drop_mode_qlen => 1000,
           flush_qlen => 5000,
           burst_limit_enable => false,
    -      overload_kill_enable => false}

    For log events from the emulator, synchronous message passing mode is not + overload_kill_enable => false}

    For log events from the emulator, synchronous message passing mode is not applicable, since all messages are passed asynchronously by the emulator. Drop mode is achieved by setting the system_logger to undefined, forcing the emulator to drop events until it is set back to the proxy pid again.

    The proxy uses erlang:send_nosuspend/2 when sending log events to a remote diff --git a/prs/9277/lib/kernel-10.2/doc/html/logger_cookbook.html b/prs/9277/lib/kernel-10.2/doc/html/logger_cookbook.html index 433260425889b..2a0bc2b62663d 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/logger_cookbook.html +++ b/prs/9277/lib/kernel-10.2/doc/html/logger_cookbook.html @@ -144,19 +144,19 @@

    -
    1> logger:i(primary).
    +
    1> logger:i(primary).
     Primary configuration:
         Level: notice
         Filter Default: log
         Filters:
    -        (none)

    It is also possible to fetch the configuration using + (none)

    It is also possible to fetch the configuration using logger:get_primary_config().

    See also

    -
    2> logger:i(handlers).
    +
    2> logger:i(handlers).
     Handler configuration:
         Id: default
             Module: logger_std_h
    @@ -173,10 +173,10 @@ 

    @@ -233,17 +233,17 @@

    Since single line logging is the default of the built-in formatter you only have to provide the empty map as the configuration. The example below uses the sys.config to change the formatter configuration.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter, #{ }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter, #{ }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, an error").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, an error").
     1962-10-03T11:07:47.466763-04:00 error: Oh noes, an error

    However, if you just want to change it for the current session you can also do -that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
    +that.

    1> logger:set_handler_config(default, formatter, {logger_formatter, #{}}).
     ok
    -2> logger:error("Oh noes, another error").
    +2> logger:error("Oh noes, another error").
     1962-10-04T15:34:02.648713-04:00 error: Oh noes, another error

    See also

    @@ -251,14 +251,14 @@

    Add file and line number to log entries

    You can change what is printed to the log by using the formatter template:

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ formatter => {logger_formatter,
    -        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ formatter => {logger_formatter,
    +        #{ template => [time," ", file,":",line," ",level,": ",msg,"\n"] }}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, more errors",#{ file => "shell.erl", line => 1 }).
     1962-10-05T07:37:44.104241+02:00 shell.erl:1 error: Oh noes, more errors

    Note that file and line have to be added in the metadata by the caller of logger:log/3 as otherwise Logger will not know from where it was called. The file and line number are automatically added if you use the ?LOG_ERROR macros @@ -275,18 +275,18 @@

    Instead of printing the logs to stdout we print them to a rotating file log.

    $ cat sys.config
    -[{kernel,
    -  [{logger,
    -    [{handler, default, logger_std_h,
    -      #{ config => #{ file => "log/erlang.log",
    +[{kernel,
    +  [{logger,
    +    [{handler, default, logger_std_h,
    +      #{ config => #{ file => "log/erlang.log",
                           max_no_bytes => 4096,
    -                      max_no_files => 5},
    -         formatter => {logger_formatter, #{}}}}]}]}].
    +                      max_no_files => 5},
    +         formatter => {logger_formatter, #{}}}}]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     ok
    -2> erlang:halt().
    +2> erlang:halt().
     $ cat log/erlang.log
     2019-10-07T11:47:16.837958+02:00 error: Oh noes, even more errors

    See also

    @@ -296,24 +296,24 @@

    Add a handler that prints debug log events to a file, while the default handler prints only up to notice level events to standard out.

    $ cat sys.config
    -[{kernel,
    -  [{logger_level, all},
    -   {logger,
    -    [{handler, default, logger_std_h,
    -      #{ level => notice }},
    -     {handler, debug, logger_std_h,
    -      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    -         config => #{ file => "log/debug.log" } }}
    -    ]}]}].
    +[{kernel,
    +  [{logger_level, all},
    +   {logger,
    +    [{handler, default, logger_std_h,
    +      #{ level => notice }},
    +     {handler, debug, logger_std_h,
    +      #{ filters => [{debug,{fun logger_filters:level/2, {stop, neq, debug}}}],
    +         config => #{ file => "log/debug.log" } }}
    +    ]}]}].
     $ erl -config sys
    -Eshell V10.5.1  (abort with ^G)
    -1> logger:error("Oh noes, even more errors").
    +Eshell V10.5.1  (abort with ^G)
    +1> logger:error("Oh noes, even more errors").
     =ERROR REPORT==== 9-Oct-2019::14:40:54.784162 ===
     Oh noes, even more errors
     ok
    -2> logger:debug("A debug event").
    +2> logger:debug("A debug event").
     ok
    -3> erlang:halt().
    +3> erlang:halt().
     $ cat log/debug.log
     2019-10-09T14:41:03.680541+02:00 debug: A debug event

    In the configuration above we first raise the primary log level to max in order for the debug log events to get to the handlers. Then we configure the default @@ -321,13 +321,13 @@

    See also

    @@ -343,7 +343,7 @@

    What to log and how

    The simplest way to log something is by using the Logger macros and give a -report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
    +report to the macro. For example if you want to log an error:

    ?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP }).

    This will print the following in the default log:

    =ERROR REPORT==== 10-Oct-2019::12:13:10.089073 ===
         dst: {8,8,4,4}
         src: {8,8,8,8}
         status: 418
    @@ -355,14 +355,14 @@ 

    If you want to do structured logging, but still want to have some control of how the final log message is formatted you can give a report_cb as part of the -metadata with your log event.

    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    -                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    -                   {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),
    -                   {"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n",
    -                    [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}
    +metadata with your log event.

    ReportCB = fun(#{ what := What, status := Status, src := Src, dst := Dst }) ->
    +                   {ok, #hostent{ h_name = SrcName }} = inet:gethostbyaddr(Src),
    +                   {ok, #hostent{ h_name = DstName }} = inet:gethostbyaddr(Dst),
    +                   {"What: ~p~nStatus: ~p~nSrc: ~s (~s)~nDst: ~s (~s)~n",
    +                    [What, Status, inet:ntoa(Src), SrcName, inet:ntoa(Dst), DstName]}
                end,
    -?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP },
    -           #{ report_cb => ReportCB }).

    This will print the following:

    =ERROR REPORT==== 10-Oct-2019::13:29:02.230863 ===
    +?LOG_ERROR(#{ what => http_error, status => 418, src => ClientIP, dst => ServerIP },
    +           #{ report_cb => ReportCB }).

    This will print the following:

    =ERROR REPORT==== 10-Oct-2019::13:29:02.230863 ===
     What: http_error
     Status: 418
     Src: 8.8.8.8 (dns.google)
    @@ -383,22 +383,22 @@ 

    If we only want debug messages from a specific process it is possible to do this with a filter like this:

    %% Initial setup to use a filter for the level filter instead of the primary level
    -PrimaryLevel = maps:get(level, logger:get_primary_config()),
    -ok = logger:add_primary_filter(primary_level,
    -    {fun logger_filters:level/2, {log, gteq, PrimaryLevel}}),
    -logger:set_primary_config(filter_default, stop),
    -logger:set_primary_config(level, all),
    +PrimaryLevel = maps:get(level, logger:get_primary_config()),
    +ok = logger:add_primary_filter(primary_level,
    +    {fun logger_filters:level/2, {log, gteq, PrimaryLevel}}),
    +logger:set_primary_config(filter_default, stop),
    +logger:set_primary_config(level, all),
     
     %% Test that things work as they should
    -logger:notice("Notice should be logged"),
    -logger:debug("Should not be logged"),
    +logger:notice("Notice should be logged"),
    +logger:debug("Should not be logged"),
     
     %% Add the filter to allow PidToLog to send debug events
    -PidToLog = self(),
    -PidFilter = fun(LogEvent, _) when PidToLog =:= self() -> LogEvent;
    -               (_LogEvent, _) -> ignore end,
    -ok = logger:add_primary_filter(pid, {PidFilter,[]}),
    -logger:debug("Debug should be logged").

    There is a bit of setup needed to allow filters to decide whether a specific +PidToLog = self(), +PidFilter = fun(LogEvent, _) when PidToLog =:= self() -> LogEvent; + (_LogEvent, _) -> ignore end, +ok = logger:add_primary_filter(pid, {PidFilter,[]}), +logger:debug("Debug should be logged").

    There is a bit of setup needed to allow filters to decide whether a specific process should be allowed to log. This is because the default primary log level is notice and it is enforced before the primary filters. So in order for the pid filter to be useful we have to raise the primary log level to all and then add @@ -415,11 +415,11 @@

    Domains are used to specify which subsystem a certain log event originates from. The default handler will by default only log events with the domain [otp] or without a domain. If you would like to include SSL log events into the default -handler log you could do this:

    1> logger:add_handler_filter(default,ssl_domain,
    -  {fun logger_filters:domain/2,{log,sub,[otp,ssl]}}).
    -2> application:ensure_all_started(ssl).
    -{ok,[crypto,asn1,public_key,ssl]}
    -3> ssl:connect("www.erlang.org",443,[{log_level,debug}]).
    +handler log you could do this:

    1> logger:add_handler_filter(default,ssl_domain,
    +  {fun logger_filters:domain/2,{log,sub,[otp,ssl]}}).
    +2> application:ensure_all_started(ssl).
    +{ok,[crypto,asn1,public_key,ssl]}
    +3> ssl:connect("www.erlang.org",443,[{log_level,debug}]).
     %% lots of text

    See also

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/logger_disk_log_h.html b/prs/9277/lib/kernel-10.2/doc/html/logger_disk_log_h.html index 9ec2247d07e83..f04ee447b3cd7 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/logger_disk_log_h.html +++ b/prs/9277/lib/kernel-10.2/doc/html/logger_disk_log_h.html @@ -164,12 +164,12 @@

    and the disk_log handler, and are documented in the User's Guide.

    Notice that when changing the configuration of the handler in runtime, the disk_log options (file, type, max_no_files, max_no_bytes) must not be -modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    -                   #{config => #{file => "./my_disk_log",
    +modified.

    Example of adding a disk_log handler:

    logger:add_handler(my_disk_log_h, logger_disk_log_h,
    +                   #{config => #{file => "./my_disk_log",
                                      type => wrap,
                                      max_no_files => 4,
                                      max_no_bytes => 10000,
    -                                 filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when + filesync_repeat_interval => 1000}}).

    To use the disk_log handler instead of the default standard handler when starting an Erlang node, change the Kernel default logger to use logger_disk_log_h. Example:

    erl -kernel logger '[{handler,default,logger_disk_log_h,
                           #{config => #{file => "./system_disk_log"}}}]'

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/logger_filters.html b/prs/9277/lib/kernel-10.2/doc/html/logger_filters.html index de25fe7ce5197..e489e10664fe4 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/logger_filters.html +++ b/prs/9277/lib/kernel-10.2/doc/html/logger_filters.html @@ -251,8 +251,8 @@

    domain(LogEvent, Extra)

    events from, for example, a specific functional area. This allows filtering or other specialized treatment in a Logger handler.

    A domain field must be a list of atoms, creating smaller and more specialized domains as the list grows longer. The greatest domain is [], which comprises -all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    -D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 +all possible domains.

    For example, consider the following domains:

    D1 = [otp]
    +D2 = [otp, sasl]

    D1 is the greatest of the two, and is said to be a super-domain of D2. D2 is a sub-domain D1. Both D1 and D2 are sub-domains of [].

    The above domains are used for logs originating from Erlang/OTP. D1 specifies that the log event comes from Erlang/OTP in general, and D2 indicates that the log event is a so called SASL report.

    The Extra parameter to the domain/2 function is specified when @@ -267,11 +267,11 @@

    domain(LogEvent, Extra)

    filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, decide if the event is allowed or not.

    Log events that do not contain any domain field, match only when Compare is -equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
    +equal to undefined or not_equal.

    Example: stop all events with domain [otp, sasl | _]

    1> logger:set_handler_config(h1, filter_default, log). % this is the default
     ok
    -2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
    +2> Filter = {fun logger_filters:domain/2, {stop, sub, [otp, sasl]}}.
     ...
    -3> logger:add_handler_filter(h1, no_sasl, Filter).
    +3> logger:add_handler_filter(h1, no_sasl, Filter).
     ok
    @@ -316,9 +316,9 @@

    level(LogEvent, Extra)

    filter matches if the value of Operator is:

    • neq - and the compare function returns lt or gt.

    • eq - and the compare function returns eq.

    • lt - and the compare function returns lt.

    • gt - and the compare function returns gt.

    • lteq - and the compare function returns lt or eq.

    • gteq - and the compare function returns gt or eq.

    If the filter matches and Action is log, the log event is allowed. If the filter matches and Action is stop, the log event is stopped.

    If the filter does not match, it returns ignore, meaning that other filters, or the value of the configuration parameter filter_default, will decide if the -event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    -Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    -logger:add_handler_filter(h1, debug_only, Filter).
    +event is allowed or not.

    Example: only allow debug level log events

    logger:set_handler_config(h1, filter_default, stop).
    +Filter = {fun logger_filters:level/2, {log, eq, debug}}.
    +logger:add_handler_filter(h1, debug_only, Filter).
     ok
    diff --git a/prs/9277/lib/kernel-10.2/doc/html/logger_std_h.html b/prs/9277/lib/kernel-10.2/doc/html/logger_std_h.html index e15102c9f79c0..ed4c862615ffe 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/logger_std_h.html +++ b/prs/9277/lib/kernel-10.2/doc/html/logger_std_h.html @@ -185,9 +185,9 @@

    protection behaviour. The same parameters are used both in the standard handler and the disk_log handler, and are documented in the User's Guide.

    Notice that if changing the configuration of the handler in runtime, the type, -file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    -                   #{config => #{file => "./system_info.log",
    -                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, +file, or modes parameters must not be modified.

    Example of adding a standard handler:

    logger:add_handler(my_standard_h, logger_std_h,
    +                   #{config => #{file => "./system_info.log",
    +                                 filesync_repeat_interval => 1000}}).

    To set the default handler, that starts initially with the Kernel application, to log to file instead of standard_io, change the Kernel default logger configuration. Example:

    erl -kernel logger '[{handler,default,logger_std_h,
                           #{config => #{file => "./log.log"}}}]'

    An example of how to replace the standard handler with a disk_log handler at diff --git a/prs/9277/lib/kernel-10.2/doc/html/net.html b/prs/9277/lib/kernel-10.2/doc/html/net.html index 90a69a025474b..8c00aee54afcc 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/net.html +++ b/prs/9277/lib/kernel-10.2/doc/html/net.html @@ -565,13 +565,13 @@

    ifaddrs_filter_fun()

    Interface address filtering selector function/0.

    For each ifaddrs entry, return either true to keep the entry or false to discard the entry.

    For example, to get an interface list which only contains -non-loopback inet interfaces:

    net:getifaddrs(
    -    fun (#{ addr  := #{family := inet},
    -            flags := Flags}) ->
    -          not lists:member(loopback, Flags);
    -        (_) ->
    +non-loopback inet interfaces:

    net:getifaddrs(
    +    fun (#{ addr  := #{family := inet},
    +            flags := Flags}) ->
    +          not lists:member(loopback, Flags);
    +        (_) ->
               false
    -    end).
    +
    end).
    diff --git a/prs/9277/lib/kernel-10.2/doc/html/net_adm.html b/prs/9277/lib/kernel-10.2/doc/html/net_adm.html index ddbeb9d2fccee..9074cc44555e5 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/net_adm.html +++ b/prs/9277/lib/kernel-10.2/doc/html/net_adm.html @@ -491,8 +491,8 @@

    names(Host)

    Returns the names and associated port numbers of the Erlang nodes that epmd -registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    -{ok,[{"arne",40262}]}
    +registered at the specified host.

    Similar to epmd -names, see erts:epmd.

    Returns {error, address} if epmd is not operational.

    Example:

    (arne@dunn)1> net_adm:names().
    +{ok,[{"arne",40262}]}
    diff --git a/prs/9277/lib/kernel-10.2/doc/html/net_kernel.html b/prs/9277/lib/kernel-10.2/doc/html/net_kernel.html index 60b65d557522b..e576045447a3c 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/net_kernel.html +++ b/prs/9277/lib/kernel-10.2/doc/html/net_kernel.html @@ -132,9 +132,9 @@

    operational for distributed Erlang to work. The purpose of this process is to implement parts of the BIFs spawn/4 and spawn_link/4, and to provide monitoring of the network.

    An Erlang node is started using command-line flag -name or -sname:

    $ erl -sname foobar

    It is also possible to call net_kernel:start(foobar, #{}) -directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    -{ok,<0.64.0>}
    -(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is +directly from the normal Erlang shell prompt:

    1> net_kernel:start(foobar, #{name_domain => shortnames}).
    +{ok,<0.64.0>}
    +(foobar@gringotts)2>

    If the node is started with command-line flag -sname, the node name is foobar@Host, where Host is the short name of the host (not the fully qualified domain name). If started with flag -name, the node name is foobar@Host, where Host is the fully qualified domain name. For more @@ -668,13 +668,13 @@

    monitor_nodes(Flag, Options)

    delivered before a nodeup message due to a new connection to the same node. Prior to OTP 23.0, this was not guaranteed to be the case.

    The format of the node status change messages depends on Options. If Options is the empty list or if net_kernel:monitor_nodes/1 is called, the format is as -follows:

    {nodeup, Node} | {nodedown, Node}
    -  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe +follows:

    {nodeup, Node} | {nodedown, Node}
    +  Node = node()

    When Options is the empty map or empty list, the caller will only subscribe for status change messages for visible nodes. That is, only nodes that appear in the result of erlang:nodes/0.

    If Options equals anything other than the empty list, the format of the status -change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    -  Node = node()
    -  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. +change messages is as follows:

    {nodeup, Node, Info} | {nodedown, Node, Info}
    +  Node = node()
    +  Info = #{Tag => Val} | [{Tag, Val}]

    Info is either a map or a list of 2-tuples. Its content depends on Options. If Options is a map, Info will also be a map. If Options is a list, Info will also be a list.

    When Options is a map, currently the following associations are allowed:

    • connection_id => boolean() - If the value of the association equals true, a connection_id => ConnectionId association will be included in the @@ -708,23 +708,23 @@

      monitor_nodes(Flag, Options)

      {node_type, visible} tuple will be included in the Info list.

    • nodedown_reason - The tuple {nodedown_reason, Reason} will be included in the Info list for nodedown messages.

      See the documentation of the nodedown_reason => boolean() association -above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
    +above for information about possible Reason values.

    Example:

    (a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
     ok
    -(a@localhost)2> flush().
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067552,node_type => visible}}
    -Shell got {nodeup,c@localhost,
    -                  #{connection_id => 13892107,node_type => hidden}}
    -Shell got {nodedown,b@localhost,
    -                    #{connection_id => 3067552,node_type => visible,
    -                      nodedown_reason => connection_closed}}
    -Shell got {nodedown,c@localhost,
    -                    #{connection_id => 13892107,node_type => hidden,
    -                      nodedown_reason => net_tick_timeout}}
    -Shell got {nodeup,b@localhost,
    -                  #{connection_id => 3067553,node_type => visible}}
    +(a@localhost)2> flush().
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067552,node_type => visible}}
    +Shell got {nodeup,c@localhost,
    +                  #{connection_id => 13892107,node_type => hidden}}
    +Shell got {nodedown,b@localhost,
    +                    #{connection_id => 3067552,node_type => visible,
    +                      nodedown_reason => connection_closed}}
    +Shell got {nodedown,c@localhost,
    +                    #{connection_id => 13892107,node_type => hidden,
    +                      nodedown_reason => net_tick_timeout}}
    +Shell got {nodeup,b@localhost,
    +                  #{connection_id => 3067553,node_type => visible}}
     ok
    -(a@localhost)3>
    +
    (a@localhost)3>
    diff --git a/prs/9277/lib/kernel-10.2/doc/html/notes.html b/prs/9277/lib/kernel-10.2/doc/html/notes.html index b6d3b71ccac8a..846c85ae5a7a4 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/notes.html +++ b/prs/9277/lib/kernel-10.2/doc/html/notes.html @@ -4005,12 +4005,12 @@

    viewed as two operations performed atomically. Asynchronously send an unlink signal or a demonitor signal, and ignore any future results of the link or monitor.

    NOTE: This change can cause some obscure code to fail which previously did -not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
    +not. For example, the following code might hang:

                Mon = erlang:monitor(process, Pid),
                 %% ...
    -            exit(Pid, bang),
    -            erlang:demonitor(Mon),
    +            exit(Pid, bang),
    +            erlang:demonitor(Mon),
                 receive
    -                {'DOWN', Mon, process, Pid, _} -> ok
    +                {'DOWN', Mon, process, Pid, _} -> ok
                 %% We were previously guaranteed to get a down message
                 %% (since we exited the process ourself), so we could
                 %% in this case leave out:
    diff --git a/prs/9277/lib/kernel-10.2/doc/html/os.html b/prs/9277/lib/kernel-10.2/doc/html/os.html
    index 1f524ecbfc119..96c3d366f72f6 100644
    --- a/prs/9277/lib/kernel-10.2/doc/html/os.html
    +++ b/prs/9277/lib/kernel-10.2/doc/html/os.html
    @@ -658,13 +658,13 @@ 

    cmd(Command, Options)

    Executes Command in a command shell of the target OS, captures the standard output and standard error of the command, and returns this result as a string.

    The command shell can be set using the kernel configuration parameter, by default the -shell is detected upon system startup.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    -DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another +shell is detected upon system startup.

    Examples:

    LsOut = os:cmd("ls"), % on unix platform
    +DirOut = os:cmd("dir"), % on Win32 platform

    Notice that in some cases, standard output of a command when called from another program can differ, compared with the standard output of the command when called directly from an OS command shell.

    The possible options are:

    • max_size - The maximum size of the data returned by the os:cmd call. This option is a safety feature that should be used when the command executed -can return a very large, possibly infinite, result.

      > os:cmd("cat /dev/zero", #{ max_size => 20 }).
      -[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    +can return a very large, possibly infinite, result.

    > os:cmd("cat /dev/zero", #{ max_size => 20 }).
    +[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    @@ -954,7 +954,7 @@

    perf_counter(Unit)

    resolution timestamp.

    This counter is read directly from the hardware or operating system with the same guarantees. This means that two consecutive calls to the function are not guaranteed to be monotonic, though it most likely will be. The performance -counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
    +counter will be converted to the resolution passed as an argument.

    1> T1 = os:perf_counter(1000),receive after 10000 -> ok end,T2 = os:perf_counter(1000).
     176525861
     2> T2 - T1.
     10004
    @@ -1125,16 +1125,16 @@

    timestamp()

    allows you to log time stamps in high resolution and consistent with the time in the rest of the OS.

    Example of code formatting a string in format "DD Mon YYYY HH:MM:SS.mmmmmm", where DD is the day of month, Mon is the textual month name, YYYY is the year, -HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

    -module(print_time).
    --export([format_utc_timestamp/0]).
    -format_utc_timestamp() ->
    -    TS = {_,_,Micro} = os:timestamp(),
    -    {{Year,Month,Day},{Hour,Minute,Second}} =
    -calendar:now_to_universal_time(TS),
    -    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    -    "Aug","Sep","Oct","Nov","Dec"}),
    -    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    -    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
    +HH:MM:SS is the time, and mmmmmm is the microseconds in six positions:

    -module(print_time).
    +-export([format_utc_timestamp/0]).
    +format_utc_timestamp() ->
    +    TS = {_,_,Micro} = os:timestamp(),
    +    {{Year,Month,Day},{Hour,Minute,Second}} =
    +calendar:now_to_universal_time(TS),
    +    Mstr = element(Month,{"Jan","Feb","Mar","Apr","May","Jun","Jul",
    +    "Aug","Sep","Oct","Nov","Dec"}),
    +    io_lib:format("~2w ~s ~4w ~2w:~2..0w:~2..0w.~6..0w",
    +    [Day,Mstr,Year,Hour,Minute,Second,Micro]).

    This module can be used as follows:

    1> io:format("~s~n",[print_time:format_utc_timestamp()]).
     29 Apr 2009  9:55:30.051711

    OS system time can also be retrieved by system_time/0 and system_time/1.

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/pg.html b/prs/9277/lib/kernel-10.2/doc/html/pg.html index 119c99bcc0091..99aca1ec339d5 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/pg.html +++ b/prs/9277/lib/kernel-10.2/doc/html/pg.html @@ -870,7 +870,7 @@

    monitor_scope(Scope)

    Subscribes the caller to updates from the specified scope.

    Returns content of the entire scope and a reference to match the upcoming notifications.

    Whenever any group membership changes, an update message is sent to the -subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    +subscriber:

    {Ref, join, Group, [JoinPid1, JoinPid2]}
    {Ref, leave, Group, [LeavePid1]}
    diff --git a/prs/9277/lib/kernel-10.2/doc/html/rpc.html b/prs/9277/lib/kernel-10.2/doc/html/rpc.html index ec6ba77cde32f..fab871809fca9 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/rpc.html +++ b/prs/9277/lib/kernel-10.2/doc/html/rpc.html @@ -1079,10 +1079,10 @@

    multicall(Nodes, Module, Function, Args, Ti return values, or {badrpc, Reason} for failing calls. Timeout is a time (integer) in milliseconds, or infinity.

    The following example is useful when new object code is to be loaded on all nodes in the network, and indicates some side effects that RPCs can produce:

    %% Find object code for module Mod
    -{Mod, Bin, File} = code:get_object_code(Mod),
    +{Mod, Bin, File} = code:get_object_code(Mod),
     
     %% and load it on all nodes including this one
    -{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
    +{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
     
     %% and then maybe check the ResL list.

    Note

    If you want the ability to distinguish between results, you may want to consider using the erpc:multicall() function from the diff --git a/prs/9277/lib/kernel-10.2/doc/html/search.html b/prs/9277/lib/kernel-10.2/doc/html/search.html index 2fdaebccdd659..64172220b2b0e 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/search.html +++ b/prs/9277/lib/kernel-10.2/doc/html/search.html @@ -122,7 +122,7 @@

    - +

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/seq_trace.html b/prs/9277/lib/kernel-10.2/doc/html/seq_trace.html index 7e0217037202c..88f389bcb4a25 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/seq_trace.html +++ b/prs/9277/lib/kernel-10.2/doc/html/seq_trace.html @@ -141,9 +141,9 @@

    Trace Messages Sent to the System Tracer

    The format of the messages is one of the following, depending on if flag -timestamp of the trace token is set to true or false:

    {seq_trace, Label, SeqTraceInfo, TimeStamp}

    or

    {seq_trace, Label, SeqTraceInfo}

    Where:

    Label = int()
    -TimeStamp = {Seconds, Milliseconds, Microseconds}
    -  Seconds = Milliseconds = Microseconds = int()

    SeqTraceInfo can have the following formats:

    • {send, Serial, From, To, Message} - Used when a process From with its +timestamp of the trace token is set to true or false:

      {seq_trace, Label, SeqTraceInfo, TimeStamp}

      or

      {seq_trace, Label, SeqTraceInfo}

      Where:

      Label = int()
      +TimeStamp = {Seconds, Milliseconds, Microseconds}
      +  Seconds = Milliseconds = Microseconds = int()

      SeqTraceInfo can have the following formats:

      • {send, Serial, From, To, Message} - Used when a process From with its trace token flag send set to true has sent information. To may be a process identifier, a registered name on a node represented as {NameAtom, NodeAtom}, or a node name represented as an atom. From may be a @@ -287,68 +287,68 @@

        Example of Use

        This example gives a rough idea of how the new primitives can be used and what -kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        --compile(export_all).
        +kind of output it produces.

        Assume that you have an initiating process with Pid == <0.30.0> like this:

        -module(seqex).
        +-compile(export_all).
         
        -loop(Port) ->
        +loop(Port) ->
             receive
        -        {Port,Message} ->
        -            seq_trace:set_token(label,17),
        -            seq_trace:set_token('receive',true),
        -            seq_trace:set_token(print,true),
        -            seq_trace:print(17,"**** Trace Started ****"),
        -            call_server ! {self(),the_message};
        -        {ack,Ack} ->
        +        {Port,Message} ->
        +            seq_trace:set_token(label,17),
        +            seq_trace:set_token('receive',true),
        +            seq_trace:set_token(print,true),
        +            seq_trace:print(17,"**** Trace Started ****"),
        +            call_server ! {self(),the_message};
        +        {ack,Ack} ->
                     ok
             end,
        -    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
        +    loop(Port).

        And a registered process call_server with Pid == <0.31.0> like this:

        loop() ->
             receive
        -        {PortController,Message} ->
        -            Ack = {received, Message},
        -            seq_trace:print(17,"We are here now"),
        -            PortController ! {ack,Ack}
        +        {PortController,Message} ->
        +            Ack = {received, Message},
        +            seq_trace:print(17,"We are here now"),
        +            PortController ! {ack,Ack}
             end,
        -    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
        +    loop().

        A possible output from the system's sequential_tracer can be like this:

        17:<0.30.0> Info {0,1} WITH
         "**** Trace Started ****"
        -17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        -{<0.30.0>,the_message}
        -17:<0.31.0> Info {2,3} WITH
        +17:<0.31.0> Received {0,2} FROM <0.30.0> WITH
        +{<0.30.0>,the_message}
        +17:<0.31.0> Info {2,3} WITH
         "We are here now"
        -17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        -{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can -look like this:

        tracer() ->
        +17:<0.30.0> Received {2,4} FROM <0.31.0> WITH
        +{ack,{received,the_message}}

        The implementation of a system tracer process that produces this printout can +look like this:

        tracer() ->
             receive
        -        {seq_trace,Label,TraceInfo} ->
        -           print_trace(Label,TraceInfo,false);
        -        {seq_trace,Label,TraceInfo,Ts} ->
        -           print_trace(Label,TraceInfo,Ts);
        +        {seq_trace,Label,TraceInfo} ->
        +           print_trace(Label,TraceInfo,false);
        +        {seq_trace,Label,TraceInfo,Ts} ->
        +           print_trace(Label,TraceInfo,Ts);
                 _Other -> ignore
             end,
        -    tracer().
        -
        -print_trace(Label,TraceInfo,false) ->
        -    io:format("~p:",[Label]),
        -    print_trace(TraceInfo);
        -print_trace(Label,TraceInfo,Ts) ->
        -    io:format("~p ~p:",[Label,Ts]),
        -    print_trace(TraceInfo).
        -
        -print_trace({print,Serial,From,_,Info}) ->
        -    io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]);
        -print_trace({'receive',Serial,From,To,Message}) ->
        -    io:format("~p Received ~p FROM ~p WITH~n~p~n",
        -              [To,Serial,From,Message]);
        -print_trace({send,Serial,From,To,Message}) ->
        -    io:format("~p Sent ~p TO ~p WITH~n~p~n",
        -              [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that -process as the system tracer can look like this:

        start() ->
        -    Pid = spawn(?MODULE,tracer,[]),
        -    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        -    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        -    P = spawn(?MODULE, loop, [port]),
        -    register(call_server, spawn(?MODULE, loop, [])),
        -    start(),
        -    P ! {port,message}.
        +
        tracer(). + +print_trace(Label,TraceInfo,false) -> + io:format("~p:",[Label]), + print_trace(TraceInfo); +print_trace(Label,TraceInfo,Ts) -> + io:format("~p ~p:",[Label,Ts]), + print_trace(TraceInfo). + +print_trace({print,Serial,From,_,Info}) -> + io:format("~p Info ~p WITH~n~p~n", [From,Serial,Info]); +print_trace({'receive',Serial,From,To,Message}) -> + io:format("~p Received ~p FROM ~p WITH~n~p~n", + [To,Serial,From,Message]); +print_trace({send,Serial,From,To,Message}) -> + io:format("~p Sent ~p TO ~p WITH~n~p~n", + [From,Serial,To,Message]).

        The code that creates a process that runs this tracer function and sets that +process as the system tracer can look like this:

        start() ->
        +    Pid = spawn(?MODULE,tracer,[]),
        +    seq_trace:set_system_tracer(Pid), % set Pid as the system tracer
        +    ok.

        With a function like test/0, the whole example can be started:

        test() ->
        +    P = spawn(?MODULE, loop, [port]),
        +    register(call_server, spawn(?MODULE, loop, [])),
        +    start(),
        +    P ! {port,message}.

    @@ -937,11 +937,11 @@

    set_token(Token)

    tracing is disabled, otherwise Token should be an Erlang term returned from get_token/0 or set_token/1. set_token/1 can be used to temporarily exclude message passing from the trace by setting the -trace token to empty like this:

    OldToken = seq_trace:set_token([]), % set to empty and save
    +trace token to empty like this:

    OldToken = seq_trace:set_token([]), % set to empty and save
                                         % old value
     % do something that should not be part of the trace
    -io:format("Exclude the signalling caused by this~n"),
    -seq_trace:set_token(OldToken), % activate the trace token again
    +io:format("Exclude the signalling caused by this~n"),
    +seq_trace:set_token(OldToken), % activate the trace token again
     ...

    Returns the previous value of the trace token.

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/socket.html b/prs/9277/lib/kernel-10.2/doc/html/socket.html index 3879a465dfa94..a108196d22b87 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/socket.html +++ b/prs/9277/lib/kernel-10.2/doc/html/socket.html @@ -172,8 +172,8 @@

    completion_info/0 and the received completion message.

    The compiler may then optimize a following receive statement to only scan the messages that arrive after the reference/0 is created. If the message queue is large this is a big optimization.

    The reference/0 has to be unique for the call.

    Repeating an Operation on a select Systems

    Onselect systems, if a call would be repeated before the select -message has been received it replaces the call in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    -    {error, timeout} = socket:accept(LSock, 500),
    +message has been received it replaces the call in progress:

        {select, {select_info, Handle}} = socket:accept(LSock, nowait),
    +    {error, timeout} = socket:accept(LSock, 500),
         :

    Above, Handle is no longer valid once the second accept/2, call has been made (the first call is automatically canceled). After the second accept/2 call returns {error, timeout}, @@ -206,28 +206,28 @@

    Examples

    -
    client(SAddr, SPort) ->
    -   {ok, Sock} = socket:open(inet, stream, tcp),
    -   ok = socket:connect(Sock, #{family => inet,
    +
    client(SAddr, SPort) ->
    +   {ok, Sock} = socket:open(inet, stream, tcp),
    +   ok = socket:connect(Sock, #{family => inet,
                                    addr   => SAddr,
    -                               port   => SPort}),
    +                               port   => SPort}),
        Msg = <<"hello">>,
    -   ok = socket:send(Sock, Msg),
    -   ok = socket:shutdown(Sock, write),
    -   {ok, Msg} = socket:recv(Sock),
    -   ok = socket:close(Sock).
    -
    -server(Addr, Port) ->
    -   {ok, LSock} = socket:open(inet, stream, tcp),
    -   ok = socket:bind(LSock, #{family => inet,
    +   ok = socket:send(Sock, Msg),
    +   ok = socket:shutdown(Sock, write),
    +   {ok, Msg} = socket:recv(Sock),
    +   ok = socket:close(Sock).
    +
    +server(Addr, Port) ->
    +   {ok, LSock} = socket:open(inet, stream, tcp),
    +   ok = socket:bind(LSock, #{family => inet,
                                  port   => Port,
    -                             addr   => Addr}),
    -   ok = socket:listen(LSock),
    -   {ok, Sock} = socket:accept(LSock),
    -   {ok, Msg} = socket:recv(Sock),
    -   ok = socket:send(Sock, Msg),
    -   ok = socket:close(Sock),
    -   ok = socket:close(LSock).
    +
    addr => Addr}), + ok = socket:listen(LSock), + {ok, Sock} = socket:accept(LSock), + {ok, Msg} = socket:recv(Sock), + ok = socket:send(Sock, Msg), + ok = socket:close(Sock), + ok = socket:close(LSock).
    @@ -4851,7 +4851,7 @@

    ioctl/2

    (since OTP 26.1).

    Result; a boolean/0.

  • tcp_info - Get miscellaneous TCP related information for a connected socket (since OTP 26.1).

    Result; a map/0 with information items as key-value pairs.

  • Note

    Not all requests are supported by all platforms. To see if a ioctl request is supported on the current platform:

          Request = nread,
    -      true = socket:is_supported(ioctl_requests, Request),
    +      true = socket:is_supported(ioctl_requests, Request),
           :
    @@ -5015,7 +5015,7 @@

    is_supported(Key1)

    Check if a socket feature is supported.

    Returns true if supports/0 has a {Key1, true} tuple or a {Key1, list()} tuple in its returned list, -otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(local),
    +otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(local),
    @@ -5046,7 +5046,7 @@

    is_supported(Key1, Key2)

    Check if a socket feature is supported.

    Returns true if supports(Key1) has a {Key2, true} tuple -in its returned list, otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(msg_flags, errqueue),
    +in its returned list, otherwise false (also for unknown keys).

    Example:

    true = socket:is_supported(msg_flags, errqueue),
    @@ -5143,7 +5143,7 @@

    monitor(Socket)

    Start a socket monitor.

    If the Socket doesn't exist or when later the monitor is triggered, a 'DOWN' message is sent to the process that called monitor/1 -with the following pattern:

    	    {'DOWN', MonitorRef, socket, Socket, Info}

    Info is the termination reason of the socket or nosock if +with the following pattern:

    	    {'DOWN', MonitorRef, socket, Socket, Info}

    Info is the termination reason of the socket or nosock if Socket did not exist when the monitor was started.

    Making several calls to socket:monitor/1 for the same Socket is not an error; each call creates an independent monitor instance.

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/socket_usage.html b/prs/9277/lib/kernel-10.2/doc/html/socket_usage.html index 781277eae394f..61a7702e06f1e 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/socket_usage.html +++ b/prs/9277/lib/kernel-10.2/doc/html/socket_usage.html @@ -186,47 +186,47 @@

    Example

    This example is intended to show how to create a simple (echo) server -(and client).

    -module(example).
    +(and client).

    -module(example).
     
    --export([client/2, client/3]).
    --export([server/0, server/1, server/2]).
    +-export([client/2, client/3]).
    +-export([server/0, server/1, server/2]).
     
     
     %% ======================================================================
     
     %% === Client ===
     
    -client(#{family := Family} = ServerSockAddr, Msg)
    -  when is_list(Msg) orelse is_binary(Msg) ->
    -    {ok, Sock} = socket:open(Family, stream, default),
    -    ok         = maybe_bind(Sock, Family),
    -    ok         = socket:connect(Sock, ServerSockAddr),
    -    client_exchange(Sock, Msg);
    +client(#{family := Family} = ServerSockAddr, Msg)
    +  when is_list(Msg) orelse is_binary(Msg) ->
    +    {ok, Sock} = socket:open(Family, stream, default),
    +    ok         = maybe_bind(Sock, Family),
    +    ok         = socket:connect(Sock, ServerSockAddr),
    +    client_exchange(Sock, Msg);
     
    -client(ServerPort, Msg)
    -  when is_integer(ServerPort) andalso (ServerPort > 0) ->
    +client(ServerPort, Msg)
    +  when is_integer(ServerPort) andalso (ServerPort > 0) ->
         Family   = inet, % Default
    -    Addr     = get_local_addr(Family), % Pick an address
    -    SockAddr = #{family => Family,
    +    Addr     = get_local_addr(Family), % Pick an address
    +    SockAddr = #{family => Family,
     		 addr   => Addr,
    -		 port   => ServerPort},
    -    client(SockAddr, Msg).
    -
    -client(ServerPort, ServerAddr, Msg)
    -  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
    -       is_tuple(ServerAddr) ->
    -    Family   = which_family(ServerAddr),
    -    SockAddr = #{family => Family,
    +		 port   => ServerPort},
    +    client(SockAddr, Msg).
    +
    +client(ServerPort, ServerAddr, Msg)
    +  when is_integer(ServerPort) andalso (ServerPort > 0) andalso
    +       is_tuple(ServerAddr) ->
    +    Family   = which_family(ServerAddr),
    +    SockAddr = #{family => Family,
     		 addr   => ServerAddr,
    -		 port   => ServerPort},
    -    client(SockAddr, Msg).
    +		 port   => ServerPort},
    +    client(SockAddr, Msg).
     
     %% Send the message to the (echo) server and wait for the echo to come back.
    -client_exchange(Sock, Msg) when is_list(Msg) ->
    -    client_exchange(Sock, list_to_binary(Msg));
    -client_exchange(Sock, Msg) when is_binary(Msg) ->
    -    ok = socket:send(Sock, Msg, infinity),
    -    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
    +client_exchange(Sock, Msg) when is_list(Msg) ->
    +    client_exchange(Sock, list_to_binary(Msg));
    +client_exchange(Sock, Msg) when is_binary(Msg) ->
    +    ok = socket:send(Sock, Msg, infinity),
    +    {ok, Msg} = socket:recv(Sock, byte_size(Msg), infinity),
         ok.
     
     
    @@ -234,188 +234,188 @@ 

    %% === Server === -server() -> +server() -> %% Make system choose port (and address) - server(0). + server(0). %% This function return the port and address that it actually uses, %% in case server/0 or server/1 (with a port number) was used to start it. -server(#{family := Family, addr := Addr, port := _} = SockAddr) -> - {ok, Sock} = socket:open(Family, stream, tcp), - ok = socket:bind(Sock, SockAddr), - ok = socket:listen(Sock), - {ok, #{port := Port}} = socket:sockname(Sock), - Acceptor = start_acceptor(Sock), - {ok, {Port, Addr, Acceptor}}; +server(#{family := Family, addr := Addr, port := _} = SockAddr) -> + {ok, Sock} = socket:open(Family, stream, tcp), + ok = socket:bind(Sock, SockAddr), + ok = socket:listen(Sock), + {ok, #{port := Port}} = socket:sockname(Sock), + Acceptor = start_acceptor(Sock), + {ok, {Port, Addr, Acceptor}}; -server(Port) when is_integer(Port) -> +server(Port) when is_integer(Port) -> Family = inet, % Default - Addr = get_local_addr(Family), % Pick an address - SockAddr = #{family => Family, + Addr = get_local_addr(Family), % Pick an address + SockAddr = #{family => Family, addr => Addr, - port => Port}, - server(SockAddr). - -server(Port, Addr) - when is_integer(Port) andalso (Port >= 0) andalso - is_tuple(Addr) -> - Family = which_family(Addr), - SockAddr = #{family => Family, + port => Port}, + server(SockAddr). + +server(Port, Addr) + when is_integer(Port) andalso (Port >= 0) andalso + is_tuple(Addr) -> + Family = which_family(Addr), + SockAddr = #{family => Family, addr => Addr, - port => Port}, - server(SockAddr). + port => Port}, + server(SockAddr). %% --- Echo Server - Acceptor --- -start_acceptor(LSock) -> - Self = self(), - {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end), +start_acceptor(LSock) -> + Self = self(), + {Pid, MRef} = spawn_monitor(fun() -> acceptor_init(Self, LSock) end), receive - {'DOWN', MRef, process, Pid, Info} -> - erlang:error({failed_starting_acceptor, Info}); - {Pid, started} -> + {'DOWN', MRef, process, Pid, Info} -> + erlang:error({failed_starting_acceptor, Info}); + {Pid, started} -> %% Transfer ownership - socket:setopt(LSock, otp, owner, Pid), - Pid ! {self(), continue}, - erlang:demonitor(MRef), + socket:setopt(LSock, otp, owner, Pid), + Pid ! {self(), continue}, + erlang:demonitor(MRef), Pid end. -acceptor_init(Parent, LSock) -> - Parent ! {self(), started}, +acceptor_init(Parent, LSock) -> + Parent ! {self(), started}, receive - {Parent, continue} -> + {Parent, continue} -> ok end, - acceptor_loop(LSock). - -acceptor_loop(LSock) -> - case socket:accept(LSock, infinity) of - {ok, ASock} -> - start_handler(ASock), - acceptor_loop(LSock); - {error, Reason} -> - erlang:error({accept_failed, Reason}) + acceptor_loop(LSock). + +acceptor_loop(LSock) -> + case socket:accept(LSock, infinity) of + {ok, ASock} -> + start_handler(ASock), + acceptor_loop(LSock); + {error, Reason} -> + erlang:error({accept_failed, Reason}) end. %% --- Echo Server - Handler --- -start_handler(Sock) -> - Self = self(), - {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end), +start_handler(Sock) -> + Self = self(), + {Pid, MRef} = spawn_monitor(fun() -> handler_init(Self, Sock) end), receive - {'DOWN', MRef, process, Pid, Info} -> - erlang:error({failed_starting_handler, Info}); - {Pid, started} -> + {'DOWN', MRef, process, Pid, Info} -> + erlang:error({failed_starting_handler, Info}); + {Pid, started} -> %% Transfer ownership - socket:setopt(Sock, otp, owner, Pid), - Pid ! {self(), continue}, - erlang:demonitor(MRef), + socket:setopt(Sock, otp, owner, Pid), + Pid ! {self(), continue}, + erlang:demonitor(MRef), Pid end. -handler_init(Parent, Sock) -> - Parent ! {self(), started}, +handler_init(Parent, Sock) -> + Parent ! {self(), started}, receive - {Parent, continue} -> + {Parent, continue} -> ok end, - handler_loop(Sock, undefined). + handler_loop(Sock, undefined). %% No "ongoing" reads %% The use of 'nowait' here is clearly *overkill* for this use case, %% but is intended as an example of how to use it. -handler_loop(Sock, undefined) -> - case socket:recv(Sock, 0, nowait) of - {ok, Data} -> - echo(Sock, Data), - handler_loop(Sock, undefined); +handler_loop(Sock, undefined) -> + case socket:recv(Sock, 0, nowait) of + {ok, Data} -> + echo(Sock, Data), + handler_loop(Sock, undefined); - {select, SelectInfo} -> - handler_loop(Sock, SelectInfo); + {select, SelectInfo} -> + handler_loop(Sock, SelectInfo); - {completion, CompletionInfo} -> - handler_loop(Sock, CompletionInfo); + {completion, CompletionInfo} -> + handler_loop(Sock, CompletionInfo); - {error, Reason} -> - erlang:error({recv_failed, Reason}) + {error, Reason} -> + erlang:error({recv_failed, Reason}) end; %% This is the standard (asyncronous) behaviour. -handler_loop(Sock, {select_info, recv, SelectHandle}) -> +handler_loop(Sock, {select_info, recv, SelectHandle}) -> receive - {'$socket', Sock, select, SelectHandle} -> - case socket:recv(Sock, 0, nowait) of - {ok, Data} -> - echo(Sock, Data), - handler_loop(Sock, undefined); + {'$socket', Sock, select, SelectHandle} -> + case socket:recv(Sock, 0, nowait) of + {ok, Data} -> + echo(Sock, Data), + handler_loop(Sock, undefined); - {select, NewSelectInfo} -> - handler_loop(Sock, NewSelectInfo); + {select, NewSelectInfo} -> + handler_loop(Sock, NewSelectInfo); - {error, Reason} -> - erlang:error({recv_failed, Reason}) + {error, Reason} -> + erlang:error({recv_failed, Reason}) end end; %% This is the (asyncronous) behaviour on platforms that support 'completion', %% currently only Windows. -handler_loop(Sock, {completion_info, recv, CompletionHandle}) -> +handler_loop(Sock, {completion_info, recv, CompletionHandle}) -> receive - {'$socket', Sock, completion, {CompletionHandle, CompletionStatus}} -> + {'$socket', Sock, completion, {CompletionHandle, CompletionStatus}} -> case CompletionStatus of - {ok, Data} -> - echo(Sock, Data), - handler_loop(Sock, undefined); - {error, Reason} -> - erlang:error({recv_failed, Reason}) + {ok, Data} -> + echo(Sock, Data), + handler_loop(Sock, undefined); + {error, Reason} -> + erlang:error({recv_failed, Reason}) end end. -echo(Sock, Data) when is_binary(Data) -> - ok = socket:send(Sock, Data, infinity), - io:format("** ECHO **" - "~n~s~n", [binary_to_list(Data)]). +echo(Sock, Data) when is_binary(Data) -> + ok = socket:send(Sock, Data, infinity), + io:format("** ECHO **" + "~n~s~n", [binary_to_list(Data)]). %% ====================================================================== %% === Utility functions === -maybe_bind(Sock, Family) -> - maybe_bind(Sock, Family, os:type()). +maybe_bind(Sock, Family) -> + maybe_bind(Sock, Family, os:type()). -maybe_bind(Sock, Family, {win32, _}) -> - Addr = get_local_addr(Family), - SockAddr = #{family => Family, +maybe_bind(Sock, Family, {win32, _}) -> + Addr = get_local_addr(Family), + SockAddr = #{family => Family, addr => Addr, - port => 0}, - socket:bind(Sock, SockAddr); -maybe_bind(_Sock, _Family, _OS) -> + port => 0}, + socket:bind(Sock, SockAddr); +maybe_bind(_Sock, _Family, _OS) -> ok. %% The idea with this is extract a "usable" local address %% that can be used even from *another* host. And doing %% so using the net module. -get_local_addr(Family) -> +get_local_addr(Family) -> Filter = - fun(#{addr := #{family := Fam}, - flags := Flags}) -> - (Fam =:= Family) andalso (not lists:member(loopback, Flags)); - (_) -> + fun(#{addr := #{family := Fam}, + flags := Flags}) -> + (Fam =:= Family) andalso (not lists:member(loopback, Flags)); + (_) -> false end, - {ok, [SockAddr|_]} = net:getifaddrs(Filter), - #{addr := #{addr := Addr}} = SockAddr, + {ok, [SockAddr|_]} = net:getifaddrs(Filter), + #{addr := #{addr := Addr}} = SockAddr, Addr. -which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 4) -> +which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 4) -> inet; -which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 8) -> +which_family(Addr) when is_tuple(Addr) andalso (tuple_size(Addr) =:= 8) -> inet6.

    diff --git a/prs/9277/lib/kernel-10.2/doc/html/trace.html b/prs/9277/lib/kernel-10.2/doc/html/trace.html index 20b16e596a507..baceb7f864d58 100644 --- a/prs/9277/lib/kernel-10.2/doc/html/trace.html +++ b/prs/9277/lib/kernel-10.2/doc/html/trace.html @@ -146,23 +146,23 @@

    messages. Several sessions can exist at the same time without interfering with each other. When a trace session is destroyed, all its trace settings are automatically cleaned up.

    Example:

    %% Create a tracer process that will receive the trace events
    -1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
    +1> Tracer = spawn(fun F() -> receive M -> io:format("~p~n",[M]), F() end end).
     <0.91.0>
     %% Create a session using the Tracer
    -2> Session = trace:session_create(my_session, Tracer, []).
    -{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
    +2> Session = trace:session_create(my_session, Tracer, []).
    +{#Ref<0.1543805153.1548353537.92331>,{my_session, 0}}
     %% Setup call tracing on self()
    -3> trace:process(Session, self(), true, [call]).
    +3> trace:process(Session, self(), true, [call]).
     1
     %% Setup call tracing on lists:seq/2
    -4> trace:function(Session, {lists,seq,2}, [], []).
    +4> trace:function(Session, {lists,seq,2}, [], []).
     1
     %% Call the traced function
    -5> lists:seq(1, 10).
    -{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
    -[1,2,3,4,5,6,7,8,9,10] % The return value
    +5> lists:seq(1, 10).
    +{trace,<0.89.0>,call,{lists,seq,[1,10]}} % The trace message
    +[1,2,3,4,5,6,7,8,9,10] % The return value
     %% Cleanup the trace session
    -6> trace:session_destroy(Session).
    +6> trace:session_destroy(Session).
     ok

    @@ -1322,9 +1322,9 @@

    recv(Session, MatchSpec, FlagList)

    Match Specifications in Erlang in the User's Guide for the ERTS application.

  • true - Enable tracing for all received messages (to 'receive' traced processes). Any match specification is removed. This is the default.

  • false - Disable tracing for all received messages. Any match -specification is removed.

  • Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
    +specification is removed.

    Argument FlagList must be [] for receive tracing.

    The return value is always 1.

    Examples:

    Only trace messages from a specific process Pid:

    > trace:recv(Session, [{['_',Pid, '_'],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:recv(Session, [{['_','_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages from other nodes:

    > trace:recv(Session, [{['$1', '_', '_'],[{'=/=','$1',{node}}],[]}], []).
     1

    Note

    A match specification for 'receive' trace can use all guard and body functions except caller, is_seq_trace, get_seq_token, set_seq_token, enable_trace, disable_trace, trace, silent, and process_dump.

    Fails by raising an error exception with an error reason of:

    • badarg - If an argument is invalid.

    • system_limit - If a match specification passed as argument has excessive @@ -1375,10 +1375,10 @@

      send(Session, MatchSpec, FlagList)

      Match Specifications in Erlang in the User's Guide for the ERTS application.

    • true - Enable tracing for all sent messages (from send traced processes). Any match specification is removed.

    • false - Disable tracing for all sent messages. Any match specification -is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, '_'],[],[]}], []).
    -1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    -1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    -1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
    +is removed.

    Argument FlagList must be [].

    The return value is always 1.

    Examples:

    Only trace messages to a specific process Pid:

    > trace:send(Session, [{[Pid, '_'],[],[]}], []).
    +1

    Only trace messages matching {reply, _}:

    > trace:send(Session, [{['_', {reply,'_'}],[],[]}], []).
    +1

    Only trace messages sent to the sender itself:

    > trace:send(Session, [{['$1', '_'],[{'=:=','$1',{self}}],[]}], []).
    +1

    Only trace messages sent to other nodes:

    > trace:send(Session, [{['$1', '_'],[{'=/=',{node,'$1'},{node}}],[]}], []).
     1

    Note

    A match specification for send trace can use all guard and body functions except caller.

    Fails by raising an error exception with an error reason of:

    • badarg - If an argument is invalid.

    • system_limit - If a match specification passed as argument has excessive nesting which causes scheduler stack exhaustion for the scheduler that the diff --git a/prs/9277/lib/megaco-4.7/doc/html/.build b/prs/9277/lib/megaco-4.7/doc/html/.build index f5dd2964ba28c..18937f57101ce 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/.build +++ b/prs/9277/lib/megaco-4.7/doc/html/.build @@ -27,7 +27,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-4D2D3E76.js +dist/search_data-FEFB7412.js dist/sidebar_items-83001DD4.js index.html megaco.html diff --git a/prs/9277/lib/megaco-4.7/doc/html/dist/search_data-4D2D3E76.js b/prs/9277/lib/megaco-4.7/doc/html/dist/search_data-4D2D3E76.js deleted file mode 100644 index 64b2407f36910..0000000000000 --- a/prs/9277/lib/megaco-4.7/doc/html/dist/search_data-4D2D3E76.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","doc":"Main API of the Megaco application\n\nInterface module for the Megaco application","title":"megaco","ref":"megaco.html"},{"type":"function","doc":"Sends one or more transaction request(s) and waits for the reply.\n\nWhen sending one transaction in a message, `ActionRequests` should be\n`t:action_reqs/0` (the reply will then be `UserReply`). When sending several\ntransactions in a message, `ActionRequests` should be `[action_reqs()]` (the\nreply will then be `[UserReply]`). Each element of the list is part of one\ntransaction.\n\nFor some of _our_ codecs (not binary), it is also possible to pre-encode the\nactions, in which case `ActionRequests` will be either a `t:binary/0` or\n`[binary()]`.\n\nThe function returns when the reply arrives, when the request timer eventually\ntimes out or when the outstanding requests are explicitly cancelled.\n\nThe default values of the send options are obtained by\n`megaco:conn_info(ConnHandle, Item)`. But the send options above, may explicitly\nbe overridden.\n\nThe `ProtocolVersion` version is the version actually encoded in the reply\nmessage.\n\nAt `Success`, the `UserReply` contains a list of 'ActionReply' records possibly\ncontaining error indications.\n\nA `Failure`, indicates that the remote user has replied with an explicit\ntransactionError.\n\nA `UserCancelReason`, indicates that the request has been canceled by the user.\n`ReasonForUserCancel` is the reason given in the call to the\n`cancel/2` function.\n\nA send error (`SendReason`), indicates that the send function of the megaco\ntransport callback module failed to send the request. There are two separate\ncases: `SendCancelledReason` and `SendFailedReason`. The first is the result of\nthe send function returning `{cancel, Reason}` and the second is some other kind\nof erroneous return value. See the\n[send_message](`c:megaco_transport:send_message/3`) function for more info.\n\nAn `OtherReason`, indicates some other error such as timeout.\n\nFor more info about the 'extra' part of the result (`SuccessExtra` and\n`ErrorExtra`), see the [note](`m:megaco_user#extra_argument`) in the user\ncallback module documentation.","title":"megaco.call/3","ref":"megaco.html#call/3"},{"type":"function","doc":"Cancel all outstanding messages for this connection\n\nThis causes outstanding megaco:call/3 requests to return. The callback functions\nUserMod:handle_reply/4 and UserMod:handle_trans_ack/4 are also invoked where it\napplies. See the megaco_user module for more info about the callback arguments.","title":"megaco.cancel/2","ref":"megaco.html#cancel/2"},{"type":"function","doc":"Sends one or more transaction request(s) but does NOT wait for a reply\n\nWhen sending one transaction in a message, `ActionRequests` should be\n`t:action_reqs/0`. When sending several transactions in a message,\n`ActionRequests` should be `[action_reqs()]`. Each element of the list is part\nof one transaction.\n\nFor some of _our_ codecs (not binary), it is also possible to pre-encode the\nactions, in which case `Actions` will be either a `t:binary/0` or `[binary()]`.\n\nThe default values of the send options are obtained by\nmegaco:conn_info(ConnHandle, Item). But the send options above, may explicitly\nbe overridden.\n\nThe ProtocolVersion version is the version actually encoded in the reply\nmessage.\n\nThe callback function UserMod:handle_trans_reply/4 is invoked when the reply\narrives, when the request timer eventually times out or when the outstanding\nrequests are explicitly cancelled. See the megaco_user module for more info\nabout the callback arguments.\n\nGiven as `ReplyData` argument to UserMod:handle_trans_reply/4.","title":"megaco.cast/3","ref":"megaco.html#cast/3"},{"type":"function","doc":"","title":"megaco.conn_info/1","ref":"megaco.html#conn_info/1"},{"type":"function","doc":"Lookup information about an active connection\n\nRequires that the connection is active.\n\nFailure: `exit` if, for instance, `ConnHandle` refers to a connection that no\nlonger exists.","title":"megaco.conn_info/2","ref":"megaco.html#conn_info/2"},{"type":"function","doc":"","title":"megaco.connect/4","ref":"megaco.html#connect/4"},{"type":"function","doc":"Establish a \"virtual\" connection\n\nActivates a connection to a remote user. When this is done the connection can be\nused to send messages (with `SendMod:send_message/2`). The `ControlPid` is the\nidentifier of a process that controls the connection. That process will be\nsupervised and if it dies, this will be detected and the\n`UserMod:handle_disconnect/2` callback function will be invoked. See the\nmegaco_user module for more info about the callback arguments. The connection\nmay also explicitly be deactivated by invoking `megaco:disconnect/2`.\n\nThe `ControlPid` may be the identity of a process residing on another Erlang\nnode. This is useful when you want to distribute a user over several Erlang\nnodes. In such a case one of the nodes has the physical connection. When a user\nresiding on one of the other nodes needs to send a request (with `megaco:call/3`\nor `megaco:cast/3`), the message will encoded on the originating Erlang node,\nand then be forwarded to the node with the physical connection. When the reply\narrives, it will be forwarded back to the originator. The distributed connection\nmay explicitly be deactivated by a local call to `megaco:disconnect/2` or\nimplicitly when the physical connection is deactivated (with\n`megaco:disconnect/2`, killing the controlling process, halting the other node,\n...).\n\nThe call of this function will trigger the callback function\n`UserMod:handle_connect/2` to be invoked. See the megaco_user module for more\ninfo about the callback arguments.\n\nA connection may be established in several ways:\n\n- **`provisioned MID`** - The MG may explicitly invoke megaco:connect/4 and use\n a provisioned MID of the MGC as the RemoteMid.\n\n- **`upgrade preliminary MID`** - The MG may explicitly invoke megaco:connect/4\n with the atom 'preliminary_mid' as a temporary MID of the MGC, send an intial\n message, the Service Change Request, to the MGC and then wait for an initial\n message, the Service Change Reply. When the reply arrives, the Megaco\n application will pick the MID of the MGC from the message header and\n automatically upgrade the connection to be a \"normal\" connection. By using\n this method of establishing the connection, the callback function\n `UserMod:handle_connect/2` to be invoked twice. First with a `ConnHandle` with\n the remote_mid-field set to preliminary_mid, and then when the connection\n upgrade is done with the remote_mid-field set to the actual MID of the MGC.\n\n- **`automatic`** - When the MGC receives its first message, the Service Change\n Request, the Megaco application will automatically establish the connection by\n using the MG MID found in the message header as remote mid.\n\n- **`distributed`** - When a user (MG/MGC) is distributed over several nodes, it\n is required that the node hosting the connection already has activated the\n connection and that it is in the \"normal\" state. The `RemoteMid` must be a\n real Megaco MID and not a `preliminary_mid`.\n\nAn initial megaco_receive_handle record may be obtained with\n`megaco:user_info(UserMid, receive_handle)`\n\nThe send handle is provided by the preferred transport module, e.g. megaco_tcp,\nmegaco_udp. Read the documentation about each transport module about the\ndetails.\n\nThe connect is done in two steps: first an internal `connection setup` and then\nby calling the user [handle_connect](`c:megaco_user:handle_connect/3`) callback function.\nThe first step could result in an error with `Reason = ConnectReason` and the\nsecond an error with `Reason = HandleConnectReason`:\n\n- **`ConnectReason`** - An error with this reason is generated by the megaco\n application itself.\n\n- **`HandleConnectReason`** - An error with this reason is caused by the user\n [handle_connect](`c:megaco_user:handle_connect/3`) callback function either returning\n an error or an invalid value.\n\n`Extra` can be any `t:term/0` except the atom `ignore_extra`. It is passed\n(back) to the user via the callback function\n[handle_connect/3](`c:megaco_user:handle_connect/3`).","title":"megaco.connect/5","ref":"megaco.html#connect/5"},{"type":"function","doc":"Decode (parse) a property parameter construct.\n\nWhen decoding `t:property_group/0` or `t:property_groups/0`, those property\nparameter constructs that cannot be decoded (either because of decode error or\nbecause they are unknown), will be returned as a two-tuple. The first element of\nwhich will be the (undecoded) property parameter and the other the actual\nreason. This means that the caller of this function has to expect not only\nsdp-records, but also this two-tuple construct.\n\nThis function performs the following transformation:\n\n- property_parm() -> sdp()\n- property_group() -> sdp_property_group()\n- property_groups() -> sdp_property_groups()","title":"megaco.decode_sdp/1","ref":"megaco.html#decode_sdp/1"},{"type":"function","doc":"This function is used to stop megaco tracing.","title":"megaco.disable_trace/0","ref":"megaco.html#disable_trace/0"},{"type":"function","doc":"Tear down a \"virtual\" connection\n\nCauses the `UserMod:handle_disconnect/2` callback function to be invoked. See\nthe megaco_user module for more info about the callback arguments.","title":"megaco.disconnect/2","ref":"megaco.html#disconnect/2"},{"type":"function","doc":"This function is used to start megaco tracing at a given `Level` and direct\nresult to the given `Destination`.\n\nIt starts a tracer server and then sets the proper match spec (according to\n`Level`).\n\nIn the case when `Destination` is `File`, the printable megaco trace events will\nbe printed to the file `File` using plain `io:format/2`.\n\nIn the case when `Destination` is `io`, the printable megaco trace events will\nbe printed on stdout using plain `io:format/2`.\n\nSee `dbg` for further information.","title":"megaco.enable_trace/2","ref":"megaco.html#enable_trace/2"},{"type":"function","doc":"Encodes lists of action requests for one or more transaction request(s).\n\nWhen encoding action requests for one transaction, `Actions` should be\n`t:action_reqs/0`. When encoding action requests for several transactions,\n`Actions` should be `[action_reqs()]`. Each element of the list is part of one\ntransaction.","title":"megaco.encode_actions/3","ref":"megaco.html#encode_actions/3"},{"type":"function","doc":"Encode (generate) an SDP construct.\n\nIf a `t:property_parm/0` is found as part of the input (`SDP`) then it is left\nunchanged.\n\nThis function performs the following transformation:\n\n- sdp() -> property_parm()\n- sdp_property_group() -> property_group()\n- sdp_property_groups() -> property_groups()","title":"megaco.encode_sdp/1","ref":"megaco.html#encode_sdp/1"},{"type":"function","doc":"","title":"megaco.eval_digit_map/1","ref":"megaco.html#eval_digit_map/1"},{"type":"function","doc":"Collect digit map letters according to the digit map.\n\nWhen evaluating a digit map, a state machine waits for timeouts and letters\nreported by megaco:report_digit_event/2. The length of the various timeouts are\ndefined in the digit_map_value() record.\n\nWhen a complete sequence of valid events has been received, the result is\nreturned as a list of letters.\n\nThere are two options for handling syntax errors (that is when an unexpected\nevent is received when the digit map evaluator is expecting some other event).\nThe unexpected events may either be ignored or rejected. The latter means that\nthe evaluation is aborted and an error is returned.","title":"megaco.eval_digit_map/2","ref":"megaco.html#eval_digit_map/2"},{"type":"function","doc":"Retreive all (SNMP) statistic counters maintained by the megaco application.\n\nThe global counters handle events that cannot be attributed to a single\nconnection (e.g. protocol errors that occur before the connection has been\nproperly setup).","title":"megaco.get_stats/0","ref":"megaco.html#get_stats/0"},{"type":"function","doc":"Retreive a (SNMP) (global) statistic counter maintained by the megaco\napplication.\n\nThe global counters handle events that cannot be attributed to a single\nconnection (e.g. protocol errors that occur before the connection has been\nproperly setup).\n\n[](){: #get_stats_1_2 }\n\nRetreive all (SNMP) statistic counters maintained by the megaco application, for\na specific connection.","title":"megaco.get_stats/1","ref":"megaco.html#get_stats/1"},{"type":"function","doc":"Retreive a (SNMP) statistic counter maintained by the megaco application.","title":"megaco.get_stats/2","ref":"megaco.html#get_stats/2"},{"type":"function","doc":"This function produces a list of information about the megaco application. Such\nas users and their config, connections and their config, statistics and so on.\n\nThis information can be produced by the functions\n`user_info/2`, `conn_info/2`, `system_info/1` and `get_stats/2` but\nthis is a simple way to get it all at once.","title":"megaco.info/0","ref":"megaco.html#info/0"},{"type":"function","doc":"Parses a digit map body\n\nParses a digit map body, represented as a list of characters, into a list of\nstate transitions suited to be evaluated by megaco:eval_digit_map/1,2.","title":"megaco.parse_digit_map/1","ref":"megaco.html#parse_digit_map/1"},{"type":"function","doc":"","title":"megaco.print_version_info/0","ref":"megaco.html#print_version_info/0"},{"type":"function","doc":"Utility function to produce a formated printout of the versions info generated\nby the `versions1` and `versions2` functions.\n\nThe function print_version_info/0 uses the result of function version1/0 as\n`VersionInfo`.\n\nExample:\n\n```erlang\n {ok, V} = megaco:versions1(), megaco:format_versions(V).\n```","title":"megaco.print_version_info/1","ref":"megaco.html#print_version_info/1"},{"type":"function","doc":"","title":"megaco.process_received_message/4","ref":"megaco.html#process_received_message/4"},{"type":"function","doc":"Process a received message\n\nThis function is intended to be invoked by some transport modules when get an\nincoming message. Which transport that actually is used is up to the user to\nchoose.\n\nThe message is delivered as an Erlang binary and is decoded by the encoding\nmodule stated in the receive handle together with its encoding config (also in\nthe receive handle). Depending of the outcome of the decoding various callback\nfunctions will be invoked. See megaco_user for more info about the callback\narguments.\n\nThe argument `Extra` is just an opaque data structure passed to the user via the\ncallback functions in the [user callback module](`m:megaco_user`). Note however\nthat if `Extra` has the value `extra_undefined` the argument will be ignored\n(same as if `process_received_message/4` had\nbeen called). See the documentation for the behaviour of the callback module,\n`m:megaco_user`, for more info.\n\nNote that all processing is done in the context of the calling process. A\ntransport module could call this function via one of the `spawn` functions (e.g.\n`spawn_opt`). See also `receive_message/4,5`.\n\nIf the message cannot be decoded the following callback function will be\ninvoked:\n\n- UserMod:handle_syntax_error/3\n\nIf the decoded message instead of transactions contains a message error, the\nfollowing callback function will be invoked:\n\n- UserMod:handle_message_error/3\n\nIf the decoded message happens to be received before the connection is\nestablished, a new \"virtual\" connection is established. This is typically the\ncase for the Media Gateway Controller (MGC) upon the first Service Change. When\nthis occurs the following callback function will be invoked:\n\n- UserMod:handle_connect/2\n\nFor each transaction request in the decoded message the following callback\nfunction will be invoked:\n\n- UserMod:handle_trans_request/3\n\nFor each transaction reply in the decoded message the reply is returned to the\nuser. Either the originating function megaco:call/3 will return. Or in case the\noriginating function was megaco:case/3 the following callback function will be\ninvoked:\n\n- UserMod:handle_trans_reply/4\n\nWhen a transaction acknowledgement is received it is possible that user has\ndecided not to bother about the acknowledgement. But in case the return value\nfrom UserMod:handle_trans_request/3 indicates that the acknowledgement is\nimportant the following callback function will be invoked:\n\n- UserMod:handle_trans_ack/4\n\nSee the megaco_user module for more info about the callback arguments.","title":"megaco.process_received_message/5","ref":"megaco.html#process_received_message/5"},{"type":"function","doc":"","title":"megaco.receive_message/4","ref":"megaco.html#receive_message/4"},{"type":"function","doc":"Process a received message\n\nThis is a callback function intended to be invoked by some transport modules\nwhen get an incoming message. Which transport that actually is used is up to the\nuser to choose.\n\nIn principle, this function calls the [process_received_message/4,5](`process_received_message/5`)\nfunction via a `spawn` to perform the actual processing.","title":"megaco.receive_message/5","ref":"megaco.html#receive_message/5"},{"type":"function","doc":"Send one or more events to the event collector process.\n\nSend one or more events to a process that is evaluating a digit map, that is a\nprocess that is executing megaco:eval_digit_map/1,2.\n\nNote that the events `$s | $S`, `l | $L` and `$z | $Z` has nothing to do with\nthe timers using the same characters.","title":"megaco.report_digit_event/2","ref":"megaco.html#report_digit_event/2"},{"type":"function","doc":"Reset all (SNMP) statistics counters.","title":"megaco.reset_stats/0","ref":"megaco.html#reset_stats/0"},{"type":"function","doc":"Reset the specified (SNMP) statistics counter.\n\n[](){: #reset_stats_1_2 }\n\nReset all (SNMP) statistics counters for a connection.","title":"megaco.reset_stats/1","ref":"megaco.html#reset_stats/1"},{"type":"function","doc":"This function is used to change the megaco trace level.\n\nIt is assumed that tracing has already been enabled (see `enable_trace` above).","title":"megaco.set_trace/1","ref":"megaco.html#set_trace/1"},{"type":"function","doc":"Starts the Megaco application\n\nUsers may either explicitly be registered with megaco:start_user/2 and/or be\nstatically configured by setting the application environment variable 'users' to\na list of \\{UserMid, Config\\} tuples. See the function megaco:start_user/2 for\ndetails.","title":"megaco.start/0","ref":"megaco.html#start/0"},{"type":"function","doc":"Initial configuration of a user\n\nRequires the megaco application to be started. A user is either a Media Gateway\n(MG) or a Media Gateway Controller (MGC). One Erlang node may host many users.\n\nA user is identified by its UserMid, which must be a legal Megaco MID.\n\nConfig is a list of \\{Item, Value\\} tuples. See megaco:user_info/2 about which\nitems and values that are valid.","title":"megaco.start_user/2","ref":"megaco.html#start_user/2"},{"type":"function","doc":"Stops the Megaco application","title":"megaco.stop/0","ref":"megaco.html#stop/0"},{"type":"function","doc":"Delete the configuration of a user\n\nRequires that the user does not have any active connection.","title":"megaco.stop_user/1","ref":"megaco.html#stop_user/1"},{"type":"function","doc":"","title":"megaco.system_info/0","ref":"megaco.html#system_info/0"},{"type":"function","doc":"Lookup system information.","title":"megaco.system_info/1","ref":"megaco.html#system_info/1"},{"type":"function","doc":"Feed digit map collector with events and return the result\n\nThis function starts the evaluation of a digit map with megaco:eval_digit_map/1\nand sends a sequence of events to it with megaco:report_digit_event/2 in order\nto simplify testing of digit maps.","title":"megaco.test_digit_event/2","ref":"megaco.html#test_digit_event/2"},{"type":"function","doc":"Tests if the Reply argument is correctly composed.\n\nThis function is only intended for testing purposes. It's supposed to test the\n`actual_reply()` return value of the callback functions\n[handle_trans_request](`c:megaco_user:handle_trans_request/4`) and\n[handle_trans_long_request](`c:megaco_user:handle_trans_long_request/4`) functions (with\nthe additions of the `EncodingMod` and `EncodingConfig` arguments). It composes\na complete megaco message end attempts to encode it. The return value, will be a\ntuple of the composed megaco message and the encode result.","title":"megaco.test_reply/5","ref":"megaco.html#test_reply/5"},{"type":"function","doc":"Tests if the Actions argument is correctly composed.\n\nThis function is only intended for testing purposes. It's supposed to have a\nsame kind of interface as the `call/3` or `cast/3`\nfunctions (with the additions of the `EncodingMod` and `EncodingConfig`\narguments). It composes a complete megaco message end attempts to encode it. The\nreturn value, will be a tuple of the composed megaco message and the encode\nresult.","title":"megaco.test_request/5","ref":"megaco.html#test_request/5"},{"type":"function","doc":"","title":"megaco.token_tag2string/1","ref":"megaco.html#token_tag2string/1"},{"type":"function","doc":"","title":"megaco.token_tag2string/2","ref":"megaco.html#token_tag2string/2"},{"type":"function","doc":"Convert a token tag to a string\n\nIf no encoder module is given, the default is used (which is pretty).\n\nIf no or an unknown version is given, the _best_ version is used (which is v3).\n\nIf no match is found for `Tag`, `Result` will be the empty string (`[]`).","title":"megaco.token_tag2string/3","ref":"megaco.html#token_tag2string/3"},{"type":"function","doc":"Update information about an active connection\n\nRequires that the connection is activated. See `t:conn_info_item/0` about which\nitems and values that are valid.","title":"megaco.update_conn_info/3","ref":"megaco.html#update_conn_info/3"},{"type":"function","doc":"Update information about a user\n\nRequires that the user is started.","title":"megaco.update_user_info/3","ref":"megaco.html#update_user_info/3"},{"type":"function","doc":"","title":"megaco.user_info/1","ref":"megaco.html#user_info/1"},{"type":"function","doc":"Lookup user information\n\n[](){: #user_info_21 }\n\nLookup user information about currently active requests.\nExpected input type `Input :: Requests` with expected\noutput type `Result :: RequestsResult`.\n\n[](){: #user_info_22 }\n\nLookup user information about currently active replies.\nExpected input type `Input :: Replies` with expected\noutput type `Result :: RepliesResult`.","title":"megaco.user_info/2","ref":"megaco.html#user_info/2"},{"type":"function","doc":"","title":"megaco.versions1/0","ref":"megaco.html#versions1/0"},{"type":"function","doc":"Utility functions used to retrieve some system and application info.\n\nThe difference between the two functions is in how they get the modules to\ncheck. `versions1` uses the app-file and `versions2` uses the function\n`application:get_key`.","title":"megaco.versions2/0","ref":"megaco.html#versions2/0"},{"type":"type","doc":"","title":"megaco.action_reply/0","ref":"megaco.html#t:action_reply/0"},{"type":"type","doc":"","title":"megaco.action_reps/0","ref":"megaco.html#t:action_reps/0"},{"type":"type","doc":"","title":"megaco.action_reqs/0","ref":"megaco.html#t:action_reqs/0"},{"type":"type","doc":"","title":"megaco.action_request/0","ref":"megaco.html#t:action_request/0"},{"type":"type","doc":"","title":"megaco.conn_handle/0","ref":"megaco.html#t:conn_handle/0"},{"type":"type","doc":"This type is a basic (atom) lookup key (for info on an active connection). The\ncorresponding value can be of any type.[](){: #ci_control_pid }\n\n- **`control_pid`** - The process identifier of the controlling process for a\n connection.\n\n Value type: [pid()](`t:erlang:pid/0`)\n\n [](){: #ci_send_handle }\n\n- **`send_handle`** - Opaque send handle whose contents is internal for the send\n module.\n\n Value type: `t:send_handle/0`\n\n [](){: #ci_local_mid }\n\n- **`local_mid`** - The local mid (of the connection, i.e. the own mid).\n\n Value type: `t:mid/0`\n\n [](){: #ci_remote_mid }\n\n- **`remote_mid`** - The remote mid (of the connection).\n\n Value type: `t:mid/0`\n\n [](){: #ci_receive_handle }\n\n- **`receive_handle`** - Construct a megaco_receive_handle record.\n\n Value type: `t:receive_handle/0`\n\n [](){: #ci_trans_id }\n\n- **`trans_id`** - Next transaction id.\n\n Note that transaction id's are (currently) maintained on a per user basis so\n there is no way to be sure that the value returned will actually be used for a\n transaction sent on this connection (in case a user has several connections,\n which is not at all unlikely).\n\n Value type: `t:transaction_id/0` | `undefined_serial`\n\n [](){: #ci_max_trans_id }\n\n- **`max_trans_id`** - Last transaction id.\n\n Value type: `t:transaction_id/0` | `infinity`\n\n [](){: #ci_request_timer }\n\n- **`request_timer`** - Wait for reply.\n\n The timer is cancelled when a reply is received.\n\n When a pending message is received, the timer is cancelled and the\n `long_request_timer` is started instead (see below). No resends will be\n performed from this point (since we now know that the other side has received\n the request).\n\n When the timer reaches an intermediate expire, the request is resent and the\n timer is restarted.\n\n When the timer reaches the final expire, either the function `megaco:call`\n will return with `{error, timeout}` or the callback function\n `handle_trans_reply` will be called with `UserReply = {error, timeout}` (if\n `megaco:cast` was used).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `#megaco_incr_timer{}`.\n\n [](){: #ci_long_request_timer }\n\n- **`long_request_timer`** - Wait for reply after having received a pending\n message.\n\n When the timer reaches an intermediate expire, the timer restarted.\n\n When a pending message is received, and the `long_request_timer` is _not_ \"on\n its final leg\", the timer will be restarted, and, if\n `long_request_resend = true`, the request will be re-sent.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `60 seconds`.\n\n [](){: #ci_request_keep_alive_timeout }\n\n- **`request_keep_alive_timeout`** - Specifies the timeout time for the\n request-keep-alive timer.\n\n This timer is started when the _first_ reply to an asynchronous request\n (issued using the `megaco:cast/3` function) arrives. As long\n as this timer is running, replies will be delivered via the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function, with\n their \"arrival number\" (see `UserReply` of the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function).\n\n Replies arriving after the timer has expired, will be delivered using the\n [handle_unexpected_trans/3,4](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n Value type: `plain` | [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `plain`.\n\n [](){: #ci_long_request_resend }\n\n- **`long_request_resend`** - This option indicates weather the request should\n be resent until the reply is received, _even_ though a pending message has\n been received.\n\n Normally, after a pending message has been received, the request is not resent\n (since a pending message is an indication that the request has been received).\n But since the reply (to the request) can be lost, this behaviour has its\n values.\n\n It is of course pointless to set this value to _true_ unless the\n `long_request_timer` (see above) is also set to an incremental timer\n (`#megaco_incr_timer{}`).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_reply_timer }\n\n- **`reply_timer`** - Wait for an ack.\n\n When a request is received, some info related to the reply is store internally\n (e.g. the binary of the reply). This info will live until either an ack is\n received or this timer expires. For instance, if the same request is received\n again (e.g. a request with the same transaction id), the (stored) reply will\n be (re-) sent automatically by megaco.\n\n If the timer is of type `#megaco_incr_timer{}`, then for each intermediate\n timout, the reply will be resent (this is valid until the ack is received or\n the timer expires).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30000`.\n\n [](){: #ci_call_proxy_gc_timeout }\n\n- **`call_proxy_gc_timeout`** - Timeout time for the call proxy.\n\n When a request is sent using the `call/3` function, a proxy\n process is started to handle all replies. When the reply has been received and\n delivered to the user, the proxy process continue to exist for as long as this\n option specifies. Any received messages, is passed on to the user via the\n [handle_unexpected_trans](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n The timeout time is in milliseconds. A value of 0 (zero) means that the proxy\n process will exit directly after the reply has been delivered.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `5000` (= 5 seconds).\n\n- **`auto_ack`** - Automatic send transaction ack when the transaction reply has\n been received (see `trans_ack` below).\n\n This is used for _three-way-handshake_.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_trans_ack }\n\n- **`trans_ack`** - Shall ack's be accumulated or not.\n\n This property is only valid if `auto_ack` is true.\n\n If `auto_ack` is true, then if `trans_ack` is `false`, ack's will be sent\n immediately. If `trans_ack` is `true`, then ack's will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_trans_ack_maxcount }\n\n- **`trans_ack_maxcount`** - Maximum number of accumulated ack's. At most this\n many ack's will be accumulated by the transaction sender (if started and\n configured to accumulate ack's).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `10`.\n\n [](){: #ci_trans_req }\n\n- **`trans_req`** - Shall requests be accumulated or not.\n\n If `trans_req` is `false`, then request(s) will be sent immediately (in its\n own message).\n\n If `trans_req` is true, then request(s) will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_trans_req_maxcount }\n\n- **`trans_req_maxcount`** - Maximum number of accumulated requests. At most\n this many requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `10`.\n\n [](){: #ci_trans_req_maxsize }\n\n- **`trans_req_maxsize`** - Maximum size of the accumulated requests. At most\n this much requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `2048`.\n\n [](){: #ci_trans_timer }\n\n- **`trans_timer`** - Transaction sender timeout time. Has two functions. First,\n if the value is 0, then transactions will not be accumulated (e.g. the\n transaction sender process will not be started). Second, if the value is\n greater then 0 and `auto_ack` and `trans_ack` is true or if `trans_req` is\n true, then transaction sender will be started and transactions (which is\n depending on the values of `auto_ack`, `trans_ack` and `trans_req`) will be\n accumulated, for later sending.\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `0`.\n\n [](){: #ci_pending_timer }\n\n- **`pending_timer`** - Automatic send transaction pending if the timer expires\n before a transaction reply has been sent. This timer is also called\n provisional response timer.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30000` (= 30 seconds).\n\n [](){: #ci_sent_pending_limit }\n\n- **`sent_pending_limit`** - Sent pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be sent\n (for a given received transaction request). When the limit is exceeded, the\n transaction is aborted (see\n [handle_trans_request_abort](`c:megaco_user:handle_trans_request_abort/5`)) and an error\n message is sent to the other side.\n\n Note that this has no effect on the actual sending of pending transactions.\n This is either implicit (e.g. when receiving a re-sent transaction request for\n a request which is being processed) or controlled by the pending_timer, see\n above.\n\n Value type: [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n Defaults to `infinity`.\n\n [](){: #ci_recv_pending_limit }\n\n- **`recv_pending_limit`** - Receive pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be\n received (for a sent transaction request). When the limit is exceeded, the\n transaction is considered lost, and an error returned to the user (through the\n call-back function _handle_trans_reply_).\n\n Value type: [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n Defaults to `infinity`.\n\n [](){: #ci_send_mod }\n\n- **`send_mod`** - Send callback module which exports send_message/2. The\n function SendMod:send_message(SendHandle, Binary) is invoked when the bytes\n needs to be transmitted to the remote user.\n\n Value type: [module()](`t:erlang:module/0`).\n\n Defaults to `megaco_tcp`.\n\n [](){: #ci_encoding_mod }\n\n- **`encoding_mod`** - Encoding callback module which exports encode_message/2\n and decode_message/2. The function EncodingMod:encode_message(EncodingConfig,\n MegacoMessage) is invoked whenever a 'MegacoMessage' record needs to be\n translated into an Erlang binary. The function\n EncodingMod:decode_message(EncodingConfig, Binary) is invoked whenever an\n Erlang binary needs to be translated into a 'MegacoMessage' record.\n\n Value type: [module()](`t:erlang:module/0`).\n\n Defaults to `megaco_pretty_text_encoder`.\n\n [](){: #ci_encoding_config }\n\n- **`encoding_config`** - Encoding module config.\n\n Value type: [loist()](`t:erlang:list/0`).\n\n Defaults to `[]`.\n\n [](){: #ci_protocol_version }\n\n- **`protocol_version`** - Actual protocol version.\n\n Value type: `t:protocol_version/0`\n\n Defaults to `1`.\n\n [](){: #ci_strict_version }\n\n- **`strict_version`** - Strict version control, i.e. when a message is\n received, verify that the version is that which was negotiated.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `true`.\n\n [](){: #ci_reply_data }\n\n- **`reply_data`** - Default reply data.\n\n Value type: [term()](`t:erlang:term/0`)\n\n Defaults to `undefined`.\n\n [](){: #ci_threaded }\n\n- **`threaded`** - If a received message contains several transaction requests,\n this option indicates whether the requests should be handled sequentially in\n the same process (`false`), or if each request should be handled by its own\n process (`true` i.e. a separate process is spawned for each request).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_resend_indication }\n\n- **`resend_indication`** - This option indicates weather the transport module\n should be told if a message send is a resend or not.\n\n If _false_, megaco messages are sent using the\n [send_message/2](`c:megaco_transport:send_message/2`) function.\n\n If _true_, megaco message _re-sends_ are made using the\n [resend_message](`c:megaco_transport:resend_message/2`) function. The initial\n message send is still done using the\n [send_message](`c:megaco_transport:send_message/2`) function.\n\n The special value _flag_ instead indicates that the function\n [send_message/3](`c:megaco_transport:send_message/3`) shall be used.\n\n Value type: `flag` | [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_segment_reply_ind }\n\n- **`segment_reply_ind`** - This option specifies if the user shall be notified\n of received segment replies or not.\n\n See [handle_segment_reply](`c:megaco_user:handle_segment_reply/6`) callback function\n for more information.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_segment_recv_timer }\n\n- **`segment_recv_timer`** - This timer is started when the segment indicated by\n the `segmentation complete token` (e.g. the last of the segment which makes up\n the reply) is received, but all segments has not yet been received.\n\n When the timer finally expires, a \"megaco segments not received\" (459) error\n message is sent to the other side and the user is notified with a\n `segment timeout` `UserReply` in either the\n [handle_trans_reply](`c:megaco_user:handle_trans_reply/5`) callback function or the\n return value of the `call/2` function.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `10000` (= 10 seconds).\n\n [](){: #ci_segment_send }\n\n- **`segment_send`** - Shall outgoing messages be segmented or not.\n\n Value type: `none` | [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n - **`none`** - Do not segment outgoing reply messages. This is useful when\n either it is known that messages are never to large or that the transport\n protocol can handle such things on its own (e.g. TCP or SCTP).\n\n - **`t:pos_integer/0`** - Outgoing reply messages will be segmented as needed\n (see `max_pdu_size` below). This value, K, indicate the outstanding window,\n i.e. how many segments can be outstanding (not acknowledged) at any given\n time.\n\n - **`infinity`** - Outgoing reply messages will be segmented as needed (see\n `max_pdu_size` below). Segment messages are sent all at once (i.e. no\n acknowledgement awaited before sending the next segment).\n\n Defaults to `none`.\n\n [](){: #ci_max_pdu_size }\n\n- **`max_pdu_size`** - Max message size. If the encoded message (PDU) exceeds\n this size, the message should be segmented, and then encoded.\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.","title":"megaco.conn_info_item/0","ref":"megaco.html#t:conn_info_item/0"},{"type":"type","doc":"","title":"megaco.counter/0","ref":"megaco.html#t:counter/0"},{"type":"type","doc":"","title":"megaco.counter_value/0","ref":"megaco.html#t:counter_value/0"},{"type":"type","doc":"","title":"megaco.digit_map_event/0","ref":"megaco.html#t:digit_map_event/0"},{"type":"type","doc":"","title":"megaco.digit_map_kind/0","ref":"megaco.html#t:digit_map_kind/0"},{"type":"type","doc":"","title":"megaco.digit_map_letter/0","ref":"megaco.html#t:digit_map_letter/0"},{"type":"type","doc":"","title":"megaco.digit_map_value/0","ref":"megaco.html#t:digit_map_value/0"},{"type":"type","doc":"","title":"megaco.error_desc/0","ref":"megaco.html#t:error_desc/0"},{"type":"type","doc":"","title":"megaco.global_counter/0","ref":"megaco.html#t:global_counter/0"},{"type":"type","doc":"","title":"megaco.megaco_message/0","ref":"megaco.html#t:megaco_message/0"},{"type":"type","doc":"","title":"megaco.megaco_timer/0","ref":"megaco.html#t:megaco_timer/0"},{"type":"type","doc":"The Megaco Identifier.","title":"megaco.mid/0","ref":"megaco.html#t:mid/0"},{"type":"type","doc":"","title":"megaco.property_group/0","ref":"megaco.html#t:property_group/0"},{"type":"type","doc":"","title":"megaco.property_groups/0","ref":"megaco.html#t:property_groups/0"},{"type":"type","doc":"","title":"megaco.property_parm/0","ref":"megaco.html#t:property_parm/0"},{"type":"type","doc":"","title":"megaco.protocol_version/0","ref":"megaco.html#t:protocol_version/0"},{"type":"type","doc":"","title":"megaco.receive_handle/0","ref":"megaco.html#t:receive_handle/0"},{"type":"type","doc":"","title":"megaco.sdp/0","ref":"megaco.html#t:sdp/0"},{"type":"type","doc":"","title":"megaco.sdp_property_group/0","ref":"megaco.html#t:sdp_property_group/0"},{"type":"type","doc":"","title":"megaco.sdp_property_groups/0","ref":"megaco.html#t:sdp_property_groups/0"},{"type":"type","doc":"","title":"megaco.sdp_property_parm/0","ref":"megaco.html#t:sdp_property_parm/0"},{"type":"type","doc":"","title":"megaco.segment_no/0","ref":"megaco.html#t:segment_no/0"},{"type":"type","doc":"Opaque send handle whose contents is internal for the send module. May be any\nterm.","title":"megaco.send_handle/0","ref":"megaco.html#t:send_handle/0"},{"type":"type","doc":"[](){: #si_text_config }\n\n- **`text_config`** - The text encoding config.\n\n Value type: [term()](`t:erlang:term/0`)\n\n [](){: #si_connections }\n\n- **`connections`** - Lists all active connections. Returns a list of\n megaco_conn_handle records.\n\n Value type: [`t:conn_handle/0`]\n\n [](){: #si_users }\n\n- **`users`** - Lists all active users.\n\n Value type: [`t:mid/0`]\n\n [](){: #si_active_requests }\n\n- **`n_active_requests`** - Returns number of requests that has originated from\n this Erlang node and still are active (and therefore consumes system\n resources).\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n [](){: #si_active_replies }\n\n- **`n_active_replies`** - Returns the number of replies that has originated\n from this Erlang node and still are active (and therefore consumes system\n resources).\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n [](){: #si_active_connections }\n\n- **`n_active_connections`** - Returns the number of active connections.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n [](){: #si_reply_counters }\n\n- **`reply_counters`** - Returns a list of the reply counters.\n\n Value type: [\\{`t:conn_handle/0`, `t:transaction_id/0`,\n [non_neg_integer()](`t:erlang:non_neg_integer/0`)\\}]\n\n [](){: #si_pending_counters }\n\n- **`pending_counters`** - Returns a list of the receive and sent pending\n counters.\n\n Value type: [\\{recv | sent, [\\{`t:transaction_id/0`,\n [non_neg_integer()](`t:erlang:non_neg_integer/0`)\\}]\\}]","title":"megaco.system_info_item/0","ref":"megaco.html#t:system_info_item/0"},{"type":"type","doc":"The trace data passed to the trace handler fun (in the second argument) and\nreturned by same. For instance this could be a file descriptor, that the trace\nhandler fun can use to print the event to a file.","title":"megaco.trace_data/0","ref":"megaco.html#t:trace_data/0"},{"type":"type","doc":"The trace event generated by dbg.","title":"megaco.trace_event/0","ref":"megaco.html#t:trace_event/0"},{"type":"type","doc":"The trace handler fun is used to \"process\" each trace event (for instance print\nto file or to stdout after formating).","title":"megaco.trace_handler/0","ref":"megaco.html#t:trace_handler/0"},{"type":"type","doc":"How much trace events should be produced. `min` (=`0`) means no trace events are\nproduced, which is the default.","title":"megaco.trace_level/0","ref":"megaco.html#t:trace_level/0"},{"type":"type","doc":"","title":"megaco.transaction_id/0","ref":"megaco.html#t:transaction_id/0"},{"type":"type","doc":"","title":"megaco.transaction_reply/0","ref":"megaco.html#t:transaction_reply/0"},{"type":"type","doc":"- **`connections`** - Lists all active connections for this user. Returns a list\n of megaco_conn_handle records.\n\n Value type: [`t:conn_handle/0`]\n\n [](){: #ui_receive_handle }\n\n- **`receive_handle`** - Construct a receive_handle from user config.\n\n Value type: `t:receive_handle/0`\n\n [](){: #ui_trans_id }\n\n- **`trans_id`** - Current transaction id.\n\n Value type: `t:transaction_id/0` | `undefined_serial`\n\n [](){: #ui_min_trans_id }\n\n- **`min_trans_id`** - First transaction id.\n\n Value type: `t:transaction_id/0`\n\n Defaults to `1`.\n\n [](){: #ui_max_trans_id }\n\n- **`max_trans_id`** - Last transaction id.\n\n Value type: `t:transaction_id/0` | `infinity`\n\n Defaults to `infinity`.\n\n [](){: #ui_request_timer }\n\n- **`request_timer`** - Wait for reply.\n\n The timer is cancelled when a reply is received.\n\n When a pending message is received, the timer is cancelled and the\n `long_request_timer` is started instead (see below). No resends will be\n performed from this point (since we now know that the other side has received\n the request).\n\n When the timer reaches an intermediate expire, the request is resent and the\n timer is restarted.\n\n When the timer reaches the final expire, either the function `megaco:call`\n will return with `{error, timeout}` or the callback function\n `handle_trans_reply` will be called with `UserReply = {error, timeout}` (if\n `megaco:cast` was used).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `#megaco_incr_timer{}`.\n\n [](){: #ui_long_request_timer }\n\n- **`long_request_timer`** - Wait for reply after having received a pending\n message.\n\n When the timer reaches an intermediate expire, the timer is restarted.\n\n When a pending message is received, and the `long_request_timer` is _not_ \"on\n its final leg\", the timer will be restarted, and, if\n `long_request_resend = true`, the request will be re-sent.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `60000` (= 60 seconds).\n\n [](){: #ui_long_request_resend }\n\n- **`long_request_resend`** - This option indicates weather the request should\n be resent until the reply is received, _even_ though a pending message has\n been received.\n\n Normally, after a pending message has been received, the request is not resent\n (since a pending message is an indication that the request has been received).\n But since the reply (to the request) can be lost, this behaviour has its\n values.\n\n It is of course pointless to set this value to _true_ unless the\n `long_request_timer` (see above) is also set to an incremental timer\n (`#megaco_incr_timer{}`).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_reply_timer }\n\n- **`reply_timer`** - Wait for an ack.\n\n When a request is received, some info related to the reply is store internally\n (e.g. the binary of the reply). This info will live until either an ack is\n received or this timer expires. For instance, if the same request is received\n again (e.g. a request with the same transaction id), the (stored) reply will\n be (re-) sent automatically by megaco.\n\n If the timer is of type `#megaco_incr_timer{}`, then for each intermediate\n timout, the reply will be resent (this is valid until the ack is received or\n the timer expires).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30 seconds`.\n\n [](){: #ui_request_keep_alive_timeout }\n\n- **`request_keep_alive_timeout`** - Specifies the timeout time for the\n request-keep-alive timer.\n\n This timer is started when the _first_ reply to an asynchronous request\n (issued using the `megaco:cast/3` function) arrives. As long\n as this timer is running, replies will be delivered via the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function, with\n their \"arrival number\" (see `UserReply` of the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function).\n\n Replies arriving after the timer has expired, will be delivered using the\n [handle_unexpected_trans/3,4](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n Value type: `plain` | [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `plain`.\n\n [](){: #ui_call_proxy_gc_timeout }\n\n- **`call_proxy_gc_timeout`** - Timeout time for the call proxy.\n\n When a request is sent using the `call/3` function, a proxy\n process is started to handle all replies. When the reply has been received and\n delivered to the user, the proxy process continue to exist for as long as this\n option specifies. Any received messages, is passed on to the user via the\n [handle_unexpected_trans](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n The timeout time is in milliseconds. A value of 0 (zero) means that the proxy\n process will exit directly after the reply has been delivered.\n\n Value type: [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `5000` (= 5 seconds).\n\n [](){: #ui_auto_ack }\n\n- **`auto_ack`** - Automatic send transaction ack when the transaction reply has\n been received (see `trans_ack` below).\n\n This is used for _three-way-handshake_.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_trans_ack }\n\n- **`trans_ack`** - Shall ack's be accumulated or not.\n\n This property is only valid if `auto_ack` is true.\n\n If `auto_ack` is true, then if `trans_ack` is `false`, ack's will be sent\n immediately. If `trans_ack` is `true`, then ack's will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_trans_ack_maxcount }\n\n- **`trans_ack_maxcount`** - Maximum number of accumulated ack's. At most this\n many ack's will be accumulated by the transaction sender (if started and\n configured to accumulate ack's).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `10`.\n\n [](){: #ui_trans_req }\n\n- **`trans_req`** - Shall requests be accumulated or not.\n\n If `trans_req` is `false`, then request(s) will be sent immediately (in its\n own message).\n\n If `trans_req` is true, then request(s) will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_trans_req_maxcount }\n\n- **`trans_req_maxcount`** - Maximum number of accumulated requests. At most\n this many requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `10`.\n\n [](){: #ui_trans_req_maxsize }\n\n- **`trans_req_maxsize`** - Maximum size of the accumulated requests. At most\n this much requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `2048`.\n\n [](){: #ui_trans_timer }\n\n- **`trans_timer`** - Transaction sender timeout time. Has two functions. First,\n if the value is 0, then transactions will not be accumulated (e.g. the\n transaction sender process will not be started). Second, if the value is\n greater then 0 and `auto_ack` and `trans_ack` are both true or if `trans_req`\n is true, then transaction sender will be started and transactions (which is\n depending on the values of `auto_ack`, `trans_ack` and `trans_req`) will be\n accumulated, for later sending.\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `0`.\n\n [](){: #ui_pending_timer }\n\n- **`pending_timer`** - Automatically send pending if the timer expires before a\n transaction reply has been sent. This timer is also called provisional\n response timer.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30000`.\n\n [](){: #ui_sent_pending_limit }\n\n- **`sent_pending_limit`** - Sent pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be sent\n (for a given received transaction request). When the limit is exceeded, the\n transaction is aborted (see\n [handle_trans_request_abort](`c:megaco_user:handle_trans_request_abort/5`)) and an error\n message is sent to the other side.\n\n Note that this has no effect on the actual sending of pending transactions.\n This is either implicit (e.g. when receiving a re-sent transaction request for\n a request which is being processed) or controlled by the pending_timer, see\n above.\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.\n\n [](){: #ui_recv_pending_limit }\n\n- **`recv_pending_limit`** - Receive pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be\n received (for a sent transaction request). When the limit is exceeded, the\n transaction is considered lost, and an error returned to the user (through the\n call-back function _handle_trans_reply_).\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.\n\n [](){: #ui_send_mod }\n\n- **`send_mod`** - Send callback module which exports send_message/2. The\n function SendMod:send_message(SendHandle, Binary) is invoked when the bytes\n needs to be transmitted to the remote user.\n\n Value type: [module()](`t:erlang:module/0`)\n\n Defaults to `megaco_tcp`.\n\n [](){: #ui_encoding_mod }\n\n- **`encoding_mod`** - Encoding callback module which exports encode_message/2\n and decode_message/2. The function EncodingMod:encode_message(EncodingConfig,\n MegacoMessage) is invoked whenever a 'MegacoMessage' record needs to be\n translated into an Erlang binary. The function\n EncodingMod:decode_message(EncodingConfig, Binary) is invoked whenever an\n Erlang binary needs to be translated into a 'MegacoMessage' record.\n\n Value type: [module()](`t:erlang:module/0`)\n\n Defaults to `megaco_pretty_text_encoder`.\n\n [](){: #ui_encoding_config }\n\n- **`encoding_config`** - Encoding module config.\n\n Value type: [list()](`t:erlang:list/0`)\n\n Defaults to `[]`.\n\n [](){: #ui_protocol_version }\n\n- **`protocol_version`** - Actual protocol version.\n\n Value type: `t:protocol_version/0`\n\n Defaults to `1`.\n\n [](){: #ui_strict_version }\n\n- **`strict_version`** - Strict version control, i.e. when a message is\n received, verify that the version is that which was negotiated.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `true`.\n\n [](){: #ui_reply_data }\n\n- **`reply_data`** - Default reply data.\n\n Value type: [term()](`t:erlang:term/0`)\n\n Defaults to `undefined`.\n\n [](){: #ui_user_mod }\n\n- **`user_mod`** - Name of the user callback module. See the the reference\n manual for megaco_user for more info.\n\n Value type: [module()](`t:erlang:module/0`)\n\n Has no default value since its an mandatory config option.\n\n [](){: #ui_user_args }\n\n- **`user_args`** - List of extra arguments to the user callback functions. See\n the the reference manual for megaco_user for more info.\n\n Value type: [list()](`t:erlang:list/0`)\n\n [](){: #ui_threaded }\n\n- **`threaded`** - If a received message contains several transaction requests,\n this option indicates whether the requests should be handled sequentially in\n the same process (`false`), or if each request should be handled by its own\n process (`true` i.e. a separate process is spawned for each request).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_resend_indication }\n\n- **`resend_indication`** - This option indicates weather the transport module\n should be told if a message send is a resend or not.\n\n If _false_, megaco messages are sent using the\n [send_message](`c:megaco_transport:send_message/2`) function.\n\n If _true_, megaco message _re-sends_ are made using the\n [resend_message](`c:megaco_transport:resend_message/2`) function. The initial\n message send is still done using the\n [send_message](`c:megaco_transport:send_message/2`) function.\n\n The special value _flag_ instead indicates that the function\n [send_message/3](`c:megaco_transport:send_message/3`) shall be used.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_segment_reply_ind }\n\n- **`segment_reply_ind`** - This option specifies if the user shall be notified\n of received segment replies or not.\n\n See [handle_segment_reply](`c:megaco_user:handle_segment_reply/6`) callback function\n for more information.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_segment_recv_timer }\n\n- **`segment_recv_timer`** - This timer is started when the segment indicated by\n the `segmentation complete token` is received, but all segments has not yet\n been received.\n\n When the timer finally expires, a \"megaco segments not received\" (459) error\n message is sent to the other side and the user is notified with a\n `segment timeout` `UserReply` in either the\n [handle_trans_reply](`c:megaco_user:handle_trans_reply/5`) callback function or the\n return value of the `call/3` function.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `10000`.\n\n [](){: #ui_segment_send }\n\n- **`segment_send`** - Shall outgoing messages be segmented or not.\n\n Value type: `none` | [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n - **`none`** - Do not segment outgoing reply messages. This is useful when\n either it is known that messages are never to large or that the transport\n protocol can handle such things on its own (e.g. TCP or SCTP).\n\n - **`t:pos_integer/0`** - Outgoing reply messages will be segmented as needed\n (see `max_pdu_size` below). This value, K, indicate the outstanding window,\n i.e. how many segments can be outstanding (not acknowledged) at any given\n time.\n\n - **`infinity`** - Outgoing reply messages will be segmented as needed (see\n `max_pdu_size` below). Segment messages are sent all at once (i.e. no\n acknowledgement awaited before sending the next segment).\n\n Defaults to `none`.\n\n [](){: #ui_max_pdu_size }\n\n- **`max_pdu_size`** - Max message size. If the encoded message (PDU) exceeds\n this size, the message should be segmented, and then encoded.\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.","title":"megaco.user_info_item/0","ref":"megaco.html#t:user_info_item/0"},{"type":"type","doc":"The type is used when a functions return is to be ignored.","title":"megaco.void/0","ref":"megaco.html#t:void/0"},{"type":"module","doc":"This module implements a simple megaco codec measurement tool.\n\nResults are written to file (excel compatible text files) and on stdout.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.","title":"megaco_codec_meas","ref":"megaco_codec_meas.html"},{"type":"function","doc":"","title":"megaco_codec_meas.start/0","ref":"megaco_codec_meas.html#start/0"},{"type":"function","doc":"This function runs the measurement on all the _official_ codecs; pretty,\ncompact, ber, per and erlang.","title":"megaco_codec_meas.start/1","ref":"megaco_codec_meas.html#start/1"},{"type":"module","doc":"This module implements a simple megaco codec-based performance tool.\n\nThis module implements the _mstone1_ tool, a simple megaco codec-based\nperformance tool.\n\nThe results, the mstone value(s), are written to stdout.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.","title":"megaco_codec_mstone1","ref":"megaco_codec_mstone1.html"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start/0","ref":"megaco_codec_mstone1.html#start/0"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start/1","ref":"megaco_codec_mstone1.html#start/1"},{"type":"function","doc":"This function starts the _mstone1_ performance test with all codec configs.\n`Factor` (defaults to `1`) processes are started for every supported codec\nconfig.\n\nEach process encodes and decodes their messages. The number of messages\nprocessed in total (for all processes) is the mstone value.","title":"megaco_codec_mstone1.start/2","ref":"megaco_codec_mstone1.html#start/2"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start_flex/0","ref":"megaco_codec_mstone1.html#start_flex/0"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start_flex/1","ref":"megaco_codec_mstone1.html#start_flex/1"},{"type":"function","doc":"This function starts the _mstone1_ performance test with only the flex codec\nconfigs (i.e. `pretty` and `compact` with `flex`). The same number of processes\nare started as when running the standard test (using the `start/0,1` function).\nEach process encodes and decodes their messages. The number of messages\nprocessed in total (for all processes) is the mstone value.","title":"megaco_codec_mstone1.start_flex/2","ref":"megaco_codec_mstone1.html#start_flex/2"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start_no_drv/0","ref":"megaco_codec_mstone1.html#start_no_drv/0"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start_no_drv/1","ref":"megaco_codec_mstone1.html#start_no_drv/1"},{"type":"function","doc":"This function starts the _mstone1_ performance test with codec configs not using\nany drivers (i.e. `pretty` and `compact` without `flex`, `ber` and `per` without\n`driver` and `erlang` without `compressed`). The same number of processes are\nstarted as when running the standard test (using the `start/0,1` function). Each\nprocess encodes and decodes their messages. The number of messages processed in\ntotal (for all processes) is the mstone value.","title":"megaco_codec_mstone1.start_no_drv/2","ref":"megaco_codec_mstone1.html#start_no_drv/2"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start_only_drv/0","ref":"megaco_codec_mstone1.html#start_only_drv/0"},{"type":"function","doc":"","title":"megaco_codec_mstone1.start_only_drv/1","ref":"megaco_codec_mstone1.html#start_only_drv/1"},{"type":"function","doc":"This function starts the _mstone1_ performance test with only the driver using\ncodec configs (i.e. `pretty` and `compact` with `flex`, and `ber` and `per` with\n`driver` and `erlang` with `compressed`). The same number of processes are\nstarted as when running the standard test (using the `start/0,1` function). Each\nprocess encodes and decodes their messages. The number of messages processed in\ntotal (for all processes) is the mstone value.","title":"megaco_codec_mstone1.start_only_drv/2","ref":"megaco_codec_mstone1.html#start_only_drv/2"},{"type":"module","doc":"This module implements a simple megaco codec-based performance tool.\n\nThis module implements the _mstone2_ tool, a simple megaco codec-based\nperformance tool.\n\nThe results, the mstone value(s), are written to stdout.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.","title":"megaco_codec_mstone2","ref":"megaco_codec_mstone2.html"},{"type":"function","doc":"","title":"megaco_codec_mstone2.start/0","ref":"megaco_codec_mstone2.html#start/0"},{"type":"function","doc":"This function starts the _mstone2_ performance test with all codec configs.\nProcesses are created dynamically. Each process make _one_ run through their\nmessages (decoding and encoding messages) and then exits. When one process\nexits, a new is created with the same codec config and set of messages.\n\nThe number of messages processed in total (for all processes) is the mstone\nvalue.","title":"megaco_codec_mstone2.start/1","ref":"megaco_codec_mstone2.html#start/1"},{"type":"module","doc":"Megaco message transformation utility.\n\nThis module implements a simple megaco message transformation utility.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.\n\n[](){: #export_messages }","title":"megaco_codec_transform","ref":"megaco_codec_transform.html"},{"type":"function","doc":"","title":"megaco_codec_transform.export_messages/0","ref":"megaco_codec_transform.html#export_messages/0"},{"type":"function","doc":"Export the messages in the `MessagePackage` (default is `time_test`).\n\nThe output produced by this function is a directory structure with the following\nstructure:\n\n```text\n /pretty/ \n compact/ \n per/ \n ber/ \n erlang/ \n```","title":"megaco_codec_transform.export_messages/1","ref":"megaco_codec_transform.html#export_messages/1"},{"type":"module","doc":"Digit Map utility module.\n\nThis is a Digit Map utility module (types).","title":"megaco_digit_map","ref":"megaco_digit_map.html"},{"type":"module","doc":"This module has existed in the megaco app for long time,\nbut as of 27.0, its also documented.","title":"Version note - megaco_digit_map","ref":"megaco_digit_map.html#module-version-note"},{"type":"type","doc":"`$z | $Z | cancel`","title":"megaco_digit_map.cancel/0","ref":"megaco_digit_map.html#t:cancel/0"},{"type":"type","doc":"","title":"megaco_digit_map.event/0","ref":"megaco_digit_map.html#t:event/0"},{"type":"type","doc":"","title":"megaco_digit_map.kind/0","ref":"megaco_digit_map.html#t:kind/0"},{"type":"type","doc":"`$0..$9 | $a..$k | $A..$K`","title":"megaco_digit_map.letter/0","ref":"megaco_digit_map.html#t:letter/0"},{"type":"type","doc":"`$s | $S`","title":"megaco_digit_map.one_second/0","ref":"megaco_digit_map.html#t:one_second/0"},{"type":"type","doc":"","title":"megaco_digit_map.pause/0","ref":"megaco_digit_map.html#t:pause/0"},{"type":"type","doc":"`$l | $L`","title":"megaco_digit_map.ten_seconds/0","ref":"megaco_digit_map.html#t:ten_seconds/0"},{"type":"type","doc":"","title":"megaco_digit_map.value/0","ref":"megaco_digit_map.html#t:value/0"},{"type":"behaviour","doc":"Megaco erlang dist compress behaviour.\n\nThe following functions should be exported from a `megaco_edist_compress`\ncallback module:","title":"megaco_edist_compress","ref":"megaco_edist_compress.html"},{"type":"callback","doc":"Decompress a megaco component.","title":"megaco_edist_compress.decode/2","ref":"megaco_edist_compress.html#c:decode/2"},{"type":"callback","doc":"Compress a megaco component. The erlang dist encoder makes no assumption on the\nhow or even if the component is compressed.","title":"megaco_edist_compress.encode/2","ref":"megaco_edist_compress.html#c:encode/2"},{"type":"behaviour","doc":"Megaco encoder behaviour.\n\nThe following functions should be exported from a `megaco_encoder` callback\nmodule:","title":"megaco_encoder","ref":"megaco_encoder.html"},{"type":"behaviour","doc":"> #### Note {: .info }\n>\n> Note that the actual definition of (some of) these records depend on the\n> megaco protocol version used. For instance, the `'TransactionReply'` record\n> has two more fields in version 3, so a simple erlang type definition cannot be\n> made here.\n\n```text\nprotocol_version() = integer()\nsegment_no() = integer()\nmegaco_message() = #'MegacoMessage{}'\ntransaction() = {transactionRequest, transaction_request()} |\n {transactionPending, transaction_reply()} |\n {transactionReply, transaction_pending()} |\n {transactionResponseAck, transaction_response_ack()} |\n {segmentReply, segment_reply()}\ntransaction_request() = #'TransactionRequest'{}\ntransaction_pending() = #'TransactionPending'{}\ntransaction_reply() = #'TransactionReply'{}\ntransaction_response_ack() = [transaction_ack()]\ntransaction_ack() = #'TransactionAck'{}\nsegment_reply() = #'SegmentReply'{}\naction_request() = #'ActionRequest'{}\naction_reply() = #'ActionReply'{}\ncommand_request() = #'CommandRequest'{}\nerror_desc() = #'ErrorDescriptor'{}\n```","title":"DATA TYPES - megaco_encoder","ref":"megaco_encoder.html#module-data-types"},{"type":"callback","doc":"Decode a megaco message.\n\nNote that if the Version argument is `dynamic`, the decoder should try to figure\nout the actual version from the message itself and then use the proper decoder,\ne.g. version 1. \nIf on the other hand the Version argument is an integer, it means that this is\nthe expected version of the message and the decoder for that version should be\nused.","title":"megaco_encoder.decode_message/3","ref":"megaco_encoder.html#c:decode_message/3"},{"type":"callback","doc":"Perform a minimal decode of a megaco message.\n\nThe purpose of this function is to do a minimal decode of Megaco message. A\nsuccessfull result is a `'MegacoMessage'` in which only version and mid has been\ninitiated. This function is used by the megaco_messenger module when the\n[`decode_message/3`](`c:decode_message/3`) function fails to figure out the mid\n(the actual sender) of the message.\n\nNote again that a successfull decode only returns a partially initiated message.","title":"megaco_encoder.decode_mini_message/3","ref":"megaco_encoder.html#c:decode_mini_message/3"},{"type":"callback","doc":"Encode a megaco action reply. If this, for whatever reason, is not supported,\nthe function should return the error reason `not_implemented`.\n\nThis function is used when segmentation has been configured. So, for this to\nwork, this function _must_ be fully supported\\!","title":"megaco_encoder.encode_action_reply/3","ref":"megaco_encoder.html#c:encode_action_reply/3"},{"type":"callback","doc":"Encode megaco action requests. This function is called when the user calls the\nfunction [encode_actions/3](`megaco:encode_actions/3`). If that function is\nnever used or if the codec cannot support this (the encoding of individual\nactions), then return with error reason `not_implemented`.","title":"megaco_encoder.encode_action_requests/3","ref":"megaco_encoder.html#c:encode_action_requests/3"},{"type":"callback","doc":"Encode a megaco message.","title":"megaco_encoder.encode_message/3","ref":"megaco_encoder.html#c:encode_message/3"},{"type":"callback","doc":"Encode a megaco transaction. If this, for whatever reason, is not supported, the\nfunction should return the error reason `not_implemented`.\n\nThis functionality is used both when the transaction sender is used and for\nsegmentation. So, for either of those to work, this function _must_ be fully\nsupported\\!","title":"megaco_encoder.encode_transaction/3","ref":"megaco_encoder.html#c:encode_transaction/3"},{"type":"type","doc":"","title":"megaco_encoder.action_reply/0","ref":"megaco_encoder.html#t:action_reply/0"},{"type":"type","doc":"","title":"megaco_encoder.action_request/0","ref":"megaco_encoder.html#t:action_request/0"},{"type":"type","doc":"Alpha Numeric characters: `A..Z | a..z`","title":"megaco_encoder.alpha/0","ref":"megaco_encoder.html#t:alpha/0"},{"type":"type","doc":"","title":"megaco_encoder.command_request/0","ref":"megaco_encoder.html#t:command_request/0"},{"type":"type","doc":"","title":"megaco_encoder.deviceName/0","ref":"megaco_encoder.html#t:deviceName/0"},{"type":"type","doc":"Decimal digits: `0..9`","title":"megaco_encoder.digit/0","ref":"megaco_encoder.html#t:digit/0"},{"type":"type","doc":"","title":"megaco_encoder.domainName/0","ref":"megaco_encoder.html#t:domainName/0"},{"type":"type","doc":"","title":"megaco_encoder.error_desc/0","ref":"megaco_encoder.html#t:error_desc/0"},{"type":"type","doc":"","title":"megaco_encoder.ip4Address/0","ref":"megaco_encoder.html#t:ip4Address/0"},{"type":"type","doc":"","title":"megaco_encoder.ip6Address/0","ref":"megaco_encoder.html#t:ip6Address/0"},{"type":"type","doc":"","title":"megaco_encoder.megaco_message/0","ref":"megaco_encoder.html#t:megaco_message/0"},{"type":"type","doc":"There is no way to properly express this type in the Erlang type system, so this\nis the best we can do.\n\nA proper definition would be: `-type mtpAddress() :: octet_string(2..4).`","title":"megaco_encoder.mtpAddress/0","ref":"megaco_encoder.html#t:mtpAddress/0"},{"type":"type","doc":"","title":"megaco_encoder.octet/0","ref":"megaco_encoder.html#t:octet/0"},{"type":"type","doc":"","title":"megaco_encoder.octet_string/0","ref":"megaco_encoder.html#t:octet_string/0"},{"type":"type","doc":"There is no way to properly express this type in the Erlang type system, so this\nis the best we can do. The minimum length is 1 and the maximum length is 64.\n\nHere is the ABNF (copied from the megaco standard) to fill in the blanks:\n\n`# Total length of pathNAME must not exceed 64 chars.`\n\n`pathNAME = [\"*\"] NAME *(\"/\" / \"*\"/ ALPHA / DIGIT /\"_\" / \"$\" ) [\"@\" pathDomainName ]`\n\n`# ABNF allows two or more consecutive \".\" although it is meaningless in a path domain name.`\n\n`pathDomainName = (ALPHA / DIGIT / \"*\" ) *63(ALPHA / DIGIT / \"-\" / \"*\" / \".\")`\n\n`NAME = ALPHA *63(ALPHA / DIGIT / \"_\" )`","title":"megaco_encoder.pathName/0","ref":"megaco_encoder.html#t:pathName/0"},{"type":"type","doc":"","title":"megaco_encoder.protocol_version/0","ref":"megaco_encoder.html#t:protocol_version/0"},{"type":"type","doc":"","title":"megaco_encoder.segment_no/0","ref":"megaco_encoder.html#t:segment_no/0"},{"type":"type","doc":"","title":"megaco_encoder.segment_reply/0","ref":"megaco_encoder.html#t:segment_reply/0"},{"type":"type","doc":"","title":"megaco_encoder.transaction/0","ref":"megaco_encoder.html#t:transaction/0"},{"type":"type","doc":"","title":"megaco_encoder.transaction_ack/0","ref":"megaco_encoder.html#t:transaction_ack/0"},{"type":"type","doc":"","title":"megaco_encoder.transaction_pending/0","ref":"megaco_encoder.html#t:transaction_pending/0"},{"type":"type","doc":"The problem with TransactionReply is that its definition depend on which version\nof the protocol we are using. As of version 3, it has two more fields.","title":"megaco_encoder.transaction_reply/0","ref":"megaco_encoder.html#t:transaction_reply/0"},{"type":"type","doc":"","title":"megaco_encoder.transaction_request/0","ref":"megaco_encoder.html#t:transaction_request/0"},{"type":"type","doc":"","title":"megaco_encoder.transaction_response_ack/0","ref":"megaco_encoder.html#t:transaction_response_ack/0"},{"type":"module","doc":"Interface module to the flex scanner linked in driver.\n\nThis module contains the public interface to the flex scanner linked in driver.\nThe flex scanner performs the scanning phase of text message decoding.\n\nThe flex scanner is written using a tool called _flex_. In order to be able to\ncompile the flex scanner driver, this tool has to be available.\n\nBy default the flex scanner reports line-number of an error. But it can be built\nwithout line-number reporting. Instead token number is used. This will speed up\nthe scanning some 5-10%. Use `--disable-megaco-flex-scanner-lineno` when\nconfiguring the application.\n\nThe scanner will, by default, be built as a reentrant scanner _if_ the flex\nutility supports this (it depends on the version of flex). It is possible to\nexplicitly disable this even when flex support this. Use\n`--disable-megaco-reentrant-flex-scanner` when configuring the application.","title":"megaco_flex_scanner","ref":"megaco_flex_scanner.html"},{"type":"function","doc":"Is the flex scanner reentrant or not.","title":"megaco_flex_scanner.is_reentrant_enabled/0","ref":"megaco_flex_scanner.html#is_reentrant_enabled/0"},{"type":"function","doc":"Checks if a port is a flex scanner port or not (useful when if a port exits).","title":"megaco_flex_scanner.is_scanner_port/2","ref":"megaco_flex_scanner.html#is_scanner_port/2"},{"type":"function","doc":"Scans a megaco message and generates a token list to be passed on the parser.","title":"megaco_flex_scanner.scan/2","ref":"megaco_flex_scanner.html#scan/2"},{"type":"function","doc":"This function is used to start the flex scanner. It locates the library and\nloads the linked in driver.\n\nOn a single core system or if it's a non-reentrant scanner, a single port is\ncreated. On a multi-core system with a reentrant scanner, several ports will be\ncreated (one for each scheduler).\n\nNote that the process that calls this function _must_ be permanent. If it dies,\nthe port(s) will exit and the driver unload.","title":"megaco_flex_scanner.start/0","ref":"megaco_flex_scanner.html#start/0"},{"type":"function","doc":"This function is used to stop the flex scanner. It also unloads the driver.","title":"megaco_flex_scanner.stop/1","ref":"megaco_flex_scanner.html#stop/1"},{"type":"type","doc":"Return value of a successful (flex) scanner start.","title":"megaco_flex_scanner.megaco_ports/0","ref":"megaco_flex_scanner.html#t:megaco_ports/0"},{"type":"module","doc":"SDP utility module.\n\nThis module contains various things related to SDP.","title":"megaco_sdp","ref":"megaco_sdp.html"},{"type":"module","doc":"This module has existed in the megaco app for long time,\nbut as of 27.0 its also documented.","title":"Version note - megaco_sdp","ref":"megaco_sdp.html#module-version-note"},{"type":"type","doc":"","title":"megaco_sdp.property_group/0","ref":"megaco_sdp.html#t:property_group/0"},{"type":"type","doc":"","title":"megaco_sdp.property_groups/0","ref":"megaco_sdp.html#t:property_groups/0"},{"type":"type","doc":"","title":"megaco_sdp.property_parm/0","ref":"megaco_sdp.html#t:property_parm/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp/0","ref":"megaco_sdp.html#t:sdp/0"},{"type":"type","doc":"Session attribute.","title":"megaco_sdp.sdp_a/0","ref":"megaco_sdp.html#t:sdp_a/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_a_fmtp/0","ref":"megaco_sdp.html#t:sdp_a_fmtp/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_a_ptime/0","ref":"megaco_sdp.html#t:sdp_a_ptime/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_a_quality/0","ref":"megaco_sdp.html#t:sdp_a_quality/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_a_rtpmap/0","ref":"megaco_sdp.html#t:sdp_a_rtpmap/0"},{"type":"type","doc":"Bandwidth information.","title":"megaco_sdp.sdp_b/0","ref":"megaco_sdp.html#t:sdp_b/0"},{"type":"type","doc":"Connection information.","title":"megaco_sdp.sdp_c/0","ref":"megaco_sdp.html#t:sdp_c/0"},{"type":"type","doc":"Email address.","title":"megaco_sdp.sdp_e/0","ref":"megaco_sdp.html#t:sdp_e/0"},{"type":"type","doc":"Session information.","title":"megaco_sdp.sdp_i/0","ref":"megaco_sdp.html#t:sdp_i/0"},{"type":"type","doc":"Encryption key.","title":"megaco_sdp.sdp_k/0","ref":"megaco_sdp.html#t:sdp_k/0"},{"type":"type","doc":"Media name and transport address.","title":"megaco_sdp.sdp_m/0","ref":"megaco_sdp.html#t:sdp_m/0"},{"type":"type","doc":"Owner/creator and session identifier.","title":"megaco_sdp.sdp_o/0","ref":"megaco_sdp.html#t:sdp_o/0"},{"type":"type","doc":"Phone number.","title":"megaco_sdp.sdp_p/0","ref":"megaco_sdp.html#t:sdp_p/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_property_group/0","ref":"megaco_sdp.html#t:sdp_property_group/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_property_groups/0","ref":"megaco_sdp.html#t:sdp_property_groups/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_property_parm/0","ref":"megaco_sdp.html#t:sdp_property_parm/0"},{"type":"type","doc":"Repeat times.","title":"megaco_sdp.sdp_r/0","ref":"megaco_sdp.html#t:sdp_r/0"},{"type":"type","doc":"Session name.","title":"megaco_sdp.sdp_s/0","ref":"megaco_sdp.html#t:sdp_s/0"},{"type":"type","doc":"","title":"megaco_sdp.sdp_t/0","ref":"megaco_sdp.html#t:sdp_t/0"},{"type":"type","doc":"URI of description.","title":"megaco_sdp.sdp_u/0","ref":"megaco_sdp.html#t:sdp_u/0"},{"type":"type","doc":"Protocol version.","title":"megaco_sdp.sdp_v/0","ref":"megaco_sdp.html#t:sdp_v/0"},{"type":"type","doc":"Time zone adjustment.","title":"megaco_sdp.sdp_z/0","ref":"megaco_sdp.html#t:sdp_z/0"},{"type":"module","doc":"Interface module to TPKT transport protocol for Megaco/H.248.\n\nThis module contains the public interface to the TPKT (TCP/IP) version transport\nprotocol for Megaco/H.248.","title":"megaco_tcp","ref":"megaco_tcp.html"},{"type":"function","doc":"Stop receiving incoming messages on the socket.","title":"megaco_tcp.block/1","ref":"megaco_tcp.html#block/1"},{"type":"function","doc":"This function is used for closing an active TPKT connection.","title":"megaco_tcp.close/1","ref":"megaco_tcp.html#close/1"},{"type":"function","doc":"This function is used to open a TPKT connection.\n\n- **`module`** - This option makes it possible for the user to provide their own\n callback module. The `receive_message/4` or `process_received_message/4`\n functions of this module is called when a new message is received. Which one\n is called depends on the size of the message;\n\n - **`small`** - receive_message\n\n - **`large`** - process_received_message\n\n Default value is _megaco_.\n\n- **`inet_backend`** - Choose the inet-backend.\n\n This option make it possible to use a different inet-backend ('default',\n 'inet' or 'socket').\n\n Default is `default` (system default).","title":"megaco_tcp.connect/2","ref":"megaco_tcp.html#connect/2"},{"type":"function","doc":"Get all counter values for all known connections.","title":"megaco_tcp.get_stats/0","ref":"megaco_tcp.html#get_stats/0"},{"type":"function","doc":"Get all counter values for a given (connection) handle.","title":"megaco_tcp.get_stats/1","ref":"megaco_tcp.html#get_stats/1"},{"type":"function","doc":"Get the value of a specific counter.","title":"megaco_tcp.get_stats/2","ref":"megaco_tcp.html#get_stats/2"},{"type":"function","doc":"This function is used for starting new TPKT listening socket for TCP/IP. The\noption list contains the socket definitions.\n\n- **`inet_backend`** - Choose the inet-backend.\n\n This option make it possible to use a different inet-backend ('default',\n 'inet' or 'socket').\n\n Default is `default` (system default).","title":"megaco_tcp.listen/2","ref":"megaco_tcp.html#listen/2"},{"type":"function","doc":"Reset all counters for all connections.","title":"megaco_tcp.reset_stats/0","ref":"megaco_tcp.html#reset_stats/0"},{"type":"function","doc":"Reset all counters for the given connection.","title":"megaco_tcp.reset_stats/1","ref":"megaco_tcp.html#reset_stats/1"},{"type":"function","doc":"Sends a message on a TPKT connection.","title":"megaco_tcp.send_message/2","ref":"megaco_tcp.html#send_message/2"},{"type":"function","doc":"This function is used to convert a socket `handle()` to a inet `socket()`.","title":"megaco_tcp.socket/1","ref":"megaco_tcp.html#socket/1"},{"type":"function","doc":"This function is used for starting the TCP/IP transport service. Use\nexit(TransportRef, Reason) to stop the transport service.","title":"megaco_tcp.start_transport/0","ref":"megaco_tcp.html#start_transport/0"},{"type":"function","doc":"Starting to receive incoming messages from the socket again.","title":"megaco_tcp.unblock/1","ref":"megaco_tcp.html#unblock/1"},{"type":"function","doc":"Upgrade the receive handle of the control process (e.g. after having changed\nprotocol version).","title":"megaco_tcp.upgrade_receive_handle/2","ref":"megaco_tcp.html#upgrade_receive_handle/2"},{"type":"type","doc":"Defines the different counters handled by this transport.","title":"megaco_tcp.counter/0","ref":"megaco_tcp.html#t:counter/0"},{"type":"opaque","doc":"An opaque data type representing a TPKT connection.","title":"megaco_tcp.handle/0","ref":"megaco_tcp.html#t:handle/0"},{"type":"behaviour","doc":"Megaco transport behaviour.\n\nThe following functions should be exported from a `megaco_transport` callback\nmodule:\n\n- `c:send_message/2` [`mandatory`]\n- `c:send_message/3` [`optional`]\n- `c:resend_message/2` [`optional`]","title":"megaco_transport","ref":"megaco_transport.html"},{"type":"callback","doc":"Re-send a megaco message.\n\nNote that this function will only be called if the user has set the\n[resend_indication](`m:megaco#ui_resend_indication`) config option to\n`true`_and_ it is in fact a message resend. If not _both_ of these condition's\nare meet, `send_message` will be called.\n\nIf the function returns `{cancel, Reason}`, this means the transport module\ndecided not to send the message. This is _not_ an error. No error messages will\nbe issued and no error counters incremented. What actions this will result in\ndepends on what kind of message was sent.\n\nIn the case of requests, megaco will cancel the message in much the same way as\nif `megaco:cancel` had been called (after a successfull send). The information\nwill be propagated back to the user differently depending on how the request(s)\nwhere issued: For requests issued using [megaco:call](`megaco:call/3`), the info\nwill be delivered in the return value. For requests issued using `megaco:cast`\nthe info will be delivered via a call to the callback function\n[handle_trans_reply](`c:megaco_user:handle_trans_reply/5`).\n\nIn the case of reply, megaco will cancel the reply and information of this will\nbe returned to the user via a call to the callback function\n[handle_trans_ack](`c:megaco_user:handle_trans_ack/5`).","title":"megaco_transport.resend_message/2","ref":"megaco_transport.html#c:resend_message/2"},{"type":"callback","doc":"","title":"megaco_transport.send_message/2","ref":"megaco_transport.html#c:send_message/2"},{"type":"callback","doc":"Send a megaco message.\n\nIf the function returns `{cancel, Reason}`, this means the transport module\ndecided not to send the message. This is _not_ an error. No error messages will\nbe issued and no error counters incremented. What actions this will result in\ndepends on what kind of message was sent.\n\nIn the case of requests, megaco will cancel the message in much the same way as\nif `megaco:cancel` had been called (after a successfull send). The information\nwill be propagated back to the user differently depending on how the request(s)\nwhere issued: For requests issued using `megaco:call/3`, the info\nwill be delivered in the return value. For requests issued using `megaco:cast`\nthe info will be delivered via a call to the callback function\n[handle_trans_reply](`c:megaco_user:handle_trans_reply/5`).\n\nIn the case of reply, megaco will cancel the reply and information of this will\nbe returned to the user via a call to the callback function\n[handle_trans_ack](`c:megaco_user:handle_trans_ack/5`).\n\nThe function [`send_message/3`](`c:send_message/3`) will only be called if the\n[resend_indication](`m:megaco#ui_resend_indication`) config option has been set\nto the value `flag`. The third argument, `Resend` then indicates if the message\nsend is a resend or not.","title":"megaco_transport.send_message/3","ref":"megaco_transport.html#c:send_message/3"},{"type":"module","doc":"Interface module to UDP transport protocol for Megaco/H.248.\n\nThis module contains the public interface to the UDP/IP version\ntransport protocol for Megaco/H.248.","title":"megaco_udp","ref":"megaco_udp.html"},{"type":"function","doc":"Stop receiving incoming messages on the socket.","title":"megaco_udp.block/1","ref":"megaco_udp.html#block/1"},{"type":"function","doc":"This function is used for closing an active UDP socket.","title":"megaco_udp.close/1","ref":"megaco_udp.html#close/1"},{"type":"function","doc":"Creates a send handle from a transport handle. The send handle is intended to be\nused by megaco_udp:send_message/2.","title":"megaco_udp.create_send_handle/3","ref":"megaco_udp.html#create_send_handle/3"},{"type":"function","doc":"Get all counter values for all known connections.","title":"megaco_udp.get_stats/0","ref":"megaco_udp.html#get_stats/0"},{"type":"function","doc":"Get all counter values for a given handle.","title":"megaco_udp.get_stats/1","ref":"megaco_udp.html#get_stats/1"},{"type":"function","doc":"Get the value of a specific counter.","title":"megaco_udp.get_stats/2","ref":"megaco_udp.html#get_stats/2"},{"type":"function","doc":"This function is used to open an UDP/IP socket.\n\n- **`module`** - The option makes it possible for the user to provide their own\n callback module. The functions `receive_message/4` or\n `process_received_message/4` of this module is called when a new message is\n received. Which one depends on the size of the message:\n\n - **`small`** - receive_message\n\n - **`large`** - process_received_message\n\n Default value is _megaco_.\n\n- **`inet_backend`** - Choose the inet-backend.\n\n This option make it possible to use a different inet-backend ('default',\n 'inet' or 'socket').\n\n Default is `default` (system default).","title":"megaco_udp.open/2","ref":"megaco_udp.html#open/2"},{"type":"function","doc":"Reset all counters for all UDP handles.","title":"megaco_udp.reset_stats/0","ref":"megaco_udp.html#reset_stats/0"},{"type":"function","doc":"Reset all counters for the given UDP handle.","title":"megaco_udp.reset_stats/1","ref":"megaco_udp.html#reset_stats/1"},{"type":"function","doc":"Sends a message on a socket. The send handle is obtained by\nmegaco_udp:create_send_handle/3. Increments the NumOutMessages and NumOutOctets\ncounters if message successfully sent. In case of a failure to send, the\nNumErrors counter is _not_ incremented. This is done elsewhere in the megaco\napp.","title":"megaco_udp.send_message/2","ref":"megaco_udp.html#send_message/2"},{"type":"function","doc":"This function is used to convert a socket `handle()` to a inet `socket()`.","title":"megaco_udp.socket/1","ref":"megaco_udp.html#socket/1"},{"type":"function","doc":"This function is used for starting the UDP/IP transport service. Use\nexit(TransportRef, Reason) to stop the transport service.","title":"megaco_udp.start_transport/0","ref":"megaco_udp.html#start_transport/0"},{"type":"function","doc":"Starting to receive incoming messages from the socket again.","title":"megaco_udp.unblock/1","ref":"megaco_udp.html#unblock/1"},{"type":"function","doc":"Update the receive handle of the control process (e.g. after having changed\nprotocol version).","title":"megaco_udp.upgrade_receive_handle/2","ref":"megaco_udp.html#upgrade_receive_handle/2"},{"type":"type","doc":"Defines the different counters handled by this transport.","title":"megaco_udp.counter/0","ref":"megaco_udp.html#t:counter/0"},{"type":"opaque","doc":"An opaque data type representing an UDP socket.","title":"megaco_udp.handle/0","ref":"megaco_udp.html#t:handle/0"},{"type":"opaque","doc":"An opaque data type representing an UDP socket, used when sending.","title":"megaco_udp.send_handle/0","ref":"megaco_udp.html#t:send_handle/0"},{"type":"behaviour","doc":"Callback module for users of the Megaco application\n\nThis module defines the callback behaviour of Megaco users. A megaco_user\ncompliant callback module must export the following functions:\n\n- [handle_connect/2,3](`c:handle_connect/3`)\n- [handle_disconnect/3](`c:handle_disconnect/3`)\n- [handle_syntax_error/3,4](`c:handle_syntax_error/4`)\n- [handle_message_error/3,4](`c:handle_message_error/4`)\n- [handle_trans_request/3,4](`c:handle_trans_request/4`)\n- [handle_trans_long_request/3,4](`c:handle_trans_long_request/4`)\n- [handle_trans_reply/4,5](`c:handle_trans_reply/5`)\n- [handle_trans_ack/4,5](`c:handle_trans_ack/5`)\n- [handle_unexpected_trans/3,4](`c:handle_unexpected_trans/4`)\n- [handle_trans_request_abort/4,5](`c:handle_trans_request_abort/5`)\n- [handle_segment_reply/5,6](`c:handle_segment_reply/6`)\n\nThe semantics of them and their exact signatures are explained below.\n\nThe `user_args` configuration parameter which may be used to extend the argument\nlist of the callback functions. For example, the handle_connect function takes\nby default two arguments:\n\n```\nhandle_connect(Handle, Version)\n```\n\nbut if the `user_args` parameter is set to a longer list, such as\n`[SomePid,SomeTableRef]`, the callback function is expected to have these (in\nthis case two) extra arguments last in the argument list:\n\n```erlang\nhandle_connect(Handle, Version, SomePid, SomeTableRef)\n```\n\n[](){: #extra_argument }\n\n> #### Note {: .info }\n>\n> Must of the functions below has an optional `Extra` argument (e.g.\n> [handle_unexpected_trans/4](`c:handle_unexpected_trans/4`)). The functions\n> which takes this argument will be called if and only if one of the functions\n> [`receive_message/5`](`megaco:receive_message/5`) or\n> [`process_received_message/5`](`megaco:process_received_message/5`) was called\n> with the `Extra` argument different than `ignore_extra`.","title":"megaco_user","ref":"megaco_user.html"},{"type":"behaviour","doc":"```erlang\naction_request() = #'ActionRequest'{}\naction_reply() = #'ActionReply'{}\nerror_desc() = #'ErrorDescriptor'{}\nsegment_no() = integer()\n```\n\n```erlang\nconn_handle() = #megaco_conn_handle{}\n```\n\nThe record initially returned by `megaco:connect/4,5`. It identifies a \"virtual\"\nconnection and may be reused after a reconnect (disconnect + connect).\n\n```text\nprotocol_version() = integer()\n```\n\nIs the actual protocol version. In most cases the protocol version is retrieved\nfrom the processed message, but there are exceptions:\n\n- When `handle_connect/2,3` is triggered by an explicit call to\n `megaco:connect/4,5`.\n- [`handle_disconnect/3`](`c:handle_disconnect/3`)\n- [`handle_syntax_error/3`](`c:handle_syntax_error/3`)\n\nIn these cases, the ProtocolVersion default version is obtained from the static\nconnection configuration:\n\n- `megaco:conn_info(ConnHandle, protocol_version)`.","title":"DATA TYPES - megaco_user","ref":"megaco_user.html#module-data-types"},{"type":"callback","doc":"","title":"megaco_user.handle_connect/2","ref":"megaco_user.html#c:handle_connect/2"},{"type":"callback","doc":"Invoked when a new connection is established\n\nConnections may either be established by an explicit call to megaco:connect/4 or\nimplicitly at the first invocation of megaco:receive_message/3.\n\nNormally a Media Gateway (MG) connects explicitly while a Media Gateway\nController (MGC) connects implicitly.\n\nAt the Media Gateway Controller (MGC) side it is possible to reject a connection\nrequest (and send a message error reply to the gateway) by returning\n`{error, ErrorDescr}` or simply `error` which generates an error descriptor with\ncode 402 (unauthorized) and reason \"Connection refused by user\" (this is also\nthe case for all unknown results, such as exit signals or throw).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_message_error/4`](`c:handle_message_error/4`).\n\n[`handle_connect/3`](`c:handle_connect/3`) (with `Extra`) can also be called as\na result of a call to the `megaco:connect/5` function (if\nthat function is called with the `Extra` argument different than `ignore_extra`.","title":"megaco_user.handle_connect/3","ref":"megaco_user.html#c:handle_connect/3"},{"type":"callback","doc":"Invoked when a connection is teared down\n\nThe disconnect may either be made explicitly by a call to megaco:disconnect/2 or\nimplicitly when the control process of the connection dies.","title":"megaco_user.handle_disconnect/3","ref":"megaco_user.html#c:handle_disconnect/3"},{"type":"callback","doc":"","title":"megaco_user.handle_message_error/3","ref":"megaco_user.html#c:handle_message_error/3"},{"type":"callback","doc":"Invoked when a received message just contains an error instead of a list of\ntransactions.\n\nIncoming messages is delivered by megaco:receive_message/4 and successfully\ndecoded. Normally a message contains a list of transactions, but it may instead\ncontain an ErrorDescriptor on top level of the message.\n\nMessage errors are detected remotely on the other side of the protocol. And you\nprobably don't want to reply to it, but it may indicate that you have\noutstanding transactions that not will get any response (request -> reply; reply\n-> ack).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_message_error/4`](`c:handle_message_error/4`).","title":"megaco_user.handle_message_error/4","ref":"megaco_user.html#c:handle_message_error/4"},{"type":"callback","doc":"","title":"megaco_user.handle_segment_reply/5","ref":"megaco_user.html#c:handle_segment_reply/5"},{"type":"callback","doc":"This function is called when a segment reply has been received if the\n[segment_reply_ind](`megaco:conn_info/2`) config option has been set to true.\n\nThis is in effect a progress report.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_segment_reply/6`](`c:handle_segment_reply/6`).","title":"megaco_user.handle_segment_reply/6","ref":"megaco_user.html#c:handle_segment_reply/6"},{"type":"callback","doc":"","title":"megaco_user.handle_syntax_error/3","ref":"megaco_user.html#c:handle_syntax_error/3"},{"type":"callback","doc":"Invoked when a received message had syntax errors\n\nIncoming messages is delivered by megaco:receive_message/4 and normally decoded\nsuccessfully. But if the decoding failed this function is called in order to\ndecide if the originator should get a reply message (reply) or if the reply\nsilently should be discarded (no_reply).\n\nSyntax errors are detected locally on this side of the protocol and may have\nmany causes, e.g. a malfunctioning transport layer, wrong encoder/decoder\nselected, bad configuration of the selected encoder/decoder etc.\n\nThe error descriptor defaults to `DefaultED`, but can be overridden with an\nalternate one by returning `{reply,ED}` or `{no_reply,ED}` instead of `reply`\nand `no_reply` respectively.\n\nAny other return values (including exit signals or throw) and the `DefaultED`\nwill be used.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_syntax_error/4`](`c:handle_syntax_error/4`).","title":"megaco_user.handle_syntax_error/4","ref":"megaco_user.html#c:handle_syntax_error/4"},{"type":"callback","doc":"","title":"megaco_user.handle_trans_ack/4","ref":"megaco_user.html#c:handle_trans_ack/4"},{"type":"callback","doc":"Optionally invoked for a transaction acknowledgement\n\nIf this function gets invoked or not, is controlled by the reply from the\npreceding call to handle_trans_request/3. The handle_trans_request/3 function\nmay decide to return \\{handle_ack, ack_data()\\} or \\{handle_sloppy_ack,\nack_data()\\} meaning that you need an immediate acknowledgement of the reply and\nthat this function should be invoked to handle the acknowledgement.\n\nThe ack_data() argument to this function is the Erlang term returned by\nhandle_trans_request/3.\n\nIf the AckStatus is ok, it is indicating that this is a true acknowledgement of\nthe transaction reply.\n\nIf the AckStatus is \\{error, Reason\\}, it is an indication that the\nacknowledgement or even the reply (for which this is an acknowledgement) was not\ndelivered, but there is no point in waiting any longer for it to arrive. This\nhappens when:\n\n- **`reply_timer`** - The `reply_timer` eventually times out.\n\n- **reply send failure** - When megaco fails to send the reply (see\n [handle_trans_reply](`c:handle_trans_reply/5`)), for whatever reason.\n\n- **cancel** - The user has explicitly cancelled the wait (megaco:cancel/2).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_ack/5`](`c:handle_trans_ack/5`).","title":"megaco_user.handle_trans_ack/5","ref":"megaco_user.html#c:handle_trans_ack/5"},{"type":"callback","doc":"","title":"megaco_user.handle_trans_long_request/3","ref":"megaco_user.html#c:handle_trans_long_request/3"},{"type":"callback","doc":"Optionally invoked for a time consuming transaction request\n\nIf this function gets invoked or not is controlled by the reply from the\npreceding call to handle_trans_request/3. The handle_trans_request/3 function\nmay decide to process the action requests itself or to delegate the processing\nto this function.\n\nThe req_data() argument to this function is the Erlang term returned by\nhandle_trans_request/3.\n\nAny other return values (including exit signals or throw) will result in an\nerror descriptor with code 500 (internal gateway error) and the module name (of\nthe callback module) as reason.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_long_request/4`](`c:handle_trans_long_request/4`).","title":"megaco_user.handle_trans_long_request/4","ref":"megaco_user.html#c:handle_trans_long_request/4"},{"type":"callback","doc":"","title":"megaco_user.handle_trans_reply/4","ref":"megaco_user.html#c:handle_trans_reply/4"},{"type":"callback","doc":"Optionally invoked for a transaction reply\n\nThe sender of a transaction request has the option of deciding, whether the\noriginating Erlang process should synchronously wait (`megaco:call/3`) for a\nreply or if the message should be sent asynchronously (`megaco:cast/3`) and the\nprocessing of the reply should be delegated this callback function.\n\nNote that if the reply is segmented (split into several smaller messages;\nsegments), then some extra info, segment number and an indication if all\nsegments of a reply has been received or not, is also included in the\n`UserReply`.\n\nThe `ReplyData` defaults to `megaco:lookup(ConnHandle, reply_data)`, but may be\nexplicitly overridden by a `megaco:cast/3` option in order to forward info about\nthe calling context of the originating process.\n\nAt `success()`, the `UserReply` either contains:\n\n- A list of 'ActionReply' records possibly containing error indications.\n- A tuple of size three containing: the segment number, the\n `last segment indicator` and finally a list of 'ActionReply' records possibly\n containing error indications. This is of course only possible if the reply was\n segmented.\n\n`failure()` indicates an local or external error and can be one of the\nfollowing:\n\n- A `transaction_reason()`, indicates that the remote user has replied with an\n explicit transactionError.\n- A `segment_reason()`, indicates that the remote user has replied with an\n explicit transactionError for this segment. This is of course only possible if\n the reply was segmented.\n- A `user_cancel_reason()`, indicates that the request has been canceled by the\n user. `reason_for_user_cancel()` is the reason given in the call to the\n [cancel](`megaco:cancel/2`) function.\n- A `send_reason()`, indicates that the transport module\n [send_message](`c:megaco_transport:send_message/3`) function did not send the\n message. The reason for this can be:\n\n - `send_cancelled_reason()` \\- the message sending was deliberately cancelled.\n `reason_for_send_cancel()` is the reason given in the `cancel` return from\n the [send_message](`c:megaco_transport:send_message/3`) function.\n - `send_failed_reason()` \\- an error occurred while attempting to send the\n message.\n\n- An `other_reason()`, indicates some other error such as:\n\n - `timeout` \\- the reply failed to arrive before the request timer expired.\n - `{segment_timeout, missing_segments()}` \\- one or more segments was not\n delivered before the expire of the segment timer.\n - `exceeded_recv_pending_limit` \\- the pending limit was exceeded for this\n request.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_reply/5`](`c:handle_trans_reply/5`).","title":"megaco_user.handle_trans_reply/5","ref":"megaco_user.html#c:handle_trans_reply/5"},{"type":"callback","doc":"","title":"megaco_user.handle_trans_request/3","ref":"megaco_user.html#c:handle_trans_request/3"},{"type":"callback","doc":"Invoked for each transaction request\n\nIncoming messages is delivered by megaco:receive_message/4 and successfully\ndecoded. Normally a message contains a list of transactions and this function is\ninvoked for each TransactionRequest in the message.\n\nThis function takes a list of 'ActionRequest' records and has three main\noptions:\n\n- **`Return ignore_trans_request`** - Decide that these action requests shall be\n ignored completely.\n\n- **`Return pending()`** - Decide that the processing of these action requests\n will take a long time and that the originator should get an immediate\n 'TransactionPending' reply as interim response. The actual processing of these\n action requests instead should be delegated to the the\n handle_trans_long_request/3 callback function with the req_data() as one of\n its arguments.\n\n- **`Return reply()`** - Process the action requests and either return an\n error_descr() indicating some fatal error or a list of action replies\n (wildcarded or not).\n\n If for some reason megaco is unable to deliver the reply, the reason for this\n will be passed to the user via a call to the callback function\n [handle_trans_ack](`c:handle_trans_ack/5`), unless\n `ack_action() = discard_ack`.\n\n The ack_action() is either:\n\n - **`discard_ack`** - Meaning that you don't care if the reply is acknowledged\n or not.\n\n - **`{handle_ack, ack_data()} | {handle_ack, ack_data(), send_options()}`** -\n Meaning that you want an immediate acknowledgement when the other part\n receives this transaction reply. When the acknowledgement eventually is\n received, the handle_trans_ack/4 callback function will be invoked with the\n ack_data() as one of its arguments. ack_data() may be any Erlang term.\n\n - **`{handle_pending_ack, ack_data()} | {handle_pending_ack, ack_data(), send_options()}`** -\n This has the same effect as the above, _if and only if_ megaco has sent at\n least one pending message for this request (during the processing of the\n request). If no pending message has been sent, then immediate\n acknowledgement will _not_ be requested.\n\n Note that this only works as specified if the `sent_pending_limit` config\n option has been set to an integer value.\n\n - **`{handle_sloppy_ack, ack_data()}| {handle_sloppy_ack, ack_data(), send_options()}`** -\n Meaning that you want an acknowledgement _sometime_. When the\n acknowledgement eventually is received, the handle_trans_ack/4 callback\n function will be invoked with the ack_data() as one of its arguments.\n ack_data() may be any Erlang term.\n\nAny other return values (including exit signals or throw) will result in an\nerror descriptor with code 500 (internal gateway error) and the module name (of\nthe callback module) as reason.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_request/4`](`c:handle_trans_request/4`).","title":"megaco_user.handle_trans_request/4","ref":"megaco_user.html#c:handle_trans_request/4"},{"type":"callback","doc":"","title":"megaco_user.handle_trans_request_abort/4","ref":"megaco_user.html#c:handle_trans_request_abort/4"},{"type":"callback","doc":"Invoked when a transaction request has been aborted\n\nThis function is invoked if the originating pending limit has been exceeded.\nThis usually means that a request has taken abnormally long time to complete.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_request_abort/5`](`c:handle_trans_request_abort/5`).","title":"megaco_user.handle_trans_request_abort/5","ref":"megaco_user.html#c:handle_trans_request_abort/5"},{"type":"callback","doc":"","title":"megaco_user.handle_unexpected_trans/3","ref":"megaco_user.html#c:handle_unexpected_trans/3"},{"type":"callback","doc":"Invoked when a unexpected message is received\n\nIf a reply to a request is not received in time, the megaco stack removes all\ninfo about the request from its tables. If a reply should arrive after this has\nbeen done the app has no way of knowing where to send this message. The message\nis delivered to the \"user\" by calling this function on the local node (the node\nwhich has the link).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_unexpected_trans/4`](`c:handle_unexpected_trans/4`).","title":"megaco_user.handle_unexpected_trans/4","ref":"megaco_user.html#c:handle_unexpected_trans/4"},{"type":"type","doc":"","title":"megaco_user.conn_handle/0","ref":"megaco_user.html#t:conn_handle/0"},{"type":"type","doc":"","title":"megaco_user.megaco_timer/0","ref":"megaco_user.html#t:megaco_timer/0"},{"type":"type","doc":"","title":"megaco_user.receive_handle/0","ref":"megaco_user.html#t:receive_handle/0"},{"type":"extras","doc":"\n# Megaco Release Notes\n\nThis document describes the changes made to the Megaco system from version to\nversion. The intention of this document is to list all incompatibilities as well\nas all enhancements and bugfixes for every release of Megaco. Each release of\nMegaco thus constitutes one section in this document. The title of each section\nis the version number of Megaco.","title":"Megaco Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Megaco 4.7 - Megaco Release Notes","ref":"notes.html#megaco-4-7"},{"type":"extras","doc":"- Erlang/OTP type specifications has been updated to eliminate overlapping domains.\n\n Own Id: OTP-19310 Aux Id: [GH-8810], [GH-8821], [PR-8986]\n\n[GH-8810]: https://github.com/erlang/otp/issues/8810\n[GH-8821]: https://github.com/erlang/otp/issues/8821\n[PR-8986]: https://github.com/erlang/otp/pull/8986","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.6 - Megaco Release Notes","ref":"notes.html#megaco-4-6"},{"type":"extras","doc":"- `-callback` attributes have been added to `m:megaco_transport`.\n\n Own Id: OTP-18806 Aux Id: [PR-7740]\n\n- Updated types and specs for all API modules.\n\n Own Id: OTP-18920 Aux Id: BL-322\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-7740]: https://github.com/erlang/otp/pull/7740\n[PR-8026]: https://github.com/erlang/otp/pull/8026","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.5 - Megaco Release Notes","ref":"notes.html#megaco-4-5"},{"type":"extras","doc":"- Make megaco transports handle gen_tcp | gen_udp with socket backend on Windows\n (completion).\n\n Own Id: OTP-18599 Aux Id: OTP-18029","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.4.4 - Megaco Release Notes","ref":"notes.html#megaco-4-4-4"},{"type":"extras","doc":"- Removed configure option `--enable-sanitizers`. It was untested and broken.\n Address sanitizer for the emulator has better support by the `asan` build\n target.\n\n Own Id: OTP-18538 Aux Id: GH-7031, PR-7078","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 4.4.3 - Megaco Release Notes","ref":"notes.html#megaco-4-4-3"},{"type":"extras","doc":"- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18432 Aux Id:\n GH-6672,PR-6793,PR-6784,PR-6787,PR-6785,PR-6682,PR-6800,PR-6797,PR-6798,PR-6799,PR-6796,PR-6813,PR-6671,PR-6673,PR-6684,PR-6694,GH-6677,PR-6696,PR-6670,PR-6674","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.4.2 - Megaco Release Notes","ref":"notes.html#megaco-4-4-2"},{"type":"extras","doc":"- A very minor improvement to the measurement tool.\n\n Own Id: OTP-18298","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.4.1 - Megaco Release Notes","ref":"notes.html#megaco-4-4-1"},{"type":"extras","doc":"- Fixed various dialyzer related issues in the examples and the application\n proper.\n\n Own Id: OTP-18179 Aux Id: ERIERL-836","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- There is a new configure option, `--enable-deterministic-build`, which will\n apply the `deterministic` compiler option when building Erlang/OTP. The\n `deterministic` option has been improved to eliminate more sources of\n non-determinism in several applications.\n\n Own Id: OTP-18165 Aux Id: PR-5965","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.4 - Megaco Release Notes","ref":"notes.html#megaco-4-4"},{"type":"extras","doc":"- Input for `configure` scripts adapted to `autoconf` 2\\.71.\n\n Own Id: OTP-17414 Aux Id: PR-4967\n\n- Megaco test suite(s) use the new peer module for node starts.\n\n Own Id: OTP-17910","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.3 - Megaco Release Notes","ref":"notes.html#megaco-4-3"},{"type":"extras","doc":"- The compilation time is no longer recorded in BEAM files. There remained\n several undocumented functions that attempted to retrieve compilation times.\n Those have now been removed.\n\n Own Id: OTP-17962","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Update the performance and debug chapters of the megaco user's guide. Also\n some updates to the meas tools.\n\n Own Id: OTP-17839","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.2 - Megaco Release Notes","ref":"notes.html#megaco-4-2"},{"type":"extras","doc":"- \\[megaco_tcp] When connect fails, include more info in the error reason.\n\n Own Id: OTP-17817","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.1 - Megaco Release Notes","ref":"notes.html#megaco-4-1"},{"type":"extras","doc":"- It is now possible to configure the built-in transports (megaco_tcp and megaco\n udp) to use the new (gen_udp- and gen_tcp-) option 'inet_backend'.\n\n Own Id: OTP-17533","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 4.0.1 - Megaco Release Notes","ref":"notes.html#megaco-4-0-1"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 4.0 - Megaco Release Notes","ref":"notes.html#megaco-4-0"},{"type":"extras","doc":"- All the pre-v3 codec(s) (prev3a, prev3b and prev3c) was deprecated in\n OTP-23.0. They have now been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16560\n\n- Removed deprecated functions marked for removal.\n\n Own Id: OTP-17049","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.19.5.1 - Megaco Release Notes","ref":"notes.html#megaco-3-19-5-1"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.19.5 - Megaco Release Notes","ref":"notes.html#megaco-3-19-5"},{"type":"extras","doc":"- Fixed usage of `AC_CONFIG_AUX_DIRS()` macros in configure script sources.\n\n Own Id: OTP-17093 Aux Id: ERL-1447, PR-2948","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.19.4 - Megaco Release Notes","ref":"notes.html#megaco-3-19-4"},{"type":"extras","doc":"- Empty statistics descriptor (now) allowed in both encode and decode for\n version 3.\n\n Own Id: OTP-17012 Aux Id: ERL-1405","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.19.3 - Megaco Release Notes","ref":"notes.html#megaco-3-19-3"},{"type":"extras","doc":"- The expected number of warnings when (yecc) generating v2 and v3 (text)\n parser's was incorrect.\n\n Own Id: OTP-16836","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.19.2 - Megaco Release Notes","ref":"notes.html#megaco-3-19-2"},{"type":"extras","doc":"- The v2 and v3 parsers could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16818 Aux Id: ERIERL-526","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.19.1 - Megaco Release Notes","ref":"notes.html#megaco-3-19-1"},{"type":"extras","doc":"- The mini parser could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16631 Aux Id: ERIERL-491","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.19 - Megaco Release Notes","ref":"notes.html#megaco-3-19"},{"type":"extras","doc":"- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469\n\n- The preliminary version 3 codec(s) prev3a, prev3b and prev3c has been\n deprecated and will be _removed_ in OTP 24. The encoding config option\n 'version3' will continue to work until OTP 24.\n\n Own Id: OTP-16531","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.18.8.4 - Megaco Release Notes","ref":"notes.html#megaco-3-18-8-4"},{"type":"extras","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.8.3 - Megaco Release Notes","ref":"notes.html#megaco-3-18-8-3"},{"type":"extras","doc":"- Empty statistics descriptor (now) allowed in both encode and decode for\n version 3.\n\n Own Id: OTP-17012 Aux Id: ERL-1405","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.8.2 - Megaco Release Notes","ref":"notes.html#megaco-3-18-8-2"},{"type":"extras","doc":"- The v2 and v3 parsers could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16818 Aux Id: ERIERL-526","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.8.1 - Megaco Release Notes","ref":"notes.html#megaco-3-18-8-1"},{"type":"extras","doc":"- The mini parser could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16631 Aux Id: ERIERL-491","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.8 - Megaco Release Notes","ref":"notes.html#megaco-3-18-8"},{"type":"extras","doc":"- The documented function megaco:get_sdp_record_from_PropertGroup/2 was a\n wrapper for megaco_sdp:get_sdp_record_from_PropertGroup/2 but did not actually\n exist. This has now been fixed.\n\n Own Id: OTP-16449","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Test suite completely reworked. Add (timestamp) utility functions for\n debugging and testing.\n\n Own Id: OTP-16158","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.18.7 - Megaco Release Notes","ref":"notes.html#megaco-3-18-7"},{"type":"extras","doc":"- The meas example had not been updated for a long time, which caused it to not\n work. Also, it made use of deprecated functions (now()). This has now been\n fixed.\n\n Own Id: OTP-16061","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.6 - Megaco Release Notes","ref":"notes.html#megaco-3-18-6"},{"type":"extras","doc":"- Fix various minor issues related to Dialyzer. Mostly these are dialyzer\n warnings, but there was also some minor bugs detected by Dialyzer.\n\n Own Id: OTP-15882","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.5 - Megaco Release Notes","ref":"notes.html#megaco-3-18-5"},{"type":"extras","doc":"- Minor updates to build system necessary due to move of configuration of\n `crypto` application.\n\n Own Id: OTP-15262 Aux Id: OTP-15129\n\n- Minor adjustments made to build system for parallel configure.\n\n Own Id: OTP-15340 Aux Id: OTP-14625","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.18.4 - Megaco Release Notes","ref":"notes.html#megaco-3-18-4"},{"type":"extras","doc":"- Improved documentation.\n\n Own Id: OTP-15190","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.3 - Megaco Release Notes","ref":"notes.html#megaco-3-18-3"},{"type":"extras","doc":"- Removed all old unused files in the documentation.\n\n Own Id: OTP-14475 Aux Id: ERL-409, PR-1493","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.18.2 - Megaco Release Notes","ref":"notes.html#megaco-3-18-2"},{"type":"extras","doc":"- Typos have been fixed.\n\n Own Id: OTP-14387","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.18.1 - Megaco Release Notes","ref":"notes.html#megaco-3-18-1"},{"type":"extras","doc":"- Internal changes\n\n Own Id: OTP-13551","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.18 - Megaco Release Notes","ref":"notes.html#megaco-3-18"},{"type":"extras","doc":"- The runtime dependencies in the application resource file have been updated.\n\n Own Id: OTP-12762","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.17.3 - Megaco Release Notes","ref":"notes.html#megaco-3-17-3"},{"type":"extras","doc":"- Distribute `autoconf` helpers to applications at build time instead of having\n multiple identical copies committed in the repository.\n\n Own Id: OTP-12348","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.17.2 - Megaco Release Notes","ref":"notes.html#megaco-3-17-2"},{"type":"extras","doc":"- Implement --enable-sanitizers\\[=sanitizers]. Similar to debugging with\n Valgrind, it's very useful to enable -fsanitize= switches to catch bugs at\n runtime.\n\n Own Id: OTP-12153","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.17.1 - Megaco Release Notes","ref":"notes.html#megaco-3-17-1"},{"type":"extras","doc":"- The default encoding of Erlang files has been changed from ISO-8859-1 to\n UTF-8.\n\n The encoding of XML files has also been changed to UTF-8.\n\n Own Id: OTP-10907","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.17.0.3 - Megaco Release Notes","ref":"notes.html#megaco-3-17-0-3"},{"type":"extras","doc":"- Updated doc files to utf8.\n\n Own Id: OTP-10907","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.17.0.2 - Megaco Release Notes","ref":"notes.html#megaco-3-17-0-2"},{"type":"extras","doc":"- Introduced functionality for inspection of system and build configuration.\n\n Own Id: OTP-11196","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Megaco 3.17.0.1 - Megaco Release Notes","ref":"notes.html#megaco-3-17-0-1"},{"type":"extras","doc":"- Postscript files no longer needed for the generation of PDF files have been\n removed.\n\n Own Id: OTP-11016","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"Version 3.17 supports code replacement in runtime from/to version 3.16.0.3 and\nand 3.16.0.2.","title":"Megaco 3.17 - Megaco Release Notes","ref":"notes.html#megaco-3-17"},{"type":"extras","doc":"-","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- Buffer overrun error while flex scanner processing property parm groups.\n\n This error occured only for large messages if a buffer realloc was needed\n while processing the property parm groups.\n\n Own Id: OTP-10998\n\n Aux Id: Seq 12263","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"-","title":"Incompatibilities - Megaco Release Notes","ref":"notes.html#incompatibilities"},{"type":"extras","doc":"Version 3.16.0.2 supports code replacement in runtime from/to version 3.16.0.1,\n3.16, 3.15.1.1, 3.15.1 and 3.15.","title":"Megaco 3.16.0.3 - Megaco Release Notes","ref":"notes.html#megaco-3-16-0-3"},{"type":"extras","doc":"- Where necessary, a comment stating encoding has been added to Erlang files.\n The comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A number of binary encoding alternatives has been removed. The binary encoding\n option `driver` has been removed since this (the use of the asn1 linked in\n driver) is now default and there is now way to _not_ use it. See\n [configuration of binary encoding](megaco_encode.md#binary_config) for more\n info.","title":"Incompatibilities - Megaco Release Notes","ref":"notes.html#incompatibilities"},{"type":"extras","doc":"Version 3.16.0.2 supports code replacement in runtime from/to version 3.16.0.1,\n3.16, 3.15.1.1, 3.15.1 and 3.15.","title":"Megaco 3.16.0.2 - Megaco Release Notes","ref":"notes.html#megaco-3-16-0-2"},{"type":"extras","doc":"- Allow whitespaces in installation path.\n\n It is now possible to give configure and make an installation/release path\n with whitespaces in it.\n\n Own Id: OTP-10107\n\n- Fix parallel make for behaviours.\n- Removed use of deprecated system flag, `global_haeps_size`, in the measurement\n tool `mstone1`.","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"-","title":"Incompatibilities - Megaco Release Notes","ref":"notes.html#incompatibilities"},{"type":"extras","doc":"Version 3.16.0.1 supports code replacement in runtime from/to version 3.16,\n3.15.1.1, 3.15.1 and 3.15.","title":"Megaco 3.16.0.1 - Megaco Release Notes","ref":"notes.html#megaco-3-16-0-1"},{"type":"extras","doc":"- Fixed some faulty test cases.\n- Removed use of deprecated system flag, `scheduler_bind_type`, in the\n measurement tool `mstone1`.\n\n Own Id: OTP-9949","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"-","title":"Incompatibilities - Megaco Release Notes","ref":"notes.html#incompatibilities"},{"type":"extras","doc":"Version 3.16 supports code replacement in runtime from/to version 3.15.1.1,\n3.15.1 and 3.15.","title":"Megaco 3.16 - Megaco Release Notes","ref":"notes.html#megaco-3-16"},{"type":"extras","doc":"- Minor improvements to the measurement tool `mstone1`.\n\n Own Id: OTP-9604\n\n- ASN.1 no longer makes use of a driver to accelerate encode/decode, instead it\n uses NIFs. The encoding config option is _still_ the same, i.e. `driver`.\n\n Own Id: OTP-9672\n\n- The profiling test tool has been rewritten.\n\n Håkan Mattsson\n\n Own Id: OTP-9679\n\n- The flex driver has been updated to support the new driver format (changed to\n enable 64-bit aware drivers).\n\n Own Id: OTP-9795","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"-","title":"Incompatibilities - Megaco Release Notes","ref":"notes.html#incompatibilities"},{"type":"extras","doc":"Version 3.15.1.1 supports code replacement in runtime from/to version 3.15.1 and\n3.15.","title":"Megaco 3.15.1.1 - Megaco Release Notes","ref":"notes.html#megaco-3-15-1-1"},{"type":"extras","doc":"- Correct various XML errors.\n\n Own Id: OTP-9550","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"Version 3.15.1 supports code replacement in runtime from/to version 3.15,\n3.14.1.1, 3.14.1 and 3.14.","title":"Megaco 3.15.1 - Megaco Release Notes","ref":"notes.html#megaco-3-15-1"},{"type":"extras","doc":"-","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- Fixing miscellaneous things detected by dialyzer.\n\n Own Id: OTP-9075","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Megaco 3.15 - Megaco Release Notes","ref":"notes.html#megaco-3-15"},{"type":"extras","doc":"- Fixing auto-import issues.\n\n Own Id: OTP-8842","title":"Improvements and New Features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"Version 3.14.1.1 supports code replacement in runtime from/to version 3.14.1,\n3.14, 3.13, 3.12 and 3.11.3.","title":"Megaco 3.14.1.1 - Megaco Release Notes","ref":"notes.html#megaco-3-14-1-1"},{"type":"extras","doc":"- Updated the [performance](megaco_performance.md) chapter.\n\n Own Id: OTP-8696","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"Version 3.14.1 supports code replacement in runtime from/to version 3.14, 3.13,\n3.12 and 3.11.3.","title":"Megaco 3.14.1 - Megaco Release Notes","ref":"notes.html#megaco-3-14-1"},{"type":"extras","doc":"- A minor compiler related performance improvement.\n\n Own Id: OTP-8561","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- A race condition when, during high load, processing both the original and a\n resent message and delivering this as two separate messages to the user.\n\n Note that this solution only protects against multiple reply deliveries\\!\n\n Own Id: OTP-8529\n\n Aux Id: Seq 10915\n\n- Fix shared libraries installation.\n\n The flex shared lib(s) were incorrectly installed as data files.\n\n Peter Lemenkov\n\n Own Id: OTP-8627\n\n- Eliminated a possible race condition while creating pending counters.\n\n Own Id: OTP-8634\n\n Aux Id: Seq 11579","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"Version 3.14 supports code replacement in runtime from/to version 3.13, 3.12 and\n3.11.3.","title":"Megaco 3.14 - Megaco Release Notes","ref":"notes.html#megaco-3-14"},{"type":"extras","doc":"- Various changes to configure and makefile(s) to facilitate cross compilation\n (and other build system improvements).\n\n Own Id: OTP-8323\n\n- Added a help target in the test Makefile to explain the most useful make\n targets, used when testing the application using the test-server provided with\n megaco.\n\n Own Id: OTP-8362\n\n- Adapted megaco_filter to the new internal format.\n\n Own Id: OTP-8403","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- Callbacks, when the callback module is unknown (undefined), results in warning\n messages.\n\n A race condition scenario. As part of a cancelation operation, replies with\n waiting acknowledgements is cancelled. This includes informing the user (via a\n call to the handle_trans_ack callback function). It is possible that at this\n point the connection data has been removed, which makes it impossible for\n megaco to perform this operation, resulting in the warning message. The\n solution is to also store the callback module with the other reply\n information, to be used when cleaning up after a cancelation.\n\n Own Id: OTP-8328\n\n Aux Id: Seq 11384","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"Version 3.13 supports code replacement in runtime from/to version 3.12 and\n3.11.3.","title":"Megaco 3.13 - Megaco Release Notes","ref":"notes.html#megaco-3-13"},{"type":"extras","doc":"- A minor optimization by using ets:update_element instead of ets:insert for\n some table updates.\n\n Own Id: OTP-8239\n\n- The documentation is now built with open source tools (_xsltproc_ and _fop_)\n that exists on most platforms. One visible change is that the frames are\n removed.\n\n Own Id: OTP-8249","title":"Improvements and new features - Megaco Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"-","title":"Fixed bugs and malfunctions - Megaco Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"-","title":"Incompatibilities - Megaco Release Notes","ref":"notes.html#incompatibilities"},{"type":"extras","doc":"\n# Introduction\n\nMegaco/H.248 is a protocol for control of elements in a physically decomposed\nmultimedia gateway, enabling separation of call control from media conversion. A\nMedia Gateway Controller (MGC) controls one or more Media Gateways (MG).\n\nThis version of the stack supports version 1, 2 and 3 as defined by:\n\n- version 1 - RFC 3525 and H.248-IG (v10-v13)\n- version 2 - draft-ietf-megaco-h248v2-04 & H.248.1 v2 Corrigendum 1 (03/2004)\n- version 3 - Full version 3 as defined by ITU H.248.1 (09/2005) (including\n segments)\n\nThe semantics of the protocol has jointly been defined by two standardization\nbodies:\n\n- IETF - which calls the protocol Megaco\n- ITU - which calls the protocol H.248","title":"Introduction","ref":"megaco_intro.html"},{"type":"extras","doc":"This manual describes the Megaco application, as a component of the Erlang/Open\nTelecom Platform development environment. It is assumed that the reader is\nfamiliar with the Erlang Development Environment, which is described in a\nseparate User's Guide.","title":"Scope and Purpose - Introduction","ref":"megaco_intro.html#scope-and-purpose"},{"type":"extras","doc":"The following prerequisites are required for understanding the material in the\nMegaco User's Guide:\n\n- the basics of the Megaco/H.248 protocol\n- the basics of the Abstract Syntax Notation One (ASN.1)\n- familiarity with the Erlang system and Erlang programming\n\nThe application requires Erlang/OTP release R10B or later.","title":"Prerequisites - Introduction","ref":"megaco_intro.html#prerequisites"},{"type":"extras","doc":"In addition to this introductory chapter, the Megaco User's Guide contains the\nfollowing chapters:\n\n- Chapter 2: \"Architecture\" describes the architecture and typical usage of the\n application.\n- Chapter 3: \"Internal form and its encodings\" describes the internal form of\n Megaco/H.248 messages and its various encodings.\n- Chapter 4: \"Transport mechanisms\" describes how different mechanisms can be\n used to transport the Megaco/H.248 messages.\n- Chapter 5: \"Debugging\" describes tracing and debugging.","title":"About This Manual - Introduction","ref":"megaco_intro.html#about-this-manual"},{"type":"extras","doc":"Refer to the following documentation for more information about Megaco/H.248 and\nabout the Erlang/OTP development system:\n\n- [version 1, RFC 3525](https://www.erlang.org/doc/standard/rfc3525.txt)\n- [old version 1, RFC 3015](http://www.ietf.org/rfc/rfc3015.txt)\n- [Version 2 Corrigendum 1](https://web.archive.org/web/20100704020645/http://www.erlang.org/project/megaco/standard/H.248.1-Corr1-200403.doc)\n- [version 2, draft-ietf-megaco-h248v2-04](https://web.archive.org/web/20100620185420/http://erlang.org/project/megaco/standard/draft-ietf-megaco-h248v2-04.txt)\n- [H.248.1 version 3](http://www.itu.int/)\n- the ASN.1 application User's Guide\n- the Megaco application Reference Manual\n- Concurrent Programming in Erlang, 2nd Edition (1996), Prentice-Hall, ISBN\n 0-13-508301-X.","title":"Where to Find More Information - Introduction","ref":"megaco_intro.html#where-to-find-more-information"},{"type":"extras","doc":"\n# Architecture","title":"Architecture","ref":"megaco_architecture.html"},{"type":"extras","doc":"Megaco is a (master/slave) protocol for control of gateway functions at the edge\nof the packet network. Examples of this is IP-PSTN trunking gateways and analog\nline gateways. The main function of Megaco is to allow gateway decomposition\ninto a call agent (call control) part (known as Media Gateway Controller, MGC) -\nmaster, and an gateway interface part (known as Media Gateway, MG) - slave. The\nMG has no call control knowledge and only handle making the connections and\nsimple configurations.\n\nSIP and H.323 are peer-to-peer protocols for call control (valid only for some\nof the protocols within H.323), or more generally multi-media session protocols.\nThey both operate at a different level (call control) from Megaco in a\ndecomposed network, and are therefor not aware of whether or not Megaco is being\nused underneath.\n\n![Network architecture](assets/megaco_sys_arch.gif \"Network architecture\")\n\nMegaco and peer protocols are complementary in nature and entirely compatible\nwithin the same system. At a system level, Megaco allows for\n\n- overall network cost and performance optimization\n- protection of investment by isolation of changes at the call control layer\n- freedom to geographically distribute both call function and gateway function\n- adaption of legacy equipment","title":"Network view - Architecture","ref":"megaco_architecture.html#network-view"},{"type":"extras","doc":"This Erlang/OTP application supplies a framework for building applications that\nneeds to utilize the Megaco/H.248 protocol.\n\nWe have introduced the term \"user\" as a generic term for either an MG or an MGC,\nsince most of the functionality we support, is common for both MG's and MGC's. A\n(local) user may be configured in various ways and it may establish any number\nof connections to its counterpart, the remote user. Once a connection has been\nestablished, the connection is supervised and it may be used for the purpose of\nsending messages. N.B. according to the standard an MG is connected to at most\none MGC, while an MGC may be connected to any number of MG's.\n\nFor the purpose of managing \"virtual MG's\", one Erlang node may host any number\nof MG's. In fact it may host a mix of MG's and MGC's. You may say that an Erlang\nnode may host any number of \"users\".\n\nThe protocol engine uses callback modules to handle various things:\n\n- encoding callback modules - handles the encoding and decoding of messages.\n Several modules for handling different encodings are included, such as ASN.1\n BER, pretty well indented text, compact text and some others. Others may be\n written by you.\n- transport callback modules - handles sending and receiving of messages.\n Transport modules for TCP/IP and UDP/IP are included and others may be written\n by you.\n- user callback modules - the actual implementation of an MG or MGC. Most of the\n functions are intended for handling of a decoded transaction (request, reply,\n acknowledgement), but there are others that handles connect, disconnect and\n errors cases.\n\nEach connection may have its own configuration of callback modules, re-send\ntimers, transaction id ranges etc. and they may be re-configured on-the-fly.\n\nIn the API of Megaco, a user may explicitly send action requests, but generation\nof transaction identifiers, the encoding and actual transport of the message to\nthe remote user is handled automatically by the protocol engine according to the\nactual connection configuration. Megaco messages are not exposed in the API.\n\nOn the receiving side the transport module receives the message and forwards it\nto the protocol engine, which decodes it and invokes user callback functions for\neach transaction. When a user has handled its action requests, it simply returns\na list of action replies (or a message error) and the protocol engine uses the\nencoding module and transport module to compose and forward the message to the\noriginating user.\n\nThe protocol stack does also handle things like automatic sending of\nacknowledgements, pending transactions, re-send of messages, supervision of\nconnections etc.\n\nIn order to provide a solution for scalable implementations of MG's and MGC's, a\nuser may be distributed over several Erlang nodes. One of the Erlang nodes is\nconnected to the physical network interface, but messages may be sent from other\nnodes and the replies are automatically forwarded back to the originating node.","title":"General - Architecture","ref":"megaco_architecture.html#general"},{"type":"extras","doc":"Here a system configuration with an MG and MGC residing in one Erlang node each\nis outlined:\n\n![Single node config](assets/single_node_config.gif \"Single node config\")","title":"Single node config - Architecture","ref":"megaco_architecture.html#single-node-config"},{"type":"extras","doc":"In a larger system with a user (in this case an MGC) distributed over several\nErlang nodes, it looks a little bit different. Here the encoding is performed on\nthe originating Erlang node (1) and the binary is forwarded to the node (2) with\nthe physical network interface. When the potential message reply is received on\nthe interface on node (2), it is decoded there and then different actions will\nbe taken for each transaction in the message. The transaction reply will be\nforwarded in its decoded form to the originating node (1) while the other types\nof transactions will be handled locally on node (2).\n\nTimers and re-send of messages will be handled on locally on one node, that is\nnode(1), in order to avoid unnecessary transfer of data between the Erlang\nnodes.\n\n![Distributes node config](assets/distr_node_config.gif \"Distributes node config\")","title":"Distributed config - Architecture","ref":"megaco_architecture.html#distributed-config"},{"type":"extras","doc":"The typical round-trip of a message can be viewed as follows. Firstly we view\nthe call flow on the originating side:\n\n![Message Call Flow (originating side)](assets/call_flow.gif \"Message Call Flow (originating side)\")\n\nThen we continue with the call flow on the destination side:\n\n![Message Call Flow (destination side)](assets/call_flow_cont.gif \"Message Call Flow (destination side)\")","title":"Message round-trip call flow - Architecture","ref":"megaco_architecture.html#message-round-trip-call-flow"},{"type":"extras","doc":"\n# Running the stack","title":"Running the stack","ref":"megaco_run.html"},{"type":"extras","doc":"A user may have a number of \"virtual\" connections to other users. An MG is\nconnected to at most one MGC, while an MGC may be connected to any number of\nMG's. For each connection the user selects a transport service, an encoding\nscheme and a user callback module.\n\nAn MGC must initiate its transport service in order to listen to MG's trying to\nconnect. How the actual transport is initiated is outside the scope of this\napplication. However a send handle (typically a socket id or host and port) must\nbe provided from the transport service in order to enable us to send the message\nto the correct destination. We do however not assume anything about this, from\nour point of view, opaque handle. Hopefully it is rather small since it will\npassed around the system between processes rather frequently.\n\nA user may either be statically configured in a .config file according to the\napplication concept of Erlang/OTP or dynamically started with the configuration\nsettings as arguments to megaco:start_user/2. These configuration settings may\nbe updated later on with megaco:update_conn_info/2.\n\nThe function megaco:connect/4 is used to tell the Megaco application about which\ncontrol process it should supervise, which MID the remote user has, which\ncallback module it should use to send messages etc. When this \"virtual\"\nconnection is established the user may use megaco:call/3 and megaco:cast/3 in\norder to send messages to the other side. Then it is up to the MG to send its\nfirst Service Change Request message after applying some clever algorithm in\norder to fight the problem with startup avalanche (as discussed in the RFC).\n\nThe originating user will wait for a reply or a timeout (defined by the\nrequest_timer). When it receives the reply this will optionally be acknowledged\n(regulated by auto_ack), and forwarded to the user. If an interim pending reply\nis received, the long_request_timer will be used instead of the usual\nrequest_timer, in order to enable avoidance of spurious re-sends of the request.\n\nOn the destination side the transport service waits for messages. Each message\nis forwarded to the Megaco application via the megaco:receive_message/4 callback\nfunction. The transport service may or may not provide means for blocking and\nunblocking the reception of the incoming messages.\n\nIf a message is received before the \"virtual\" connection has been established,\nthe connection will be setup automatically. An MGC may be real open minded and\ndynamically decide which encoding and transport service to use depending on how\nthe transport layer contact is performed. For IP transports two ports are\nstandardized, one for textual encoding and one for binary encoding. If for\nexample an UDP packet was received on the text port it would be possible to\ndecide encoding and transport on the fly.\n\nAfter decoding a message various user callback functions are invoked in order to\nallow the user to act properly. See the megaco_user module for more info about\nthe callback arguments.\n\nWhen the user has processed a transaction request in its callback function, the\nMegaco application assembles a transaction reply, encodes it using the selected\nencoding module and sends the message back by invoking the callback function:\n\n- SendMod:send_message(SendHandle, ErlangBinary)\n\nRe-send of messages, handling pending transactions, acknowledgements etc. is\nhandled automatically by the Megaco application but the user is free to override\nthe default behaviour by the various configuration possibilities. See\nmegaco:update_user_info/2 and megaco:update_conn_info/2 about the possibilities.\n\nWhen connections gets broken (that is explicitly by megaco:disconnect/2 or when\nits controlling process dies) a user callback function is invoked in order to\nallow the user to re-establish the connection. The internal state of kept\nmessages, re-send timers etc. is not affected by this. A few re-sends will of\ncourse fail while the connection is down, but the automatic re-send algorithm\ndoes not bother about this and eventually when the connection is up and running\nthe messages will be delivered if the timeouts are set to be long enough. The\nuser has the option of explicitly invoking megaco:cancel/2 to cancel all\nmessages for a connection.\n\n[](){: #mgc_startup_call_flow }","title":"Starting - Running the stack","ref":"megaco_run.html#starting"},{"type":"extras","doc":"In order to prepare the MGC for the reception of the initial message, hopefully\na Service Change Request, the following needs to be done:\n\n- Start the Megaco application.\n- Start the MGC user. This may either be done explicitly with\n megaco:start_user/2 or implicitly by providing the -megaco users configuration\n parameter.\n- Initiate the transport service and provide it with a receive handle obtained\n from megaco:user_info/2.\n\nWhen the initial message arrives the transport service forwards it to the\nprotocol engine which automatically sets up the connection and invokes\nUserMod:handle_connect/2 before it invokes UserMod:handle_trans_request/3 with\nthe Service Change Request like this:\n\n![MGC Startup Call Flow](assets/MGC_startup_call_flow.gif \"MGC Startup Call Flow\")\n\n[](){: #mg_startup_call_flow }","title":"MGC startup call flow - Running the stack","ref":"megaco_run.html#mgc-startup-call-flow"},{"type":"extras","doc":"In order to prepare the MG for the sending of the initial message, hopefully a\nService Change Request, the following needs to be done:\n\n- Start the Megaco application.\n- Start the MG user. This may either be done explicitly with megaco:start_user/2\n or implicitly by providing the -megaco users configuration parameter.\n- Initiate the transport service and provide it with a receive handle obtained\n from megaco:user_info/2.\n- Setup a connection to the MGC with megaco:connect/4 and provide it with a\n receive handle obtained from megaco:user_info/2.\n\nIf the MG has been provisioned with the MID of the MGC it can be given as the\nRemoteMid parameter to megaco:connect/4 and the call flow will look like this:\n\n![MG Startup Call Flow](assets/MG_startup_call_flow.gif \"MG Startup Call Flow\")\n\nIf the MG cannot be provisioned with the MID of the MGC, the MG can use the atom\n'preliminary_mid' as the RemoteMid parameter to megaco:connect/4 and the call\nflow will look like this:\n\n![MG Startup Call Flow (no MID)](assets/MG-startup_flow_noMID.gif \"MG Startup Call Flow (no MID)\")\n\n[](){: #config_megaco }","title":"MG startup call flow - Running the stack","ref":"megaco_run.html#mg-startup-call-flow"},{"type":"extras","doc":"There are three kinds of configuration:\n\n- User info - Information related to megaco users. Read/Write.\n\n A User is an entity identified by a MID, e.g. a MGC or a MG.\n\n This information can be retrieved using\n [megaco:user_info](`megaco:user_info/2`).\n\n- Connection info - Information regarding connections. Read/Write.\n\n This information can be retrieved using\n [megaco:conn_info](`megaco:conn_info/2`).\n\n- System info - System wide information. Read only.\n\n This information can be retrieved using\n [megaco:system_info](`megaco:system_info/1`).\n\n[](){: #initial_config }","title":"Configuring the Megaco stack - Running the stack","ref":"megaco_run.html#configuring-the-megaco-stack"},{"type":"extras","doc":"The initial configuration of the Megaco should be defined in the Erlang system\nconfiguration file. The following configured parameters are defined for the\nMegaco application:\n\n- `users = [{Mid, [user_config()]}].`\n\n Each user is represented by a tuple with the Mid of the user and a list of\n config parameters (each parameter is in turn a tuple: `{Item, Value}`).\n\n- `scanner = flex | {Module, Function, Arguments, Modules}`\n\n - `flex` will result in the start of the flex scanner with default options.\n - The MFA alternative makes it possible for Megaco to start and supervise a\n scanner written by the user (see `supervisor:start_child` for an explanation\n of the parameters).\n\nSee also\n[Configuration of text encoding module(s)](megaco_encode.md#text_config) for\nmore info.\n\n[](){: #changing_config }","title":"Initial configuration - Running the stack","ref":"megaco_run.html#initial-configuration"},{"type":"extras","doc":"The configuration can be changed during runtime. This is done with the functions\n[megaco:update_user_info](`megaco:update_user_info/3`) and\n[megaco:update_conn_info](`megaco:update_conn_info/3`)\n\n[](){: #transaction_sender }","title":"Changing the configuration - Running the stack","ref":"megaco_run.html#changing-the-configuration"},{"type":"extras","doc":"The transaction sender is a process (one per connection), which handle all\ntransaction sending, if so configured (see\n[megaco:user_info](`megaco:user_info/2`) and\n[megaco:conn_info](`megaco:conn_info/2`)).\n\nThe purpose of the transaction sender is to accumulate transactions for a more\nefficient message sending. The transactions that are accumulated are transaction\nrequest and transaction ack. For transaction ack's the benefit is quite large,\nsince the transactions are small and it is possible to have ranges (which means\nthat transaction acks for transactions 1, 2, 3 and 4 can be sent as a range 1-4\nin one transaction ack, instead of four separate transactions).\n\nThere are a number of configuration parameter's that control the operation of\nthe transaction sender. In principle, a message with everything stored (ack's\nand request's) is sent from the process when:\n\n- When `trans_timer` expires.\n- When `trans_ack_maxcount` number of ack's has been received.\n- When `trans_req_maxcount` number of requests's has been received.\n- When the size of all received requests exceeds `trans_req_maxsize`.\n- When a reply transaction is sent.\n- When a pending transaction is sent.\n\nWhen something is to be sent, everything is packed into one message, unless the\ntrigger was a reply transaction and the added size of the reply and all the\nrequests is greater then `trans_req_maxsize`, in which case the stored\ntransactions are sent first in a separate message and the reply in another\nmessage.\n\nWhen the transaction sender receives a request which is already \"in storage\"\n(indicated by the transaction id) it is assumed to be a resend and everything\nstored is sent. This could happen if the values of the `trans_timer` and the\n`request_timer` is not properly chosen.\n\n[](){: #segment_reply }","title":"The transaction sender - Running the stack","ref":"megaco_run.html#the-transaction-sender"},{"type":"extras","doc":"In version 3 of the megaco standard, the concept of `segmentation package` was\nintroduced. Simply, this package defines a procedure to segment megaco messages\n(transaction replies) when using a transport that does not automatically do this\n(e.g. UDP).\n\nAlthough it would be both pointless and counterproductive to use segmentation on\na transport that already does this (e.g. TCP), the megaco application does not\ncheck this. Instead, it is up to the user to configure this properly.\n\n- Receiving segmented messages:\n\n This is handled automatically by the megaco application. There is however one\n thing that need to be configured by the user, the\n [segment_recv_timer](`megaco:user_info/2`) option.\n\n Note that the segments are delivered to the user differently depending on\n which function is used to issue the original request. When issuing the request\n using the [megaco:cast](`megaco:cast/3`) function, the segments are delivered\n to the user via the [handle_trans_reply](`c:megaco_user:handle_trans_reply/5`) callback\n function one at a time, as they arrive. But this obviously doe not work for\n the [megaco:call](`megaco:call/3`) function. In this case, the segments are\n accumulated and then delivered all at once as the function returns.\n\n- Sending segmented messages:\n\n This is also handled automatically by the megaco application. First of all,\n segmentation is only attempted if so configured, see the\n [segment_send](`megaco:user_info/2`) option. Secondly, megaco relies on the\n ability of the used codec to encode action replies, which is the smallest\n component the megaco application handles when segmenting. Thirdly, the reply\n will be segmented only if the sum of the size of the action replies (plus an\n arbitrary message header size) are greater then the specified max message size\n (see the [max_pdu_size](`megaco:user_info/2`) option). Finally, if\n segmentation is decided, then each action reply will make up its own (segment)\n message.","title":"Segmentation of transaction replies - Running the stack","ref":"megaco_run.html#segmentation-of-transaction-replies"},{"type":"extras","doc":"\n# Internal form and its encodings\n\nThis version of the stack is compliant with:\n\n- Megaco/H.248 version 1 (RFC3525) updated according to Implementors Guide\n version 10-13.\n- Megaco/H.248 version 2 as defined by draft-ietf-megaco-h248v2-04 updated\n according to Implementors Guide version 10-13.\n- Megaco/H.248 version 3 as defined by ITU H.248.1 (09/2005).","title":"Internal form and its encodings","ref":"megaco_encode.html"},{"type":"extras","doc":"We use the same internal form for both the binary and text encoding. Our\ninternal form of Megaco/H.248 messages is heavily influenced by the internal\nformat used by ASN.1 encoders/decoders:\n\n- \"SEQUENCE OF\" is represented as a list.\n- \"CHOICE\" is represented as a tagged tuple with size 2.\n- \"SEQUENCE\" is represented as a record, defined in\n \"megaco/include/megaco_message_v1.hrl\".\n- \"OPTIONAL\" is represented as an ordinary field in a record which defaults to\n 'asn1_NOVALUE', meaning that the field has no value.\n- \"OCTET STRING\" is represented as a list of unsigned integers.\n- \"ENUMERATED\" is represented as a single atom.\n- \"BIT STRING\" is represented as a list of atoms.\n- \"BOOLEAN\" is represented as the atom 'true' or 'false'.\n- \"INTEGER\" is represented as an integer.\n- \"IA5String\" is represented as a list of integers, where each integer is the\n ASCII value of the corresponding character.\n- \"NULL\" is represented as the atom 'NULL'.\n\nIn order to fully understand the internal form you must get hold on a ASN.1\nspecification for the Megaco/H.248 protocol, and apply the rules above. Please,\nsee the documentation of the ASN.1 compiler in Erlang/OTP for more details of\nthe semantics in mapping between ASN.1 and the corresponding internal form.\n\nObserve that the 'TerminationId' record is not used in the internal form. It has\nbeen replaced with a megaco_term_id record (defined in\n\"megaco/include/megaco.hrl\").","title":"Internal form of messages - Internal form and its encodings","ref":"megaco_encode.html#internal-form-of-messages"},{"type":"extras","doc":"The Megaco/H.248 standard defines both a plain text encoding and a binary\nencoding (ASN.1 BER) and we have implemented encoders and decoders for both. We\ndo in fact supply five different encoding/decoding modules.\n\nIn the text encoding, implementors have the choice of using a mix of short and\nlong keywords. It is also possible to add white spaces to improve readability.\nWe use the term compact for text messages with the shortest possible keywords\nand no optional white spaces, and the term pretty for a well indented text\nformat using long keywords and an indentation style like the text examples in\nthe Megaco/H.248 specification).\n\nHere follows an example of a text message to give a feeling of the difference\nbetween the pretty and compact versions of text messages. First the pretty, well\nindented version with long keywords:\n\n```c\n MEGACO/1 [124.124.124.222]\n Transaction = 9998 {\n Context = - {\n ServiceChange = ROOT {\n Services {\n Method = Restart,\n ServiceChangeAddress = 55555,\n Profile = ResGW/1,\n Reason = \"901 Cold Boot\"\n }\n }\n }\n }\n```\n\nThen the compact version without indentation and with short keywords:\n\n```text\n\n !/1 [124.124.124.222]\n T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE=\"901 Cold Boot\"}}}}\n```\n\nAnd the programmers view of the same message. First a list of ActionRequest\nrecords are constructed and then it is sent with one of the send functions in\nthe API:\n\n```erlang\n Prof = #'ServiceChangeProfile'{profileName = \"resgw\", version = 1},\n Parm = #'ServiceChangeParm'{serviceChangeMethod = restart,\n serviceChangeAddress = {portNumber, 55555},\n serviceChangeReason = \"901 Cold Boot\",\n serviceChangeProfile = Prof},\n Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],\n serviceChangeParms = Parm},\n Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,\n commandRequests = {serviceChangeReq, Req}}],\n megaco:call(ConnHandle, Actions, Config).\n```\n\nAnd finally a print-out of the entire internal form:\n\n```erlang\n {'MegacoMessage',\n asn1_NOVALUE,\n {'Message',\n 1,\n {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},\n {transactions,\n [\n {transactionRequest,\n {'TransactionRequest',\n 9998,\n [{'ActionRequest',\n 0,\n asn1_NOVALUE,\n asn1_NOVALUE,\n [\n {'CommandRequest',\n {serviceChangeReq,\n {'ServiceChangeRequest',\n [\n {megaco_term_id, false, [\"root\"]}],\n {'ServiceChangeParm',\n restart,\n {portNumber, 55555},\n asn1_NOVALUE,\n {'ServiceChangeProfile', \"resgw\", version = 1},\n \"901 MG Cold Boot\",\n asn1_NOVALUE,\n asn1_NOVALUE,\n asn1_NOVALUE\n }\n }\n },\n asn1_NOVALUE,\n asn1_NOVALUE\n }\n ]\n }\n ]\n }\n }\n ]\n }\n }\n }\n```\n\nThe following encoding modules are provided:\n\n- megaco_pretty_text_encoder - encodes messages into pretty text format, decodes\n both pretty as well as compact text.\n- megaco_compact_text_encoder - encodes messages into compact text format,\n decodes both pretty as well as compact text.\n- megaco_binary_encoder - encode/decode ASN.1 BER messages. This encoder\n implements the fastest of the BER encoders/decoders. Recommended binary codec.\n- megaco_ber_encoder - encode/decode ASN.1 BER messages.\n- megaco_per_encoder - encode/decode ASN.1 PER messages. N.B. that this format\n is not included in the Megaco standard.\n- megaco_erl_dist_encoder - encodes messages into Erlangs distribution format.\n It is rather verbose but encoding and decoding is blinding fast. N.B. that\n this format is not included in the Megaco standard.\n\n[](){: #erl_dist_config }","title":"The different encodings - Internal form and its encodings","ref":"megaco_encode.html#the-different-encodings"},{"type":"extras","doc":"The encoding_config of the megaco_erl_dist_encoder module may be one of these:\n\n- `[]` \\- Encodes the messages to the standard distribution format. It is rather\n verbose but encoding and decoding is blinding fast.\n- `[megaco_compressed]` \\- Encodes the messages to the standard distribution\n format after an internal transformation. It is less verbose, but the total\n time of the encoding and decoding will on the other hand be somewhat slower\n (see the [performance](megaco_performance.md) chapter for more info).\n- `[{megaco_compressed, Module}]` \\- Works in the same way as the\n megaco_compressed config parameter, only here the user provide their own\n compress module. This module must implement the `m:megaco_edist_compress`\n behaviour.\n- `[compressed]` \\- Encodes the messages to a compressed form of the standard\n distribution format. It is less verbose, but the encoding and decoding will on\n the other hand be slower.\n\n[](){: #text_config }","title":"Configuration of Erlang distribution encoding module - Internal form and its encodings","ref":"megaco_encode.html#configuration-of-erlang-distribution-encoding-module"},{"type":"extras","doc":"When using text encoding(s), there is actually two different configs controlling\nwhat software to use:\n\n- `[]` \\- An empty list indicates that the erlang scanner should be used.\n- `[{flex, port()}]` \\- Use the flex scanner when decoding (not optimized for\n SMP). See [initial configuration](megaco_run.md#initial_config) for more info.\n- `[{flex, ports()}]` \\- Use the flex scanner when decoding (optimized for SMP).\n See [initial configuration](megaco_run.md#initial_config) for more info.\n\nThe Flex scanner is a Megaco scanner written as a linked in driver (in C). There\nare two ways to get this working:\n\n- Let the Megaco stack start the flex scanner (load the driver).\n\n To make this happen the megaco stack has to be configured:\n\n - Add the `{scanner, flex}` (or similar) directive to an Erlang system config\n file for the megaco app (see\n [initial configuration](megaco_run.md#initial_config) chapter for details).\n - Retrieve the encoding-config using the [system_info](`megaco:system_info/1`)\n function (with `Item = text_config`).\n - Update the receive handle with the encoding-config (the `encoding_config`\n field).\n\n The benefit of this is that Megaco handles the starting, holding and the\n supervision of the driver and port.\n\n- The Megaco client (user) starts the flex scanner (load the driver).\n\n When starting the flex scanner a port to the linked in driver is created. This\n port has to be owned by a process. This process must not die. If it does the\n port will also terminate. Therefor:\n\n - Create a permanent process. Make sure this process is supervised (so that if\n it does die, this will be noticed).\n - Let this process start the flex scanner by calling the\n `megaco_flex_scanner:start/0,1` function.\n - Retrieve the encoding-config and when initiating the\n `megaco_receive_handle`, set the field `encoding_config` accordingly.\n - Pass the `megaco_receive_handle` to the transport module.\n\n[](){: #binary_config }","title":"Configuration of text encoding module(s) - Internal form and its encodings","ref":"megaco_encode.html#configuration-of-text-encoding-module-s"},{"type":"extras","doc":"When using binary encoding, the structure of the termination id's needs to be\nspecified.\n\n- `[native]` \\- skips the transformation phase, i.e. the decoded message(s) will\n not be transformed into our internal form.\n- `[integer()]` \\- A list containing the size (the number of bits) of each\n level. Example: `[3,8,5,8]`.\n- `t:integer/0` \\- Number of one byte (8 bits) levels. N.B. This is currently\n converted into the previous config. Example: `3` (`[8,8,8]`).\n\n[](){: #handling_versions }","title":"Configuration of binary encoding module(s) - Internal form and its encodings","ref":"megaco_encode.html#configuration-of-binary-encoding-module-s"},{"type":"extras","doc":"There are two ways to handle the different megaco encoding versions. Either\nusing _dynamic version detection_ (only valid for for incoming messages) or by\n_explicit version_ setting in the connection info.\n\nFor incoming messages:\n\n- Dynamic version detection\n\n Set the protocol version in the megaco_receive_handle to `dynamic` (this is\n the default). \n This works for those codecs that support partial decode of the version,\n currently _text_, and ber_bin (`megaco_binary_encoder` and\n `megaco_ber_bin_encoder`). \n This way the decoder will detect which version is used and then use the proper\n decoder.\n\n- Explicit version\n\n Explicitly set the actual protocol version in the megaco_receive_handle. \n Start with version 1. When the initial service change has been performed and\n version 2 has been negotiated, upgrade the megaco_receive_handle of the\n transport process (control_pid) to version 2. See\n [megaco_tcp](`megaco_tcp:upgrade_receive_handle/2`) and\n [megaco_udp](`megaco_udp:upgrade_receive_handle/2`). \n Note that if `udp` is used, the same transport process could be used for\n several connections. This could make upgrading impossible. \n For codecs that does not support partial decode of the version, currently\n `megaco_ber_encoder` and `megaco_per_encoder`, `dynamic` will revert to\n version 1.\n\nFor outgoing messages:\n\n- Update the connection info protocol_version.\n- Override protocol version when sending a message by adding the item\n `{protocol_version, integer()}` to the Options. See [call](`megaco:call/3`) or\n [cast](`megaco:cast/3`). \n Note that this does not effect the messages that are sent autonomously by the\n stack. They use the protocol_version of the connection info.","title":"Handling megaco versions - Internal form and its encodings","ref":"megaco_encode.html#handling-megaco-versions"},{"type":"extras","doc":"The encoder callback interface is defined by the `megaco_encoder` behaviour, see\n`m:megaco_encoder`.","title":"Encoder callback functions - Internal form and its encodings","ref":"megaco_encode.html#encoder-callback-functions"},{"type":"extras","doc":"\n# Transport mechanisms","title":"Transport mechanisms","ref":"megaco_transport_mechanisms.html"},{"type":"extras","doc":"The callback interface of the transport module contains several functions. Some\nof which are mandatory while others are only optional:\n\n- `send_message` \\- Send a message. _Mandatory_\n- `block` \\- Block the transport. _Optional_\n\n This function is usefull for flow control.\n\n- `unblock` \\- Unblock the transport. _Optional_\n\nFor more detail, see the `m:megaco_transport` behaviour definition.","title":"Callback interface - Transport mechanisms","ref":"megaco_transport_mechanisms.html#callback-interface"},{"type":"extras","doc":"The Megaco/H.248 application contains implementations for the two protocols\nspecified by the Megaco/H.248 standard; UDP, see `m:megaco_udp`, and TCP/TPKT,\nsee `m:megaco_tcp`.","title":"Examples - Transport mechanisms","ref":"megaco_transport_mechanisms.html#examples"},{"type":"extras","doc":"\n# Implementation examples","title":"Implementation examples","ref":"megaco_examples.html"},{"type":"extras","doc":"In megaco/examples/simple/megaco_simple_mgc.erl there is an example of a simple\nMGC that listens on both text and binary standard ports and is prepared to\nhandle a Service Change Request message to arrive either via TCP/IP or UDP/IP.\nMessages received on the text port are decoded using a text decoder and messages\nreceived on the binary port are decoded using a binary decoder.\n\nThe Service Change Reply is encoded in the same way as the request and sent back\nto the MG with the same transport mechanism UDP/IP or TCP/IP.\n\nAfter this initial service change message the connection between the MG and MGC\nis fully established and supervised.\n\nThe MGC, with its four listeners, may be started with:\n\n```text\n cd megaco/examples/simple\n erl -pa ../../../megaco/ebin -s megaco_filter -s megaco\n megaco_simple_mgc:start().\n```\n\nor simply 'gmake mgc'.\n\nThe -s megaco_filter option to erl implies, the event tracing mechanism to be\nenabled and an interactive sequence chart tool to be started. This may be quite\nuseful in order to visualize how your MGC interacts with the Megaco/H.248\nprotocol stack.\n\nThe event traces may alternatively be directed to a file for later analyze. By\ndefault the event tracing is disabled, but it may dynamically be enabled without\nany need for re-compilation of the code.","title":"A simple Media Gateway Controller - Implementation examples","ref":"megaco_examples.html#a-simple-media-gateway-controller"},{"type":"extras","doc":"In megaco/examples/simple/megaco_simple_mg.erl there is an example of a simple\nMG that connects to an MGC, sends a Service Change Request and waits\nsynchronously for a reply.\n\nAfter this initial service change message the connection between the MG and MGC\nis fully established and supervised.\n\nAssuming that the MGC is started on the local host, four different MG's, using\ntext over TCP/IP, binary over TCP/IP, text over UDP/IP and binary over UDP/IP\nmay be started on the same Erlang node with:\n\n```text\n cd megaco/examples/simple\n erl -pa ../../../megaco/ebin -s megaco_filter -s megaco\n megaco_simple_mg:start().\n```\n\nor simply 'gmake mg'.\n\nIf you \"only\" want to start a single MG which tries to connect an MG on a host\nnamed \"baidarka\", you may use one of these functions (instead of the\nmegaco_simple_mg:start/0 above):\n\n```erlang\n megaco_simple_mg:start_tcp_text(\"baidarka\", []).\n megaco_simple_mg:start_tcp_binary(\"baidarka\", []).\n megaco_simple_mg:start_udp_text(\"baidarka\", []).\n megaco_simple_mg:start_udp_binary(\"baidarka\", []).\n```\n\nThe -s megaco_filter option to erl implies, the event tracing mechanism to be\nenabled and an interactive sequence chart tool to be started. This may be quite\nuseful in order to visualize how your MG interacts with the Megaco/H.248\nprotocol stack.\n\nThe event traces may alternatively be directed to a file for later analyze. By\ndefault the event tracing is disabled, but it may dynamically be enabled without\nany need for re-compilation of the code.","title":"A simple Media Gateway - Implementation examples","ref":"megaco_examples.html#a-simple-media-gateway"},{"type":"extras","doc":"\n# Megaco mib","title":"Megaco mib","ref":"megaco_mib.html"},{"type":"extras","doc":"The Megaco mib is as of yet not standardized and our implementation is based on\n_draft-ietf-megaco-mib-04.txt_. Almost all of the mib cannot easily be\nimplemented by the megaco application. Instead these things should be\nimplemented by a user (of the megaco application).\n\nSo what part of the mib is implemented? Basically the relevant statistic\ncounters of the _MedGwyGatewayStatsEntry_.","title":"Intro - Megaco mib","ref":"megaco_mib.html#intro"},{"type":"extras","doc":"The implementation of the statistic counters is lightweight. I.e. the statistic\ncounters are handled separately by different entities of the application. For\ninstance our two transport module(s) (see [megaco_tcp](`megaco_tcp:get_stats/0`) and\n[megaco_udp](`megaco_udp:get_stats/0`)) maintain their own counters and the\napplication engine (see [megaco](`megaco:get_stats/2`)) maintain its own counters.\n\nThis also means that if a user implement their own transport service then it has\nto maintain its own statistics.","title":"Statistics counters - Megaco mib","ref":"megaco_mib.html#statistics-counters"},{"type":"extras","doc":"Each megaco application maintains its own set of counters. So in a large\n(distributed) MG/MGC it could be necessary to collect the statistics from\nseveral nodes (each) running the megaco application (only one of them with the\ntransport).","title":"Distribution - Megaco mib","ref":"megaco_mib.html#distribution"},{"type":"extras","doc":"\n# Performance comparison","title":"Performance comparison","ref":"megaco_performance.html"},{"type":"extras","doc":"The Megaco/H.248 standard defines both a plain text encoding and a binary\nencoding (ASN.1 BER) and we have implemented encoders and decoders for both. We\ndo supply a bunch of different encoding/decoding modules and the user may in\nfact implement their own (like our erl_dist module). Using a non-standard\nencoding format has its obvious drawbacks, but may be useful in some\nconfigurations.\n\nWe have made four different measurements of our Erlang/OTP implementation of the\nMegaco/H.248 protocol stack, in order to compare our different\nencoders/decoders. The result of each one is summarized in the table below.\n\n| _Codec and config_ | _Size_ | _Encode_ | _Decode_ | _Total_ |\n| ---------------------------------------- | ------ | -------- | -------- | ------- |\n| pretty | 336 | 5 | 12 | 17 |\n| pretty \\[flex] | 336 | 5 | 11 | 16 |\n| compact | 181 | 4 | 10 | 14 |\n| compact \\[flex] | 181 | 4 | 9 | 13 |\n| per bin | 91 | 6 | 6 | 12 |\n| per bin \\[native] | 91 | 4 | 3 | 7 |\n| ber bin | 165 | 6 | 6 | 12 |\n| ber bin \\[native] | 165 | 4 | 3 | 7 |\n| erl_dist | 875 | 2 | 5 | 7 |\n| erl_dist \\[megaco_compressed] | 405 | 1 | 2 | 3 |\n| erl_dist \\[compressed] | 345 | 15 | 9 | 24 |\n| erl_dist \\[megaco_compressed,compressed] | 200 | 11 | 4 | 15 |\n\n_Table: Codec performance_","title":"Comparison of encoder/decoders - Performance comparison","ref":"megaco_performance.html#comparison-of-encoder-decoders"},{"type":"extras","doc":"In Appendix A of the Megaco/H.248 specification (RFC 3525), there are about 30\nmessages that shows a representative call flow. We have also added a few extra\nversion 1, version 2 and version 3 messages. We have used these messages as\nbasis for our measurements. Our figures have not been weighted in regard to how\nfrequent the different kinds of messages that are sent between the media gateway\nand its controller.\n\nThe test compares the following encoder/decoders:\n\n- _pretty_ \\- pretty printed text. In the text encoding, the protocol stack\n implementors have the choice of using a mix of short and long keywords. It is\n also possible to add white spaces to improve readability. The pretty text\n encoding utilizes long keywords and an indentation style like the text\n examples in the Megaco/H.248 specification.\n- _compact_ \\- the compact text encoding uses the shortest possible keywords and\n no optional white spaces.\n- _ber_ \\- ASN.1 BER.\n- _per_ \\- ASN.1 PER. Not standardized as a valid Megaco/H.248 encoding, but\n included for the matter of completeness as its encoding is extremely compact.\n- _erl_dist_ \\- Erlang's native distribution format. Not standardized as a valid\n Megaco/H.248 encoding, but included as a reference due to its well known\n performance characteristics. Erlang is a dynamically typed language and any\n Erlang data structure may be serialized to the erl_dist format by using\n built-in functions.\n\nThe actual encoded messages have been collected in one directory per encoding\ntype, containing one file per encoded message.\n\nHere follows an example of a text message to give a feeling of the difference\nbetween the pretty and compact versions of text messages. First the pretty\nprinted, well indented version with long keywords:\n\n```c\nMEGACO/1 [124.124.124.222]\n Transaction = 9998 {\n Context = - {\n ServiceChange = ROOT {\n Services {\n Method = Restart,\n ServiceChangeAddress = 55555,\n Profile = ResGW/1,\n Reason = \"901 MG Cold Boot\"\n }\n }\n }\n }\n```\n\nThen the compact text version without indentation and with short keywords:\n\n```text\n!/1 [124.124.124.222] T=9998{\n C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE=\"901 MG Cold Boot\"}}}}\n```","title":"Description of encoders/decoders - Performance comparison","ref":"megaco_performance.html#description-of-encoders-decoders"},{"type":"extras","doc":"The measurements has been performed on a Dell Precision 5550 Laptop with a\nIntel(R) Core(TM) i7-10875H CPU @ 2.30GHz, with 40 GB memory and running Ubuntu\n20.04 x86_64, kernel 5.4.0-91-generic. Software versions was open source OTP\n24.2 (megaco-4.2).","title":"Setup - Performance comparison","ref":"megaco_performance.html#setup"},{"type":"extras","doc":"In our measurements we have seen that there are no significant differences in\nmessage sizes between ASN.1 BER and the compact text format. Some care should be\ntaken when using the pretty text style (which is used in all the examples\nincluded in the protocol specification and preferred during debugging sessions)\nsince the messages can then be quite large. If the message size really is a\nserious issue, our per encoder should be used, as the ASN.1 PER format is much\nmore compact than all the other alternatives. Its major drawback is that it is\nhas not been approved as a valid Megaco/H.248 message encoding.\n\nWhen it comes to pure encode/decode performance, it turns out that:\n\n- our fastest binary encoder (ber) is about equal to our fastest text encoder\n (compact).\n- our fastest binary decoder (ber) is about 66% faster than our fastest text\n decoder (compact).\n\nIf the pure encode/decode performance really is a serious issue, our erl_dist\nencoder could be used, as the encoding/decoding of the erlang distribution\nformat is much faster than all the other alternatives. Its major drawback is\nthat it is has not been approved as a valid Megaco/H.248 message encoding.\n\nThere is no performance advantage of building (and using) a non-reentrant flex\nscanner over a reentrant flex scanner (if flex supports building such a\nscanner).\n\n> #### Note {: .info }\n>\n> Please, observe that these performance figures are related to our\n> implementation in Erlang/OTP. Measurements of other implementations using\n> other tools and techniques may of course result in other figures.","title":"Summary - Performance comparison","ref":"megaco_performance.html#summary"},{"type":"extras","doc":"\n# Testing and tools","title":"Testing and tools","ref":"megaco_debug.html"},{"type":"extras","doc":"We have instrumented our code in order to enable tracing. Running the\napplication with tracing deactivated, causes a negligible performance overhead\n(an external call to a function which returns an atom). Activation of tracing\ndoes not require any recompilation of the code, since we rely on Erlang/OTP's\nbuilt in support for dynamic trace activation. In our case tracing of calls to a\ngiven external function.\n\nEvent traces can be viewed in a generic message sequence chart tool, `et`, or as\nstandard output (events are written to stdio).\n\nSee [enable_trace](`megaco:enable_trace/2`),\n[disable_trace](`megaco:disable_trace/0`) and [set_trace](`megaco:set_trace/1`)\nfor more info.","title":"Tracing - Testing and tools","ref":"megaco_debug.html#tracing"},{"type":"extras","doc":"We have included some simple tool(s) for codec measurement (meas), performance\ntests (mstone1 and mstone2) and message transformation.\n\nThe tool(s) are located in the example/meas directory.","title":"Measurement and transformation - Testing and tools","ref":"megaco_debug.html#measurement-and-transformation"},{"type":"extras","doc":"- Erlang/OTP, version 24.2 or later.\n- Version 4.2 or later of _this_ application.\n- Version 5.0.17 or later of the _asn1_ application.\n- The flex libraries. Without it, the flex powered codecs cannot be used.","title":"Requirement - Testing and tools","ref":"megaco_debug.html#requirement"},{"type":"extras","doc":"The results from the measurement run (meas) is four excel-compatible textfiles:\n\n- decode_time.xls -> Decoding result\n- encode_time.xls -> Encoding result\n- total_time.xls -> Total (Decoding+encoding) result\n- message_size.xls -> Message size","title":"Meas results - Testing and tools","ref":"megaco_debug.html#meas-results"},{"type":"extras","doc":"The tool contain four things:\n\n- The transformation module\n- The measurement (meas) module(s)\n- The mstone (mstone1 and mstone2) module(s)\n- The basic message file\n\n#### Message Transformation\n\nThe messages used by the different tools are contained in single message package\nfile (see below for more info). The messages in this file is encoded with just\none codec. During measurement initiation, the messages are read and then\ntransformed to all codec formats used in the measurement.\n\nThe message transformation is done by the transformation module. It is used to\ntransform a set of messages encoded with one codec into the other base codec's.\n\n#### Measurement(s)\n\nThere are two different measurement tools:\n\n- _meas_:\n\n Used to perform codec measurements. That is, to see what kind of performance\n can be expected by the different codecs provided by the megaco application.\n\n The measurement is done by iterating over the decode/encode function for\n approx 2 seconds per message and counting the number of decodes/encodes.\n\n Is best run by modifying the meas.sh.skel skeleton script provided by the\n tool.\n\n To run it manually do the following:\n\n ```erlang\n % erl -pa -pa \n Erlang (BEAM) emulator version 5.6 [source]\n\n Eshell V12.2 (abort with ^G)\n 1> megaco_codec_meas:start().\n ...\n 2> halt().\n ```\n\n or to make it even easier, assuming a measure shall be done on all the codecs\n (as above):\n\n ```text\n % erl -noshell -pa \\\\\n -pa \\\\\n -s megaco_codec_meas -s init stop\n ```\n\n When run as above (this will take some time), the measurement process is done\n as follows:\n\n ```text\n For each codec:\n For each message:\n Read the message from the file\n Detect message version\n Measure decode\n Measure encode\n Write results, encode, decode and total, to file\n ```\n\n- _mstone1 and mstone2_:\n\n These are two different SMP performance monitoring tool(s).\n\n _mstone1_ creates a process for each codec config supported by the megaco\n application and let them run for a specific time (all at the same time),\n encoding and decoding megaco messages. The number of messages processed in\n total is the mstone1(1) value.\n\n There are different ways to run the mstone1 tool, e.g. with or without the use\n of drivers, with _only_ flex-empowered configs.\n\n Is best run by modifying the mstone1.sh.skel skeleton script provided by the\n tool.\n\n The _mstone2_ is similar to the _mstone1_ tool, but in this case, each created\n process makes only _one_ run through the messages and then exits. A soon as a\n process exits, a new process (with the same config and messages) is created to\n takes its place. The number of messages processed in total is the mstone2(1)\n value.\n\nBoth these tools use the message package (time_test.msgs) provided with the\ntool(s), although it can run on any message package as long as it has the same\nstructure.\n\n#### Message package file\n\nThis is simply an erlang compatible text-file with the following structure:\n`{codec_name(), messages_list()}`.\n\n```erlang\ncodec_name() = pretty | compact | ber | per | erlang (how the messages are encoded)\nmessages_list() = [{message_name(), message()}]\nmessage_name() = atom()\nmessage() = binary()\n```\n\nThe codec name is the name of the codec with which all messages in the\n`message_list()` has been encoded.\n\nThis file can be `exported` to a file structure by calling the\n[export_messages](`m:megaco_codec_transform#export_messages`) function. This can\nbe usefull if a measurement shall be done with an external tool. Exporting the\nmessages creates a directory tree with the following structure:\n\n```text\n /pretty/ \n compact/\n per/\n ber/ \n erlang/\n```\n\nThe file includes both version 1, 2 and version 3 messages.","title":"Instruction - Testing and tools","ref":"megaco_debug.html#instruction"},{"type":"extras","doc":"#### Binary codecs\n\nThere are two basic ways to use the binary encodings: With package related name\nand termination id transformation (the 'native' encoding config) or without.\nThis transformation converts package related names and termination id's to a\nmore convenient internal form (equivalent with the decoded text message).\n\nThe transformation is done \\_after\\_ the actual decode has been done.\n\nTherefor in the tests, binary codecs are tested with two different encoding\nconfigs to determine exactly how the different options effect the performance:\nwith transformation ([]) and without transformation (\\[native]).\n\n#### Included test messages\n\nSome of these messages are ripped from the call flow examples in an old version\nof the RFC and others are created to test a specific feature of megaco.\n\n#### Measurement tool directory name\n\nBe sure _not_ no name the directory containing the measurement binaries starting\nwith 'megaco-', e.g. megaco-meas. This will confuse the erlang application\nloader (erlang applications are named, e.g. megaco-5.2).","title":"Notes - Testing and tools","ref":"megaco_debug.html#notes"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/megaco-4.7/doc/html/dist/search_data-FEFB7412.js b/prs/9277/lib/megaco-4.7/doc/html/dist/search_data-FEFB7412.js new file mode 100644 index 0000000000000..6ae630412dcbe --- /dev/null +++ b/prs/9277/lib/megaco-4.7/doc/html/dist/search_data-FEFB7412.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","title":"megaco","doc":"Main API of the Megaco application\n\nInterface module for the Megaco application","ref":"megaco.html"},{"type":"function","title":"megaco.call/3","doc":"Sends one or more transaction request(s) and waits for the reply.\n\nWhen sending one transaction in a message, `ActionRequests` should be\n`t:action_reqs/0` (the reply will then be `UserReply`). When sending several\ntransactions in a message, `ActionRequests` should be `[action_reqs()]` (the\nreply will then be `[UserReply]`). Each element of the list is part of one\ntransaction.\n\nFor some of _our_ codecs (not binary), it is also possible to pre-encode the\nactions, in which case `ActionRequests` will be either a `t:binary/0` or\n`[binary()]`.\n\nThe function returns when the reply arrives, when the request timer eventually\ntimes out or when the outstanding requests are explicitly cancelled.\n\nThe default values of the send options are obtained by\n`megaco:conn_info(ConnHandle, Item)`. But the send options above, may explicitly\nbe overridden.\n\nThe `ProtocolVersion` version is the version actually encoded in the reply\nmessage.\n\nAt `Success`, the `UserReply` contains a list of 'ActionReply' records possibly\ncontaining error indications.\n\nA `Failure`, indicates that the remote user has replied with an explicit\ntransactionError.\n\nA `UserCancelReason`, indicates that the request has been canceled by the user.\n`ReasonForUserCancel` is the reason given in the call to the\n`cancel/2` function.\n\nA send error (`SendReason`), indicates that the send function of the megaco\ntransport callback module failed to send the request. There are two separate\ncases: `SendCancelledReason` and `SendFailedReason`. The first is the result of\nthe send function returning `{cancel, Reason}` and the second is some other kind\nof erroneous return value. See the\n[send_message](`c:megaco_transport:send_message/3`) function for more info.\n\nAn `OtherReason`, indicates some other error such as timeout.\n\nFor more info about the 'extra' part of the result (`SuccessExtra` and\n`ErrorExtra`), see the [note](`m:megaco_user#extra_argument`) in the user\ncallback module documentation.","ref":"megaco.html#call/3"},{"type":"function","title":"megaco.cancel/2","doc":"Cancel all outstanding messages for this connection\n\nThis causes outstanding megaco:call/3 requests to return. The callback functions\nUserMod:handle_reply/4 and UserMod:handle_trans_ack/4 are also invoked where it\napplies. See the megaco_user module for more info about the callback arguments.","ref":"megaco.html#cancel/2"},{"type":"function","title":"megaco.cast/3","doc":"Sends one or more transaction request(s) but does NOT wait for a reply\n\nWhen sending one transaction in a message, `ActionRequests` should be\n`t:action_reqs/0`. When sending several transactions in a message,\n`ActionRequests` should be `[action_reqs()]`. Each element of the list is part\nof one transaction.\n\nFor some of _our_ codecs (not binary), it is also possible to pre-encode the\nactions, in which case `Actions` will be either a `t:binary/0` or `[binary()]`.\n\nThe default values of the send options are obtained by\nmegaco:conn_info(ConnHandle, Item). But the send options above, may explicitly\nbe overridden.\n\nThe ProtocolVersion version is the version actually encoded in the reply\nmessage.\n\nThe callback function UserMod:handle_trans_reply/4 is invoked when the reply\narrives, when the request timer eventually times out or when the outstanding\nrequests are explicitly cancelled. See the megaco_user module for more info\nabout the callback arguments.\n\nGiven as `ReplyData` argument to UserMod:handle_trans_reply/4.","ref":"megaco.html#cast/3"},{"type":"function","title":"megaco.conn_info/1","doc":"","ref":"megaco.html#conn_info/1"},{"type":"function","title":"megaco.conn_info/2","doc":"Lookup information about an active connection\n\nRequires that the connection is active.\n\nFailure: `exit` if, for instance, `ConnHandle` refers to a connection that no\nlonger exists.","ref":"megaco.html#conn_info/2"},{"type":"function","title":"megaco.connect/4","doc":"","ref":"megaco.html#connect/4"},{"type":"function","title":"megaco.connect/5","doc":"Establish a \"virtual\" connection\n\nActivates a connection to a remote user. When this is done the connection can be\nused to send messages (with `SendMod:send_message/2`). The `ControlPid` is the\nidentifier of a process that controls the connection. That process will be\nsupervised and if it dies, this will be detected and the\n`UserMod:handle_disconnect/2` callback function will be invoked. See the\nmegaco_user module for more info about the callback arguments. The connection\nmay also explicitly be deactivated by invoking `megaco:disconnect/2`.\n\nThe `ControlPid` may be the identity of a process residing on another Erlang\nnode. This is useful when you want to distribute a user over several Erlang\nnodes. In such a case one of the nodes has the physical connection. When a user\nresiding on one of the other nodes needs to send a request (with `megaco:call/3`\nor `megaco:cast/3`), the message will encoded on the originating Erlang node,\nand then be forwarded to the node with the physical connection. When the reply\narrives, it will be forwarded back to the originator. The distributed connection\nmay explicitly be deactivated by a local call to `megaco:disconnect/2` or\nimplicitly when the physical connection is deactivated (with\n`megaco:disconnect/2`, killing the controlling process, halting the other node,\n...).\n\nThe call of this function will trigger the callback function\n`UserMod:handle_connect/2` to be invoked. See the megaco_user module for more\ninfo about the callback arguments.\n\nA connection may be established in several ways:\n\n- **`provisioned MID`** - The MG may explicitly invoke megaco:connect/4 and use\n a provisioned MID of the MGC as the RemoteMid.\n\n- **`upgrade preliminary MID`** - The MG may explicitly invoke megaco:connect/4\n with the atom 'preliminary_mid' as a temporary MID of the MGC, send an intial\n message, the Service Change Request, to the MGC and then wait for an initial\n message, the Service Change Reply. When the reply arrives, the Megaco\n application will pick the MID of the MGC from the message header and\n automatically upgrade the connection to be a \"normal\" connection. By using\n this method of establishing the connection, the callback function\n `UserMod:handle_connect/2` to be invoked twice. First with a `ConnHandle` with\n the remote_mid-field set to preliminary_mid, and then when the connection\n upgrade is done with the remote_mid-field set to the actual MID of the MGC.\n\n- **`automatic`** - When the MGC receives its first message, the Service Change\n Request, the Megaco application will automatically establish the connection by\n using the MG MID found in the message header as remote mid.\n\n- **`distributed`** - When a user (MG/MGC) is distributed over several nodes, it\n is required that the node hosting the connection already has activated the\n connection and that it is in the \"normal\" state. The `RemoteMid` must be a\n real Megaco MID and not a `preliminary_mid`.\n\nAn initial megaco_receive_handle record may be obtained with\n`megaco:user_info(UserMid, receive_handle)`\n\nThe send handle is provided by the preferred transport module, e.g. megaco_tcp,\nmegaco_udp. Read the documentation about each transport module about the\ndetails.\n\nThe connect is done in two steps: first an internal `connection setup` and then\nby calling the user [handle_connect](`c:megaco_user:handle_connect/3`) callback function.\nThe first step could result in an error with `Reason = ConnectReason` and the\nsecond an error with `Reason = HandleConnectReason`:\n\n- **`ConnectReason`** - An error with this reason is generated by the megaco\n application itself.\n\n- **`HandleConnectReason`** - An error with this reason is caused by the user\n [handle_connect](`c:megaco_user:handle_connect/3`) callback function either returning\n an error or an invalid value.\n\n`Extra` can be any `t:term/0` except the atom `ignore_extra`. It is passed\n(back) to the user via the callback function\n[handle_connect/3](`c:megaco_user:handle_connect/3`).","ref":"megaco.html#connect/5"},{"type":"function","title":"megaco.decode_sdp/1","doc":"Decode (parse) a property parameter construct.\n\nWhen decoding `t:property_group/0` or `t:property_groups/0`, those property\nparameter constructs that cannot be decoded (either because of decode error or\nbecause they are unknown), will be returned as a two-tuple. The first element of\nwhich will be the (undecoded) property parameter and the other the actual\nreason. This means that the caller of this function has to expect not only\nsdp-records, but also this two-tuple construct.\n\nThis function performs the following transformation:\n\n- property_parm() -> sdp()\n- property_group() -> sdp_property_group()\n- property_groups() -> sdp_property_groups()","ref":"megaco.html#decode_sdp/1"},{"type":"function","title":"megaco.disable_trace/0","doc":"This function is used to stop megaco tracing.","ref":"megaco.html#disable_trace/0"},{"type":"function","title":"megaco.disconnect/2","doc":"Tear down a \"virtual\" connection\n\nCauses the `UserMod:handle_disconnect/2` callback function to be invoked. See\nthe megaco_user module for more info about the callback arguments.","ref":"megaco.html#disconnect/2"},{"type":"function","title":"megaco.enable_trace/2","doc":"This function is used to start megaco tracing at a given `Level` and direct\nresult to the given `Destination`.\n\nIt starts a tracer server and then sets the proper match spec (according to\n`Level`).\n\nIn the case when `Destination` is `File`, the printable megaco trace events will\nbe printed to the file `File` using plain `io:format/2`.\n\nIn the case when `Destination` is `io`, the printable megaco trace events will\nbe printed on stdout using plain `io:format/2`.\n\nSee `dbg` for further information.","ref":"megaco.html#enable_trace/2"},{"type":"function","title":"megaco.encode_actions/3","doc":"Encodes lists of action requests for one or more transaction request(s).\n\nWhen encoding action requests for one transaction, `Actions` should be\n`t:action_reqs/0`. When encoding action requests for several transactions,\n`Actions` should be `[action_reqs()]`. Each element of the list is part of one\ntransaction.","ref":"megaco.html#encode_actions/3"},{"type":"function","title":"megaco.encode_sdp/1","doc":"Encode (generate) an SDP construct.\n\nIf a `t:property_parm/0` is found as part of the input (`SDP`) then it is left\nunchanged.\n\nThis function performs the following transformation:\n\n- sdp() -> property_parm()\n- sdp_property_group() -> property_group()\n- sdp_property_groups() -> property_groups()","ref":"megaco.html#encode_sdp/1"},{"type":"function","title":"megaco.eval_digit_map/1","doc":"","ref":"megaco.html#eval_digit_map/1"},{"type":"function","title":"megaco.eval_digit_map/2","doc":"Collect digit map letters according to the digit map.\n\nWhen evaluating a digit map, a state machine waits for timeouts and letters\nreported by megaco:report_digit_event/2. The length of the various timeouts are\ndefined in the digit_map_value() record.\n\nWhen a complete sequence of valid events has been received, the result is\nreturned as a list of letters.\n\nThere are two options for handling syntax errors (that is when an unexpected\nevent is received when the digit map evaluator is expecting some other event).\nThe unexpected events may either be ignored or rejected. The latter means that\nthe evaluation is aborted and an error is returned.","ref":"megaco.html#eval_digit_map/2"},{"type":"function","title":"megaco.get_stats/0","doc":"Retreive all (SNMP) statistic counters maintained by the megaco application.\n\nThe global counters handle events that cannot be attributed to a single\nconnection (e.g. protocol errors that occur before the connection has been\nproperly setup).","ref":"megaco.html#get_stats/0"},{"type":"function","title":"megaco.get_stats/1","doc":"Retreive a (SNMP) (global) statistic counter maintained by the megaco\napplication.\n\nThe global counters handle events that cannot be attributed to a single\nconnection (e.g. protocol errors that occur before the connection has been\nproperly setup).\n\n[](){: #get_stats_1_2 }\n\nRetreive all (SNMP) statistic counters maintained by the megaco application, for\na specific connection.","ref":"megaco.html#get_stats/1"},{"type":"function","title":"megaco.get_stats/2","doc":"Retreive a (SNMP) statistic counter maintained by the megaco application.","ref":"megaco.html#get_stats/2"},{"type":"function","title":"megaco.info/0","doc":"This function produces a list of information about the megaco application. Such\nas users and their config, connections and their config, statistics and so on.\n\nThis information can be produced by the functions\n`user_info/2`, `conn_info/2`, `system_info/1` and `get_stats/2` but\nthis is a simple way to get it all at once.","ref":"megaco.html#info/0"},{"type":"function","title":"megaco.parse_digit_map/1","doc":"Parses a digit map body\n\nParses a digit map body, represented as a list of characters, into a list of\nstate transitions suited to be evaluated by megaco:eval_digit_map/1,2.","ref":"megaco.html#parse_digit_map/1"},{"type":"function","title":"megaco.print_version_info/0","doc":"","ref":"megaco.html#print_version_info/0"},{"type":"function","title":"megaco.print_version_info/1","doc":"Utility function to produce a formated printout of the versions info generated\nby the `versions1` and `versions2` functions.\n\nThe function print_version_info/0 uses the result of function version1/0 as\n`VersionInfo`.\n\nExample:\n\n```erlang\n {ok, V} = megaco:versions1(), megaco:format_versions(V).\n```","ref":"megaco.html#print_version_info/1"},{"type":"function","title":"megaco.process_received_message/4","doc":"","ref":"megaco.html#process_received_message/4"},{"type":"function","title":"megaco.process_received_message/5","doc":"Process a received message\n\nThis function is intended to be invoked by some transport modules when get an\nincoming message. Which transport that actually is used is up to the user to\nchoose.\n\nThe message is delivered as an Erlang binary and is decoded by the encoding\nmodule stated in the receive handle together with its encoding config (also in\nthe receive handle). Depending of the outcome of the decoding various callback\nfunctions will be invoked. See megaco_user for more info about the callback\narguments.\n\nThe argument `Extra` is just an opaque data structure passed to the user via the\ncallback functions in the [user callback module](`m:megaco_user`). Note however\nthat if `Extra` has the value `extra_undefined` the argument will be ignored\n(same as if `process_received_message/4` had\nbeen called). See the documentation for the behaviour of the callback module,\n`m:megaco_user`, for more info.\n\nNote that all processing is done in the context of the calling process. A\ntransport module could call this function via one of the `spawn` functions (e.g.\n`spawn_opt`). See also `receive_message/4,5`.\n\nIf the message cannot be decoded the following callback function will be\ninvoked:\n\n- UserMod:handle_syntax_error/3\n\nIf the decoded message instead of transactions contains a message error, the\nfollowing callback function will be invoked:\n\n- UserMod:handle_message_error/3\n\nIf the decoded message happens to be received before the connection is\nestablished, a new \"virtual\" connection is established. This is typically the\ncase for the Media Gateway Controller (MGC) upon the first Service Change. When\nthis occurs the following callback function will be invoked:\n\n- UserMod:handle_connect/2\n\nFor each transaction request in the decoded message the following callback\nfunction will be invoked:\n\n- UserMod:handle_trans_request/3\n\nFor each transaction reply in the decoded message the reply is returned to the\nuser. Either the originating function megaco:call/3 will return. Or in case the\noriginating function was megaco:case/3 the following callback function will be\ninvoked:\n\n- UserMod:handle_trans_reply/4\n\nWhen a transaction acknowledgement is received it is possible that user has\ndecided not to bother about the acknowledgement. But in case the return value\nfrom UserMod:handle_trans_request/3 indicates that the acknowledgement is\nimportant the following callback function will be invoked:\n\n- UserMod:handle_trans_ack/4\n\nSee the megaco_user module for more info about the callback arguments.","ref":"megaco.html#process_received_message/5"},{"type":"function","title":"megaco.receive_message/4","doc":"","ref":"megaco.html#receive_message/4"},{"type":"function","title":"megaco.receive_message/5","doc":"Process a received message\n\nThis is a callback function intended to be invoked by some transport modules\nwhen get an incoming message. Which transport that actually is used is up to the\nuser to choose.\n\nIn principle, this function calls the [process_received_message/4,5](`process_received_message/5`)\nfunction via a `spawn` to perform the actual processing.","ref":"megaco.html#receive_message/5"},{"type":"function","title":"megaco.report_digit_event/2","doc":"Send one or more events to the event collector process.\n\nSend one or more events to a process that is evaluating a digit map, that is a\nprocess that is executing megaco:eval_digit_map/1,2.\n\nNote that the events `$s | $S`, `l | $L` and `$z | $Z` has nothing to do with\nthe timers using the same characters.","ref":"megaco.html#report_digit_event/2"},{"type":"function","title":"megaco.reset_stats/0","doc":"Reset all (SNMP) statistics counters.","ref":"megaco.html#reset_stats/0"},{"type":"function","title":"megaco.reset_stats/1","doc":"Reset the specified (SNMP) statistics counter.\n\n[](){: #reset_stats_1_2 }\n\nReset all (SNMP) statistics counters for a connection.","ref":"megaco.html#reset_stats/1"},{"type":"function","title":"megaco.set_trace/1","doc":"This function is used to change the megaco trace level.\n\nIt is assumed that tracing has already been enabled (see `enable_trace` above).","ref":"megaco.html#set_trace/1"},{"type":"function","title":"megaco.start/0","doc":"Starts the Megaco application\n\nUsers may either explicitly be registered with megaco:start_user/2 and/or be\nstatically configured by setting the application environment variable 'users' to\na list of \\{UserMid, Config\\} tuples. See the function megaco:start_user/2 for\ndetails.","ref":"megaco.html#start/0"},{"type":"function","title":"megaco.start_user/2","doc":"Initial configuration of a user\n\nRequires the megaco application to be started. A user is either a Media Gateway\n(MG) or a Media Gateway Controller (MGC). One Erlang node may host many users.\n\nA user is identified by its UserMid, which must be a legal Megaco MID.\n\nConfig is a list of \\{Item, Value\\} tuples. See megaco:user_info/2 about which\nitems and values that are valid.","ref":"megaco.html#start_user/2"},{"type":"function","title":"megaco.stop/0","doc":"Stops the Megaco application","ref":"megaco.html#stop/0"},{"type":"function","title":"megaco.stop_user/1","doc":"Delete the configuration of a user\n\nRequires that the user does not have any active connection.","ref":"megaco.html#stop_user/1"},{"type":"function","title":"megaco.system_info/0","doc":"","ref":"megaco.html#system_info/0"},{"type":"function","title":"megaco.system_info/1","doc":"Lookup system information.","ref":"megaco.html#system_info/1"},{"type":"function","title":"megaco.test_digit_event/2","doc":"Feed digit map collector with events and return the result\n\nThis function starts the evaluation of a digit map with megaco:eval_digit_map/1\nand sends a sequence of events to it with megaco:report_digit_event/2 in order\nto simplify testing of digit maps.","ref":"megaco.html#test_digit_event/2"},{"type":"function","title":"megaco.test_reply/5","doc":"Tests if the Reply argument is correctly composed.\n\nThis function is only intended for testing purposes. It's supposed to test the\n`actual_reply()` return value of the callback functions\n[handle_trans_request](`c:megaco_user:handle_trans_request/4`) and\n[handle_trans_long_request](`c:megaco_user:handle_trans_long_request/4`) functions (with\nthe additions of the `EncodingMod` and `EncodingConfig` arguments). It composes\na complete megaco message end attempts to encode it. The return value, will be a\ntuple of the composed megaco message and the encode result.","ref":"megaco.html#test_reply/5"},{"type":"function","title":"megaco.test_request/5","doc":"Tests if the Actions argument is correctly composed.\n\nThis function is only intended for testing purposes. It's supposed to have a\nsame kind of interface as the `call/3` or `cast/3`\nfunctions (with the additions of the `EncodingMod` and `EncodingConfig`\narguments). It composes a complete megaco message end attempts to encode it. The\nreturn value, will be a tuple of the composed megaco message and the encode\nresult.","ref":"megaco.html#test_request/5"},{"type":"function","title":"megaco.token_tag2string/1","doc":"","ref":"megaco.html#token_tag2string/1"},{"type":"function","title":"megaco.token_tag2string/2","doc":"","ref":"megaco.html#token_tag2string/2"},{"type":"function","title":"megaco.token_tag2string/3","doc":"Convert a token tag to a string\n\nIf no encoder module is given, the default is used (which is pretty).\n\nIf no or an unknown version is given, the _best_ version is used (which is v3).\n\nIf no match is found for `Tag`, `Result` will be the empty string (`[]`).","ref":"megaco.html#token_tag2string/3"},{"type":"function","title":"megaco.update_conn_info/3","doc":"Update information about an active connection\n\nRequires that the connection is activated. See `t:conn_info_item/0` about which\nitems and values that are valid.","ref":"megaco.html#update_conn_info/3"},{"type":"function","title":"megaco.update_user_info/3","doc":"Update information about a user\n\nRequires that the user is started.","ref":"megaco.html#update_user_info/3"},{"type":"function","title":"megaco.user_info/1","doc":"","ref":"megaco.html#user_info/1"},{"type":"function","title":"megaco.user_info/2","doc":"Lookup user information\n\n[](){: #user_info_21 }\n\nLookup user information about currently active requests.\nExpected input type `Input :: Requests` with expected\noutput type `Result :: RequestsResult`.\n\n[](){: #user_info_22 }\n\nLookup user information about currently active replies.\nExpected input type `Input :: Replies` with expected\noutput type `Result :: RepliesResult`.","ref":"megaco.html#user_info/2"},{"type":"function","title":"megaco.versions1/0","doc":"","ref":"megaco.html#versions1/0"},{"type":"function","title":"megaco.versions2/0","doc":"Utility functions used to retrieve some system and application info.\n\nThe difference between the two functions is in how they get the modules to\ncheck. `versions1` uses the app-file and `versions2` uses the function\n`application:get_key`.","ref":"megaco.html#versions2/0"},{"type":"type","title":"megaco.action_reply/0","doc":"","ref":"megaco.html#t:action_reply/0"},{"type":"type","title":"megaco.action_reps/0","doc":"","ref":"megaco.html#t:action_reps/0"},{"type":"type","title":"megaco.action_reqs/0","doc":"","ref":"megaco.html#t:action_reqs/0"},{"type":"type","title":"megaco.action_request/0","doc":"","ref":"megaco.html#t:action_request/0"},{"type":"type","title":"megaco.conn_handle/0","doc":"","ref":"megaco.html#t:conn_handle/0"},{"type":"type","title":"megaco.conn_info_item/0","doc":"This type is a basic (atom) lookup key (for info on an active connection). The\ncorresponding value can be of any type.[](){: #ci_control_pid }\n\n- **`control_pid`** - The process identifier of the controlling process for a\n connection.\n\n Value type: [pid()](`t:erlang:pid/0`)\n\n [](){: #ci_send_handle }\n\n- **`send_handle`** - Opaque send handle whose contents is internal for the send\n module.\n\n Value type: `t:send_handle/0`\n\n [](){: #ci_local_mid }\n\n- **`local_mid`** - The local mid (of the connection, i.e. the own mid).\n\n Value type: `t:mid/0`\n\n [](){: #ci_remote_mid }\n\n- **`remote_mid`** - The remote mid (of the connection).\n\n Value type: `t:mid/0`\n\n [](){: #ci_receive_handle }\n\n- **`receive_handle`** - Construct a megaco_receive_handle record.\n\n Value type: `t:receive_handle/0`\n\n [](){: #ci_trans_id }\n\n- **`trans_id`** - Next transaction id.\n\n Note that transaction id's are (currently) maintained on a per user basis so\n there is no way to be sure that the value returned will actually be used for a\n transaction sent on this connection (in case a user has several connections,\n which is not at all unlikely).\n\n Value type: `t:transaction_id/0` | `undefined_serial`\n\n [](){: #ci_max_trans_id }\n\n- **`max_trans_id`** - Last transaction id.\n\n Value type: `t:transaction_id/0` | `infinity`\n\n [](){: #ci_request_timer }\n\n- **`request_timer`** - Wait for reply.\n\n The timer is cancelled when a reply is received.\n\n When a pending message is received, the timer is cancelled and the\n `long_request_timer` is started instead (see below). No resends will be\n performed from this point (since we now know that the other side has received\n the request).\n\n When the timer reaches an intermediate expire, the request is resent and the\n timer is restarted.\n\n When the timer reaches the final expire, either the function `megaco:call`\n will return with `{error, timeout}` or the callback function\n `handle_trans_reply` will be called with `UserReply = {error, timeout}` (if\n `megaco:cast` was used).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `#megaco_incr_timer{}`.\n\n [](){: #ci_long_request_timer }\n\n- **`long_request_timer`** - Wait for reply after having received a pending\n message.\n\n When the timer reaches an intermediate expire, the timer restarted.\n\n When a pending message is received, and the `long_request_timer` is _not_ \"on\n its final leg\", the timer will be restarted, and, if\n `long_request_resend = true`, the request will be re-sent.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `60 seconds`.\n\n [](){: #ci_request_keep_alive_timeout }\n\n- **`request_keep_alive_timeout`** - Specifies the timeout time for the\n request-keep-alive timer.\n\n This timer is started when the _first_ reply to an asynchronous request\n (issued using the `megaco:cast/3` function) arrives. As long\n as this timer is running, replies will be delivered via the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function, with\n their \"arrival number\" (see `UserReply` of the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function).\n\n Replies arriving after the timer has expired, will be delivered using the\n [handle_unexpected_trans/3,4](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n Value type: `plain` | [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `plain`.\n\n [](){: #ci_long_request_resend }\n\n- **`long_request_resend`** - This option indicates weather the request should\n be resent until the reply is received, _even_ though a pending message has\n been received.\n\n Normally, after a pending message has been received, the request is not resent\n (since a pending message is an indication that the request has been received).\n But since the reply (to the request) can be lost, this behaviour has its\n values.\n\n It is of course pointless to set this value to _true_ unless the\n `long_request_timer` (see above) is also set to an incremental timer\n (`#megaco_incr_timer{}`).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_reply_timer }\n\n- **`reply_timer`** - Wait for an ack.\n\n When a request is received, some info related to the reply is store internally\n (e.g. the binary of the reply). This info will live until either an ack is\n received or this timer expires. For instance, if the same request is received\n again (e.g. a request with the same transaction id), the (stored) reply will\n be (re-) sent automatically by megaco.\n\n If the timer is of type `#megaco_incr_timer{}`, then for each intermediate\n timout, the reply will be resent (this is valid until the ack is received or\n the timer expires).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30000`.\n\n [](){: #ci_call_proxy_gc_timeout }\n\n- **`call_proxy_gc_timeout`** - Timeout time for the call proxy.\n\n When a request is sent using the `call/3` function, a proxy\n process is started to handle all replies. When the reply has been received and\n delivered to the user, the proxy process continue to exist for as long as this\n option specifies. Any received messages, is passed on to the user via the\n [handle_unexpected_trans](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n The timeout time is in milliseconds. A value of 0 (zero) means that the proxy\n process will exit directly after the reply has been delivered.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `5000` (= 5 seconds).\n\n- **`auto_ack`** - Automatic send transaction ack when the transaction reply has\n been received (see `trans_ack` below).\n\n This is used for _three-way-handshake_.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_trans_ack }\n\n- **`trans_ack`** - Shall ack's be accumulated or not.\n\n This property is only valid if `auto_ack` is true.\n\n If `auto_ack` is true, then if `trans_ack` is `false`, ack's will be sent\n immediately. If `trans_ack` is `true`, then ack's will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_trans_ack_maxcount }\n\n- **`trans_ack_maxcount`** - Maximum number of accumulated ack's. At most this\n many ack's will be accumulated by the transaction sender (if started and\n configured to accumulate ack's).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `10`.\n\n [](){: #ci_trans_req }\n\n- **`trans_req`** - Shall requests be accumulated or not.\n\n If `trans_req` is `false`, then request(s) will be sent immediately (in its\n own message).\n\n If `trans_req` is true, then request(s) will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_trans_req_maxcount }\n\n- **`trans_req_maxcount`** - Maximum number of accumulated requests. At most\n this many requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `10`.\n\n [](){: #ci_trans_req_maxsize }\n\n- **`trans_req_maxsize`** - Maximum size of the accumulated requests. At most\n this much requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `2048`.\n\n [](){: #ci_trans_timer }\n\n- **`trans_timer`** - Transaction sender timeout time. Has two functions. First,\n if the value is 0, then transactions will not be accumulated (e.g. the\n transaction sender process will not be started). Second, if the value is\n greater then 0 and `auto_ack` and `trans_ack` is true or if `trans_req` is\n true, then transaction sender will be started and transactions (which is\n depending on the values of `auto_ack`, `trans_ack` and `trans_req`) will be\n accumulated, for later sending.\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `0`.\n\n [](){: #ci_pending_timer }\n\n- **`pending_timer`** - Automatic send transaction pending if the timer expires\n before a transaction reply has been sent. This timer is also called\n provisional response timer.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30000` (= 30 seconds).\n\n [](){: #ci_sent_pending_limit }\n\n- **`sent_pending_limit`** - Sent pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be sent\n (for a given received transaction request). When the limit is exceeded, the\n transaction is aborted (see\n [handle_trans_request_abort](`c:megaco_user:handle_trans_request_abort/5`)) and an error\n message is sent to the other side.\n\n Note that this has no effect on the actual sending of pending transactions.\n This is either implicit (e.g. when receiving a re-sent transaction request for\n a request which is being processed) or controlled by the pending_timer, see\n above.\n\n Value type: [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n Defaults to `infinity`.\n\n [](){: #ci_recv_pending_limit }\n\n- **`recv_pending_limit`** - Receive pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be\n received (for a sent transaction request). When the limit is exceeded, the\n transaction is considered lost, and an error returned to the user (through the\n call-back function _handle_trans_reply_).\n\n Value type: [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n Defaults to `infinity`.\n\n [](){: #ci_send_mod }\n\n- **`send_mod`** - Send callback module which exports send_message/2. The\n function SendMod:send_message(SendHandle, Binary) is invoked when the bytes\n needs to be transmitted to the remote user.\n\n Value type: [module()](`t:erlang:module/0`).\n\n Defaults to `megaco_tcp`.\n\n [](){: #ci_encoding_mod }\n\n- **`encoding_mod`** - Encoding callback module which exports encode_message/2\n and decode_message/2. The function EncodingMod:encode_message(EncodingConfig,\n MegacoMessage) is invoked whenever a 'MegacoMessage' record needs to be\n translated into an Erlang binary. The function\n EncodingMod:decode_message(EncodingConfig, Binary) is invoked whenever an\n Erlang binary needs to be translated into a 'MegacoMessage' record.\n\n Value type: [module()](`t:erlang:module/0`).\n\n Defaults to `megaco_pretty_text_encoder`.\n\n [](){: #ci_encoding_config }\n\n- **`encoding_config`** - Encoding module config.\n\n Value type: [loist()](`t:erlang:list/0`).\n\n Defaults to `[]`.\n\n [](){: #ci_protocol_version }\n\n- **`protocol_version`** - Actual protocol version.\n\n Value type: `t:protocol_version/0`\n\n Defaults to `1`.\n\n [](){: #ci_strict_version }\n\n- **`strict_version`** - Strict version control, i.e. when a message is\n received, verify that the version is that which was negotiated.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `true`.\n\n [](){: #ci_reply_data }\n\n- **`reply_data`** - Default reply data.\n\n Value type: [term()](`t:erlang:term/0`)\n\n Defaults to `undefined`.\n\n [](){: #ci_threaded }\n\n- **`threaded`** - If a received message contains several transaction requests,\n this option indicates whether the requests should be handled sequentially in\n the same process (`false`), or if each request should be handled by its own\n process (`true` i.e. a separate process is spawned for each request).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_resend_indication }\n\n- **`resend_indication`** - This option indicates weather the transport module\n should be told if a message send is a resend or not.\n\n If _false_, megaco messages are sent using the\n [send_message/2](`c:megaco_transport:send_message/2`) function.\n\n If _true_, megaco message _re-sends_ are made using the\n [resend_message](`c:megaco_transport:resend_message/2`) function. The initial\n message send is still done using the\n [send_message](`c:megaco_transport:send_message/2`) function.\n\n The special value _flag_ instead indicates that the function\n [send_message/3](`c:megaco_transport:send_message/3`) shall be used.\n\n Value type: `flag` | [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_segment_reply_ind }\n\n- **`segment_reply_ind`** - This option specifies if the user shall be notified\n of received segment replies or not.\n\n See [handle_segment_reply](`c:megaco_user:handle_segment_reply/6`) callback function\n for more information.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ci_segment_recv_timer }\n\n- **`segment_recv_timer`** - This timer is started when the segment indicated by\n the `segmentation complete token` (e.g. the last of the segment which makes up\n the reply) is received, but all segments has not yet been received.\n\n When the timer finally expires, a \"megaco segments not received\" (459) error\n message is sent to the other side and the user is notified with a\n `segment timeout` `UserReply` in either the\n [handle_trans_reply](`c:megaco_user:handle_trans_reply/5`) callback function or the\n return value of the `call/2` function.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `10000` (= 10 seconds).\n\n [](){: #ci_segment_send }\n\n- **`segment_send`** - Shall outgoing messages be segmented or not.\n\n Value type: `none` | [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n - **`none`** - Do not segment outgoing reply messages. This is useful when\n either it is known that messages are never to large or that the transport\n protocol can handle such things on its own (e.g. TCP or SCTP).\n\n - **`t:pos_integer/0`** - Outgoing reply messages will be segmented as needed\n (see `max_pdu_size` below). This value, K, indicate the outstanding window,\n i.e. how many segments can be outstanding (not acknowledged) at any given\n time.\n\n - **`infinity`** - Outgoing reply messages will be segmented as needed (see\n `max_pdu_size` below). Segment messages are sent all at once (i.e. no\n acknowledgement awaited before sending the next segment).\n\n Defaults to `none`.\n\n [](){: #ci_max_pdu_size }\n\n- **`max_pdu_size`** - Max message size. If the encoded message (PDU) exceeds\n this size, the message should be segmented, and then encoded.\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.","ref":"megaco.html#t:conn_info_item/0"},{"type":"type","title":"megaco.counter/0","doc":"","ref":"megaco.html#t:counter/0"},{"type":"type","title":"megaco.counter_value/0","doc":"","ref":"megaco.html#t:counter_value/0"},{"type":"type","title":"megaco.digit_map_event/0","doc":"","ref":"megaco.html#t:digit_map_event/0"},{"type":"type","title":"megaco.digit_map_kind/0","doc":"","ref":"megaco.html#t:digit_map_kind/0"},{"type":"type","title":"megaco.digit_map_letter/0","doc":"","ref":"megaco.html#t:digit_map_letter/0"},{"type":"type","title":"megaco.digit_map_value/0","doc":"","ref":"megaco.html#t:digit_map_value/0"},{"type":"type","title":"megaco.error_desc/0","doc":"","ref":"megaco.html#t:error_desc/0"},{"type":"type","title":"megaco.global_counter/0","doc":"","ref":"megaco.html#t:global_counter/0"},{"type":"type","title":"megaco.megaco_message/0","doc":"","ref":"megaco.html#t:megaco_message/0"},{"type":"type","title":"megaco.megaco_timer/0","doc":"","ref":"megaco.html#t:megaco_timer/0"},{"type":"type","title":"megaco.mid/0","doc":"The Megaco Identifier.","ref":"megaco.html#t:mid/0"},{"type":"type","title":"megaco.property_group/0","doc":"","ref":"megaco.html#t:property_group/0"},{"type":"type","title":"megaco.property_groups/0","doc":"","ref":"megaco.html#t:property_groups/0"},{"type":"type","title":"megaco.property_parm/0","doc":"","ref":"megaco.html#t:property_parm/0"},{"type":"type","title":"megaco.protocol_version/0","doc":"","ref":"megaco.html#t:protocol_version/0"},{"type":"type","title":"megaco.receive_handle/0","doc":"","ref":"megaco.html#t:receive_handle/0"},{"type":"type","title":"megaco.sdp/0","doc":"","ref":"megaco.html#t:sdp/0"},{"type":"type","title":"megaco.sdp_property_group/0","doc":"","ref":"megaco.html#t:sdp_property_group/0"},{"type":"type","title":"megaco.sdp_property_groups/0","doc":"","ref":"megaco.html#t:sdp_property_groups/0"},{"type":"type","title":"megaco.sdp_property_parm/0","doc":"","ref":"megaco.html#t:sdp_property_parm/0"},{"type":"type","title":"megaco.segment_no/0","doc":"","ref":"megaco.html#t:segment_no/0"},{"type":"type","title":"megaco.send_handle/0","doc":"Opaque send handle whose contents is internal for the send module. May be any\nterm.","ref":"megaco.html#t:send_handle/0"},{"type":"type","title":"megaco.system_info_item/0","doc":"[](){: #si_text_config }\n\n- **`text_config`** - The text encoding config.\n\n Value type: [term()](`t:erlang:term/0`)\n\n [](){: #si_connections }\n\n- **`connections`** - Lists all active connections. Returns a list of\n megaco_conn_handle records.\n\n Value type: [`t:conn_handle/0`]\n\n [](){: #si_users }\n\n- **`users`** - Lists all active users.\n\n Value type: [`t:mid/0`]\n\n [](){: #si_active_requests }\n\n- **`n_active_requests`** - Returns number of requests that has originated from\n this Erlang node and still are active (and therefore consumes system\n resources).\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n [](){: #si_active_replies }\n\n- **`n_active_replies`** - Returns the number of replies that has originated\n from this Erlang node and still are active (and therefore consumes system\n resources).\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n [](){: #si_active_connections }\n\n- **`n_active_connections`** - Returns the number of active connections.\n\n Value type: [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n [](){: #si_reply_counters }\n\n- **`reply_counters`** - Returns a list of the reply counters.\n\n Value type: [\\{`t:conn_handle/0`, `t:transaction_id/0`,\n [non_neg_integer()](`t:erlang:non_neg_integer/0`)\\}]\n\n [](){: #si_pending_counters }\n\n- **`pending_counters`** - Returns a list of the receive and sent pending\n counters.\n\n Value type: [\\{recv | sent, [\\{`t:transaction_id/0`,\n [non_neg_integer()](`t:erlang:non_neg_integer/0`)\\}]\\}]","ref":"megaco.html#t:system_info_item/0"},{"type":"type","title":"megaco.trace_data/0","doc":"The trace data passed to the trace handler fun (in the second argument) and\nreturned by same. For instance this could be a file descriptor, that the trace\nhandler fun can use to print the event to a file.","ref":"megaco.html#t:trace_data/0"},{"type":"type","title":"megaco.trace_event/0","doc":"The trace event generated by dbg.","ref":"megaco.html#t:trace_event/0"},{"type":"type","title":"megaco.trace_handler/0","doc":"The trace handler fun is used to \"process\" each trace event (for instance print\nto file or to stdout after formating).","ref":"megaco.html#t:trace_handler/0"},{"type":"type","title":"megaco.trace_level/0","doc":"How much trace events should be produced. `min` (=`0`) means no trace events are\nproduced, which is the default.","ref":"megaco.html#t:trace_level/0"},{"type":"type","title":"megaco.transaction_id/0","doc":"","ref":"megaco.html#t:transaction_id/0"},{"type":"type","title":"megaco.transaction_reply/0","doc":"","ref":"megaco.html#t:transaction_reply/0"},{"type":"type","title":"megaco.user_info_item/0","doc":"- **`connections`** - Lists all active connections for this user. Returns a list\n of megaco_conn_handle records.\n\n Value type: [`t:conn_handle/0`]\n\n [](){: #ui_receive_handle }\n\n- **`receive_handle`** - Construct a receive_handle from user config.\n\n Value type: `t:receive_handle/0`\n\n [](){: #ui_trans_id }\n\n- **`trans_id`** - Current transaction id.\n\n Value type: `t:transaction_id/0` | `undefined_serial`\n\n [](){: #ui_min_trans_id }\n\n- **`min_trans_id`** - First transaction id.\n\n Value type: `t:transaction_id/0`\n\n Defaults to `1`.\n\n [](){: #ui_max_trans_id }\n\n- **`max_trans_id`** - Last transaction id.\n\n Value type: `t:transaction_id/0` | `infinity`\n\n Defaults to `infinity`.\n\n [](){: #ui_request_timer }\n\n- **`request_timer`** - Wait for reply.\n\n The timer is cancelled when a reply is received.\n\n When a pending message is received, the timer is cancelled and the\n `long_request_timer` is started instead (see below). No resends will be\n performed from this point (since we now know that the other side has received\n the request).\n\n When the timer reaches an intermediate expire, the request is resent and the\n timer is restarted.\n\n When the timer reaches the final expire, either the function `megaco:call`\n will return with `{error, timeout}` or the callback function\n `handle_trans_reply` will be called with `UserReply = {error, timeout}` (if\n `megaco:cast` was used).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `#megaco_incr_timer{}`.\n\n [](){: #ui_long_request_timer }\n\n- **`long_request_timer`** - Wait for reply after having received a pending\n message.\n\n When the timer reaches an intermediate expire, the timer is restarted.\n\n When a pending message is received, and the `long_request_timer` is _not_ \"on\n its final leg\", the timer will be restarted, and, if\n `long_request_resend = true`, the request will be re-sent.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `60000` (= 60 seconds).\n\n [](){: #ui_long_request_resend }\n\n- **`long_request_resend`** - This option indicates weather the request should\n be resent until the reply is received, _even_ though a pending message has\n been received.\n\n Normally, after a pending message has been received, the request is not resent\n (since a pending message is an indication that the request has been received).\n But since the reply (to the request) can be lost, this behaviour has its\n values.\n\n It is of course pointless to set this value to _true_ unless the\n `long_request_timer` (see above) is also set to an incremental timer\n (`#megaco_incr_timer{}`).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_reply_timer }\n\n- **`reply_timer`** - Wait for an ack.\n\n When a request is received, some info related to the reply is store internally\n (e.g. the binary of the reply). This info will live until either an ack is\n received or this timer expires. For instance, if the same request is received\n again (e.g. a request with the same transaction id), the (stored) reply will\n be (re-) sent automatically by megaco.\n\n If the timer is of type `#megaco_incr_timer{}`, then for each intermediate\n timout, the reply will be resent (this is valid until the ack is received or\n the timer expires).\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30 seconds`.\n\n [](){: #ui_request_keep_alive_timeout }\n\n- **`request_keep_alive_timeout`** - Specifies the timeout time for the\n request-keep-alive timer.\n\n This timer is started when the _first_ reply to an asynchronous request\n (issued using the `megaco:cast/3` function) arrives. As long\n as this timer is running, replies will be delivered via the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function, with\n their \"arrival number\" (see `UserReply` of the\n [handle_trans_reply/4,5](`c:megaco_user:handle_trans_reply/5`) callback function).\n\n Replies arriving after the timer has expired, will be delivered using the\n [handle_unexpected_trans/3,4](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n Value type: `plain` | [non_neg_integer()](`t:erlang:non_neg_integer/0`)\n\n Defaults to `plain`.\n\n [](){: #ui_call_proxy_gc_timeout }\n\n- **`call_proxy_gc_timeout`** - Timeout time for the call proxy.\n\n When a request is sent using the `call/3` function, a proxy\n process is started to handle all replies. When the reply has been received and\n delivered to the user, the proxy process continue to exist for as long as this\n option specifies. Any received messages, is passed on to the user via the\n [handle_unexpected_trans](`c:megaco_user:handle_unexpected_trans/4`) callback\n function.\n\n The timeout time is in milliseconds. A value of 0 (zero) means that the proxy\n process will exit directly after the reply has been delivered.\n\n Value type: [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `5000` (= 5 seconds).\n\n [](){: #ui_auto_ack }\n\n- **`auto_ack`** - Automatic send transaction ack when the transaction reply has\n been received (see `trans_ack` below).\n\n This is used for _three-way-handshake_.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_trans_ack }\n\n- **`trans_ack`** - Shall ack's be accumulated or not.\n\n This property is only valid if `auto_ack` is true.\n\n If `auto_ack` is true, then if `trans_ack` is `false`, ack's will be sent\n immediately. If `trans_ack` is `true`, then ack's will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_trans_ack_maxcount }\n\n- **`trans_ack_maxcount`** - Maximum number of accumulated ack's. At most this\n many ack's will be accumulated by the transaction sender (if started and\n configured to accumulate ack's).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `10`.\n\n [](){: #ui_trans_req }\n\n- **`trans_req`** - Shall requests be accumulated or not.\n\n If `trans_req` is `false`, then request(s) will be sent immediately (in its\n own message).\n\n If `trans_req` is true, then request(s) will instead be sent to the\n transaction sender process for accumulation and later sending (see\n `trans_ack_maxcount`, `trans_req_maxcount`, `trans_req_maxsize`,\n `trans_ack_maxcount` and `trans_timer`).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_trans_req_maxcount }\n\n- **`trans_req_maxcount`** - Maximum number of accumulated requests. At most\n this many requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `10`.\n\n [](){: #ui_trans_req_maxsize }\n\n- **`trans_req_maxsize`** - Maximum size of the accumulated requests. At most\n this much requests will be accumulated by the transaction sender (if started\n and configured to accumulate requests).\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `2048`.\n\n [](){: #ui_trans_timer }\n\n- **`trans_timer`** - Transaction sender timeout time. Has two functions. First,\n if the value is 0, then transactions will not be accumulated (e.g. the\n transaction sender process will not be started). Second, if the value is\n greater then 0 and `auto_ack` and `trans_ack` are both true or if `trans_req`\n is true, then transaction sender will be started and transactions (which is\n depending on the values of `auto_ack`, `trans_ack` and `trans_req`) will be\n accumulated, for later sending.\n\n See also [transaction sender](megaco_run.md#transaction_sender) for more info.\n\n Value type: [integer()](`t:erlang:integer/0`)\n\n Defaults to `0`.\n\n [](){: #ui_pending_timer }\n\n- **`pending_timer`** - Automatically send pending if the timer expires before a\n transaction reply has been sent. This timer is also called provisional\n response timer.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `30000`.\n\n [](){: #ui_sent_pending_limit }\n\n- **`sent_pending_limit`** - Sent pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be sent\n (for a given received transaction request). When the limit is exceeded, the\n transaction is aborted (see\n [handle_trans_request_abort](`c:megaco_user:handle_trans_request_abort/5`)) and an error\n message is sent to the other side.\n\n Note that this has no effect on the actual sending of pending transactions.\n This is either implicit (e.g. when receiving a re-sent transaction request for\n a request which is being processed) or controlled by the pending_timer, see\n above.\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.\n\n [](){: #ui_recv_pending_limit }\n\n- **`recv_pending_limit`** - Receive pending limit (see the\n MGOriginatedPendingLimit and the MGCOriginatedPendingLimit of the megaco root\n package). This parameter specifies how many pending messages that can be\n received (for a sent transaction request). When the limit is exceeded, the\n transaction is considered lost, and an error returned to the user (through the\n call-back function _handle_trans_reply_).\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.\n\n [](){: #ui_send_mod }\n\n- **`send_mod`** - Send callback module which exports send_message/2. The\n function SendMod:send_message(SendHandle, Binary) is invoked when the bytes\n needs to be transmitted to the remote user.\n\n Value type: [module()](`t:erlang:module/0`)\n\n Defaults to `megaco_tcp`.\n\n [](){: #ui_encoding_mod }\n\n- **`encoding_mod`** - Encoding callback module which exports encode_message/2\n and decode_message/2. The function EncodingMod:encode_message(EncodingConfig,\n MegacoMessage) is invoked whenever a 'MegacoMessage' record needs to be\n translated into an Erlang binary. The function\n EncodingMod:decode_message(EncodingConfig, Binary) is invoked whenever an\n Erlang binary needs to be translated into a 'MegacoMessage' record.\n\n Value type: [module()](`t:erlang:module/0`)\n\n Defaults to `megaco_pretty_text_encoder`.\n\n [](){: #ui_encoding_config }\n\n- **`encoding_config`** - Encoding module config.\n\n Value type: [list()](`t:erlang:list/0`)\n\n Defaults to `[]`.\n\n [](){: #ui_protocol_version }\n\n- **`protocol_version`** - Actual protocol version.\n\n Value type: `t:protocol_version/0`\n\n Defaults to `1`.\n\n [](){: #ui_strict_version }\n\n- **`strict_version`** - Strict version control, i.e. when a message is\n received, verify that the version is that which was negotiated.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `true`.\n\n [](){: #ui_reply_data }\n\n- **`reply_data`** - Default reply data.\n\n Value type: [term()](`t:erlang:term/0`)\n\n Defaults to `undefined`.\n\n [](){: #ui_user_mod }\n\n- **`user_mod`** - Name of the user callback module. See the the reference\n manual for megaco_user for more info.\n\n Value type: [module()](`t:erlang:module/0`)\n\n Has no default value since its an mandatory config option.\n\n [](){: #ui_user_args }\n\n- **`user_args`** - List of extra arguments to the user callback functions. See\n the the reference manual for megaco_user for more info.\n\n Value type: [list()](`t:erlang:list/0`)\n\n [](){: #ui_threaded }\n\n- **`threaded`** - If a received message contains several transaction requests,\n this option indicates whether the requests should be handled sequentially in\n the same process (`false`), or if each request should be handled by its own\n process (`true` i.e. a separate process is spawned for each request).\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_resend_indication }\n\n- **`resend_indication`** - This option indicates weather the transport module\n should be told if a message send is a resend or not.\n\n If _false_, megaco messages are sent using the\n [send_message](`c:megaco_transport:send_message/2`) function.\n\n If _true_, megaco message _re-sends_ are made using the\n [resend_message](`c:megaco_transport:resend_message/2`) function. The initial\n message send is still done using the\n [send_message](`c:megaco_transport:send_message/2`) function.\n\n The special value _flag_ instead indicates that the function\n [send_message/3](`c:megaco_transport:send_message/3`) shall be used.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_segment_reply_ind }\n\n- **`segment_reply_ind`** - This option specifies if the user shall be notified\n of received segment replies or not.\n\n See [handle_segment_reply](`c:megaco_user:handle_segment_reply/6`) callback function\n for more information.\n\n Value type: [boolean()](`t:erlang:boolean/0`)\n\n Defaults to `false`.\n\n [](){: #ui_segment_recv_timer }\n\n- **`segment_recv_timer`** - This timer is started when the segment indicated by\n the `segmentation complete token` is received, but all segments has not yet\n been received.\n\n When the timer finally expires, a \"megaco segments not received\" (459) error\n message is sent to the other side and the user is notified with a\n `segment timeout` `UserReply` in either the\n [handle_trans_reply](`c:megaco_user:handle_trans_reply/5`) callback function or the\n return value of the `call/3` function.\n\n Value type: `t:megaco_timer/0`\n\n Defaults to `10000`.\n\n [](){: #ui_segment_send }\n\n- **`segment_send`** - Shall outgoing messages be segmented or not.\n\n Value type: `none` | [pos_integer()](`t:erlang:pos_integer/0`) | `infinity`\n\n - **`none`** - Do not segment outgoing reply messages. This is useful when\n either it is known that messages are never to large or that the transport\n protocol can handle such things on its own (e.g. TCP or SCTP).\n\n - **`t:pos_integer/0`** - Outgoing reply messages will be segmented as needed\n (see `max_pdu_size` below). This value, K, indicate the outstanding window,\n i.e. how many segments can be outstanding (not acknowledged) at any given\n time.\n\n - **`infinity`** - Outgoing reply messages will be segmented as needed (see\n `max_pdu_size` below). Segment messages are sent all at once (i.e. no\n acknowledgement awaited before sending the next segment).\n\n Defaults to `none`.\n\n [](){: #ui_max_pdu_size }\n\n- **`max_pdu_size`** - Max message size. If the encoded message (PDU) exceeds\n this size, the message should be segmented, and then encoded.\n\n Value type: `infinity` | [pos_integer()](`t:erlang:pos_integer/0`)\n\n Defaults to `infinity`.","ref":"megaco.html#t:user_info_item/0"},{"type":"type","title":"megaco.void/0","doc":"The type is used when a functions return is to be ignored.","ref":"megaco.html#t:void/0"},{"type":"module","title":"megaco_codec_meas","doc":"This module implements a simple megaco codec measurement tool.\n\nResults are written to file (excel compatible text files) and on stdout.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.","ref":"megaco_codec_meas.html"},{"type":"function","title":"megaco_codec_meas.start/0","doc":"","ref":"megaco_codec_meas.html#start/0"},{"type":"function","title":"megaco_codec_meas.start/1","doc":"This function runs the measurement on all the _official_ codecs; pretty,\ncompact, ber, per and erlang.","ref":"megaco_codec_meas.html#start/1"},{"type":"module","title":"megaco_codec_mstone1","doc":"This module implements a simple megaco codec-based performance tool.\n\nThis module implements the _mstone1_ tool, a simple megaco codec-based\nperformance tool.\n\nThe results, the mstone value(s), are written to stdout.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.","ref":"megaco_codec_mstone1.html"},{"type":"function","title":"megaco_codec_mstone1.start/0","doc":"","ref":"megaco_codec_mstone1.html#start/0"},{"type":"function","title":"megaco_codec_mstone1.start/1","doc":"","ref":"megaco_codec_mstone1.html#start/1"},{"type":"function","title":"megaco_codec_mstone1.start/2","doc":"This function starts the _mstone1_ performance test with all codec configs.\n`Factor` (defaults to `1`) processes are started for every supported codec\nconfig.\n\nEach process encodes and decodes their messages. The number of messages\nprocessed in total (for all processes) is the mstone value.","ref":"megaco_codec_mstone1.html#start/2"},{"type":"function","title":"megaco_codec_mstone1.start_flex/0","doc":"","ref":"megaco_codec_mstone1.html#start_flex/0"},{"type":"function","title":"megaco_codec_mstone1.start_flex/1","doc":"","ref":"megaco_codec_mstone1.html#start_flex/1"},{"type":"function","title":"megaco_codec_mstone1.start_flex/2","doc":"This function starts the _mstone1_ performance test with only the flex codec\nconfigs (i.e. `pretty` and `compact` with `flex`). The same number of processes\nare started as when running the standard test (using the `start/0,1` function).\nEach process encodes and decodes their messages. The number of messages\nprocessed in total (for all processes) is the mstone value.","ref":"megaco_codec_mstone1.html#start_flex/2"},{"type":"function","title":"megaco_codec_mstone1.start_no_drv/0","doc":"","ref":"megaco_codec_mstone1.html#start_no_drv/0"},{"type":"function","title":"megaco_codec_mstone1.start_no_drv/1","doc":"","ref":"megaco_codec_mstone1.html#start_no_drv/1"},{"type":"function","title":"megaco_codec_mstone1.start_no_drv/2","doc":"This function starts the _mstone1_ performance test with codec configs not using\nany drivers (i.e. `pretty` and `compact` without `flex`, `ber` and `per` without\n`driver` and `erlang` without `compressed`). The same number of processes are\nstarted as when running the standard test (using the `start/0,1` function). Each\nprocess encodes and decodes their messages. The number of messages processed in\ntotal (for all processes) is the mstone value.","ref":"megaco_codec_mstone1.html#start_no_drv/2"},{"type":"function","title":"megaco_codec_mstone1.start_only_drv/0","doc":"","ref":"megaco_codec_mstone1.html#start_only_drv/0"},{"type":"function","title":"megaco_codec_mstone1.start_only_drv/1","doc":"","ref":"megaco_codec_mstone1.html#start_only_drv/1"},{"type":"function","title":"megaco_codec_mstone1.start_only_drv/2","doc":"This function starts the _mstone1_ performance test with only the driver using\ncodec configs (i.e. `pretty` and `compact` with `flex`, and `ber` and `per` with\n`driver` and `erlang` with `compressed`). The same number of processes are\nstarted as when running the standard test (using the `start/0,1` function). Each\nprocess encodes and decodes their messages. The number of messages processed in\ntotal (for all processes) is the mstone value.","ref":"megaco_codec_mstone1.html#start_only_drv/2"},{"type":"module","title":"megaco_codec_mstone2","doc":"This module implements a simple megaco codec-based performance tool.\n\nThis module implements the _mstone2_ tool, a simple megaco codec-based\nperformance tool.\n\nThe results, the mstone value(s), are written to stdout.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.","ref":"megaco_codec_mstone2.html"},{"type":"function","title":"megaco_codec_mstone2.start/0","doc":"","ref":"megaco_codec_mstone2.html#start/0"},{"type":"function","title":"megaco_codec_mstone2.start/1","doc":"This function starts the _mstone2_ performance test with all codec configs.\nProcesses are created dynamically. Each process make _one_ run through their\nmessages (decoding and encoding messages) and then exits. When one process\nexits, a new is created with the same codec config and set of messages.\n\nThe number of messages processed in total (for all processes) is the mstone\nvalue.","ref":"megaco_codec_mstone2.html#start/1"},{"type":"module","title":"megaco_codec_transform","doc":"Megaco message transformation utility.\n\nThis module implements a simple megaco message transformation utility.\n\n_Note_ that this module is _not_ included in the runtime part of the\napplication.\n\n[](){: #export_messages }","ref":"megaco_codec_transform.html"},{"type":"function","title":"megaco_codec_transform.export_messages/0","doc":"","ref":"megaco_codec_transform.html#export_messages/0"},{"type":"function","title":"megaco_codec_transform.export_messages/1","doc":"Export the messages in the `MessagePackage` (default is `time_test`).\n\nThe output produced by this function is a directory structure with the following\nstructure:\n\n```text\n /pretty/ \n compact/ \n per/ \n ber/ \n erlang/ \n```","ref":"megaco_codec_transform.html#export_messages/1"},{"type":"module","title":"megaco_digit_map","doc":"Digit Map utility module.\n\nThis is a Digit Map utility module (types).","ref":"megaco_digit_map.html"},{"type":"module","title":"Version note - megaco_digit_map","doc":"This module has existed in the megaco app for long time,\nbut as of 27.0, its also documented.","ref":"megaco_digit_map.html#module-version-note"},{"type":"type","title":"megaco_digit_map.cancel/0","doc":"`$z | $Z | cancel`","ref":"megaco_digit_map.html#t:cancel/0"},{"type":"type","title":"megaco_digit_map.event/0","doc":"","ref":"megaco_digit_map.html#t:event/0"},{"type":"type","title":"megaco_digit_map.kind/0","doc":"","ref":"megaco_digit_map.html#t:kind/0"},{"type":"type","title":"megaco_digit_map.letter/0","doc":"`$0..$9 | $a..$k | $A..$K`","ref":"megaco_digit_map.html#t:letter/0"},{"type":"type","title":"megaco_digit_map.one_second/0","doc":"`$s | $S`","ref":"megaco_digit_map.html#t:one_second/0"},{"type":"type","title":"megaco_digit_map.pause/0","doc":"","ref":"megaco_digit_map.html#t:pause/0"},{"type":"type","title":"megaco_digit_map.ten_seconds/0","doc":"`$l | $L`","ref":"megaco_digit_map.html#t:ten_seconds/0"},{"type":"type","title":"megaco_digit_map.value/0","doc":"","ref":"megaco_digit_map.html#t:value/0"},{"type":"behaviour","title":"megaco_edist_compress","doc":"Megaco erlang dist compress behaviour.\n\nThe following functions should be exported from a `megaco_edist_compress`\ncallback module:","ref":"megaco_edist_compress.html"},{"type":"callback","title":"megaco_edist_compress.decode/2","doc":"Decompress a megaco component.","ref":"megaco_edist_compress.html#c:decode/2"},{"type":"callback","title":"megaco_edist_compress.encode/2","doc":"Compress a megaco component. The erlang dist encoder makes no assumption on the\nhow or even if the component is compressed.","ref":"megaco_edist_compress.html#c:encode/2"},{"type":"behaviour","title":"megaco_encoder","doc":"Megaco encoder behaviour.\n\nThe following functions should be exported from a `megaco_encoder` callback\nmodule:","ref":"megaco_encoder.html"},{"type":"behaviour","title":"DATA TYPES - megaco_encoder","doc":"> #### Note {: .info }\n>\n> Note that the actual definition of (some of) these records depend on the\n> megaco protocol version used. For instance, the `'TransactionReply'` record\n> has two more fields in version 3, so a simple erlang type definition cannot be\n> made here.\n\n```text\nprotocol_version() = integer()\nsegment_no() = integer()\nmegaco_message() = #'MegacoMessage{}'\ntransaction() = {transactionRequest, transaction_request()} |\n {transactionPending, transaction_reply()} |\n {transactionReply, transaction_pending()} |\n {transactionResponseAck, transaction_response_ack()} |\n {segmentReply, segment_reply()}\ntransaction_request() = #'TransactionRequest'{}\ntransaction_pending() = #'TransactionPending'{}\ntransaction_reply() = #'TransactionReply'{}\ntransaction_response_ack() = [transaction_ack()]\ntransaction_ack() = #'TransactionAck'{}\nsegment_reply() = #'SegmentReply'{}\naction_request() = #'ActionRequest'{}\naction_reply() = #'ActionReply'{}\ncommand_request() = #'CommandRequest'{}\nerror_desc() = #'ErrorDescriptor'{}\n```","ref":"megaco_encoder.html#module-data-types"},{"type":"callback","title":"megaco_encoder.decode_message/3","doc":"Decode a megaco message.\n\nNote that if the Version argument is `dynamic`, the decoder should try to figure\nout the actual version from the message itself and then use the proper decoder,\ne.g. version 1. \nIf on the other hand the Version argument is an integer, it means that this is\nthe expected version of the message and the decoder for that version should be\nused.","ref":"megaco_encoder.html#c:decode_message/3"},{"type":"callback","title":"megaco_encoder.decode_mini_message/3","doc":"Perform a minimal decode of a megaco message.\n\nThe purpose of this function is to do a minimal decode of Megaco message. A\nsuccessfull result is a `'MegacoMessage'` in which only version and mid has been\ninitiated. This function is used by the megaco_messenger module when the\n[`decode_message/3`](`c:decode_message/3`) function fails to figure out the mid\n(the actual sender) of the message.\n\nNote again that a successfull decode only returns a partially initiated message.","ref":"megaco_encoder.html#c:decode_mini_message/3"},{"type":"callback","title":"megaco_encoder.encode_action_reply/3","doc":"Encode a megaco action reply. If this, for whatever reason, is not supported,\nthe function should return the error reason `not_implemented`.\n\nThis function is used when segmentation has been configured. So, for this to\nwork, this function _must_ be fully supported\\!","ref":"megaco_encoder.html#c:encode_action_reply/3"},{"type":"callback","title":"megaco_encoder.encode_action_requests/3","doc":"Encode megaco action requests. This function is called when the user calls the\nfunction [encode_actions/3](`megaco:encode_actions/3`). If that function is\nnever used or if the codec cannot support this (the encoding of individual\nactions), then return with error reason `not_implemented`.","ref":"megaco_encoder.html#c:encode_action_requests/3"},{"type":"callback","title":"megaco_encoder.encode_message/3","doc":"Encode a megaco message.","ref":"megaco_encoder.html#c:encode_message/3"},{"type":"callback","title":"megaco_encoder.encode_transaction/3","doc":"Encode a megaco transaction. If this, for whatever reason, is not supported, the\nfunction should return the error reason `not_implemented`.\n\nThis functionality is used both when the transaction sender is used and for\nsegmentation. So, for either of those to work, this function _must_ be fully\nsupported\\!","ref":"megaco_encoder.html#c:encode_transaction/3"},{"type":"type","title":"megaco_encoder.action_reply/0","doc":"","ref":"megaco_encoder.html#t:action_reply/0"},{"type":"type","title":"megaco_encoder.action_request/0","doc":"","ref":"megaco_encoder.html#t:action_request/0"},{"type":"type","title":"megaco_encoder.alpha/0","doc":"Alpha Numeric characters: `A..Z | a..z`","ref":"megaco_encoder.html#t:alpha/0"},{"type":"type","title":"megaco_encoder.command_request/0","doc":"","ref":"megaco_encoder.html#t:command_request/0"},{"type":"type","title":"megaco_encoder.deviceName/0","doc":"","ref":"megaco_encoder.html#t:deviceName/0"},{"type":"type","title":"megaco_encoder.digit/0","doc":"Decimal digits: `0..9`","ref":"megaco_encoder.html#t:digit/0"},{"type":"type","title":"megaco_encoder.domainName/0","doc":"","ref":"megaco_encoder.html#t:domainName/0"},{"type":"type","title":"megaco_encoder.error_desc/0","doc":"","ref":"megaco_encoder.html#t:error_desc/0"},{"type":"type","title":"megaco_encoder.ip4Address/0","doc":"","ref":"megaco_encoder.html#t:ip4Address/0"},{"type":"type","title":"megaco_encoder.ip6Address/0","doc":"","ref":"megaco_encoder.html#t:ip6Address/0"},{"type":"type","title":"megaco_encoder.megaco_message/0","doc":"","ref":"megaco_encoder.html#t:megaco_message/0"},{"type":"type","title":"megaco_encoder.mtpAddress/0","doc":"There is no way to properly express this type in the Erlang type system, so this\nis the best we can do.\n\nA proper definition would be: `-type mtpAddress() :: octet_string(2..4).`","ref":"megaco_encoder.html#t:mtpAddress/0"},{"type":"type","title":"megaco_encoder.octet/0","doc":"","ref":"megaco_encoder.html#t:octet/0"},{"type":"type","title":"megaco_encoder.octet_string/0","doc":"","ref":"megaco_encoder.html#t:octet_string/0"},{"type":"type","title":"megaco_encoder.pathName/0","doc":"There is no way to properly express this type in the Erlang type system, so this\nis the best we can do. The minimum length is 1 and the maximum length is 64.\n\nHere is the ABNF (copied from the megaco standard) to fill in the blanks:\n\n`# Total length of pathNAME must not exceed 64 chars.`\n\n`pathNAME = [\"*\"] NAME *(\"/\" / \"*\"/ ALPHA / DIGIT /\"_\" / \"$\" ) [\"@\" pathDomainName ]`\n\n`# ABNF allows two or more consecutive \".\" although it is meaningless in a path domain name.`\n\n`pathDomainName = (ALPHA / DIGIT / \"*\" ) *63(ALPHA / DIGIT / \"-\" / \"*\" / \".\")`\n\n`NAME = ALPHA *63(ALPHA / DIGIT / \"_\" )`","ref":"megaco_encoder.html#t:pathName/0"},{"type":"type","title":"megaco_encoder.protocol_version/0","doc":"","ref":"megaco_encoder.html#t:protocol_version/0"},{"type":"type","title":"megaco_encoder.segment_no/0","doc":"","ref":"megaco_encoder.html#t:segment_no/0"},{"type":"type","title":"megaco_encoder.segment_reply/0","doc":"","ref":"megaco_encoder.html#t:segment_reply/0"},{"type":"type","title":"megaco_encoder.transaction/0","doc":"","ref":"megaco_encoder.html#t:transaction/0"},{"type":"type","title":"megaco_encoder.transaction_ack/0","doc":"","ref":"megaco_encoder.html#t:transaction_ack/0"},{"type":"type","title":"megaco_encoder.transaction_pending/0","doc":"","ref":"megaco_encoder.html#t:transaction_pending/0"},{"type":"type","title":"megaco_encoder.transaction_reply/0","doc":"The problem with TransactionReply is that its definition depend on which version\nof the protocol we are using. As of version 3, it has two more fields.","ref":"megaco_encoder.html#t:transaction_reply/0"},{"type":"type","title":"megaco_encoder.transaction_request/0","doc":"","ref":"megaco_encoder.html#t:transaction_request/0"},{"type":"type","title":"megaco_encoder.transaction_response_ack/0","doc":"","ref":"megaco_encoder.html#t:transaction_response_ack/0"},{"type":"module","title":"megaco_flex_scanner","doc":"Interface module to the flex scanner linked in driver.\n\nThis module contains the public interface to the flex scanner linked in driver.\nThe flex scanner performs the scanning phase of text message decoding.\n\nThe flex scanner is written using a tool called _flex_. In order to be able to\ncompile the flex scanner driver, this tool has to be available.\n\nBy default the flex scanner reports line-number of an error. But it can be built\nwithout line-number reporting. Instead token number is used. This will speed up\nthe scanning some 5-10%. Use `--disable-megaco-flex-scanner-lineno` when\nconfiguring the application.\n\nThe scanner will, by default, be built as a reentrant scanner _if_ the flex\nutility supports this (it depends on the version of flex). It is possible to\nexplicitly disable this even when flex support this. Use\n`--disable-megaco-reentrant-flex-scanner` when configuring the application.","ref":"megaco_flex_scanner.html"},{"type":"function","title":"megaco_flex_scanner.is_reentrant_enabled/0","doc":"Is the flex scanner reentrant or not.","ref":"megaco_flex_scanner.html#is_reentrant_enabled/0"},{"type":"function","title":"megaco_flex_scanner.is_scanner_port/2","doc":"Checks if a port is a flex scanner port or not (useful when if a port exits).","ref":"megaco_flex_scanner.html#is_scanner_port/2"},{"type":"function","title":"megaco_flex_scanner.scan/2","doc":"Scans a megaco message and generates a token list to be passed on the parser.","ref":"megaco_flex_scanner.html#scan/2"},{"type":"function","title":"megaco_flex_scanner.start/0","doc":"This function is used to start the flex scanner. It locates the library and\nloads the linked in driver.\n\nOn a single core system or if it's a non-reentrant scanner, a single port is\ncreated. On a multi-core system with a reentrant scanner, several ports will be\ncreated (one for each scheduler).\n\nNote that the process that calls this function _must_ be permanent. If it dies,\nthe port(s) will exit and the driver unload.","ref":"megaco_flex_scanner.html#start/0"},{"type":"function","title":"megaco_flex_scanner.stop/1","doc":"This function is used to stop the flex scanner. It also unloads the driver.","ref":"megaco_flex_scanner.html#stop/1"},{"type":"type","title":"megaco_flex_scanner.megaco_ports/0","doc":"Return value of a successful (flex) scanner start.","ref":"megaco_flex_scanner.html#t:megaco_ports/0"},{"type":"module","title":"megaco_sdp","doc":"SDP utility module.\n\nThis module contains various things related to SDP.","ref":"megaco_sdp.html"},{"type":"module","title":"Version note - megaco_sdp","doc":"This module has existed in the megaco app for long time,\nbut as of 27.0 its also documented.","ref":"megaco_sdp.html#module-version-note"},{"type":"type","title":"megaco_sdp.property_group/0","doc":"","ref":"megaco_sdp.html#t:property_group/0"},{"type":"type","title":"megaco_sdp.property_groups/0","doc":"","ref":"megaco_sdp.html#t:property_groups/0"},{"type":"type","title":"megaco_sdp.property_parm/0","doc":"","ref":"megaco_sdp.html#t:property_parm/0"},{"type":"type","title":"megaco_sdp.sdp/0","doc":"","ref":"megaco_sdp.html#t:sdp/0"},{"type":"type","title":"megaco_sdp.sdp_a/0","doc":"Session attribute.","ref":"megaco_sdp.html#t:sdp_a/0"},{"type":"type","title":"megaco_sdp.sdp_a_fmtp/0","doc":"","ref":"megaco_sdp.html#t:sdp_a_fmtp/0"},{"type":"type","title":"megaco_sdp.sdp_a_ptime/0","doc":"","ref":"megaco_sdp.html#t:sdp_a_ptime/0"},{"type":"type","title":"megaco_sdp.sdp_a_quality/0","doc":"","ref":"megaco_sdp.html#t:sdp_a_quality/0"},{"type":"type","title":"megaco_sdp.sdp_a_rtpmap/0","doc":"","ref":"megaco_sdp.html#t:sdp_a_rtpmap/0"},{"type":"type","title":"megaco_sdp.sdp_b/0","doc":"Bandwidth information.","ref":"megaco_sdp.html#t:sdp_b/0"},{"type":"type","title":"megaco_sdp.sdp_c/0","doc":"Connection information.","ref":"megaco_sdp.html#t:sdp_c/0"},{"type":"type","title":"megaco_sdp.sdp_e/0","doc":"Email address.","ref":"megaco_sdp.html#t:sdp_e/0"},{"type":"type","title":"megaco_sdp.sdp_i/0","doc":"Session information.","ref":"megaco_sdp.html#t:sdp_i/0"},{"type":"type","title":"megaco_sdp.sdp_k/0","doc":"Encryption key.","ref":"megaco_sdp.html#t:sdp_k/0"},{"type":"type","title":"megaco_sdp.sdp_m/0","doc":"Media name and transport address.","ref":"megaco_sdp.html#t:sdp_m/0"},{"type":"type","title":"megaco_sdp.sdp_o/0","doc":"Owner/creator and session identifier.","ref":"megaco_sdp.html#t:sdp_o/0"},{"type":"type","title":"megaco_sdp.sdp_p/0","doc":"Phone number.","ref":"megaco_sdp.html#t:sdp_p/0"},{"type":"type","title":"megaco_sdp.sdp_property_group/0","doc":"","ref":"megaco_sdp.html#t:sdp_property_group/0"},{"type":"type","title":"megaco_sdp.sdp_property_groups/0","doc":"","ref":"megaco_sdp.html#t:sdp_property_groups/0"},{"type":"type","title":"megaco_sdp.sdp_property_parm/0","doc":"","ref":"megaco_sdp.html#t:sdp_property_parm/0"},{"type":"type","title":"megaco_sdp.sdp_r/0","doc":"Repeat times.","ref":"megaco_sdp.html#t:sdp_r/0"},{"type":"type","title":"megaco_sdp.sdp_s/0","doc":"Session name.","ref":"megaco_sdp.html#t:sdp_s/0"},{"type":"type","title":"megaco_sdp.sdp_t/0","doc":"","ref":"megaco_sdp.html#t:sdp_t/0"},{"type":"type","title":"megaco_sdp.sdp_u/0","doc":"URI of description.","ref":"megaco_sdp.html#t:sdp_u/0"},{"type":"type","title":"megaco_sdp.sdp_v/0","doc":"Protocol version.","ref":"megaco_sdp.html#t:sdp_v/0"},{"type":"type","title":"megaco_sdp.sdp_z/0","doc":"Time zone adjustment.","ref":"megaco_sdp.html#t:sdp_z/0"},{"type":"module","title":"megaco_tcp","doc":"Interface module to TPKT transport protocol for Megaco/H.248.\n\nThis module contains the public interface to the TPKT (TCP/IP) version transport\nprotocol for Megaco/H.248.","ref":"megaco_tcp.html"},{"type":"function","title":"megaco_tcp.block/1","doc":"Stop receiving incoming messages on the socket.","ref":"megaco_tcp.html#block/1"},{"type":"function","title":"megaco_tcp.close/1","doc":"This function is used for closing an active TPKT connection.","ref":"megaco_tcp.html#close/1"},{"type":"function","title":"megaco_tcp.connect/2","doc":"This function is used to open a TPKT connection.\n\n- **`module`** - This option makes it possible for the user to provide their own\n callback module. The `receive_message/4` or `process_received_message/4`\n functions of this module is called when a new message is received. Which one\n is called depends on the size of the message;\n\n - **`small`** - receive_message\n\n - **`large`** - process_received_message\n\n Default value is _megaco_.\n\n- **`inet_backend`** - Choose the inet-backend.\n\n This option make it possible to use a different inet-backend ('default',\n 'inet' or 'socket').\n\n Default is `default` (system default).","ref":"megaco_tcp.html#connect/2"},{"type":"function","title":"megaco_tcp.get_stats/0","doc":"Get all counter values for all known connections.","ref":"megaco_tcp.html#get_stats/0"},{"type":"function","title":"megaco_tcp.get_stats/1","doc":"Get all counter values for a given (connection) handle.","ref":"megaco_tcp.html#get_stats/1"},{"type":"function","title":"megaco_tcp.get_stats/2","doc":"Get the value of a specific counter.","ref":"megaco_tcp.html#get_stats/2"},{"type":"function","title":"megaco_tcp.listen/2","doc":"This function is used for starting new TPKT listening socket for TCP/IP. The\noption list contains the socket definitions.\n\n- **`inet_backend`** - Choose the inet-backend.\n\n This option make it possible to use a different inet-backend ('default',\n 'inet' or 'socket').\n\n Default is `default` (system default).","ref":"megaco_tcp.html#listen/2"},{"type":"function","title":"megaco_tcp.reset_stats/0","doc":"Reset all counters for all connections.","ref":"megaco_tcp.html#reset_stats/0"},{"type":"function","title":"megaco_tcp.reset_stats/1","doc":"Reset all counters for the given connection.","ref":"megaco_tcp.html#reset_stats/1"},{"type":"function","title":"megaco_tcp.send_message/2","doc":"Sends a message on a TPKT connection.","ref":"megaco_tcp.html#send_message/2"},{"type":"function","title":"megaco_tcp.socket/1","doc":"This function is used to convert a socket `handle()` to a inet `socket()`.","ref":"megaco_tcp.html#socket/1"},{"type":"function","title":"megaco_tcp.start_transport/0","doc":"This function is used for starting the TCP/IP transport service. Use\nexit(TransportRef, Reason) to stop the transport service.","ref":"megaco_tcp.html#start_transport/0"},{"type":"function","title":"megaco_tcp.unblock/1","doc":"Starting to receive incoming messages from the socket again.","ref":"megaco_tcp.html#unblock/1"},{"type":"function","title":"megaco_tcp.upgrade_receive_handle/2","doc":"Upgrade the receive handle of the control process (e.g. after having changed\nprotocol version).","ref":"megaco_tcp.html#upgrade_receive_handle/2"},{"type":"type","title":"megaco_tcp.counter/0","doc":"Defines the different counters handled by this transport.","ref":"megaco_tcp.html#t:counter/0"},{"type":"opaque","title":"megaco_tcp.handle/0","doc":"An opaque data type representing a TPKT connection.","ref":"megaco_tcp.html#t:handle/0"},{"type":"behaviour","title":"megaco_transport","doc":"Megaco transport behaviour.\n\nThe following functions should be exported from a `megaco_transport` callback\nmodule:\n\n- `c:send_message/2` [`mandatory`]\n- `c:send_message/3` [`optional`]\n- `c:resend_message/2` [`optional`]","ref":"megaco_transport.html"},{"type":"callback","title":"megaco_transport.resend_message/2","doc":"Re-send a megaco message.\n\nNote that this function will only be called if the user has set the\n[resend_indication](`m:megaco#ui_resend_indication`) config option to\n`true`_and_ it is in fact a message resend. If not _both_ of these condition's\nare meet, `send_message` will be called.\n\nIf the function returns `{cancel, Reason}`, this means the transport module\ndecided not to send the message. This is _not_ an error. No error messages will\nbe issued and no error counters incremented. What actions this will result in\ndepends on what kind of message was sent.\n\nIn the case of requests, megaco will cancel the message in much the same way as\nif `megaco:cancel` had been called (after a successfull send). The information\nwill be propagated back to the user differently depending on how the request(s)\nwhere issued: For requests issued using [megaco:call](`megaco:call/3`), the info\nwill be delivered in the return value. For requests issued using `megaco:cast`\nthe info will be delivered via a call to the callback function\n[handle_trans_reply](`c:megaco_user:handle_trans_reply/5`).\n\nIn the case of reply, megaco will cancel the reply and information of this will\nbe returned to the user via a call to the callback function\n[handle_trans_ack](`c:megaco_user:handle_trans_ack/5`).","ref":"megaco_transport.html#c:resend_message/2"},{"type":"callback","title":"megaco_transport.send_message/2","doc":"","ref":"megaco_transport.html#c:send_message/2"},{"type":"callback","title":"megaco_transport.send_message/3","doc":"Send a megaco message.\n\nIf the function returns `{cancel, Reason}`, this means the transport module\ndecided not to send the message. This is _not_ an error. No error messages will\nbe issued and no error counters incremented. What actions this will result in\ndepends on what kind of message was sent.\n\nIn the case of requests, megaco will cancel the message in much the same way as\nif `megaco:cancel` had been called (after a successfull send). The information\nwill be propagated back to the user differently depending on how the request(s)\nwhere issued: For requests issued using `megaco:call/3`, the info\nwill be delivered in the return value. For requests issued using `megaco:cast`\nthe info will be delivered via a call to the callback function\n[handle_trans_reply](`c:megaco_user:handle_trans_reply/5`).\n\nIn the case of reply, megaco will cancel the reply and information of this will\nbe returned to the user via a call to the callback function\n[handle_trans_ack](`c:megaco_user:handle_trans_ack/5`).\n\nThe function [`send_message/3`](`c:send_message/3`) will only be called if the\n[resend_indication](`m:megaco#ui_resend_indication`) config option has been set\nto the value `flag`. The third argument, `Resend` then indicates if the message\nsend is a resend or not.","ref":"megaco_transport.html#c:send_message/3"},{"type":"module","title":"megaco_udp","doc":"Interface module to UDP transport protocol for Megaco/H.248.\n\nThis module contains the public interface to the UDP/IP version\ntransport protocol for Megaco/H.248.","ref":"megaco_udp.html"},{"type":"function","title":"megaco_udp.block/1","doc":"Stop receiving incoming messages on the socket.","ref":"megaco_udp.html#block/1"},{"type":"function","title":"megaco_udp.close/1","doc":"This function is used for closing an active UDP socket.","ref":"megaco_udp.html#close/1"},{"type":"function","title":"megaco_udp.create_send_handle/3","doc":"Creates a send handle from a transport handle. The send handle is intended to be\nused by megaco_udp:send_message/2.","ref":"megaco_udp.html#create_send_handle/3"},{"type":"function","title":"megaco_udp.get_stats/0","doc":"Get all counter values for all known connections.","ref":"megaco_udp.html#get_stats/0"},{"type":"function","title":"megaco_udp.get_stats/1","doc":"Get all counter values for a given handle.","ref":"megaco_udp.html#get_stats/1"},{"type":"function","title":"megaco_udp.get_stats/2","doc":"Get the value of a specific counter.","ref":"megaco_udp.html#get_stats/2"},{"type":"function","title":"megaco_udp.open/2","doc":"This function is used to open an UDP/IP socket.\n\n- **`module`** - The option makes it possible for the user to provide their own\n callback module. The functions `receive_message/4` or\n `process_received_message/4` of this module is called when a new message is\n received. Which one depends on the size of the message:\n\n - **`small`** - receive_message\n\n - **`large`** - process_received_message\n\n Default value is _megaco_.\n\n- **`inet_backend`** - Choose the inet-backend.\n\n This option make it possible to use a different inet-backend ('default',\n 'inet' or 'socket').\n\n Default is `default` (system default).","ref":"megaco_udp.html#open/2"},{"type":"function","title":"megaco_udp.reset_stats/0","doc":"Reset all counters for all UDP handles.","ref":"megaco_udp.html#reset_stats/0"},{"type":"function","title":"megaco_udp.reset_stats/1","doc":"Reset all counters for the given UDP handle.","ref":"megaco_udp.html#reset_stats/1"},{"type":"function","title":"megaco_udp.send_message/2","doc":"Sends a message on a socket. The send handle is obtained by\nmegaco_udp:create_send_handle/3. Increments the NumOutMessages and NumOutOctets\ncounters if message successfully sent. In case of a failure to send, the\nNumErrors counter is _not_ incremented. This is done elsewhere in the megaco\napp.","ref":"megaco_udp.html#send_message/2"},{"type":"function","title":"megaco_udp.socket/1","doc":"This function is used to convert a socket `handle()` to a inet `socket()`.","ref":"megaco_udp.html#socket/1"},{"type":"function","title":"megaco_udp.start_transport/0","doc":"This function is used for starting the UDP/IP transport service. Use\nexit(TransportRef, Reason) to stop the transport service.","ref":"megaco_udp.html#start_transport/0"},{"type":"function","title":"megaco_udp.unblock/1","doc":"Starting to receive incoming messages from the socket again.","ref":"megaco_udp.html#unblock/1"},{"type":"function","title":"megaco_udp.upgrade_receive_handle/2","doc":"Update the receive handle of the control process (e.g. after having changed\nprotocol version).","ref":"megaco_udp.html#upgrade_receive_handle/2"},{"type":"type","title":"megaco_udp.counter/0","doc":"Defines the different counters handled by this transport.","ref":"megaco_udp.html#t:counter/0"},{"type":"opaque","title":"megaco_udp.handle/0","doc":"An opaque data type representing an UDP socket.","ref":"megaco_udp.html#t:handle/0"},{"type":"opaque","title":"megaco_udp.send_handle/0","doc":"An opaque data type representing an UDP socket, used when sending.","ref":"megaco_udp.html#t:send_handle/0"},{"type":"behaviour","title":"megaco_user","doc":"Callback module for users of the Megaco application\n\nThis module defines the callback behaviour of Megaco users. A megaco_user\ncompliant callback module must export the following functions:\n\n- [handle_connect/2,3](`c:handle_connect/3`)\n- [handle_disconnect/3](`c:handle_disconnect/3`)\n- [handle_syntax_error/3,4](`c:handle_syntax_error/4`)\n- [handle_message_error/3,4](`c:handle_message_error/4`)\n- [handle_trans_request/3,4](`c:handle_trans_request/4`)\n- [handle_trans_long_request/3,4](`c:handle_trans_long_request/4`)\n- [handle_trans_reply/4,5](`c:handle_trans_reply/5`)\n- [handle_trans_ack/4,5](`c:handle_trans_ack/5`)\n- [handle_unexpected_trans/3,4](`c:handle_unexpected_trans/4`)\n- [handle_trans_request_abort/4,5](`c:handle_trans_request_abort/5`)\n- [handle_segment_reply/5,6](`c:handle_segment_reply/6`)\n\nThe semantics of them and their exact signatures are explained below.\n\nThe `user_args` configuration parameter which may be used to extend the argument\nlist of the callback functions. For example, the handle_connect function takes\nby default two arguments:\n\n```\nhandle_connect(Handle, Version)\n```\n\nbut if the `user_args` parameter is set to a longer list, such as\n`[SomePid,SomeTableRef]`, the callback function is expected to have these (in\nthis case two) extra arguments last in the argument list:\n\n```erlang\nhandle_connect(Handle, Version, SomePid, SomeTableRef)\n```\n\n[](){: #extra_argument }\n\n> #### Note {: .info }\n>\n> Must of the functions below has an optional `Extra` argument (e.g.\n> [handle_unexpected_trans/4](`c:handle_unexpected_trans/4`)). The functions\n> which takes this argument will be called if and only if one of the functions\n> [`receive_message/5`](`megaco:receive_message/5`) or\n> [`process_received_message/5`](`megaco:process_received_message/5`) was called\n> with the `Extra` argument different than `ignore_extra`.","ref":"megaco_user.html"},{"type":"behaviour","title":"DATA TYPES - megaco_user","doc":"```erlang\naction_request() = #'ActionRequest'{}\naction_reply() = #'ActionReply'{}\nerror_desc() = #'ErrorDescriptor'{}\nsegment_no() = integer()\n```\n\n```erlang\nconn_handle() = #megaco_conn_handle{}\n```\n\nThe record initially returned by `megaco:connect/4,5`. It identifies a \"virtual\"\nconnection and may be reused after a reconnect (disconnect + connect).\n\n```text\nprotocol_version() = integer()\n```\n\nIs the actual protocol version. In most cases the protocol version is retrieved\nfrom the processed message, but there are exceptions:\n\n- When `handle_connect/2,3` is triggered by an explicit call to\n `megaco:connect/4,5`.\n- [`handle_disconnect/3`](`c:handle_disconnect/3`)\n- [`handle_syntax_error/3`](`c:handle_syntax_error/3`)\n\nIn these cases, the ProtocolVersion default version is obtained from the static\nconnection configuration:\n\n- `megaco:conn_info(ConnHandle, protocol_version)`.","ref":"megaco_user.html#module-data-types"},{"type":"callback","title":"megaco_user.handle_connect/2","doc":"","ref":"megaco_user.html#c:handle_connect/2"},{"type":"callback","title":"megaco_user.handle_connect/3","doc":"Invoked when a new connection is established\n\nConnections may either be established by an explicit call to megaco:connect/4 or\nimplicitly at the first invocation of megaco:receive_message/3.\n\nNormally a Media Gateway (MG) connects explicitly while a Media Gateway\nController (MGC) connects implicitly.\n\nAt the Media Gateway Controller (MGC) side it is possible to reject a connection\nrequest (and send a message error reply to the gateway) by returning\n`{error, ErrorDescr}` or simply `error` which generates an error descriptor with\ncode 402 (unauthorized) and reason \"Connection refused by user\" (this is also\nthe case for all unknown results, such as exit signals or throw).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_message_error/4`](`c:handle_message_error/4`).\n\n[`handle_connect/3`](`c:handle_connect/3`) (with `Extra`) can also be called as\na result of a call to the `megaco:connect/5` function (if\nthat function is called with the `Extra` argument different than `ignore_extra`.","ref":"megaco_user.html#c:handle_connect/3"},{"type":"callback","title":"megaco_user.handle_disconnect/3","doc":"Invoked when a connection is teared down\n\nThe disconnect may either be made explicitly by a call to megaco:disconnect/2 or\nimplicitly when the control process of the connection dies.","ref":"megaco_user.html#c:handle_disconnect/3"},{"type":"callback","title":"megaco_user.handle_message_error/3","doc":"","ref":"megaco_user.html#c:handle_message_error/3"},{"type":"callback","title":"megaco_user.handle_message_error/4","doc":"Invoked when a received message just contains an error instead of a list of\ntransactions.\n\nIncoming messages is delivered by megaco:receive_message/4 and successfully\ndecoded. Normally a message contains a list of transactions, but it may instead\ncontain an ErrorDescriptor on top level of the message.\n\nMessage errors are detected remotely on the other side of the protocol. And you\nprobably don't want to reply to it, but it may indicate that you have\noutstanding transactions that not will get any response (request -> reply; reply\n-> ack).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_message_error/4`](`c:handle_message_error/4`).","ref":"megaco_user.html#c:handle_message_error/4"},{"type":"callback","title":"megaco_user.handle_segment_reply/5","doc":"","ref":"megaco_user.html#c:handle_segment_reply/5"},{"type":"callback","title":"megaco_user.handle_segment_reply/6","doc":"This function is called when a segment reply has been received if the\n[segment_reply_ind](`megaco:conn_info/2`) config option has been set to true.\n\nThis is in effect a progress report.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_segment_reply/6`](`c:handle_segment_reply/6`).","ref":"megaco_user.html#c:handle_segment_reply/6"},{"type":"callback","title":"megaco_user.handle_syntax_error/3","doc":"","ref":"megaco_user.html#c:handle_syntax_error/3"},{"type":"callback","title":"megaco_user.handle_syntax_error/4","doc":"Invoked when a received message had syntax errors\n\nIncoming messages is delivered by megaco:receive_message/4 and normally decoded\nsuccessfully. But if the decoding failed this function is called in order to\ndecide if the originator should get a reply message (reply) or if the reply\nsilently should be discarded (no_reply).\n\nSyntax errors are detected locally on this side of the protocol and may have\nmany causes, e.g. a malfunctioning transport layer, wrong encoder/decoder\nselected, bad configuration of the selected encoder/decoder etc.\n\nThe error descriptor defaults to `DefaultED`, but can be overridden with an\nalternate one by returning `{reply,ED}` or `{no_reply,ED}` instead of `reply`\nand `no_reply` respectively.\n\nAny other return values (including exit signals or throw) and the `DefaultED`\nwill be used.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_syntax_error/4`](`c:handle_syntax_error/4`).","ref":"megaco_user.html#c:handle_syntax_error/4"},{"type":"callback","title":"megaco_user.handle_trans_ack/4","doc":"","ref":"megaco_user.html#c:handle_trans_ack/4"},{"type":"callback","title":"megaco_user.handle_trans_ack/5","doc":"Optionally invoked for a transaction acknowledgement\n\nIf this function gets invoked or not, is controlled by the reply from the\npreceding call to handle_trans_request/3. The handle_trans_request/3 function\nmay decide to return \\{handle_ack, ack_data()\\} or \\{handle_sloppy_ack,\nack_data()\\} meaning that you need an immediate acknowledgement of the reply and\nthat this function should be invoked to handle the acknowledgement.\n\nThe ack_data() argument to this function is the Erlang term returned by\nhandle_trans_request/3.\n\nIf the AckStatus is ok, it is indicating that this is a true acknowledgement of\nthe transaction reply.\n\nIf the AckStatus is \\{error, Reason\\}, it is an indication that the\nacknowledgement or even the reply (for which this is an acknowledgement) was not\ndelivered, but there is no point in waiting any longer for it to arrive. This\nhappens when:\n\n- **`reply_timer`** - The `reply_timer` eventually times out.\n\n- **reply send failure** - When megaco fails to send the reply (see\n [handle_trans_reply](`c:handle_trans_reply/5`)), for whatever reason.\n\n- **cancel** - The user has explicitly cancelled the wait (megaco:cancel/2).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_ack/5`](`c:handle_trans_ack/5`).","ref":"megaco_user.html#c:handle_trans_ack/5"},{"type":"callback","title":"megaco_user.handle_trans_long_request/3","doc":"","ref":"megaco_user.html#c:handle_trans_long_request/3"},{"type":"callback","title":"megaco_user.handle_trans_long_request/4","doc":"Optionally invoked for a time consuming transaction request\n\nIf this function gets invoked or not is controlled by the reply from the\npreceding call to handle_trans_request/3. The handle_trans_request/3 function\nmay decide to process the action requests itself or to delegate the processing\nto this function.\n\nThe req_data() argument to this function is the Erlang term returned by\nhandle_trans_request/3.\n\nAny other return values (including exit signals or throw) will result in an\nerror descriptor with code 500 (internal gateway error) and the module name (of\nthe callback module) as reason.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_long_request/4`](`c:handle_trans_long_request/4`).","ref":"megaco_user.html#c:handle_trans_long_request/4"},{"type":"callback","title":"megaco_user.handle_trans_reply/4","doc":"","ref":"megaco_user.html#c:handle_trans_reply/4"},{"type":"callback","title":"megaco_user.handle_trans_reply/5","doc":"Optionally invoked for a transaction reply\n\nThe sender of a transaction request has the option of deciding, whether the\noriginating Erlang process should synchronously wait (`megaco:call/3`) for a\nreply or if the message should be sent asynchronously (`megaco:cast/3`) and the\nprocessing of the reply should be delegated this callback function.\n\nNote that if the reply is segmented (split into several smaller messages;\nsegments), then some extra info, segment number and an indication if all\nsegments of a reply has been received or not, is also included in the\n`UserReply`.\n\nThe `ReplyData` defaults to `megaco:lookup(ConnHandle, reply_data)`, but may be\nexplicitly overridden by a `megaco:cast/3` option in order to forward info about\nthe calling context of the originating process.\n\nAt `success()`, the `UserReply` either contains:\n\n- A list of 'ActionReply' records possibly containing error indications.\n- A tuple of size three containing: the segment number, the\n `last segment indicator` and finally a list of 'ActionReply' records possibly\n containing error indications. This is of course only possible if the reply was\n segmented.\n\n`failure()` indicates an local or external error and can be one of the\nfollowing:\n\n- A `transaction_reason()`, indicates that the remote user has replied with an\n explicit transactionError.\n- A `segment_reason()`, indicates that the remote user has replied with an\n explicit transactionError for this segment. This is of course only possible if\n the reply was segmented.\n- A `user_cancel_reason()`, indicates that the request has been canceled by the\n user. `reason_for_user_cancel()` is the reason given in the call to the\n [cancel](`megaco:cancel/2`) function.\n- A `send_reason()`, indicates that the transport module\n [send_message](`c:megaco_transport:send_message/3`) function did not send the\n message. The reason for this can be:\n\n - `send_cancelled_reason()` \\- the message sending was deliberately cancelled.\n `reason_for_send_cancel()` is the reason given in the `cancel` return from\n the [send_message](`c:megaco_transport:send_message/3`) function.\n - `send_failed_reason()` \\- an error occurred while attempting to send the\n message.\n\n- An `other_reason()`, indicates some other error such as:\n\n - `timeout` \\- the reply failed to arrive before the request timer expired.\n - `{segment_timeout, missing_segments()}` \\- one or more segments was not\n delivered before the expire of the segment timer.\n - `exceeded_recv_pending_limit` \\- the pending limit was exceeded for this\n request.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_reply/5`](`c:handle_trans_reply/5`).","ref":"megaco_user.html#c:handle_trans_reply/5"},{"type":"callback","title":"megaco_user.handle_trans_request/3","doc":"","ref":"megaco_user.html#c:handle_trans_request/3"},{"type":"callback","title":"megaco_user.handle_trans_request/4","doc":"Invoked for each transaction request\n\nIncoming messages is delivered by megaco:receive_message/4 and successfully\ndecoded. Normally a message contains a list of transactions and this function is\ninvoked for each TransactionRequest in the message.\n\nThis function takes a list of 'ActionRequest' records and has three main\noptions:\n\n- **`Return ignore_trans_request`** - Decide that these action requests shall be\n ignored completely.\n\n- **`Return pending()`** - Decide that the processing of these action requests\n will take a long time and that the originator should get an immediate\n 'TransactionPending' reply as interim response. The actual processing of these\n action requests instead should be delegated to the the\n handle_trans_long_request/3 callback function with the req_data() as one of\n its arguments.\n\n- **`Return reply()`** - Process the action requests and either return an\n error_descr() indicating some fatal error or a list of action replies\n (wildcarded or not).\n\n If for some reason megaco is unable to deliver the reply, the reason for this\n will be passed to the user via a call to the callback function\n [handle_trans_ack](`c:handle_trans_ack/5`), unless\n `ack_action() = discard_ack`.\n\n The ack_action() is either:\n\n - **`discard_ack`** - Meaning that you don't care if the reply is acknowledged\n or not.\n\n - **`{handle_ack, ack_data()} | {handle_ack, ack_data(), send_options()}`** -\n Meaning that you want an immediate acknowledgement when the other part\n receives this transaction reply. When the acknowledgement eventually is\n received, the handle_trans_ack/4 callback function will be invoked with the\n ack_data() as one of its arguments. ack_data() may be any Erlang term.\n\n - **`{handle_pending_ack, ack_data()} | {handle_pending_ack, ack_data(), send_options()}`** -\n This has the same effect as the above, _if and only if_ megaco has sent at\n least one pending message for this request (during the processing of the\n request). If no pending message has been sent, then immediate\n acknowledgement will _not_ be requested.\n\n Note that this only works as specified if the `sent_pending_limit` config\n option has been set to an integer value.\n\n - **`{handle_sloppy_ack, ack_data()}| {handle_sloppy_ack, ack_data(), send_options()}`** -\n Meaning that you want an acknowledgement _sometime_. When the\n acknowledgement eventually is received, the handle_trans_ack/4 callback\n function will be invoked with the ack_data() as one of its arguments.\n ack_data() may be any Erlang term.\n\nAny other return values (including exit signals or throw) will result in an\nerror descriptor with code 500 (internal gateway error) and the module name (of\nthe callback module) as reason.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_request/4`](`c:handle_trans_request/4`).","ref":"megaco_user.html#c:handle_trans_request/4"},{"type":"callback","title":"megaco_user.handle_trans_request_abort/4","doc":"","ref":"megaco_user.html#c:handle_trans_request_abort/4"},{"type":"callback","title":"megaco_user.handle_trans_request_abort/5","doc":"Invoked when a transaction request has been aborted\n\nThis function is invoked if the originating pending limit has been exceeded.\nThis usually means that a request has taken abnormally long time to complete.\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_trans_request_abort/5`](`c:handle_trans_request_abort/5`).","ref":"megaco_user.html#c:handle_trans_request_abort/5"},{"type":"callback","title":"megaco_user.handle_unexpected_trans/3","doc":"","ref":"megaco_user.html#c:handle_unexpected_trans/3"},{"type":"callback","title":"megaco_user.handle_unexpected_trans/4","doc":"Invoked when a unexpected message is received\n\nIf a reply to a request is not received in time, the megaco stack removes all\ninfo about the request from its tables. If a reply should arrive after this has\nbeen done the app has no way of knowing where to send this message. The message\nis delivered to the \"user\" by calling this function on the local node (the node\nwhich has the link).\n\nSee [note](#extra_argument) above about the `Extra` argument in\n[`handle_unexpected_trans/4`](`c:handle_unexpected_trans/4`).","ref":"megaco_user.html#c:handle_unexpected_trans/4"},{"type":"type","title":"megaco_user.conn_handle/0","doc":"","ref":"megaco_user.html#t:conn_handle/0"},{"type":"type","title":"megaco_user.megaco_timer/0","doc":"","ref":"megaco_user.html#t:megaco_timer/0"},{"type":"type","title":"megaco_user.receive_handle/0","doc":"","ref":"megaco_user.html#t:receive_handle/0"},{"type":"extras","title":"Megaco Release Notes","doc":"\n# Megaco Release Notes\n\nThis document describes the changes made to the Megaco system from version to\nversion. The intention of this document is to list all incompatibilities as well\nas all enhancements and bugfixes for every release of Megaco. Each release of\nMegaco thus constitutes one section in this document. The title of each section\nis the version number of Megaco.","ref":"notes.html"},{"type":"extras","title":"Megaco 4.7 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-7"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Erlang/OTP type specifications has been updated to eliminate overlapping domains.\n\n Own Id: OTP-19310 Aux Id: [GH-8810], [GH-8821], [PR-8986]\n\n[GH-8810]: https://github.com/erlang/otp/issues/8810\n[GH-8821]: https://github.com/erlang/otp/issues/8821\n[PR-8986]: https://github.com/erlang/otp/pull/8986","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.6 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-6"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- `-callback` attributes have been added to `m:megaco_transport`.\n\n Own Id: OTP-18806 Aux Id: [PR-7740]\n\n- Updated types and specs for all API modules.\n\n Own Id: OTP-18920 Aux Id: BL-322\n\n- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-7740]: https://github.com/erlang/otp/pull/7740\n[PR-8026]: https://github.com/erlang/otp/pull/8026","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.5 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-5"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Make megaco transports handle gen_tcp | gen_udp with socket backend on Windows\n (completion).\n\n Own Id: OTP-18599 Aux Id: OTP-18029","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.4.4 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-4-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Removed configure option `--enable-sanitizers`. It was untested and broken.\n Address sanitizer for the emulator has better support by the `asan` build\n target.\n\n Own Id: OTP-18538 Aux Id: GH-7031, PR-7078","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 4.4.3 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-4-3"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Replace size/1 with either tuple_size/1 or byte_size/1\n\n The [`size/1`](`size/1`) BIF is not optimized by the JIT, and its use can\n result in worse types for Dialyzer.\n\n When one knows that the value being tested must be a tuple,\n [`tuple_size/1`](`tuple_size/1`) should always be preferred.\n\n When one knows that the value being tested must be a binary,\n [`byte_size/1`](`byte_size/1`) should be preferred. However,\n [`byte_size/1`](`byte_size/1`) also accepts a bitstring (rounding up size to a\n whole number of bytes), so one must make sure that the call to `byte_size/` is\n preceded by a call to [`is_binary/1`](`is_binary/1`) to ensure that bitstrings\n are rejected. Note that the compiler removes redundant calls to\n [`is_binary/1`](`is_binary/1`), so if one is not sure whether previous code\n had made sure that the argument is a binary, it does not harm to add an\n [`is_binary/1`](`is_binary/1`) test immediately before the call to\n [`byte_size/1`](`byte_size/1`).\n\n Own Id: OTP-18432 Aux Id:\n GH-6672,PR-6793,PR-6784,PR-6787,PR-6785,PR-6682,PR-6800,PR-6797,PR-6798,PR-6799,PR-6796,PR-6813,PR-6671,PR-6673,PR-6684,PR-6694,GH-6677,PR-6696,PR-6670,PR-6674","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.4.2 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-4-2"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- A very minor improvement to the measurement tool.\n\n Own Id: OTP-18298","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.4.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-4-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Fixed various dialyzer related issues in the examples and the application\n proper.\n\n Own Id: OTP-18179 Aux Id: ERIERL-836","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- There is a new configure option, `--enable-deterministic-build`, which will\n apply the `deterministic` compiler option when building Erlang/OTP. The\n `deterministic` option has been improved to eliminate more sources of\n non-determinism in several applications.\n\n Own Id: OTP-18165 Aux Id: PR-5965","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.4 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-4"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Input for `configure` scripts adapted to `autoconf` 2\\.71.\n\n Own Id: OTP-17414 Aux Id: PR-4967\n\n- Megaco test suite(s) use the new peer module for node starts.\n\n Own Id: OTP-17910","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.3 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The compilation time is no longer recorded in BEAM files. There remained\n several undocumented functions that attempted to retrieve compilation times.\n Those have now been removed.\n\n Own Id: OTP-17962","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Update the performance and debug chapters of the megaco user's guide. Also\n some updates to the meas tools.\n\n Own Id: OTP-17839","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.2 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-2"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- \\[megaco_tcp] When connect fails, include more info in the error reason.\n\n Own Id: OTP-17817","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-1"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- It is now possible to configure the built-in transports (megaco_tcp and megaco\n udp) to use the new (gen_udp- and gen_tcp-) option 'inet_backend'.\n\n Own Id: OTP-17533","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 4.0.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 4.0 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-4-0"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- All the pre-v3 codec(s) (prev3a, prev3b and prev3c) was deprecated in\n OTP-23.0. They have now been removed.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-16560\n\n- Removed deprecated functions marked for removal.\n\n Own Id: OTP-17049","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.19.5.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-19-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.19.5 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-19-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Fixed usage of `AC_CONFIG_AUX_DIRS()` macros in configure script sources.\n\n Own Id: OTP-17093 Aux Id: ERL-1447, PR-2948","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.19.4 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-19-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Empty statistics descriptor (now) allowed in both encode and decode for\n version 3.\n\n Own Id: OTP-17012 Aux Id: ERL-1405","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.19.3 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-19-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The expected number of warnings when (yecc) generating v2 and v3 (text)\n parser's was incorrect.\n\n Own Id: OTP-16836","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.19.2 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-19-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The v2 and v3 parsers could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16818 Aux Id: ERIERL-526","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.19.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-19-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The mini parser could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16631 Aux Id: ERIERL-491","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.19 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-19"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Refactored the internal handling of deprecated and removed functions.\n\n Own Id: OTP-16469\n\n- The preliminary version 3 codec(s) prev3a, prev3b and prev3c has been\n deprecated and will be _removed_ in OTP 24. The encoding config option\n 'version3' will continue to work until OTP 24.\n\n Own Id: OTP-16531","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.18.8.4 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-8-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Commit of generated `configure` script.\n\n Own Id: OTP-17420 Aux Id: OTP-17398, GH-4821","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.8.3 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-8-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Empty statistics descriptor (now) allowed in both encode and decode for\n version 3.\n\n Own Id: OTP-17012 Aux Id: ERL-1405","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.8.2 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-8-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The v2 and v3 parsers could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16818 Aux Id: ERIERL-526","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.8.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-8-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The mini parser could not properly decode some IPv6 addresses.\n\n Own Id: OTP-16631 Aux Id: ERIERL-491","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.8 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The documented function megaco:get_sdp_record_from_PropertGroup/2 was a\n wrapper for megaco_sdp:get_sdp_record_from_PropertGroup/2 but did not actually\n exist. This has now been fixed.\n\n Own Id: OTP-16449","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Test suite completely reworked. Add (timestamp) utility functions for\n debugging and testing.\n\n Own Id: OTP-16158","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.18.7 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- The meas example had not been updated for a long time, which caused it to not\n work. Also, it made use of deprecated functions (now()). This has now been\n fixed.\n\n Own Id: OTP-16061","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.6 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Fix various minor issues related to Dialyzer. Mostly these are dialyzer\n warnings, but there was also some minor bugs detected by Dialyzer.\n\n Own Id: OTP-15882","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.5 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-5"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Minor updates to build system necessary due to move of configuration of\n `crypto` application.\n\n Own Id: OTP-15262 Aux Id: OTP-15129\n\n- Minor adjustments made to build system for parallel configure.\n\n Own Id: OTP-15340 Aux Id: OTP-14625","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.18.4 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Improved documentation.\n\n Own Id: OTP-15190","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.3 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Removed all old unused files in the documentation.\n\n Own Id: OTP-14475 Aux Id: ERL-409, PR-1493","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.18.2 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-2"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Typos have been fixed.\n\n Own Id: OTP-14387","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.18.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18-1"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Internal changes\n\n Own Id: OTP-13551","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.18 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-18"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- The runtime dependencies in the application resource file have been updated.\n\n Own Id: OTP-12762","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.17.3 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-17-3"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Distribute `autoconf` helpers to applications at build time instead of having\n multiple identical copies committed in the repository.\n\n Own Id: OTP-12348","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.17.2 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-17-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Megaco Release Notes","doc":"- Implement --enable-sanitizers\\[=sanitizers]. Similar to debugging with\n Valgrind, it's very useful to enable -fsanitize= switches to catch bugs at\n runtime.\n\n Own Id: OTP-12153","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.17.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-17-1"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- The default encoding of Erlang files has been changed from ISO-8859-1 to\n UTF-8.\n\n The encoding of XML files has also been changed to UTF-8.\n\n Own Id: OTP-10907","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.17.0.3 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-17-0-3"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Updated doc files to utf8.\n\n Own Id: OTP-10907","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.17.0.2 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-17-0-2"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Introduced functionality for inspection of system and build configuration.\n\n Own Id: OTP-11196","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.17.0.1 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-17-0-1"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Postscript files no longer needed for the generation of PDF files have been\n removed.\n\n Own Id: OTP-11016","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Megaco 3.17 - Megaco Release Notes","doc":"Version 3.17 supports code replacement in runtime from/to version 3.16.0.3 and\nand 3.16.0.2.","ref":"notes.html#megaco-3-17"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"-","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"- Buffer overrun error while flex scanner processing property parm groups.\n\n This error occured only for large messages if a buffer realloc was needed\n while processing the property parm groups.\n\n Own Id: OTP-10998\n\n Aux Id: Seq 12263","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Incompatibilities - Megaco Release Notes","doc":"-","ref":"notes.html#incompatibilities"},{"type":"extras","title":"Megaco 3.16.0.3 - Megaco Release Notes","doc":"Version 3.16.0.2 supports code replacement in runtime from/to version 3.16.0.1,\n3.16, 3.15.1.1, 3.15.1 and 3.15.","ref":"notes.html#megaco-3-16-0-3"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- Where necessary, a comment stating encoding has been added to Erlang files.\n The comment is meant to be removed in Erlang/OTP R17B when UTF-8 becomes the\n default encoding.\n\n Own Id: OTP-10630","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Incompatibilities - Megaco Release Notes","doc":"- A number of binary encoding alternatives has been removed. The binary encoding\n option `driver` has been removed since this (the use of the asn1 linked in\n driver) is now default and there is now way to _not_ use it. See\n [configuration of binary encoding](megaco_encode.md#binary_config) for more\n info.","ref":"notes.html#incompatibilities"},{"type":"extras","title":"Megaco 3.16.0.2 - Megaco Release Notes","doc":"Version 3.16.0.2 supports code replacement in runtime from/to version 3.16.0.1,\n3.16, 3.15.1.1, 3.15.1 and 3.15.","ref":"notes.html#megaco-3-16-0-2"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- Allow whitespaces in installation path.\n\n It is now possible to give configure and make an installation/release path\n with whitespaces in it.\n\n Own Id: OTP-10107\n\n- Fix parallel make for behaviours.\n- Removed use of deprecated system flag, `global_haeps_size`, in the measurement\n tool `mstone1`.","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Incompatibilities - Megaco Release Notes","doc":"-","ref":"notes.html#incompatibilities"},{"type":"extras","title":"Megaco 3.16.0.1 - Megaco Release Notes","doc":"Version 3.16.0.1 supports code replacement in runtime from/to version 3.16,\n3.15.1.1, 3.15.1 and 3.15.","ref":"notes.html#megaco-3-16-0-1"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- Fixed some faulty test cases.\n- Removed use of deprecated system flag, `scheduler_bind_type`, in the\n measurement tool `mstone1`.\n\n Own Id: OTP-9949","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Incompatibilities - Megaco Release Notes","doc":"-","ref":"notes.html#incompatibilities"},{"type":"extras","title":"Megaco 3.16 - Megaco Release Notes","doc":"Version 3.16 supports code replacement in runtime from/to version 3.15.1.1,\n3.15.1 and 3.15.","ref":"notes.html#megaco-3-16"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- Minor improvements to the measurement tool `mstone1`.\n\n Own Id: OTP-9604\n\n- ASN.1 no longer makes use of a driver to accelerate encode/decode, instead it\n uses NIFs. The encoding config option is _still_ the same, i.e. `driver`.\n\n Own Id: OTP-9672\n\n- The profiling test tool has been rewritten.\n\n Håkan Mattsson\n\n Own Id: OTP-9679\n\n- The flex driver has been updated to support the new driver format (changed to\n enable 64-bit aware drivers).\n\n Own Id: OTP-9795","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Incompatibilities - Megaco Release Notes","doc":"-","ref":"notes.html#incompatibilities"},{"type":"extras","title":"Megaco 3.15.1.1 - Megaco Release Notes","doc":"Version 3.15.1.1 supports code replacement in runtime from/to version 3.15.1 and\n3.15.","ref":"notes.html#megaco-3-15-1-1"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- Correct various XML errors.\n\n Own Id: OTP-9550","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.15.1 - Megaco Release Notes","doc":"Version 3.15.1 supports code replacement in runtime from/to version 3.15,\n3.14.1.1, 3.14.1 and 3.14.","ref":"notes.html#megaco-3-15-1"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"-","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"- Fixing miscellaneous things detected by dialyzer.\n\n Own Id: OTP-9075","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.15 - Megaco Release Notes","doc":"","ref":"notes.html#megaco-3-15"},{"type":"extras","title":"Improvements and New Features - Megaco Release Notes","doc":"- Fixing auto-import issues.\n\n Own Id: OTP-8842","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.14.1.1 - Megaco Release Notes","doc":"Version 3.14.1.1 supports code replacement in runtime from/to version 3.14.1,\n3.14, 3.13, 3.12 and 3.11.3.","ref":"notes.html#megaco-3-14-1-1"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- Updated the [performance](megaco_performance.md) chapter.\n\n Own Id: OTP-8696","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.14.1 - Megaco Release Notes","doc":"Version 3.14.1 supports code replacement in runtime from/to version 3.14, 3.13,\n3.12 and 3.11.3.","ref":"notes.html#megaco-3-14-1"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- A minor compiler related performance improvement.\n\n Own Id: OTP-8561","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"- A race condition when, during high load, processing both the original and a\n resent message and delivering this as two separate messages to the user.\n\n Note that this solution only protects against multiple reply deliveries\\!\n\n Own Id: OTP-8529\n\n Aux Id: Seq 10915\n\n- Fix shared libraries installation.\n\n The flex shared lib(s) were incorrectly installed as data files.\n\n Peter Lemenkov\n\n Own Id: OTP-8627\n\n- Eliminated a possible race condition while creating pending counters.\n\n Own Id: OTP-8634\n\n Aux Id: Seq 11579","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.14 - Megaco Release Notes","doc":"Version 3.14 supports code replacement in runtime from/to version 3.13, 3.12 and\n3.11.3.","ref":"notes.html#megaco-3-14"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- Various changes to configure and makefile(s) to facilitate cross compilation\n (and other build system improvements).\n\n Own Id: OTP-8323\n\n- Added a help target in the test Makefile to explain the most useful make\n targets, used when testing the application using the test-server provided with\n megaco.\n\n Own Id: OTP-8362\n\n- Adapted megaco_filter to the new internal format.\n\n Own Id: OTP-8403","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"- Callbacks, when the callback module is unknown (undefined), results in warning\n messages.\n\n A race condition scenario. As part of a cancelation operation, replies with\n waiting acknowledgements is cancelled. This includes informing the user (via a\n call to the handle_trans_ack callback function). It is possible that at this\n point the connection data has been removed, which makes it impossible for\n megaco to perform this operation, resulting in the warning message. The\n solution is to also store the callback module with the other reply\n information, to be used when cleaning up after a cancelation.\n\n Own Id: OTP-8328\n\n Aux Id: Seq 11384","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Megaco 3.13 - Megaco Release Notes","doc":"Version 3.13 supports code replacement in runtime from/to version 3.12 and\n3.11.3.","ref":"notes.html#megaco-3-13"},{"type":"extras","title":"Improvements and new features - Megaco Release Notes","doc":"- A minor optimization by using ets:update_element instead of ets:insert for\n some table updates.\n\n Own Id: OTP-8239\n\n- The documentation is now built with open source tools (_xsltproc_ and _fop_)\n that exists on most platforms. One visible change is that the frames are\n removed.\n\n Own Id: OTP-8249","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Fixed bugs and malfunctions - Megaco Release Notes","doc":"-","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Incompatibilities - Megaco Release Notes","doc":"-","ref":"notes.html#incompatibilities"},{"type":"extras","title":"Introduction","doc":"\n# Introduction\n\nMegaco/H.248 is a protocol for control of elements in a physically decomposed\nmultimedia gateway, enabling separation of call control from media conversion. A\nMedia Gateway Controller (MGC) controls one or more Media Gateways (MG).\n\nThis version of the stack supports version 1, 2 and 3 as defined by:\n\n- version 1 - RFC 3525 and H.248-IG (v10-v13)\n- version 2 - draft-ietf-megaco-h248v2-04 & H.248.1 v2 Corrigendum 1 (03/2004)\n- version 3 - Full version 3 as defined by ITU H.248.1 (09/2005) (including\n segments)\n\nThe semantics of the protocol has jointly been defined by two standardization\nbodies:\n\n- IETF - which calls the protocol Megaco\n- ITU - which calls the protocol H.248","ref":"megaco_intro.html"},{"type":"extras","title":"Scope and Purpose - Introduction","doc":"This manual describes the Megaco application, as a component of the Erlang/Open\nTelecom Platform development environment. It is assumed that the reader is\nfamiliar with the Erlang Development Environment, which is described in a\nseparate User's Guide.","ref":"megaco_intro.html#scope-and-purpose"},{"type":"extras","title":"Prerequisites - Introduction","doc":"The following prerequisites are required for understanding the material in the\nMegaco User's Guide:\n\n- the basics of the Megaco/H.248 protocol\n- the basics of the Abstract Syntax Notation One (ASN.1)\n- familiarity with the Erlang system and Erlang programming\n\nThe application requires Erlang/OTP release R10B or later.","ref":"megaco_intro.html#prerequisites"},{"type":"extras","title":"About This Manual - Introduction","doc":"In addition to this introductory chapter, the Megaco User's Guide contains the\nfollowing chapters:\n\n- Chapter 2: \"Architecture\" describes the architecture and typical usage of the\n application.\n- Chapter 3: \"Internal form and its encodings\" describes the internal form of\n Megaco/H.248 messages and its various encodings.\n- Chapter 4: \"Transport mechanisms\" describes how different mechanisms can be\n used to transport the Megaco/H.248 messages.\n- Chapter 5: \"Debugging\" describes tracing and debugging.","ref":"megaco_intro.html#about-this-manual"},{"type":"extras","title":"Where to Find More Information - Introduction","doc":"Refer to the following documentation for more information about Megaco/H.248 and\nabout the Erlang/OTP development system:\n\n- [version 1, RFC 3525](https://www.erlang.org/doc/standard/rfc3525.txt)\n- [old version 1, RFC 3015](http://www.ietf.org/rfc/rfc3015.txt)\n- [Version 2 Corrigendum 1](https://web.archive.org/web/20100704020645/http://www.erlang.org/project/megaco/standard/H.248.1-Corr1-200403.doc)\n- [version 2, draft-ietf-megaco-h248v2-04](https://web.archive.org/web/20100620185420/http://erlang.org/project/megaco/standard/draft-ietf-megaco-h248v2-04.txt)\n- [H.248.1 version 3](http://www.itu.int/)\n- the ASN.1 application User's Guide\n- the Megaco application Reference Manual\n- Concurrent Programming in Erlang, 2nd Edition (1996), Prentice-Hall, ISBN\n 0-13-508301-X.","ref":"megaco_intro.html#where-to-find-more-information"},{"type":"extras","title":"Architecture","doc":"\n# Architecture","ref":"megaco_architecture.html"},{"type":"extras","title":"Network view - Architecture","doc":"Megaco is a (master/slave) protocol for control of gateway functions at the edge\nof the packet network. Examples of this is IP-PSTN trunking gateways and analog\nline gateways. The main function of Megaco is to allow gateway decomposition\ninto a call agent (call control) part (known as Media Gateway Controller, MGC) -\nmaster, and an gateway interface part (known as Media Gateway, MG) - slave. The\nMG has no call control knowledge and only handle making the connections and\nsimple configurations.\n\nSIP and H.323 are peer-to-peer protocols for call control (valid only for some\nof the protocols within H.323), or more generally multi-media session protocols.\nThey both operate at a different level (call control) from Megaco in a\ndecomposed network, and are therefor not aware of whether or not Megaco is being\nused underneath.\n\n![Network architecture](assets/megaco_sys_arch.gif \"Network architecture\")\n\nMegaco and peer protocols are complementary in nature and entirely compatible\nwithin the same system. At a system level, Megaco allows for\n\n- overall network cost and performance optimization\n- protection of investment by isolation of changes at the call control layer\n- freedom to geographically distribute both call function and gateway function\n- adaption of legacy equipment","ref":"megaco_architecture.html#network-view"},{"type":"extras","title":"General - Architecture","doc":"This Erlang/OTP application supplies a framework for building applications that\nneeds to utilize the Megaco/H.248 protocol.\n\nWe have introduced the term \"user\" as a generic term for either an MG or an MGC,\nsince most of the functionality we support, is common for both MG's and MGC's. A\n(local) user may be configured in various ways and it may establish any number\nof connections to its counterpart, the remote user. Once a connection has been\nestablished, the connection is supervised and it may be used for the purpose of\nsending messages. N.B. according to the standard an MG is connected to at most\none MGC, while an MGC may be connected to any number of MG's.\n\nFor the purpose of managing \"virtual MG's\", one Erlang node may host any number\nof MG's. In fact it may host a mix of MG's and MGC's. You may say that an Erlang\nnode may host any number of \"users\".\n\nThe protocol engine uses callback modules to handle various things:\n\n- encoding callback modules - handles the encoding and decoding of messages.\n Several modules for handling different encodings are included, such as ASN.1\n BER, pretty well indented text, compact text and some others. Others may be\n written by you.\n- transport callback modules - handles sending and receiving of messages.\n Transport modules for TCP/IP and UDP/IP are included and others may be written\n by you.\n- user callback modules - the actual implementation of an MG or MGC. Most of the\n functions are intended for handling of a decoded transaction (request, reply,\n acknowledgement), but there are others that handles connect, disconnect and\n errors cases.\n\nEach connection may have its own configuration of callback modules, re-send\ntimers, transaction id ranges etc. and they may be re-configured on-the-fly.\n\nIn the API of Megaco, a user may explicitly send action requests, but generation\nof transaction identifiers, the encoding and actual transport of the message to\nthe remote user is handled automatically by the protocol engine according to the\nactual connection configuration. Megaco messages are not exposed in the API.\n\nOn the receiving side the transport module receives the message and forwards it\nto the protocol engine, which decodes it and invokes user callback functions for\neach transaction. When a user has handled its action requests, it simply returns\na list of action replies (or a message error) and the protocol engine uses the\nencoding module and transport module to compose and forward the message to the\noriginating user.\n\nThe protocol stack does also handle things like automatic sending of\nacknowledgements, pending transactions, re-send of messages, supervision of\nconnections etc.\n\nIn order to provide a solution for scalable implementations of MG's and MGC's, a\nuser may be distributed over several Erlang nodes. One of the Erlang nodes is\nconnected to the physical network interface, but messages may be sent from other\nnodes and the replies are automatically forwarded back to the originating node.","ref":"megaco_architecture.html#general"},{"type":"extras","title":"Single node config - Architecture","doc":"Here a system configuration with an MG and MGC residing in one Erlang node each\nis outlined:\n\n![Single node config](assets/single_node_config.gif \"Single node config\")","ref":"megaco_architecture.html#single-node-config"},{"type":"extras","title":"Distributed config - Architecture","doc":"In a larger system with a user (in this case an MGC) distributed over several\nErlang nodes, it looks a little bit different. Here the encoding is performed on\nthe originating Erlang node (1) and the binary is forwarded to the node (2) with\nthe physical network interface. When the potential message reply is received on\nthe interface on node (2), it is decoded there and then different actions will\nbe taken for each transaction in the message. The transaction reply will be\nforwarded in its decoded form to the originating node (1) while the other types\nof transactions will be handled locally on node (2).\n\nTimers and re-send of messages will be handled on locally on one node, that is\nnode(1), in order to avoid unnecessary transfer of data between the Erlang\nnodes.\n\n![Distributes node config](assets/distr_node_config.gif \"Distributes node config\")","ref":"megaco_architecture.html#distributed-config"},{"type":"extras","title":"Message round-trip call flow - Architecture","doc":"The typical round-trip of a message can be viewed as follows. Firstly we view\nthe call flow on the originating side:\n\n![Message Call Flow (originating side)](assets/call_flow.gif \"Message Call Flow (originating side)\")\n\nThen we continue with the call flow on the destination side:\n\n![Message Call Flow (destination side)](assets/call_flow_cont.gif \"Message Call Flow (destination side)\")","ref":"megaco_architecture.html#message-round-trip-call-flow"},{"type":"extras","title":"Running the stack","doc":"\n# Running the stack","ref":"megaco_run.html"},{"type":"extras","title":"Starting - Running the stack","doc":"A user may have a number of \"virtual\" connections to other users. An MG is\nconnected to at most one MGC, while an MGC may be connected to any number of\nMG's. For each connection the user selects a transport service, an encoding\nscheme and a user callback module.\n\nAn MGC must initiate its transport service in order to listen to MG's trying to\nconnect. How the actual transport is initiated is outside the scope of this\napplication. However a send handle (typically a socket id or host and port) must\nbe provided from the transport service in order to enable us to send the message\nto the correct destination. We do however not assume anything about this, from\nour point of view, opaque handle. Hopefully it is rather small since it will\npassed around the system between processes rather frequently.\n\nA user may either be statically configured in a .config file according to the\napplication concept of Erlang/OTP or dynamically started with the configuration\nsettings as arguments to megaco:start_user/2. These configuration settings may\nbe updated later on with megaco:update_conn_info/2.\n\nThe function megaco:connect/4 is used to tell the Megaco application about which\ncontrol process it should supervise, which MID the remote user has, which\ncallback module it should use to send messages etc. When this \"virtual\"\nconnection is established the user may use megaco:call/3 and megaco:cast/3 in\norder to send messages to the other side. Then it is up to the MG to send its\nfirst Service Change Request message after applying some clever algorithm in\norder to fight the problem with startup avalanche (as discussed in the RFC).\n\nThe originating user will wait for a reply or a timeout (defined by the\nrequest_timer). When it receives the reply this will optionally be acknowledged\n(regulated by auto_ack), and forwarded to the user. If an interim pending reply\nis received, the long_request_timer will be used instead of the usual\nrequest_timer, in order to enable avoidance of spurious re-sends of the request.\n\nOn the destination side the transport service waits for messages. Each message\nis forwarded to the Megaco application via the megaco:receive_message/4 callback\nfunction. The transport service may or may not provide means for blocking and\nunblocking the reception of the incoming messages.\n\nIf a message is received before the \"virtual\" connection has been established,\nthe connection will be setup automatically. An MGC may be real open minded and\ndynamically decide which encoding and transport service to use depending on how\nthe transport layer contact is performed. For IP transports two ports are\nstandardized, one for textual encoding and one for binary encoding. If for\nexample an UDP packet was received on the text port it would be possible to\ndecide encoding and transport on the fly.\n\nAfter decoding a message various user callback functions are invoked in order to\nallow the user to act properly. See the megaco_user module for more info about\nthe callback arguments.\n\nWhen the user has processed a transaction request in its callback function, the\nMegaco application assembles a transaction reply, encodes it using the selected\nencoding module and sends the message back by invoking the callback function:\n\n- SendMod:send_message(SendHandle, ErlangBinary)\n\nRe-send of messages, handling pending transactions, acknowledgements etc. is\nhandled automatically by the Megaco application but the user is free to override\nthe default behaviour by the various configuration possibilities. See\nmegaco:update_user_info/2 and megaco:update_conn_info/2 about the possibilities.\n\nWhen connections gets broken (that is explicitly by megaco:disconnect/2 or when\nits controlling process dies) a user callback function is invoked in order to\nallow the user to re-establish the connection. The internal state of kept\nmessages, re-send timers etc. is not affected by this. A few re-sends will of\ncourse fail while the connection is down, but the automatic re-send algorithm\ndoes not bother about this and eventually when the connection is up and running\nthe messages will be delivered if the timeouts are set to be long enough. The\nuser has the option of explicitly invoking megaco:cancel/2 to cancel all\nmessages for a connection.\n\n[](){: #mgc_startup_call_flow }","ref":"megaco_run.html#starting"},{"type":"extras","title":"MGC startup call flow - Running the stack","doc":"In order to prepare the MGC for the reception of the initial message, hopefully\na Service Change Request, the following needs to be done:\n\n- Start the Megaco application.\n- Start the MGC user. This may either be done explicitly with\n megaco:start_user/2 or implicitly by providing the -megaco users configuration\n parameter.\n- Initiate the transport service and provide it with a receive handle obtained\n from megaco:user_info/2.\n\nWhen the initial message arrives the transport service forwards it to the\nprotocol engine which automatically sets up the connection and invokes\nUserMod:handle_connect/2 before it invokes UserMod:handle_trans_request/3 with\nthe Service Change Request like this:\n\n![MGC Startup Call Flow](assets/MGC_startup_call_flow.gif \"MGC Startup Call Flow\")\n\n[](){: #mg_startup_call_flow }","ref":"megaco_run.html#mgc-startup-call-flow"},{"type":"extras","title":"MG startup call flow - Running the stack","doc":"In order to prepare the MG for the sending of the initial message, hopefully a\nService Change Request, the following needs to be done:\n\n- Start the Megaco application.\n- Start the MG user. This may either be done explicitly with megaco:start_user/2\n or implicitly by providing the -megaco users configuration parameter.\n- Initiate the transport service and provide it with a receive handle obtained\n from megaco:user_info/2.\n- Setup a connection to the MGC with megaco:connect/4 and provide it with a\n receive handle obtained from megaco:user_info/2.\n\nIf the MG has been provisioned with the MID of the MGC it can be given as the\nRemoteMid parameter to megaco:connect/4 and the call flow will look like this:\n\n![MG Startup Call Flow](assets/MG_startup_call_flow.gif \"MG Startup Call Flow\")\n\nIf the MG cannot be provisioned with the MID of the MGC, the MG can use the atom\n'preliminary_mid' as the RemoteMid parameter to megaco:connect/4 and the call\nflow will look like this:\n\n![MG Startup Call Flow (no MID)](assets/MG-startup_flow_noMID.gif \"MG Startup Call Flow (no MID)\")\n\n[](){: #config_megaco }","ref":"megaco_run.html#mg-startup-call-flow"},{"type":"extras","title":"Configuring the Megaco stack - Running the stack","doc":"There are three kinds of configuration:\n\n- User info - Information related to megaco users. Read/Write.\n\n A User is an entity identified by a MID, e.g. a MGC or a MG.\n\n This information can be retrieved using\n [megaco:user_info](`megaco:user_info/2`).\n\n- Connection info - Information regarding connections. Read/Write.\n\n This information can be retrieved using\n [megaco:conn_info](`megaco:conn_info/2`).\n\n- System info - System wide information. Read only.\n\n This information can be retrieved using\n [megaco:system_info](`megaco:system_info/1`).\n\n[](){: #initial_config }","ref":"megaco_run.html#configuring-the-megaco-stack"},{"type":"extras","title":"Initial configuration - Running the stack","doc":"The initial configuration of the Megaco should be defined in the Erlang system\nconfiguration file. The following configured parameters are defined for the\nMegaco application:\n\n- `users = [{Mid, [user_config()]}].`\n\n Each user is represented by a tuple with the Mid of the user and a list of\n config parameters (each parameter is in turn a tuple: `{Item, Value}`).\n\n- `scanner = flex | {Module, Function, Arguments, Modules}`\n\n - `flex` will result in the start of the flex scanner with default options.\n - The MFA alternative makes it possible for Megaco to start and supervise a\n scanner written by the user (see `supervisor:start_child` for an explanation\n of the parameters).\n\nSee also\n[Configuration of text encoding module(s)](megaco_encode.md#text_config) for\nmore info.\n\n[](){: #changing_config }","ref":"megaco_run.html#initial-configuration"},{"type":"extras","title":"Changing the configuration - Running the stack","doc":"The configuration can be changed during runtime. This is done with the functions\n[megaco:update_user_info](`megaco:update_user_info/3`) and\n[megaco:update_conn_info](`megaco:update_conn_info/3`)\n\n[](){: #transaction_sender }","ref":"megaco_run.html#changing-the-configuration"},{"type":"extras","title":"The transaction sender - Running the stack","doc":"The transaction sender is a process (one per connection), which handle all\ntransaction sending, if so configured (see\n[megaco:user_info](`megaco:user_info/2`) and\n[megaco:conn_info](`megaco:conn_info/2`)).\n\nThe purpose of the transaction sender is to accumulate transactions for a more\nefficient message sending. The transactions that are accumulated are transaction\nrequest and transaction ack. For transaction ack's the benefit is quite large,\nsince the transactions are small and it is possible to have ranges (which means\nthat transaction acks for transactions 1, 2, 3 and 4 can be sent as a range 1-4\nin one transaction ack, instead of four separate transactions).\n\nThere are a number of configuration parameter's that control the operation of\nthe transaction sender. In principle, a message with everything stored (ack's\nand request's) is sent from the process when:\n\n- When `trans_timer` expires.\n- When `trans_ack_maxcount` number of ack's has been received.\n- When `trans_req_maxcount` number of requests's has been received.\n- When the size of all received requests exceeds `trans_req_maxsize`.\n- When a reply transaction is sent.\n- When a pending transaction is sent.\n\nWhen something is to be sent, everything is packed into one message, unless the\ntrigger was a reply transaction and the added size of the reply and all the\nrequests is greater then `trans_req_maxsize`, in which case the stored\ntransactions are sent first in a separate message and the reply in another\nmessage.\n\nWhen the transaction sender receives a request which is already \"in storage\"\n(indicated by the transaction id) it is assumed to be a resend and everything\nstored is sent. This could happen if the values of the `trans_timer` and the\n`request_timer` is not properly chosen.\n\n[](){: #segment_reply }","ref":"megaco_run.html#the-transaction-sender"},{"type":"extras","title":"Segmentation of transaction replies - Running the stack","doc":"In version 3 of the megaco standard, the concept of `segmentation package` was\nintroduced. Simply, this package defines a procedure to segment megaco messages\n(transaction replies) when using a transport that does not automatically do this\n(e.g. UDP).\n\nAlthough it would be both pointless and counterproductive to use segmentation on\na transport that already does this (e.g. TCP), the megaco application does not\ncheck this. Instead, it is up to the user to configure this properly.\n\n- Receiving segmented messages:\n\n This is handled automatically by the megaco application. There is however one\n thing that need to be configured by the user, the\n [segment_recv_timer](`megaco:user_info/2`) option.\n\n Note that the segments are delivered to the user differently depending on\n which function is used to issue the original request. When issuing the request\n using the [megaco:cast](`megaco:cast/3`) function, the segments are delivered\n to the user via the [handle_trans_reply](`c:megaco_user:handle_trans_reply/5`) callback\n function one at a time, as they arrive. But this obviously doe not work for\n the [megaco:call](`megaco:call/3`) function. In this case, the segments are\n accumulated and then delivered all at once as the function returns.\n\n- Sending segmented messages:\n\n This is also handled automatically by the megaco application. First of all,\n segmentation is only attempted if so configured, see the\n [segment_send](`megaco:user_info/2`) option. Secondly, megaco relies on the\n ability of the used codec to encode action replies, which is the smallest\n component the megaco application handles when segmenting. Thirdly, the reply\n will be segmented only if the sum of the size of the action replies (plus an\n arbitrary message header size) are greater then the specified max message size\n (see the [max_pdu_size](`megaco:user_info/2`) option). Finally, if\n segmentation is decided, then each action reply will make up its own (segment)\n message.","ref":"megaco_run.html#segmentation-of-transaction-replies"},{"type":"extras","title":"Internal form and its encodings","doc":"\n# Internal form and its encodings\n\nThis version of the stack is compliant with:\n\n- Megaco/H.248 version 1 (RFC3525) updated according to Implementors Guide\n version 10-13.\n- Megaco/H.248 version 2 as defined by draft-ietf-megaco-h248v2-04 updated\n according to Implementors Guide version 10-13.\n- Megaco/H.248 version 3 as defined by ITU H.248.1 (09/2005).","ref":"megaco_encode.html"},{"type":"extras","title":"Internal form of messages - Internal form and its encodings","doc":"We use the same internal form for both the binary and text encoding. Our\ninternal form of Megaco/H.248 messages is heavily influenced by the internal\nformat used by ASN.1 encoders/decoders:\n\n- \"SEQUENCE OF\" is represented as a list.\n- \"CHOICE\" is represented as a tagged tuple with size 2.\n- \"SEQUENCE\" is represented as a record, defined in\n \"megaco/include/megaco_message_v1.hrl\".\n- \"OPTIONAL\" is represented as an ordinary field in a record which defaults to\n 'asn1_NOVALUE', meaning that the field has no value.\n- \"OCTET STRING\" is represented as a list of unsigned integers.\n- \"ENUMERATED\" is represented as a single atom.\n- \"BIT STRING\" is represented as a list of atoms.\n- \"BOOLEAN\" is represented as the atom 'true' or 'false'.\n- \"INTEGER\" is represented as an integer.\n- \"IA5String\" is represented as a list of integers, where each integer is the\n ASCII value of the corresponding character.\n- \"NULL\" is represented as the atom 'NULL'.\n\nIn order to fully understand the internal form you must get hold on a ASN.1\nspecification for the Megaco/H.248 protocol, and apply the rules above. Please,\nsee the documentation of the ASN.1 compiler in Erlang/OTP for more details of\nthe semantics in mapping between ASN.1 and the corresponding internal form.\n\nObserve that the 'TerminationId' record is not used in the internal form. It has\nbeen replaced with a megaco_term_id record (defined in\n\"megaco/include/megaco.hrl\").","ref":"megaco_encode.html#internal-form-of-messages"},{"type":"extras","title":"The different encodings - Internal form and its encodings","doc":"The Megaco/H.248 standard defines both a plain text encoding and a binary\nencoding (ASN.1 BER) and we have implemented encoders and decoders for both. We\ndo in fact supply five different encoding/decoding modules.\n\nIn the text encoding, implementors have the choice of using a mix of short and\nlong keywords. It is also possible to add white spaces to improve readability.\nWe use the term compact for text messages with the shortest possible keywords\nand no optional white spaces, and the term pretty for a well indented text\nformat using long keywords and an indentation style like the text examples in\nthe Megaco/H.248 specification).\n\nHere follows an example of a text message to give a feeling of the difference\nbetween the pretty and compact versions of text messages. First the pretty, well\nindented version with long keywords:\n\n```c\n MEGACO/1 [124.124.124.222]\n Transaction = 9998 {\n Context = - {\n ServiceChange = ROOT {\n Services {\n Method = Restart,\n ServiceChangeAddress = 55555,\n Profile = ResGW/1,\n Reason = \"901 Cold Boot\"\n }\n }\n }\n }\n```\n\nThen the compact version without indentation and with short keywords:\n\n```text\n\n !/1 [124.124.124.222]\n T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE=\"901 Cold Boot\"}}}}\n```\n\nAnd the programmers view of the same message. First a list of ActionRequest\nrecords are constructed and then it is sent with one of the send functions in\nthe API:\n\n```erlang\n Prof = #'ServiceChangeProfile'{profileName = \"resgw\", version = 1},\n Parm = #'ServiceChangeParm'{serviceChangeMethod = restart,\n serviceChangeAddress = {portNumber, 55555},\n serviceChangeReason = \"901 Cold Boot\",\n serviceChangeProfile = Prof},\n Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],\n serviceChangeParms = Parm},\n Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,\n commandRequests = {serviceChangeReq, Req}}],\n megaco:call(ConnHandle, Actions, Config).\n```\n\nAnd finally a print-out of the entire internal form:\n\n```erlang\n {'MegacoMessage',\n asn1_NOVALUE,\n {'Message',\n 1,\n {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},\n {transactions,\n [\n {transactionRequest,\n {'TransactionRequest',\n 9998,\n [{'ActionRequest',\n 0,\n asn1_NOVALUE,\n asn1_NOVALUE,\n [\n {'CommandRequest',\n {serviceChangeReq,\n {'ServiceChangeRequest',\n [\n {megaco_term_id, false, [\"root\"]}],\n {'ServiceChangeParm',\n restart,\n {portNumber, 55555},\n asn1_NOVALUE,\n {'ServiceChangeProfile', \"resgw\", version = 1},\n \"901 MG Cold Boot\",\n asn1_NOVALUE,\n asn1_NOVALUE,\n asn1_NOVALUE\n }\n }\n },\n asn1_NOVALUE,\n asn1_NOVALUE\n }\n ]\n }\n ]\n }\n }\n ]\n }\n }\n }\n```\n\nThe following encoding modules are provided:\n\n- megaco_pretty_text_encoder - encodes messages into pretty text format, decodes\n both pretty as well as compact text.\n- megaco_compact_text_encoder - encodes messages into compact text format,\n decodes both pretty as well as compact text.\n- megaco_binary_encoder - encode/decode ASN.1 BER messages. This encoder\n implements the fastest of the BER encoders/decoders. Recommended binary codec.\n- megaco_ber_encoder - encode/decode ASN.1 BER messages.\n- megaco_per_encoder - encode/decode ASN.1 PER messages. N.B. that this format\n is not included in the Megaco standard.\n- megaco_erl_dist_encoder - encodes messages into Erlangs distribution format.\n It is rather verbose but encoding and decoding is blinding fast. N.B. that\n this format is not included in the Megaco standard.\n\n[](){: #erl_dist_config }","ref":"megaco_encode.html#the-different-encodings"},{"type":"extras","title":"Configuration of Erlang distribution encoding module - Internal form and its encodings","doc":"The encoding_config of the megaco_erl_dist_encoder module may be one of these:\n\n- `[]` \\- Encodes the messages to the standard distribution format. It is rather\n verbose but encoding and decoding is blinding fast.\n- `[megaco_compressed]` \\- Encodes the messages to the standard distribution\n format after an internal transformation. It is less verbose, but the total\n time of the encoding and decoding will on the other hand be somewhat slower\n (see the [performance](megaco_performance.md) chapter for more info).\n- `[{megaco_compressed, Module}]` \\- Works in the same way as the\n megaco_compressed config parameter, only here the user provide their own\n compress module. This module must implement the `m:megaco_edist_compress`\n behaviour.\n- `[compressed]` \\- Encodes the messages to a compressed form of the standard\n distribution format. It is less verbose, but the encoding and decoding will on\n the other hand be slower.\n\n[](){: #text_config }","ref":"megaco_encode.html#configuration-of-erlang-distribution-encoding-module"},{"type":"extras","title":"Configuration of text encoding module(s) - Internal form and its encodings","doc":"When using text encoding(s), there is actually two different configs controlling\nwhat software to use:\n\n- `[]` \\- An empty list indicates that the erlang scanner should be used.\n- `[{flex, port()}]` \\- Use the flex scanner when decoding (not optimized for\n SMP). See [initial configuration](megaco_run.md#initial_config) for more info.\n- `[{flex, ports()}]` \\- Use the flex scanner when decoding (optimized for SMP).\n See [initial configuration](megaco_run.md#initial_config) for more info.\n\nThe Flex scanner is a Megaco scanner written as a linked in driver (in C). There\nare two ways to get this working:\n\n- Let the Megaco stack start the flex scanner (load the driver).\n\n To make this happen the megaco stack has to be configured:\n\n - Add the `{scanner, flex}` (or similar) directive to an Erlang system config\n file for the megaco app (see\n [initial configuration](megaco_run.md#initial_config) chapter for details).\n - Retrieve the encoding-config using the [system_info](`megaco:system_info/1`)\n function (with `Item = text_config`).\n - Update the receive handle with the encoding-config (the `encoding_config`\n field).\n\n The benefit of this is that Megaco handles the starting, holding and the\n supervision of the driver and port.\n\n- The Megaco client (user) starts the flex scanner (load the driver).\n\n When starting the flex scanner a port to the linked in driver is created. This\n port has to be owned by a process. This process must not die. If it does the\n port will also terminate. Therefor:\n\n - Create a permanent process. Make sure this process is supervised (so that if\n it does die, this will be noticed).\n - Let this process start the flex scanner by calling the\n `megaco_flex_scanner:start/0,1` function.\n - Retrieve the encoding-config and when initiating the\n `megaco_receive_handle`, set the field `encoding_config` accordingly.\n - Pass the `megaco_receive_handle` to the transport module.\n\n[](){: #binary_config }","ref":"megaco_encode.html#configuration-of-text-encoding-module-s"},{"type":"extras","title":"Configuration of binary encoding module(s) - Internal form and its encodings","doc":"When using binary encoding, the structure of the termination id's needs to be\nspecified.\n\n- `[native]` \\- skips the transformation phase, i.e. the decoded message(s) will\n not be transformed into our internal form.\n- `[integer()]` \\- A list containing the size (the number of bits) of each\n level. Example: `[3,8,5,8]`.\n- `t:integer/0` \\- Number of one byte (8 bits) levels. N.B. This is currently\n converted into the previous config. Example: `3` (`[8,8,8]`).\n\n[](){: #handling_versions }","ref":"megaco_encode.html#configuration-of-binary-encoding-module-s"},{"type":"extras","title":"Handling megaco versions - Internal form and its encodings","doc":"There are two ways to handle the different megaco encoding versions. Either\nusing _dynamic version detection_ (only valid for for incoming messages) or by\n_explicit version_ setting in the connection info.\n\nFor incoming messages:\n\n- Dynamic version detection\n\n Set the protocol version in the megaco_receive_handle to `dynamic` (this is\n the default). \n This works for those codecs that support partial decode of the version,\n currently _text_, and ber_bin (`megaco_binary_encoder` and\n `megaco_ber_bin_encoder`). \n This way the decoder will detect which version is used and then use the proper\n decoder.\n\n- Explicit version\n\n Explicitly set the actual protocol version in the megaco_receive_handle. \n Start with version 1. When the initial service change has been performed and\n version 2 has been negotiated, upgrade the megaco_receive_handle of the\n transport process (control_pid) to version 2. See\n [megaco_tcp](`megaco_tcp:upgrade_receive_handle/2`) and\n [megaco_udp](`megaco_udp:upgrade_receive_handle/2`). \n Note that if `udp` is used, the same transport process could be used for\n several connections. This could make upgrading impossible. \n For codecs that does not support partial decode of the version, currently\n `megaco_ber_encoder` and `megaco_per_encoder`, `dynamic` will revert to\n version 1.\n\nFor outgoing messages:\n\n- Update the connection info protocol_version.\n- Override protocol version when sending a message by adding the item\n `{protocol_version, integer()}` to the Options. See [call](`megaco:call/3`) or\n [cast](`megaco:cast/3`). \n Note that this does not effect the messages that are sent autonomously by the\n stack. They use the protocol_version of the connection info.","ref":"megaco_encode.html#handling-megaco-versions"},{"type":"extras","title":"Encoder callback functions - Internal form and its encodings","doc":"The encoder callback interface is defined by the `megaco_encoder` behaviour, see\n`m:megaco_encoder`.","ref":"megaco_encode.html#encoder-callback-functions"},{"type":"extras","title":"Transport mechanisms","doc":"\n# Transport mechanisms","ref":"megaco_transport_mechanisms.html"},{"type":"extras","title":"Callback interface - Transport mechanisms","doc":"The callback interface of the transport module contains several functions. Some\nof which are mandatory while others are only optional:\n\n- `send_message` \\- Send a message. _Mandatory_\n- `block` \\- Block the transport. _Optional_\n\n This function is usefull for flow control.\n\n- `unblock` \\- Unblock the transport. _Optional_\n\nFor more detail, see the `m:megaco_transport` behaviour definition.","ref":"megaco_transport_mechanisms.html#callback-interface"},{"type":"extras","title":"Examples - Transport mechanisms","doc":"The Megaco/H.248 application contains implementations for the two protocols\nspecified by the Megaco/H.248 standard; UDP, see `m:megaco_udp`, and TCP/TPKT,\nsee `m:megaco_tcp`.","ref":"megaco_transport_mechanisms.html#examples"},{"type":"extras","title":"Implementation examples","doc":"\n# Implementation examples","ref":"megaco_examples.html"},{"type":"extras","title":"A simple Media Gateway Controller - Implementation examples","doc":"In megaco/examples/simple/megaco_simple_mgc.erl there is an example of a simple\nMGC that listens on both text and binary standard ports and is prepared to\nhandle a Service Change Request message to arrive either via TCP/IP or UDP/IP.\nMessages received on the text port are decoded using a text decoder and messages\nreceived on the binary port are decoded using a binary decoder.\n\nThe Service Change Reply is encoded in the same way as the request and sent back\nto the MG with the same transport mechanism UDP/IP or TCP/IP.\n\nAfter this initial service change message the connection between the MG and MGC\nis fully established and supervised.\n\nThe MGC, with its four listeners, may be started with:\n\n```text\n cd megaco/examples/simple\n erl -pa ../../../megaco/ebin -s megaco_filter -s megaco\n megaco_simple_mgc:start().\n```\n\nor simply 'gmake mgc'.\n\nThe -s megaco_filter option to erl implies, the event tracing mechanism to be\nenabled and an interactive sequence chart tool to be started. This may be quite\nuseful in order to visualize how your MGC interacts with the Megaco/H.248\nprotocol stack.\n\nThe event traces may alternatively be directed to a file for later analyze. By\ndefault the event tracing is disabled, but it may dynamically be enabled without\nany need for re-compilation of the code.","ref":"megaco_examples.html#a-simple-media-gateway-controller"},{"type":"extras","title":"A simple Media Gateway - Implementation examples","doc":"In megaco/examples/simple/megaco_simple_mg.erl there is an example of a simple\nMG that connects to an MGC, sends a Service Change Request and waits\nsynchronously for a reply.\n\nAfter this initial service change message the connection between the MG and MGC\nis fully established and supervised.\n\nAssuming that the MGC is started on the local host, four different MG's, using\ntext over TCP/IP, binary over TCP/IP, text over UDP/IP and binary over UDP/IP\nmay be started on the same Erlang node with:\n\n```text\n cd megaco/examples/simple\n erl -pa ../../../megaco/ebin -s megaco_filter -s megaco\n megaco_simple_mg:start().\n```\n\nor simply 'gmake mg'.\n\nIf you \"only\" want to start a single MG which tries to connect an MG on a host\nnamed \"baidarka\", you may use one of these functions (instead of the\nmegaco_simple_mg:start/0 above):\n\n```erlang\n megaco_simple_mg:start_tcp_text(\"baidarka\", []).\n megaco_simple_mg:start_tcp_binary(\"baidarka\", []).\n megaco_simple_mg:start_udp_text(\"baidarka\", []).\n megaco_simple_mg:start_udp_binary(\"baidarka\", []).\n```\n\nThe -s megaco_filter option to erl implies, the event tracing mechanism to be\nenabled and an interactive sequence chart tool to be started. This may be quite\nuseful in order to visualize how your MG interacts with the Megaco/H.248\nprotocol stack.\n\nThe event traces may alternatively be directed to a file for later analyze. By\ndefault the event tracing is disabled, but it may dynamically be enabled without\nany need for re-compilation of the code.","ref":"megaco_examples.html#a-simple-media-gateway"},{"type":"extras","title":"Megaco mib","doc":"\n# Megaco mib","ref":"megaco_mib.html"},{"type":"extras","title":"Intro - Megaco mib","doc":"The Megaco mib is as of yet not standardized and our implementation is based on\n_draft-ietf-megaco-mib-04.txt_. Almost all of the mib cannot easily be\nimplemented by the megaco application. Instead these things should be\nimplemented by a user (of the megaco application).\n\nSo what part of the mib is implemented? Basically the relevant statistic\ncounters of the _MedGwyGatewayStatsEntry_.","ref":"megaco_mib.html#intro"},{"type":"extras","title":"Statistics counters - Megaco mib","doc":"The implementation of the statistic counters is lightweight. I.e. the statistic\ncounters are handled separately by different entities of the application. For\ninstance our two transport module(s) (see [megaco_tcp](`megaco_tcp:get_stats/0`) and\n[megaco_udp](`megaco_udp:get_stats/0`)) maintain their own counters and the\napplication engine (see [megaco](`megaco:get_stats/2`)) maintain its own counters.\n\nThis also means that if a user implement their own transport service then it has\nto maintain its own statistics.","ref":"megaco_mib.html#statistics-counters"},{"type":"extras","title":"Distribution - Megaco mib","doc":"Each megaco application maintains its own set of counters. So in a large\n(distributed) MG/MGC it could be necessary to collect the statistics from\nseveral nodes (each) running the megaco application (only one of them with the\ntransport).","ref":"megaco_mib.html#distribution"},{"type":"extras","title":"Performance comparison","doc":"\n# Performance comparison","ref":"megaco_performance.html"},{"type":"extras","title":"Comparison of encoder/decoders - Performance comparison","doc":"The Megaco/H.248 standard defines both a plain text encoding and a binary\nencoding (ASN.1 BER) and we have implemented encoders and decoders for both. We\ndo supply a bunch of different encoding/decoding modules and the user may in\nfact implement their own (like our erl_dist module). Using a non-standard\nencoding format has its obvious drawbacks, but may be useful in some\nconfigurations.\n\nWe have made four different measurements of our Erlang/OTP implementation of the\nMegaco/H.248 protocol stack, in order to compare our different\nencoders/decoders. The result of each one is summarized in the table below.\n\n| _Codec and config_ | _Size_ | _Encode_ | _Decode_ | _Total_ |\n| ---------------------------------------- | ------ | -------- | -------- | ------- |\n| pretty | 336 | 5 | 12 | 17 |\n| pretty \\[flex] | 336 | 5 | 11 | 16 |\n| compact | 181 | 4 | 10 | 14 |\n| compact \\[flex] | 181 | 4 | 9 | 13 |\n| per bin | 91 | 6 | 6 | 12 |\n| per bin \\[native] | 91 | 4 | 3 | 7 |\n| ber bin | 165 | 6 | 6 | 12 |\n| ber bin \\[native] | 165 | 4 | 3 | 7 |\n| erl_dist | 875 | 2 | 5 | 7 |\n| erl_dist \\[megaco_compressed] | 405 | 1 | 2 | 3 |\n| erl_dist \\[compressed] | 345 | 15 | 9 | 24 |\n| erl_dist \\[megaco_compressed,compressed] | 200 | 11 | 4 | 15 |\n\n_Table: Codec performance_","ref":"megaco_performance.html#comparison-of-encoder-decoders"},{"type":"extras","title":"Description of encoders/decoders - Performance comparison","doc":"In Appendix A of the Megaco/H.248 specification (RFC 3525), there are about 30\nmessages that shows a representative call flow. We have also added a few extra\nversion 1, version 2 and version 3 messages. We have used these messages as\nbasis for our measurements. Our figures have not been weighted in regard to how\nfrequent the different kinds of messages that are sent between the media gateway\nand its controller.\n\nThe test compares the following encoder/decoders:\n\n- _pretty_ \\- pretty printed text. In the text encoding, the protocol stack\n implementors have the choice of using a mix of short and long keywords. It is\n also possible to add white spaces to improve readability. The pretty text\n encoding utilizes long keywords and an indentation style like the text\n examples in the Megaco/H.248 specification.\n- _compact_ \\- the compact text encoding uses the shortest possible keywords and\n no optional white spaces.\n- _ber_ \\- ASN.1 BER.\n- _per_ \\- ASN.1 PER. Not standardized as a valid Megaco/H.248 encoding, but\n included for the matter of completeness as its encoding is extremely compact.\n- _erl_dist_ \\- Erlang's native distribution format. Not standardized as a valid\n Megaco/H.248 encoding, but included as a reference due to its well known\n performance characteristics. Erlang is a dynamically typed language and any\n Erlang data structure may be serialized to the erl_dist format by using\n built-in functions.\n\nThe actual encoded messages have been collected in one directory per encoding\ntype, containing one file per encoded message.\n\nHere follows an example of a text message to give a feeling of the difference\nbetween the pretty and compact versions of text messages. First the pretty\nprinted, well indented version with long keywords:\n\n```c\nMEGACO/1 [124.124.124.222]\n Transaction = 9998 {\n Context = - {\n ServiceChange = ROOT {\n Services {\n Method = Restart,\n ServiceChangeAddress = 55555,\n Profile = ResGW/1,\n Reason = \"901 MG Cold Boot\"\n }\n }\n }\n }\n```\n\nThen the compact text version without indentation and with short keywords:\n\n```text\n!/1 [124.124.124.222] T=9998{\n C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE=\"901 MG Cold Boot\"}}}}\n```","ref":"megaco_performance.html#description-of-encoders-decoders"},{"type":"extras","title":"Setup - Performance comparison","doc":"The measurements has been performed on a Dell Precision 5550 Laptop with a\nIntel(R) Core(TM) i7-10875H CPU @ 2.30GHz, with 40 GB memory and running Ubuntu\n20.04 x86_64, kernel 5.4.0-91-generic. Software versions was open source OTP\n24.2 (megaco-4.2).","ref":"megaco_performance.html#setup"},{"type":"extras","title":"Summary - Performance comparison","doc":"In our measurements we have seen that there are no significant differences in\nmessage sizes between ASN.1 BER and the compact text format. Some care should be\ntaken when using the pretty text style (which is used in all the examples\nincluded in the protocol specification and preferred during debugging sessions)\nsince the messages can then be quite large. If the message size really is a\nserious issue, our per encoder should be used, as the ASN.1 PER format is much\nmore compact than all the other alternatives. Its major drawback is that it is\nhas not been approved as a valid Megaco/H.248 message encoding.\n\nWhen it comes to pure encode/decode performance, it turns out that:\n\n- our fastest binary encoder (ber) is about equal to our fastest text encoder\n (compact).\n- our fastest binary decoder (ber) is about 66% faster than our fastest text\n decoder (compact).\n\nIf the pure encode/decode performance really is a serious issue, our erl_dist\nencoder could be used, as the encoding/decoding of the erlang distribution\nformat is much faster than all the other alternatives. Its major drawback is\nthat it is has not been approved as a valid Megaco/H.248 message encoding.\n\nThere is no performance advantage of building (and using) a non-reentrant flex\nscanner over a reentrant flex scanner (if flex supports building such a\nscanner).\n\n> #### Note {: .info }\n>\n> Please, observe that these performance figures are related to our\n> implementation in Erlang/OTP. Measurements of other implementations using\n> other tools and techniques may of course result in other figures.","ref":"megaco_performance.html#summary"},{"type":"extras","title":"Testing and tools","doc":"\n# Testing and tools","ref":"megaco_debug.html"},{"type":"extras","title":"Tracing - Testing and tools","doc":"We have instrumented our code in order to enable tracing. Running the\napplication with tracing deactivated, causes a negligible performance overhead\n(an external call to a function which returns an atom). Activation of tracing\ndoes not require any recompilation of the code, since we rely on Erlang/OTP's\nbuilt in support for dynamic trace activation. In our case tracing of calls to a\ngiven external function.\n\nEvent traces can be viewed in a generic message sequence chart tool, `et`, or as\nstandard output (events are written to stdio).\n\nSee [enable_trace](`megaco:enable_trace/2`),\n[disable_trace](`megaco:disable_trace/0`) and [set_trace](`megaco:set_trace/1`)\nfor more info.","ref":"megaco_debug.html#tracing"},{"type":"extras","title":"Measurement and transformation - Testing and tools","doc":"We have included some simple tool(s) for codec measurement (meas), performance\ntests (mstone1 and mstone2) and message transformation.\n\nThe tool(s) are located in the example/meas directory.","ref":"megaco_debug.html#measurement-and-transformation"},{"type":"extras","title":"Requirement - Testing and tools","doc":"- Erlang/OTP, version 24.2 or later.\n- Version 4.2 or later of _this_ application.\n- Version 5.0.17 or later of the _asn1_ application.\n- The flex libraries. Without it, the flex powered codecs cannot be used.","ref":"megaco_debug.html#requirement"},{"type":"extras","title":"Meas results - Testing and tools","doc":"The results from the measurement run (meas) is four excel-compatible textfiles:\n\n- decode_time.xls -> Decoding result\n- encode_time.xls -> Encoding result\n- total_time.xls -> Total (Decoding+encoding) result\n- message_size.xls -> Message size","ref":"megaco_debug.html#meas-results"},{"type":"extras","title":"Instruction - Testing and tools","doc":"The tool contain four things:\n\n- The transformation module\n- The measurement (meas) module(s)\n- The mstone (mstone1 and mstone2) module(s)\n- The basic message file\n\n#### Message Transformation\n\nThe messages used by the different tools are contained in single message package\nfile (see below for more info). The messages in this file is encoded with just\none codec. During measurement initiation, the messages are read and then\ntransformed to all codec formats used in the measurement.\n\nThe message transformation is done by the transformation module. It is used to\ntransform a set of messages encoded with one codec into the other base codec's.\n\n#### Measurement(s)\n\nThere are two different measurement tools:\n\n- _meas_:\n\n Used to perform codec measurements. That is, to see what kind of performance\n can be expected by the different codecs provided by the megaco application.\n\n The measurement is done by iterating over the decode/encode function for\n approx 2 seconds per message and counting the number of decodes/encodes.\n\n Is best run by modifying the meas.sh.skel skeleton script provided by the\n tool.\n\n To run it manually do the following:\n\n ```erlang\n % erl -pa -pa \n Erlang (BEAM) emulator version 5.6 [source]\n\n Eshell V12.2 (abort with ^G)\n 1> megaco_codec_meas:start().\n ...\n 2> halt().\n ```\n\n or to make it even easier, assuming a measure shall be done on all the codecs\n (as above):\n\n ```text\n % erl -noshell -pa \\\\\n -pa \\\\\n -s megaco_codec_meas -s init stop\n ```\n\n When run as above (this will take some time), the measurement process is done\n as follows:\n\n ```text\n For each codec:\n For each message:\n Read the message from the file\n Detect message version\n Measure decode\n Measure encode\n Write results, encode, decode and total, to file\n ```\n\n- _mstone1 and mstone2_:\n\n These are two different SMP performance monitoring tool(s).\n\n _mstone1_ creates a process for each codec config supported by the megaco\n application and let them run for a specific time (all at the same time),\n encoding and decoding megaco messages. The number of messages processed in\n total is the mstone1(1) value.\n\n There are different ways to run the mstone1 tool, e.g. with or without the use\n of drivers, with _only_ flex-empowered configs.\n\n Is best run by modifying the mstone1.sh.skel skeleton script provided by the\n tool.\n\n The _mstone2_ is similar to the _mstone1_ tool, but in this case, each created\n process makes only _one_ run through the messages and then exits. A soon as a\n process exits, a new process (with the same config and messages) is created to\n takes its place. The number of messages processed in total is the mstone2(1)\n value.\n\nBoth these tools use the message package (time_test.msgs) provided with the\ntool(s), although it can run on any message package as long as it has the same\nstructure.\n\n#### Message package file\n\nThis is simply an erlang compatible text-file with the following structure:\n`{codec_name(), messages_list()}`.\n\n```erlang\ncodec_name() = pretty | compact | ber | per | erlang (how the messages are encoded)\nmessages_list() = [{message_name(), message()}]\nmessage_name() = atom()\nmessage() = binary()\n```\n\nThe codec name is the name of the codec with which all messages in the\n`message_list()` has been encoded.\n\nThis file can be `exported` to a file structure by calling the\n[export_messages](`m:megaco_codec_transform#export_messages`) function. This can\nbe usefull if a measurement shall be done with an external tool. Exporting the\nmessages creates a directory tree with the following structure:\n\n```text\n /pretty/ \n compact/\n per/\n ber/ \n erlang/\n```\n\nThe file includes both version 1, 2 and version 3 messages.","ref":"megaco_debug.html#instruction"},{"type":"extras","title":"Notes - Testing and tools","doc":"#### Binary codecs\n\nThere are two basic ways to use the binary encodings: With package related name\nand termination id transformation (the 'native' encoding config) or without.\nThis transformation converts package related names and termination id's to a\nmore convenient internal form (equivalent with the decoded text message).\n\nThe transformation is done \\_after\\_ the actual decode has been done.\n\nTherefor in the tests, binary codecs are tested with two different encoding\nconfigs to determine exactly how the different options effect the performance:\nwith transformation ([]) and without transformation (\\[native]).\n\n#### Included test messages\n\nSome of these messages are ripped from the call flow examples in an old version\nof the RFC and others are created to test a specific feature of megaco.\n\n#### Measurement tool directory name\n\nBe sure _not_ no name the directory containing the measurement binaries starting\nwith 'megaco-', e.g. megaco-meas. This will confuse the erlang application\nloader (erlang applications are named, e.g. megaco-5.2).","ref":"megaco_debug.html#notes"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/megaco-4.7/doc/html/megaco.epub b/prs/9277/lib/megaco-4.7/doc/html/megaco.epub index b40fcf86ee4bf..722bee75c8ae6 100644 Binary files a/prs/9277/lib/megaco-4.7/doc/html/megaco.epub and b/prs/9277/lib/megaco-4.7/doc/html/megaco.epub differ diff --git a/prs/9277/lib/megaco-4.7/doc/html/megaco.html b/prs/9277/lib/megaco-4.7/doc/html/megaco.html index cada47d5a7fe4..fe655aeec6bb1 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/megaco.html +++ b/prs/9277/lib/megaco-4.7/doc/html/megaco.html @@ -3194,7 +3194,7 @@

      print_version_info(Versions)

      Utility function to produce a formated printout of the versions info generated by the versions1 and versions2 functions.

      The function print_version_info/0 uses the result of function version1/0 as -VersionInfo.

      Example:

                 {ok, V} = megaco:versions1(), megaco:format_versions(V).
      +VersionInfo.

      Example:

                 {ok, V} = megaco:versions1(), megaco:format_versions(V).
      diff --git a/prs/9277/lib/megaco-4.7/doc/html/megaco_debug.html b/prs/9277/lib/megaco-4.7/doc/html/megaco_debug.html index 5026a95e5aeb0..b389a753d7b45 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/megaco_debug.html +++ b/prs/9277/lib/megaco-4.7/doc/html/megaco_debug.html @@ -172,12 +172,12 @@

      can be expected by the different codecs provided by the megaco application.

      The measurement is done by iterating over the decode/encode function for approx 2 seconds per message and counting the number of decodes/encodes.

      Is best run by modifying the meas.sh.skel skeleton script provided by the tool.

      To run it manually do the following:

              % erl -pa <path-megaco-ebin-dir> -pa <path-to-meas-module-dir>
      -        Erlang (BEAM) emulator version 5.6 [source]
      +        Erlang (BEAM) emulator version 5.6 [source]
       
      -        Eshell V12.2  (abort with ^G)
      -        1> megaco_codec_meas:start().
      +        Eshell V12.2  (abort with ^G)
      +        1> megaco_codec_meas:start().
               ...
      -        2> halt().

      or to make it even easier, assuming a measure shall be done on all the codecs + 2> halt().

    or to make it even easier, assuming a measure shall be done on all the codecs (as above):

            % erl -noshell -pa <path-megaco-ebin-dir> \\
                   -pa <path-to-meas-module-dir> \\
                   -s megaco_codec_meas -s init stop

    When run as above (this will take some time), the measurement process is done @@ -199,10 +199,10 @@

    value.

    Both these tools use the message package (time_test.msgs) provided with the tool(s), although it can run on any message package as long as it has the same structure.

    Message package file

    This is simply an erlang compatible text-file with the following structure: -{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    -messages_list() = [{message_name(), message()}]
    -message_name() = atom()
    -message() = binary()

    The codec name is the name of the codec with which all messages in the +{codec_name(), messages_list()}.

    codec_name() = pretty | compact | ber | per | erlang      (how the messages are encoded)
    +messages_list() = [{message_name(), message()}]
    +message_name() = atom()
    +message() = binary()

    The codec name is the name of the codec with which all messages in the message_list() has been encoded.

    This file can be exported to a file structure by calling the export_messages function. This can be usefull if a measurement shall be done with an external tool. Exporting the diff --git a/prs/9277/lib/megaco-4.7/doc/html/megaco_encode.html b/prs/9277/lib/megaco-4.7/doc/html/megaco_encode.html index d7488b972cddd..0adcdc59f6c5a 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/megaco_encode.html +++ b/prs/9277/lib/megaco-4.7/doc/html/megaco_encode.html @@ -158,75 +158,75 @@

    format using long keywords and an indentation style like the text examples in the Megaco/H.248 specification).

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty, well -indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    -   Transaction = 9998 {
    -           Context = - {
    -                   ServiceChange = ROOT {
    -                           Services {
    +indented version with long keywords:

       MEGACO/1 [124.124.124.222]
    +   Transaction = 9998 {
    +           Context = - {
    +                   ServiceChange = ROOT {
    +                           Services {
                                        Method = Restart,
                                        ServiceChangeAddress = 55555,
                                        Profile = ResGW/1,
                                        Reason = "901 Cold Boot"
    -                           }
    -                   }
    -           }
    -   }

    Then the compact version without indentation and with short keywords:

    
    +                           }
    +                   }
    +           }
    +   }

    Then the compact version without indentation and with short keywords:

    
        !/1 [124.124.124.222]
        T=9998{C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 Cold Boot"}}}}

    And the programmers view of the same message. First a list of ActionRequest records are constructed and then it is sent with one of the send functions in -the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    -  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    -                              serviceChangeAddress = {portNumber, 55555},
    +the API:

      Prof = #'ServiceChangeProfile'{profileName = "resgw", version = 1},
    +  Parm = #'ServiceChangeParm'{serviceChangeMethod  = restart,
    +                              serviceChangeAddress = {portNumber, 55555},
                                   serviceChangeReason  = "901 Cold Boot",
    -                              serviceChangeProfile = Prof},
    -  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    -                                serviceChangeParms = Parm},
    -  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    -                              commandRequests = {serviceChangeReq, Req}}],
    -  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
    +                              serviceChangeProfile = Prof},
    +  Req = #'ServiceChangeRequest'{terminationID = [?megaco_root_termination_id],
    +                                serviceChangeParms = Parm},
    +  Actions = [#'ActionRequest'{contextId = ?megaco_null_context_id,
    +                              commandRequests = {serviceChangeReq, Req}}],
    +  megaco:call(ConnHandle, Actions, Config).

    And finally a print-out of the entire internal form:

      {'MegacoMessage',
        asn1_NOVALUE,
    -   {'Message',
    +   {'Message',
         1,
    -    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    -    {transactions,
    -     [
    -      {transactionRequest,
    -       {'TransactionRequest',
    +    {ip4Address,{'IP4Address', [124,124,124,222], asn1_NOVALUE}},
    +    {transactions,
    +     [
    +      {transactionRequest,
    +       {'TransactionRequest',
              9998,
    -         [{'ActionRequest',
    +         [{'ActionRequest',
                0,
                asn1_NOVALUE,
                asn1_NOVALUE,
    -           [
    -            {'CommandRequest',
    -             {serviceChangeReq,
    -              {'ServiceChangeRequest',
    -               [
    -                {megaco_term_id, false, ["root"]}],
    -                {'ServiceChangeParm',
    +           [
    +            {'CommandRequest',
    +             {serviceChangeReq,
    +              {'ServiceChangeRequest',
    +               [
    +                {megaco_term_id, false, ["root"]}],
    +                {'ServiceChangeParm',
                      restart,
    -                 {portNumber, 55555},
    +                 {portNumber, 55555},
                      asn1_NOVALUE,
    -                 {'ServiceChangeProfile', "resgw", version = 1},
    +                 {'ServiceChangeProfile', "resgw", version = 1},
                      "901 MG Cold Boot",
                      asn1_NOVALUE,
                      asn1_NOVALUE,
                      asn1_NOVALUE
    -                }
    -              }
    -             },
    +                }
    +              }
    +             },
                  asn1_NOVALUE,
                  asn1_NOVALUE
    -            }
    -           ]
    -          }
    -         ]
    -       }
    -      }
    -     ]
    -    }
    -   }
    -  }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes + } + ] + } + ] + } + } + ] + } + } + }

    The following encoding modules are provided:

    • megaco_pretty_text_encoder - encodes messages into pretty text format, decodes both pretty as well as compact text.
    • megaco_compact_text_encoder - encodes messages into compact text format, decodes both pretty as well as compact text.
    • megaco_binary_encoder - encode/decode ASN.1 BER messages. This encoder implements the fastest of the BER encoders/decoders. Recommended binary codec.
    • megaco_ber_encoder - encode/decode ASN.1 BER messages.
    • megaco_per_encoder - encode/decode ASN.1 PER messages. N.B. that this format diff --git a/prs/9277/lib/megaco-4.7/doc/html/megaco_examples.html b/prs/9277/lib/megaco-4.7/doc/html/megaco_examples.html index 5c5d548fa0024..63aad8d5a2b6f 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/megaco_examples.html +++ b/prs/9277/lib/megaco-4.7/doc/html/megaco_examples.html @@ -159,10 +159,10 @@

      erl -pa ../../../megaco/ebin -s megaco_filter -s megaco megaco_simple_mg:start().

    or simply 'gmake mg'.

    If you "only" want to start a single MG which tries to connect an MG on a host named "baidarka", you may use one of these functions (instead of the -megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    -      megaco_simple_mg:start_tcp_binary("baidarka", []).
    -      megaco_simple_mg:start_udp_text("baidarka", []).
    -      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be +megaco_simple_mg:start/0 above):

          megaco_simple_mg:start_tcp_text("baidarka", []).
    +      megaco_simple_mg:start_tcp_binary("baidarka", []).
    +      megaco_simple_mg:start_udp_text("baidarka", []).
    +      megaco_simple_mg:start_udp_binary("baidarka", []).

    The -s megaco_filter option to erl implies, the event tracing mechanism to be enabled and an interactive sequence chart tool to be started. This may be quite useful in order to visualize how your MG interacts with the Megaco/H.248 protocol stack.

    The event traces may alternatively be directed to a file for later analyze. By diff --git a/prs/9277/lib/megaco-4.7/doc/html/megaco_performance.html b/prs/9277/lib/megaco-4.7/doc/html/megaco_performance.html index 9bc96a34ec254..202efb4a2d50b 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/megaco_performance.html +++ b/prs/9277/lib/megaco-4.7/doc/html/megaco_performance.html @@ -162,19 +162,19 @@

    built-in functions.

    The actual encoded messages have been collected in one directory per encoding type, containing one file per encoded message.

    Here follows an example of a text message to give a feeling of the difference between the pretty and compact versions of text messages. First the pretty -printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    -  Transaction = 9998 {
    -    Context = - {
    -      ServiceChange = ROOT {
    -        Services {
    +printed, well indented version with long keywords:

    MEGACO/1 [124.124.124.222]
    +  Transaction = 9998 {
    +    Context = - {
    +      ServiceChange = ROOT {
    +        Services {
               Method = Restart,
               ServiceChangeAddress = 55555,
               Profile = ResGW/1,
               Reason = "901 MG Cold Boot"
    -        }
    -      }
    -    }
    -  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
    +        }
    +      }
    +    }
    +  }

    Then the compact text version without indentation and with short keywords:

    !/1 [124.124.124.222] T=9998{
       C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 MG Cold Boot"}}}}

    diff --git a/prs/9277/lib/megaco-4.7/doc/html/megaco_user.html b/prs/9277/lib/megaco-4.7/doc/html/megaco_user.html index be2cdc0a33dc2..a5bf7f89c0c38 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/megaco_user.html +++ b/prs/9277/lib/megaco-4.7/doc/html/megaco_user.html @@ -131,9 +131,9 @@

    Callback module for users of the Megaco application

    This module defines the callback behaviour of Megaco users. A megaco_user compliant callback module must export the following functions:

    The semantics of them and their exact signatures are explained below.

    The user_args configuration parameter which may be used to extend the argument list of the callback functions. For example, the handle_connect function takes -by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as +by default two arguments:

    handle_connect(Handle, Version)

    but if the user_args parameter is set to a longer list, such as [SomePid,SomeTableRef], the callback function is expected to have these (in -this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. +this case two) extra arguments last in the argument list:

    handle_connect(Handle, Version, SomePid, SomeTableRef)

    Note

    Must of the functions below has an optional Extra argument (e.g. handle_unexpected_trans/4). The functions which takes this argument will be called if and only if one of the functions receive_message/5 or @@ -144,10 +144,10 @@

    DATA TYPES

    -
    action_request() = #'ActionRequest'{}
    -action_reply() = #'ActionReply'{}
    -error_desc() = #'ErrorDescriptor'{}
    -segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" +

    action_request() = #'ActionRequest'{}
    +action_reply() = #'ActionReply'{}
    +error_desc() = #'ErrorDescriptor'{}
    +segment_no() = integer()
    conn_handle() = #megaco_conn_handle{}

    The record initially returned by megaco:connect/4,5. It identifies a "virtual" connection and may be reused after a reconnect (disconnect + connect).

    protocol_version() = integer()

    Is the actual protocol version. In most cases the protocol version is retrieved from the processed message, but there are exceptions:

    In these cases, the ProtocolVersion default version is obtained from the static diff --git a/prs/9277/lib/megaco-4.7/doc/html/search.html b/prs/9277/lib/megaco-4.7/doc/html/search.html index 9543f920c544c..cc8b6d98d2ee8 100644 --- a/prs/9277/lib/megaco-4.7/doc/html/search.html +++ b/prs/9277/lib/megaco-4.7/doc/html/search.html @@ -122,7 +122,7 @@

    - +

    diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.epub b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.epub index 15b502fd697e2..74085ffc1b4b9 100644 Binary files a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.epub and b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.epub differ diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.html index 2d3fd5e1a35a6..14529fce3802e 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia.html @@ -166,11 +166,11 @@

    specifies the types of the SNMP keys.

  • attributes. The names of the attributes for the records that are inserted in the table.

  • For information about the complete set of table properties and their details, see mnesia:create_table/2.

    This Reference Manual uses a table of persons to illustrate various examples. -The following record definition is assumed:

    -record(person, {name,
    +The following record definition is assumed:

    -record(person, {name,
                      age = 0,
                      address = unknown,
                      salary = 0,
    -                 children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to + children = []}),

    The first record attribute is the primary key, or key for short.

    The function descriptions are sorted in alphabetical order. It is recommended to start to read about mnesia:create_table/2, mnesia:lock/2, and mnesia:activity/4 before you continue and learn about the rest.

    Writing or deleting in transaction-context creates a local copy of each modified record during the transaction. During iteration, that is, mnesia:foldl/4, @@ -2865,7 +2865,7 @@

    change_table_copy_type(Tab, Node, To)

    -

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at +

    Change the storage type of a table.

    For example:

    mnesia:change_table_copy_type(person, node(), disc_copies)

    Transforms the person table from a RAM table into a disc-based table at Node.

    This function can also be used to change the storage type of the table named schema. The schema table can only have ram_copies or disc_copies as the storage type. If the storage type of the schema is ram_copies, no other table @@ -3116,22 +3116,22 @@

    create_table(Name, Opts)

    back end storage. Backend can currently be ets or dets. Properties is a list of options sent to the back end storage during table creation. Properties cannot contain properties already used by Mnesia, such as type -or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    -       {storage_properties,
    -        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, +or named_table.

    For example:

    mnesia:create_table(table, [{ram_copies, [node()]}, {disc_only_copies, nodes()},
    +       {storage_properties,
    +        [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}])
  • {type, Type}, where Type must be either of the atoms set, ordered_set, or bag. Default is set. In a set, all records have unique keys. In a bag, several records can have the same key, but the record content is unique. If a non-unique record is stored, the old conflicting records are overwritten.

    Notice that currently ordered_set is not supported for disc_only_copies.

  • {local_content, Bool}, where Bool is true or false. Default is false.

  • For example, the following call creates the person table (defined earlier) and -replicates it on two nodes:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on +replicates it on two nodes:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {attributes, record_info(fields, person)}]).

    If it is required that Mnesia must build and maintain an extra index table on attribute address of all the person records that are inserted in the table, -the following code would be issued:

    mnesia:create_table(person,
    -    [{ram_copies, [N1, N2]},
    -     {index, [address]},
    -     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as +the following code would be issued:

    mnesia:create_table(person,
    +    [{ram_copies, [N1, N2]},
    +     {index, [address]},
    +     {attributes, record_info(fields, person)}]).

    The specification of index and attributes can be hard-coded as {index, [2]} and {attributes, [name, age, address, salary, children]}, respectively.

    mnesia:create_table/2 writes records into the table schema. This function, and all other schema manipulation functions, are implemented with the normal @@ -5381,10 +5381,10 @@

    select(Tab, Spec, LockKind)

    argument. Default is read. The return value depends on MatchSpec.

    Notice that for best performance, select is to be used before any modifying operations are done on that table in the same transaction. That is, do not use write or delete before a select.

    In its simplest forms, the match_spec look as follows:

    • MatchSpec = [MatchFunction]
    • MatchFunction = {MatchHead, [Guard], [Result]}
    • MatchHead = tuple() | record()

    • Guard = {"Guardtest name", ...}
    • Result = "Term construct"

    For a complete description of select, see the ERTS -User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #person{name='$1', sex=male, age='$2', _='_'},
    -Guard = {'>', '$2', 30},
    +User's Guide and the ets manual page in STDLIB.

    For example, to find the names of all male persons older than 30 in table Tab:

    MatchHead = #person{name='$1', sex=male, age='$2', _='_'},
    +Guard = {'>', '$2', 30},
     Result = '$1',
    -mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    +
    mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),
    @@ -5679,9 +5679,9 @@

    snmp_open_table(Tab, Snmp)

    specified as a tuple of atoms describing the types. The only significant type is fix_string. This means that a string has a fixed size.

    For example, the following causes table person to be ordered as an SNMP table:

    mnesia:snmp_open_table(person, [{key, string}])

    Consider the following schema for a table of company employees. Each employee is identified by department number and name. The other table column stores the -telephone number:

    mnesia:create_table(employee,
    -    [{snmp, [{key, {integer, string}}]},
    -     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and +telephone number:

    mnesia:create_table(employee,
    +    [{snmp, [{key, {integer, string}}]},
    +     {attributes, record_info(fields, employees)}]),

    The corresponding SNMP table would have three columns: department, name, and telno.

    An option is to have table columns that are not visible through the SNMP protocol. These columns must be the last columns of the table. In the previous example, the SNMP table could have columns department and name only. The @@ -6284,17 +6284,17 @@

    transaction(Fun, Args, Retries)

    transaction is terminated and the function transaction/1 returns the tuple {aborted, Reason}.

    If all is going well, {atomic, ResultOfFun} is returned, where ResultOfFun is the value of the last expression in Fun.

    A function that adds a family to the database can be written as follows if there -is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    -    ChildOids = lists:map(fun oid/1, Children),
    -    Trans = fun() ->
    -        mnesia:write(F#person{children = ChildOids}),
    -        mnesia:write(M#person{children = ChildOids}),
    -        Write = fun(Child) -> mnesia:write(Child) end,
    -        lists:foreach(Write, Children)
    +is a structure {family, Father, Mother, ChildrenList}:

    add_family({family, F, M, Children}) ->
    +    ChildOids = lists:map(fun oid/1, Children),
    +    Trans = fun() ->
    +        mnesia:write(F#person{children = ChildOids}),
    +        mnesia:write(M#person{children = ChildOids}),
    +        Write = fun(Child) -> mnesia:write(Child) end,
    +        lists:foreach(Write, Children)
         end,
    -    mnesia:transaction(Trans).
    +    mnesia:transaction(Trans).
     
    -oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one +oid(Rec) -> {element(1, Rec), element(2, Rec)}.

    This code adds a set of people to the database. Running this code within one transaction ensures that either the whole family is added to the database, or the whole transaction terminates. For example, if the last child is badly formatted, or the executing process terminates because of an 'EXIT' signal @@ -6302,17 +6302,17 @@

    transaction(Fun, Args, Retries)

    where half a family is added can never occur.

    It is also useful to update the database within a transaction if several processes concurrently update the same records. For example, the function raise(Name, Amount), which adds Amount to the salary field of a person, is -to be implemented as follows:

    raise(Name, Amount) ->
    -    mnesia:transaction(fun() ->
    -        case mnesia:wread({person, Name}) of
    -            [P] ->
    +to be implemented as follows:

    raise(Name, Amount) ->
    +    mnesia:transaction(fun() ->
    +        case mnesia:wread({person, Name}) of
    +            [P] ->
                     Salary = Amount + P#person.salary,
    -                P2 = P#person{salary = Salary},
    -                mnesia:write(P2);
    +                P2 = P#person{salary = Salary},
    +                mnesia:write(P2);
                 _ ->
    -                mnesia:abort("No such person")
    +                mnesia:abort("No such person")
             end
    -    end).

    When this function executes within a transaction, several processes running on + end).

    When this function executes within a transaction, several processes running on different nodes can concurrently execute the function raise/2 without interfering with each other.

    Since Mnesia detects deadlocks, a transaction can be restarted any number of times and therefore the Fun shall not have any side effects such as waiting diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_a.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_a.html index 1947731c32d75..41c8d9efd2ce2 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_a.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_a.html @@ -159,11 +159,11 @@

    %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --module(mnesia_backup). +-module(mnesia_backup). --include_lib("kernel/include/file.hrl"). +-include_lib("kernel/include/file.hrl"). --export([ +-export([ %% Write access open_write/1, write/2, @@ -174,105 +174,105 @@

    open_read/1, read/1, close_read/1 - ]). + ]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Backup callback interface --record(backup, {tmp_file, file, file_desc}). +-record(backup, {tmp_file, file, file_desc}). %% Opens backup media for write %% %% Returns {ok, OpaqueData} or {error, Reason} -open_write(OpaqueData) -> +open_write(OpaqueData) -> File = OpaqueData, - Tmp = lists:concat([File,".BUPTMP"]), - file:delete(Tmp), - case disk_log:open([{name, make_ref()}, - {file, Tmp}, - {repair, false}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; - {error, Reason} -> - {error, Reason} + Tmp = lists:concat([File,".BUPTMP"]), + file:delete(Tmp), + case disk_log:open([{name, make_ref()}, + {file, Tmp}, + {repair, false}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}}; + {error, Reason} -> + {error, Reason} end. %% Writes BackupItems to the backup media %% %% Returns {ok, OpaqueData} or {error, Reason} -write(OpaqueData, BackupItems) -> +write(OpaqueData, BackupItems) -> B = OpaqueData, - case disk_log:log_terms(B#backup.file_desc, BackupItems) of + case disk_log:log_terms(B#backup.file_desc, BackupItems) of ok -> - {ok, B}; - {error, Reason} -> - abort_write(B), - {error, Reason} + {ok, B}; + {error, Reason} -> + abort_write(B), + {error, Reason} end. %% Closes the backup media after a successful backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -commit_write(OpaqueData) -> +commit_write(OpaqueData) -> B = OpaqueData, - case disk_log:sync(B#backup.file_desc) of + case disk_log:sync(B#backup.file_desc) of ok -> - case disk_log:close(B#backup.file_desc) of + case disk_log:close(B#backup.file_desc) of ok -> - file:delete(B#backup.file), - case file:rename(B#backup.tmp_file, B#backup.file) of + file:delete(B#backup.file), + case file:rename(B#backup.tmp_file, B#backup.file) of ok -> - {ok, B#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, B#backup.file}; + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end; - {error, Reason} -> - {error, Reason} + {error, Reason} -> + {error, Reason} end. %% Closes the backup media after an interrupted backup %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -abort_write(BackupRef) -> - Res = disk_log:close(BackupRef#backup.file_desc), - file:delete(BackupRef#backup.tmp_file), +abort_write(BackupRef) -> + Res = disk_log:close(BackupRef#backup.file_desc), + file:delete(BackupRef#backup.tmp_file), case Res of ok -> - {ok, BackupRef#backup.file}; - {error, Reason} -> - {error, Reason} + {ok, BackupRef#backup.file}; + {error, Reason} -> + {error, Reason} end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Restore callback interface --record(restore, {file, file_desc, cont}). +-record(restore, {file, file_desc, cont}). %% Opens backup media for read %% %% Returns {ok, OpaqueData} or {error, Reason} -open_read(OpaqueData) -> +open_read(OpaqueData) -> File = OpaqueData, - case file:read_file_info(File) of - {error, Reason} -> - {error, Reason}; + case file:read_file_info(File) of + {error, Reason} -> + {error, Reason}; _FileInfo -> %% file exists - case disk_log:open([{file, File}, - {name, make_ref()}, - {repair, false}, - {mode, read_only}, - {linkto, self()}]) of - {ok, Fd} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, {badbytes, 0}} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {repaired, Fd, _, _} -> - {ok, #restore{file = File, file_desc = Fd, cont = start}}; - {error, Reason} -> - {error, Reason} + case disk_log:open([{file, File}, + {name, make_ref()}, + {repair, false}, + {mode, read_only}, + {linkto, self()}]) of + {ok, Fd} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, {badbytes, 0}} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {repaired, Fd, _, _} -> + {ok, #restore{file = File, file_desc = Fd, cont = start}}; + {error, Reason} -> + {error, Reason} end end. @@ -281,30 +281,30 @@

    %% Returns {ok, OpaqueData, BackupItems} or {error, Reason} %% %% BackupItems == [] is interpreted as eof -read(OpaqueData) -> +read(OpaqueData) -> R = OpaqueData, Fd = R#restore.file_desc, - case disk_log:chunk(Fd, R#restore.cont) of - {error, Reason} -> - {error, {"Possibly truncated", Reason}}; + case disk_log:chunk(Fd, R#restore.cont) of + {error, Reason} -> + {error, {"Possibly truncated", Reason}}; eof -> - {ok, R, []}; - {Cont, []} -> - read(R#restore{cont = Cont}); - {Cont, BackupItems, _BadBytes} -> - {ok, R#restore{cont = Cont}, BackupItems}; - {Cont, BackupItems} -> - {ok, R#restore{cont = Cont}, BackupItems} + {ok, R, []}; + {Cont, []} -> + read(R#restore{cont = Cont}); + {Cont, BackupItems, _BadBytes} -> + {ok, R#restore{cont = Cont}, BackupItems}; + {Cont, BackupItems} -> + {ok, R#restore{cont = Cont}, BackupItems} end. %% Closes the backup media after restore %% %% Returns {ok, ReturnValueToUser} or {error, Reason} -close_read(OpaqueData) -> +close_read(OpaqueData) -> R = OpaqueData, - case disk_log:close(R#restore.file_desc) of - ok -> {ok, R#restore.file}; - {error, Reason} -> {error, Reason} + case disk_log:close(R#restore.file_desc) of + ok -> {ok, R#restore.file}; + {error, Reason} -> {error, Reason} end.

    diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_b.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_b.html index bc706e2ccdac3..0f180f14992eb 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_b.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_b.html @@ -131,10 +131,10 @@

    mnesia_access Callback Behavior

    -
    -module(mnesia_frag).
    +
    -module(mnesia_frag).
     
     %% Callback functions when accessed within an activity
    --export([
    +-export([
              lock/4,
              write/5, delete/5, delete_object/5,
              read/5, match_object/5, all_keys/4,
    @@ -143,242 +143,242 @@ 

    foldl/6, foldr/6, table_info/4, first/3, next/4, prev/4, last/3, clear_table/4 - ]). + ]). %% Callback functions which provides transparent %% access of fragmented tables from any activity %% access context. -lock(ActivityId, Opaque, {table , Tab}, LockKind) -> - case frag_names(Tab) of - [Tab] -> - mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind); +lock(ActivityId, Opaque, {table , Tab}, LockKind) -> + case frag_names(Tab) of + [Tab] -> + mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind); Frags -> - DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) || - F <- Frags], - mnesia_lib:uniq(lists:append(DeepNs)) + DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) || + F <- Frags], + mnesia_lib:uniq(lists:append(DeepNs)) end; -lock(ActivityId, Opaque, LockItem, LockKind) -> - mnesia:lock(ActivityId, Opaque, LockItem, LockKind). +lock(ActivityId, Opaque, LockItem, LockKind) -> + mnesia:lock(ActivityId, Opaque, LockItem, LockKind). -write(ActivityId, Opaque, Tab, Rec, LockKind) -> - Frag = record_to_frag_name(Tab, Rec), - mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind). +write(ActivityId, Opaque, Tab, Rec, LockKind) -> + Frag = record_to_frag_name(Tab, Rec), + mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind). -delete(ActivityId, Opaque, Tab, Key, LockKind) -> - Frag = key_to_frag_name(Tab, Key), - mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind). +delete(ActivityId, Opaque, Tab, Key, LockKind) -> + Frag = key_to_frag_name(Tab, Key), + mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind). -delete_object(ActivityId, Opaque, Tab, Rec, LockKind) -> - Frag = record_to_frag_name(Tab, Rec), - mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind). +delete_object(ActivityId, Opaque, Tab, Rec, LockKind) -> + Frag = record_to_frag_name(Tab, Rec), + mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind). -read(ActivityId, Opaque, Tab, Key, LockKind) -> - Frag = key_to_frag_name(Tab, Key), - mnesia:read(ActivityId, Opaque, Frag, Key, LockKind). +read(ActivityId, Opaque, Tab, Key, LockKind) -> + Frag = key_to_frag_name(Tab, Key), + mnesia:read(ActivityId, Opaque, Frag, Key, LockKind). -match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) -> - MatchSpec = [{HeadPat, [], ['$_']}], - select(ActivityId, Opaque, Tab, MatchSpec, LockKind). +match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) -> + MatchSpec = [{HeadPat, [], ['$_']}], + select(ActivityId, Opaque, Tab, MatchSpec, LockKind). -select(ActivityId, Opaque, Tab, MatchSpec, LockKind) -> - do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind). +select(ActivityId, Opaque, Tab, MatchSpec, LockKind) -> + do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind). -select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) -> - init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind). +select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind) -> + init_select(ActivityId, Opaque, Tab, MatchSpec, Limit, LockKind). -select_cont(_Tid,_,{frag_cont, '$end_of_table', [],_}) -> '$end_of_table'; -select_cont(Tid,Ts,{frag_cont, '$end_of_table', [{Tab,Node,Type}|Rest],Args}) -> - {Spec,LockKind,Limit} = Args, - InitFun = fun(FixedSpec) -> mnesia:dirty_sel_init(Node,Tab,FixedSpec,Limit,Type) end, - Res = mnesia:fun_select(Tid,Ts,Tab,Spec,LockKind,Tab,InitFun,Limit,Node,Type), - frag_sel_cont(Res, Rest, Args); -select_cont(Tid,Ts,{frag_cont, Cont, TabL, Args}) -> - frag_sel_cont(mnesia:select_cont(Tid,Ts,Cont),TabL,Args); -select_cont(Tid,Ts,Else) -> - mnesia:select_cont(Tid,Ts,Else). +select_cont(_Tid,_,{frag_cont, '$end_of_table', [],_}) -> '$end_of_table'; +select_cont(Tid,Ts,{frag_cont, '$end_of_table', [{Tab,Node,Type}|Rest],Args}) -> + {Spec,LockKind,Limit} = Args, + InitFun = fun(FixedSpec) -> mnesia:dirty_sel_init(Node,Tab,FixedSpec,Limit,Type) end, + Res = mnesia:fun_select(Tid,Ts,Tab,Spec,LockKind,Tab,InitFun,Limit,Node,Type), + frag_sel_cont(Res, Rest, Args); +select_cont(Tid,Ts,{frag_cont, Cont, TabL, Args}) -> + frag_sel_cont(mnesia:select_cont(Tid,Ts,Cont),TabL,Args); +select_cont(Tid,Ts,Else) -> + mnesia:select_cont(Tid,Ts,Else). -all_keys(ActivityId, Opaque, Tab, LockKind) -> - Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind) - || Frag <- frag_names(Tab)], - lists:append(Match). +all_keys(ActivityId, Opaque, Tab, LockKind) -> + Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind) + || Frag <- frag_names(Tab)], + lists:append(Match). -clear_table(ActivityId, Opaque, Tab, Obj) -> - [mnesia:clear_table(ActivityId, Opaque, Frag, Obj) || Frag <- frag_names(Tab)], +clear_table(ActivityId, Opaque, Tab, Obj) -> + [mnesia:clear_table(ActivityId, Opaque, Frag, Obj) || Frag <- frag_names(Tab)], ok. -index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) -> +index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) -> Match = - [mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind) - || Frag <- frag_names(Tab)], - lists:append(Match). + [mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind) + || Frag <- frag_names(Tab)], + lists:append(Match). -index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) -> +index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) -> Match = - [mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind) - || Frag <- frag_names(Tab)], - lists:append(Match). + [mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind) + || Frag <- frag_names(Tab)], + lists:append(Match). -foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) -> - Fun2 = fun(Frag, A) -> - mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind) +foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) -> + Fun2 = fun(Frag, A) -> + mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind) end, - lists:foldl(Fun2, Acc, frag_names(Tab)). + lists:foldl(Fun2, Acc, frag_names(Tab)). -foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) -> - Fun2 = fun(Frag, A) -> - mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind) +foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) -> + Fun2 = fun(Frag, A) -> + mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind) end, - lists:foldr(Fun2, Acc, frag_names(Tab)). + lists:foldr(Fun2, Acc, frag_names(Tab)). -table_info(ActivityId, Opaque, {Tab, Key}, Item) -> - Frag = key_to_frag_name(Tab, Key), - table_info2(ActivityId, Opaque, Tab, Frag, Item); -table_info(ActivityId, Opaque, Tab, Item) -> - table_info2(ActivityId, Opaque, Tab, Tab, Item). +table_info(ActivityId, Opaque, {Tab, Key}, Item) -> + Frag = key_to_frag_name(Tab, Key), + table_info2(ActivityId, Opaque, Tab, Frag, Item); +table_info(ActivityId, Opaque, Tab, Item) -> + table_info2(ActivityId, Opaque, Tab, Tab, Item). -table_info2(ActivityId, Opaque, Tab, Frag, Item) -> +table_info2(ActivityId, Opaque, Tab, Frag, Item) -> case Item of size -> - SumFun = fun({_, Size}, Acc) -> Acc + Size end, - lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab)); + SumFun = fun({_, Size}, Acc) -> Acc + Size end, + lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab)); memory -> - SumFun = fun({_, Size}, Acc) -> Acc + Size end, - lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab)); + SumFun = fun({_, Size}, Acc) -> Acc + Size end, + lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab)); base_table -> - lookup_prop(Tab, base_table); + lookup_prop(Tab, base_table); node_pool -> - lookup_prop(Tab, node_pool); + lookup_prop(Tab, node_pool); n_fragments -> - FH = lookup_frag_hash(Tab), + FH = lookup_frag_hash(Tab), FH#frag_state.n_fragments; foreign_key -> - FH = lookup_frag_hash(Tab), + FH = lookup_frag_hash(Tab), FH#frag_state.foreign_key; foreigners -> - lookup_foreigners(Tab); + lookup_foreigners(Tab); n_ram_copies -> - length(val({Tab, ram_copies})); + length(val({Tab, ram_copies})); n_disc_copies -> - length(val({Tab, disc_copies})); + length(val({Tab, disc_copies})); n_disc_only_copies -> - length(val({Tab, disc_only_copies})); + length(val({Tab, disc_only_copies})); n_external_copies -> - length(val({Tab, external_copies})); + length(val({Tab, external_copies})); frag_names -> - frag_names(Tab); + frag_names(Tab); frag_dist -> - frag_dist(Tab); + frag_dist(Tab); frag_size -> - frag_size(ActivityId, Opaque, Tab); + frag_size(ActivityId, Opaque, Tab); frag_memory -> - frag_memory(ActivityId, Opaque, Tab); + frag_memory(ActivityId, Opaque, Tab); _ -> - mnesia:table_info(ActivityId, Opaque, Frag, Item) + mnesia:table_info(ActivityId, Opaque, Frag, Item) end. -first(ActivityId, Opaque, Tab) -> - case ?catch_val({Tab, frag_hash}) of - {'EXIT', _} -> - mnesia:first(ActivityId, Opaque, Tab); +first(ActivityId, Opaque, Tab) -> + case ?catch_val({Tab, frag_hash}) of + {'EXIT', _} -> + mnesia:first(ActivityId, Opaque, Tab); FH -> FirstFrag = Tab, - case mnesia:first(ActivityId, Opaque, FirstFrag) of + case mnesia:first(ActivityId, Opaque, FirstFrag) of '$end_of_table' -> - search_first(ActivityId, Opaque, Tab, 1, FH); + search_first(ActivityId, Opaque, Tab, 1, FH); Next -> Next end end. -search_first(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments -> +search_first(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments -> NextN = N + 1, - NextFrag = n_to_frag_name(Tab, NextN), - case mnesia:first(ActivityId, Opaque, NextFrag) of + NextFrag = n_to_frag_name(Tab, NextN), + case mnesia:first(ActivityId, Opaque, NextFrag) of '$end_of_table' -> - search_first(ActivityId, Opaque, Tab, NextN, FH); + search_first(ActivityId, Opaque, Tab, NextN, FH); Next -> Next end; -search_first(_ActivityId, _Opaque, _Tab, _N, _FH) -> +search_first(_ActivityId, _Opaque, _Tab, _N, _FH) -> '$end_of_table'. -last(ActivityId, Opaque, Tab) -> - case ?catch_val({Tab, frag_hash}) of - {'EXIT', _} -> - mnesia:last(ActivityId, Opaque, Tab); +last(ActivityId, Opaque, Tab) -> + case ?catch_val({Tab, frag_hash}) of + {'EXIT', _} -> + mnesia:last(ActivityId, Opaque, Tab); FH -> LastN = FH#frag_state.n_fragments, - search_last(ActivityId, Opaque, Tab, LastN, FH) + search_last(ActivityId, Opaque, Tab, LastN, FH) end. -search_last(ActivityId, Opaque, Tab, N, FH) when N >= 1 -> - Frag = n_to_frag_name(Tab, N), - case mnesia:last(ActivityId, Opaque, Frag) of +search_last(ActivityId, Opaque, Tab, N, FH) when N >= 1 -> + Frag = n_to_frag_name(Tab, N), + case mnesia:last(ActivityId, Opaque, Frag) of '$end_of_table' -> PrevN = N - 1, - search_last(ActivityId, Opaque, Tab, PrevN, FH); + search_last(ActivityId, Opaque, Tab, PrevN, FH); Prev -> Prev end; -search_last(_ActivityId, _Opaque, _Tab, _N, _FH) -> +search_last(_ActivityId, _Opaque, _Tab, _N, _FH) -> '$end_of_table'. -prev(ActivityId, Opaque, Tab, Key) -> - case ?catch_val({Tab, frag_hash}) of - {'EXIT', _} -> - mnesia:prev(ActivityId, Opaque, Tab, Key); +prev(ActivityId, Opaque, Tab, Key) -> + case ?catch_val({Tab, frag_hash}) of + {'EXIT', _} -> + mnesia:prev(ActivityId, Opaque, Tab, Key); FH -> - N = key_to_n(FH, Key), - Frag = n_to_frag_name(Tab, N), - case mnesia:prev(ActivityId, Opaque, Frag, Key) of + N = key_to_n(FH, Key), + Frag = n_to_frag_name(Tab, N), + case mnesia:prev(ActivityId, Opaque, Frag, Key) of '$end_of_table' -> - search_prev(ActivityId, Opaque, Tab, N); + search_prev(ActivityId, Opaque, Tab, N); Prev -> Prev end end. -search_prev(ActivityId, Opaque, Tab, N) when N > 1 -> +search_prev(ActivityId, Opaque, Tab, N) when N > 1 -> PrevN = N - 1, - PrevFrag = n_to_frag_name(Tab, PrevN), - case mnesia:last(ActivityId, Opaque, PrevFrag) of + PrevFrag = n_to_frag_name(Tab, PrevN), + case mnesia:last(ActivityId, Opaque, PrevFrag) of '$end_of_table' -> - search_prev(ActivityId, Opaque, Tab, PrevN); + search_prev(ActivityId, Opaque, Tab, PrevN); Prev -> Prev end; -search_prev(_ActivityId, _Opaque, _Tab, _N) -> +search_prev(_ActivityId, _Opaque, _Tab, _N) -> '$end_of_table'. -next(ActivityId, Opaque, Tab, Key) -> - case ?catch_val({Tab, frag_hash}) of - {'EXIT', _} -> - mnesia:next(ActivityId, Opaque, Tab, Key); +next(ActivityId, Opaque, Tab, Key) -> + case ?catch_val({Tab, frag_hash}) of + {'EXIT', _} -> + mnesia:next(ActivityId, Opaque, Tab, Key); FH -> - N = key_to_n(FH, Key), - Frag = n_to_frag_name(Tab, N), - case mnesia:next(ActivityId, Opaque, Frag, Key) of + N = key_to_n(FH, Key), + Frag = n_to_frag_name(Tab, N), + case mnesia:next(ActivityId, Opaque, Frag, Key) of '$end_of_table' -> - search_next(ActivityId, Opaque, Tab, N, FH); + search_next(ActivityId, Opaque, Tab, N, FH); Prev -> Prev end end. -search_next(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments -> +search_next(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments -> NextN = N + 1, - NextFrag = n_to_frag_name(Tab, NextN), - case mnesia:first(ActivityId, Opaque, NextFrag) of + NextFrag = n_to_frag_name(Tab, NextN), + case mnesia:first(ActivityId, Opaque, NextFrag) of '$end_of_table' -> - search_next(ActivityId, Opaque, Tab, NextN, FH); + search_next(ActivityId, Opaque, Tab, NextN, FH); Next -> Next end; -search_next(_ActivityId, _Opaque, _Tab, _N, _FH) -> +search_next(_ActivityId, _Opaque, _Tab, _N, _FH) -> '$end_of_table'.

    diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_c.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_c.html index d3bdcaaa8f8ef..7c455ee18390a 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_c.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_app_c.html @@ -131,140 +131,140 @@

    mnesia_frag_hash Callback Behavior

    -
    -module(mnesia_frag_hash).
    --compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
    +
    -module(mnesia_frag_hash).
    +-compile([{nowarn_deprecated_function, [{erlang,phash,2}]}]).
     
     %% Fragmented Table Hashing callback functions
    --export([
    +-export([
              init_state/2,
              add_frag/1,
              del_frag/1,
              key_to_frag_number/2,
              match_spec_to_frag_numbers/2
    -        ]).
    -record(hash_state,
    -    {n_fragments,
    +        ]).
    -record(hash_state,
    +    {n_fragments,
          next_n_to_split,
          n_doubles,
    -     function}).
    +     function}).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec init_state(Tab, State) -> NewState when
    -      Tab :: atom(),
    -      State :: term(),
    -      NewState :: term().
    -init_state(_Tab, State) when State == undefined ->
    -    #hash_state{n_fragments     = 1,
    +-spec init_state(Tab, State) -> NewState when
    +      Tab :: atom(),
    +      State :: term(),
    +      NewState :: term().
    +init_state(_Tab, State) when State == undefined ->
    +    #hash_state{n_fragments     = 1,
                     next_n_to_split = 1,
                     n_doubles       = 0,
    -                function        = phash2}.
    +                function        = phash2}.
     
    -convert_old_state({hash_state, N, P, L}) ->
    -    #hash_state{n_fragments     = N,
    +convert_old_state({hash_state, N, P, L}) ->
    +    #hash_state{n_fragments     = N,
                     next_n_to_split = P,
                     n_doubles       = L,
    -                function        = phash}.
    +                function        = phash}.
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec add_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN + 1,
         NewN = N + 1,
    -    State2 = case power2(L) + 1 of
    +    State2 = case power2(L) + 1 of
             P2 when P2 == P ->
    -            State#hash_state{n_fragments      = NewN,
    +            State#hash_state{n_fragments      = NewN,
                                  n_doubles        = L + 1,
    -                             next_n_to_split  = 1};
    +                             next_n_to_split  = 1};
             _ ->
    -            State#hash_state{n_fragments     = NewN,
    -                             next_n_to_split = P}
    +            State#hash_state{n_fragments     = NewN,
    +                             next_n_to_split = P}
         end,
    -    {State2, [SplitN], [NewN]};
    -add_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    add_frag(State).
    +    {State2, [SplitN], [NewN]};
    +add_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    add_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    --spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    -      NewState :: term(),
    -      IterFrags :: [integer()],
    -      AdditionalLockFrags :: [integer()].
    -del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    +-spec del_frag(State :: term()) -> {NewState, IterFrags, AdditionalLockFrags} when
    +      NewState :: term(),
    +      IterFrags :: [integer()],
    +      AdditionalLockFrags :: [integer()].
    +del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
         P = SplitN - 1,
         if
             P < 1 ->
                 L2 = L - 1,
    -            MergeN = power2(L2),
    -            State2 = State#hash_state{n_fragments     = N - 1,
    +            MergeN = power2(L2),
    +            State2 = State#hash_state{n_fragments     = N - 1,
                                           next_n_to_split = MergeN,
    -                                      n_doubles       = L2},
    -            {State2, [N], [MergeN]};
    +                                      n_doubles       = L2},
    +            {State2, [N], [MergeN]};
             true ->
                 MergeN = P,
    -            State2 = State#hash_state{n_fragments     = N - 1,
    -                                      next_n_to_split = MergeN},
    -            {State2, [N], [MergeN]}
    +            State2 = State#hash_state{n_fragments     = N - 1,
    +                                      next_n_to_split = MergeN},
    +            {State2, [N], [MergeN]}
         end;
    -del_frag(OldState) ->
    -    State = convert_old_state(OldState),
    -    del_frag(State).
    +del_frag(OldState) ->
    +    State = convert_old_state(OldState),
    +    del_frag(State).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec key_to_frag_number(State, Key) -> Fragnum when
    -      State :: term(),
    -      Key :: term(),
    -      Fragnum :: integer().
    -key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash(Key, power2(L + 1)),
    +-spec key_to_frag_number(State, Key) -> Fragnum when
    +      State :: term(),
    +      Key :: term(),
    +      Fragnum :: integer().
    +key_to_frag_number(#hash_state{function = phash, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash(Key, power2(L + 1)),
         if
             A > N ->
    -            A - power2(L);
    +            A - power2(L);
             true ->
                 A
         end;
    -key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    -    A = erlang:phash2(Key, power2(L + 1)) + 1,
    +key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    +    A = erlang:phash2(Key, power2(L + 1)) + 1,
         if
             A > N ->
    -            A - power2(L);
    +            A - power2(L);
             true ->
                 A
         end;
    -key_to_frag_number(OldState, Key) ->
    -    State = convert_old_state(OldState),
    -    key_to_frag_number(State, Key).
    +key_to_frag_number(OldState, Key) ->
    +    State = convert_old_state(OldState),
    +    key_to_frag_number(State, Key).
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    --spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    -      State :: term(),
    -      MatchSpec :: ets:match_spec(),
    -      Fragnums :: [integer()].
    -match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
    +-spec match_spec_to_frag_numbers(State, MatchSpec) -> Fragnums when
    +      State :: term(),
    +      MatchSpec :: ets:match_spec(),
    +      Fragnums :: [integer()].
    +match_spec_to_frag_numbers(#hash_state{n_fragments = N} = State, MatchSpec) ->
         case MatchSpec of
    -        [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    -            KeyPat = element(2, HeadPat),
    -            case has_var(KeyPat) of
    +        [{HeadPat, _, _}] when is_tuple(HeadPat), tuple_size(HeadPat) > 2 ->
    +            KeyPat = element(2, HeadPat),
    +            case has_var(KeyPat) of
                     false ->
    -                    [key_to_frag_number(State, KeyPat)];
    +                    [key_to_frag_number(State, KeyPat)];
                     true ->
    -                    lists:seq(1, N)
    +                    lists:seq(1, N)
                 end;
             _ ->
    -            lists:seq(1, N)
    +            lists:seq(1, N)
         end;
    -match_spec_to_frag_numbers(OldState, MatchSpec) ->
    -    State = convert_old_state(OldState),
    -    match_spec_to_frag_numbers(State, MatchSpec).
    +match_spec_to_frag_numbers(OldState, MatchSpec) ->
    +    State = convert_old_state(OldState),
    +    match_spec_to_frag_numbers(State, MatchSpec).
     
    -power2(Y) ->
    +power2(Y) ->
         1 bsl Y. % trunc(math:pow(2, Y)).
     
    -has_var(Pat) ->
    -    mnesia:has_var(Pat).
    +
    has_var(Pat) -> + mnesia:has_var(Pat).
    diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap2.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap2.html index 583286cb50acd..f4b513719ced1 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap2.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap2.html @@ -137,16 +137,16 @@

    This section provides a simplified demonstration of a Mnesia system startup. The dialogue from the Erlang shell is as follows:

    % erl -mnesia dir '"/tmp/funky"'
    -Erlang/OTP 27 [erts-15.1.2]
    +Erlang/OTP 27 [erts-15.1.2]
     
    -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    -1> mnesia:create_schema([node()]).
    +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    +1> mnesia:create_schema([node()]).
     ok
    -2> mnesia:start().
    +2> mnesia:start().
     ok
    -3> mnesia:create_table(funky, []).
    -{atomic,ok}
    -4> mnesia:info().
    +3> mnesia:create_table(funky, []).
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <--- 
     ---> Processes waiting for locks <--- 
     ---> Participant transactions <--- 
    @@ -158,18 +158,18 @@ 

    ===> System info in version "4.23.2", debug level = none <=== opt_disc. Directory "/tmp/funky" is used. use fallback at restart = false -running db nodes = [nonode@nohost] -stopped db nodes = [] -master node tables = [] -remote = [] -ram_copies = [funky] -disc_copies = [schema] -disc_only_copies = [] -[{nonode@nohost,disc_copies}] = [schema] -[{nonode@nohost,ram_copies}] = [funky] +running db nodes = [nonode@nohost] +stopped db nodes = [] +master node tables = [] +remote = [] +ram_copies = [funky] +disc_copies = [schema] +disc_only_copies = [] +[{nonode@nohost,disc_copies}] = [schema] +[{nonode@nohost,ram_copies}] = [funky] 3 transactions committed, 0 aborted, 0 restarted, 2 logged to disc 0 held locks, 0 in queue; 0 local transactions, 0 remote -0 transactions waits for other nodes: [] +0 transactions waits for other nodes: [] ok

    In this example, the following actions are performed:

    • Step 1: The Erlang system is started from the UNIX prompt with a flag -mnesia dir '"/tmp/funky"', which indicates in which directory to store the data.
    • Step 2: A new empty schema is initialized on the local node by evaluating @@ -229,28 +229,28 @@

      Defining Structure and Content

      First the record definitions are entered into a text file named company.hrl. -This file defines the following structure for the example database:

      -record(employee, {emp_no,
      +This file defines the following structure for the example database:

      -record(employee, {emp_no,
                          name,
                          salary,
                          sex,
                          phone,
      -                   room_no}).
      +                   room_no}).
       
      --record(dept, {id,
      -               name}).
      +-record(dept, {id,
      +               name}).
       
      --record(project, {name,
      -                  number}).
      +-record(project, {name,
      +                  number}).
       
       
      --record(manager, {emp,
      -                  dept}).
      +-record(manager, {emp,
      +                  dept}).
       
      --record(at_dep, {emp,
      -                 dept_id}).
      +-record(at_dep, {emp,
      +                 dept_id}).
       
      --record(in_proj, {emp,
      -                  proj_name}).

      The structure defines six tables in the database. In Mnesia, the function +-record(in_proj, {emp, + proj_name}).

      The structure defines six tables in the database. In Mnesia, the function mnesia:create_table(Name, Opts) creates tables. Name is the table name.

      Note

      The current version of Mnesia does not require that the name of the table is the same as the record name, see @@ -267,28 +267,28 @@

      The following shell interaction starts Mnesia and initializes the schema for the Company database:

      % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
      -Erlang/OTP 27 [erts-15.1.2]
      +Erlang/OTP 27 [erts-15.1.2]
       
      -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      -1> mnesia:create_schema([node()]).
      +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      +1> mnesia:create_schema([node()]).
       ok
      -2> mnesia:start().
      -ok

      The following program module creates and populates previously defined tables:

      -include_lib("stdlib/include/qlc.hrl").
      --include("company.hrl").
      -
      -init() ->
      -    mnesia:create_table(employee,
      -                        [{attributes, record_info(fields, employee)}]),
      -    mnesia:create_table(dept,
      -                        [{attributes, record_info(fields, dept)}]),
      -    mnesia:create_table(project,
      -                        [{attributes, record_info(fields, project)}]),
      -    mnesia:create_table(manager, [{type, bag},
      -                                  {attributes, record_info(fields, manager)}]),
      -    mnesia:create_table(at_dep,
      -                         [{attributes, record_info(fields, at_dep)}]),
      -    mnesia:create_table(in_proj, [{type, bag},
      -                                  {attributes, record_info(fields, in_proj)}]).

      +2> mnesia:start(). +ok

    The following program module creates and populates previously defined tables:

    -include_lib("stdlib/include/qlc.hrl").
    +-include("company.hrl").
    +
    +init() ->
    +    mnesia:create_table(employee,
    +                        [{attributes, record_info(fields, employee)}]),
    +    mnesia:create_table(dept,
    +                        [{attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                        [{attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {attributes, record_info(fields, manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj, [{type, bag},
    +                                  {attributes, record_info(fields, in_proj)}]).

    @@ -302,9 +302,9 @@

    the format mnesia:create_schema(DiscNodeList) and initiates a new schema. In this example, a non-distributed system using only one node is created. Schemas are fully explained in Define a Schema.
  • mnesia:start(). This function starts Mnesia and is fully -explained in Start Mnesia.
  • Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    -{atomic,ok}
    -4> mnesia:info().
    +explained in Start Mnesia.

    Continuing the dialogue with the Erlang shell produces the following:

    3> company:init().
    +{atomic,ok}
    +4> mnesia:info().
     ---> Processes holding locks <--- 
     ---> Processes waiting for locks <--- 
     ---> Participant transactions <--- 
    @@ -321,18 +321,18 @@ 

    ===> System info in version "4.23.2", debug level = none <=== opt_disc. Directory "/ldisc/scratch/Mnesia.Company" is used. use fallback at restart = false -running db nodes = [nonode@nohost] -stopped db nodes = [] -master node tables = [] -remote = [] -ram_copies = [at_dep,dept,employee,in_proj,manager,project] -disc_copies = [schema] -disc_only_copies = [] -[{nonode@nohost,disc_copies}] = [schema] -[{nonode@nohost,ram_copies}] = [employee,dept,project,manager,at_dep,in_proj] +running db nodes = [nonode@nohost] +stopped db nodes = [] +master node tables = [] +remote = [] +ram_copies = [at_dep,dept,employee,in_proj,manager,project] +disc_copies = [schema] +disc_only_copies = [] +[{nonode@nohost,disc_copies}] = [schema] +[{nonode@nohost,ram_copies}] = [employee,dept,project,manager,at_dep,in_proj] 8 transactions committed, 0 aborted, 0 restarted, 12 logged to disc 0 held locks, 0 in queue; 0 local transactions, 0 remote -0 transactions waits for other nodes: [] +0 transactions waits for other nodes: [] ok

    A set of tables is created. The function mnesia:create_table(Name, Opts) creates the required database tables. The options available with Opts are explained in @@ -346,32 +346,32 @@

    transactions have been committed, as six successful transactions were run when creating the tables.

    To write a function that inserts an employee record into the database, there must be an at_dep record and a set of in_proj records inserted. Examine the -following code used to complete this action:

    insert_emp(Emp, DeptId, ProjNames) ->
    +following code used to complete this action:

    insert_emp(Emp, DeptId, ProjNames) ->
         Ename = Emp#employee.name,
    -    Fun = fun() ->
    -                  mnesia:write(Emp),
    -                  AtDep = #at_dep{emp = Ename, dept_id = DeptId},
    -                  mnesia:write(AtDep),
    -                  mk_projs(Ename, ProjNames)
    +    Fun = fun() ->
    +                  mnesia:write(Emp),
    +                  AtDep = #at_dep{emp = Ename, dept_id = DeptId},
    +                  mnesia:write(AtDep),
    +                  mk_projs(Ename, ProjNames)
               end,
    -    mnesia:transaction(Fun).
    +    mnesia:transaction(Fun).
     
     
    -mk_projs(Ename, [ProjName|Tail]) ->
    -    mnesia:write(#in_proj{emp = Ename, proj_name = ProjName}),
    -    mk_projs(Ename, Tail);
    -mk_projs(_, []) -> ok.
    • The insert_emp/3 arguments are as follows:
      1. Emp is an employee record.
      2. DeptId is the identity of the department where the employee works.
      3. ProjNames is a list of the names of the projects where the employee +mk_projs(Ename, [ProjName|Tail]) -> + mnesia:write(#in_proj{emp = Ename, proj_name = ProjName}), + mk_projs(Ename, Tail); +mk_projs(_, []) -> ok.
    • The insert_emp/3 arguments are as follows:
      1. Emp is an employee record.
      2. DeptId is the identity of the department where the employee works.
      3. ProjNames is a list of the names of the projects where the employee works.

    The function insert_emp/3 creates a Functional Object (Fun). Fun is passed as a single argument to the function mnesia:transaction(Fun). This means that Fun is run as a transaction with the following properties:

    • A Fun either succeeds or fails.
    • Code that manipulates the same data records can be run concurrently without -the different processes interfering with each other.

    The function can be used as follows:

    Emp = #employee{emp_no = 104732,
    +the different processes interfering with each other.

    The function can be used as follows:

    Emp = #employee{emp_no = 104732,
                     name = klacke,
                     salary = 7,
                     sex = male,
                     phone = 98108,
    -                room_no = {221, 015}},
    -insert_emp(Emp, 'B/SFR', [Erlang, mnesia, otp]).

    Note

    For information about Funs, see "Fun Expressions" in section + room_no = {221, 015}}, +insert_emp(Emp, 'B/SFR', [Erlang, mnesia, otp]).

    Note

    For information about Funs, see "Fun Expressions" in section Erlang Reference Manual in System Documentation..

    @@ -399,48 +399,48 @@

    Adding Records and Relationships to Database

    After adding more records to the Company database, the result can be the -following records:

    employees:

    {employee, 104465, "Johnson Torbjorn",   1, male,  99184, {242,038}}.
    -{employee, 107912, "Carlsson Tuula",     2, female,94556, {242,056}}.
    -{employee, 114872, "Dacker Bjarne",      3, male,  99415, {221,035}}.
    -{employee, 104531, "Nilsson Hans",       3, male,  99495, {222,026}}.
    -{employee, 104659, "Tornkvist Torbjorn", 2, male,  99514, {222,022}}.
    -{employee, 104732, "Wikstrom Claes",     2, male,  99586, {221,015}}.
    -{employee, 117716, "Fedoriw Anna",       1, female,99143, {221,031}}.
    -{employee, 115018, "Mattsson Hakan",     3, male,  99251, {203,348}}.

    dept:

    {dept, 'B/SF',  "Open Telecom Platform"}.
    -{dept, 'B/SFP', "OTP - Product Development"}.
    -{dept, 'B/SFR', "Computer Science Laboratory"}.

    projects:

    %% projects
    -{project, erlang, 1}.
    -{project, otp, 2}.
    -{project, beam, 3}.
    -{project, mnesia, 5}.
    -{project, wolf, 6}.
    -{project, documentation, 7}.
    -{project, www, 8}.

    These three tables, employees, dept, and projects, are made up of real +following records:

    employees:

    {employee, 104465, "Johnson Torbjorn",   1, male,  99184, {242,038}}.
    +{employee, 107912, "Carlsson Tuula",     2, female,94556, {242,056}}.
    +{employee, 114872, "Dacker Bjarne",      3, male,  99415, {221,035}}.
    +{employee, 104531, "Nilsson Hans",       3, male,  99495, {222,026}}.
    +{employee, 104659, "Tornkvist Torbjorn", 2, male,  99514, {222,022}}.
    +{employee, 104732, "Wikstrom Claes",     2, male,  99586, {221,015}}.
    +{employee, 117716, "Fedoriw Anna",       1, female,99143, {221,031}}.
    +{employee, 115018, "Mattsson Hakan",     3, male,  99251, {203,348}}.

    dept:

    {dept, 'B/SF',  "Open Telecom Platform"}.
    +{dept, 'B/SFP', "OTP - Product Development"}.
    +{dept, 'B/SFR', "Computer Science Laboratory"}.

    projects:

    %% projects
    +{project, erlang, 1}.
    +{project, otp, 2}.
    +{project, beam, 3}.
    +{project, mnesia, 5}.
    +{project, wolf, 6}.
    +{project, documentation, 7}.
    +{project, www, 8}.

    These three tables, employees, dept, and projects, are made up of real records. The following database content is stored in the tables and is built on -relationships. These tables are manager, at_dep, and in_proj.

    manager:

    {manager, 104465, 'B/SF'}.
    -{manager, 104465, 'B/SFP'}.
    -{manager, 114872, 'B/SFR'}.

    at_dep:

    {at_dep, 104465, 'B/SF'}.
    -{at_dep, 107912, 'B/SF'}.
    -{at_dep, 114872, 'B/SFR'}.
    -{at_dep, 104531, 'B/SFR'}.
    -{at_dep, 104659, 'B/SFR'}.
    -{at_dep, 104732, 'B/SFR'}.
    -{at_dep, 117716, 'B/SFP'}.
    -{at_dep, 115018, 'B/SFP'}.

    in_proj:

    {in_proj, 104465, otp}.
    -{in_proj, 107912, otp}.
    -{in_proj, 114872, otp}.
    -{in_proj, 104531, otp}.
    -{in_proj, 104531, mnesia}.
    -{in_proj, 104545, wolf}.
    -{in_proj, 104659, otp}.
    -{in_proj, 104659, wolf}.
    -{in_proj, 104732, otp}.
    -{in_proj, 104732, mnesia}.
    -{in_proj, 104732, erlang}.
    -{in_proj, 117716, otp}.
    -{in_proj, 117716, documentation}.
    -{in_proj, 115018, otp}.
    -{in_proj, 115018, mnesia}.

    The room number is an attribute of the employee record. This is a structured +relationships. These tables are manager, at_dep, and in_proj.

    manager:

    {manager, 104465, 'B/SF'}.
    +{manager, 104465, 'B/SFP'}.
    +{manager, 114872, 'B/SFR'}.

    at_dep:

    {at_dep, 104465, 'B/SF'}.
    +{at_dep, 107912, 'B/SF'}.
    +{at_dep, 114872, 'B/SFR'}.
    +{at_dep, 104531, 'B/SFR'}.
    +{at_dep, 104659, 'B/SFR'}.
    +{at_dep, 104732, 'B/SFR'}.
    +{at_dep, 117716, 'B/SFP'}.
    +{at_dep, 115018, 'B/SFP'}.

    in_proj:

    {in_proj, 104465, otp}.
    +{in_proj, 107912, otp}.
    +{in_proj, 114872, otp}.
    +{in_proj, 104531, otp}.
    +{in_proj, 104531, mnesia}.
    +{in_proj, 104545, wolf}.
    +{in_proj, 104659, otp}.
    +{in_proj, 104659, wolf}.
    +{in_proj, 104732, otp}.
    +{in_proj, 104732, mnesia}.
    +{in_proj, 104732, erlang}.
    +{in_proj, 117716, otp}.
    +{in_proj, 117716, documentation}.
    +{in_proj, 115018, otp}.
    +{in_proj, 115018, mnesia}.

    The room number is an attribute of the employee record. This is a structured attribute that consists of a tuple. The first element of the tuple identifies a corridor, and the second element identifies the room in that corridor. An alternative is to represent this as a record -record(room, {corr, no}). @@ -452,67 +452,67 @@

    Retrieving data from DBMS is usually to be done with the functions mnesia:read/3 or mnesia:read/1. The following function -raises the salary:

    raise(Eno, Raise) ->
    -    F = fun() ->
    -                [E] = mnesia:read(employee, Eno, write),
    +raises the salary:

    raise(Eno, Raise) ->
    +    F = fun() ->
    +                [E] = mnesia:read(employee, Eno, write),
                     Salary = E#employee.salary + Raise,
    -                New = E#employee{salary = Salary},
    -                mnesia:write(New)
    +                New = E#employee{salary = Salary},
    +                mnesia:write(New)
             end,
    -    mnesia:transaction(F).

    Since it is desired to update the record using the function mnesia:write/1 + mnesia:transaction(F).

    Since it is desired to update the record using the function mnesia:write/1 after the salary has been increased, a write lock (third argument to read) is acquired when the record from the table is read.

    To read the values from the table directly is not always possible. It can be needed to search one or more tables to get the wanted data, and this is done by writing database queries. Queries are always more expensive operations than direct lookups done with mnesia:read/1. Therefore, avoid queries in performance-critical code.

    Two methods are available for writing database queries:

    • Mnesia functions
    • QLC

    Using Mnesia Functions

    The following function extracts the names of the female employees stored in the -database:

    mnesia:select(employee, [{#employee{sex = female, name = '$1', _ = '_'},[], ['$1']}]).

    select must always run within an activity, such as a transaction. The -following function can be constructed to call from the shell:

    all_females() ->
    -    F = fun() ->
    -                Female = #employee{sex = female, name = '$1', _ = '_'},
    -                mnesia:select(employee, [{Female, [], ['$1']}])
    +database:

    mnesia:select(employee, [{#employee{sex = female, name = '$1', _ = '_'},[], ['$1']}]).

    select must always run within an activity, such as a transaction. The +following function can be constructed to call from the shell:

    all_females() ->
    +    F = fun() ->
    +                Female = #employee{sex = female, name = '$1', _ = '_'},
    +                mnesia:select(employee, [{Female, [], ['$1']}])
             end,
    -    mnesia:transaction(F).

    The select expression matches all entries in table employee with the field -sex set to female.

    This function can be called from the shell as follows:

    (klacke@gin)1> company:all_females().
    -{atomic, ["Carlsson Tuula", "Fedoriw Anna"]}

    For a description of select and its syntax, see + mnesia:transaction(F).

    The select expression matches all entries in table employee with the field +sex set to female.

    This function can be called from the shell as follows:

    (klacke@gin)1> company:all_females().
    +{atomic, ["Carlsson Tuula", "Fedoriw Anna"]}

    For a description of select and its syntax, see Pattern Matching.

    Using QLC

    This section contains simple introductory examples only. For a full description of the QLC query language, see the qlc manual page in STDLIB.

    Using QLC can be more expensive than using Mnesia functions directly but -offers a nice syntax.

    The following function extracts a list of female employees from the database:

    Q = qlc:q([E#employee.name || E <- mnesia:table(employee),
    -                              E#employee.sex == female]),
    -qlc:e(Q),

    Accessing Mnesia tables from a QLC list comprehension must always be done -within a transaction. Consider the following function:

    females() ->
    -    F = fun() ->
    -                Q = qlc:q([E#employee.name || E <- mnesia:table(employee),
    -                                              E#employee.sex == female]),
    -                qlc:e(Q)
    +offers a nice syntax.

    The following function extracts a list of female employees from the database:

    Q = qlc:q([E#employee.name || E <- mnesia:table(employee),
    +                              E#employee.sex == female]),
    +qlc:e(Q),

    Accessing Mnesia tables from a QLC list comprehension must always be done +within a transaction. Consider the following function:

    females() ->
    +    F = fun() ->
    +                Q = qlc:q([E#employee.name || E <- mnesia:table(employee),
    +                                              E#employee.sex == female]),
    +                qlc:e(Q)
             end,
    -    mnesia:transaction(F).

    This function can be called from the shell as follows:

    (klacke@gin)1> company:females().
    -{atomic, ["Carlsson Tuula", "Fedoriw Anna"]}

    In traditional relational database terminology, this operation is called a + mnesia:transaction(F).

    This function can be called from the shell as follows:

    (klacke@gin)1> company:females().
    +{atomic, ["Carlsson Tuula", "Fedoriw Anna"]}

    In traditional relational database terminology, this operation is called a selection, followed by a projection.

    The previous list comprehension expression contains a number of syntactical elements:

    • The first [ bracket is read as "build the list".
    • The || "such that" and the arrow <- is read as "taken from".

    Hence, the previous list comprehension demonstrates the formation of the list E#employee.name such that E is taken from the table of employees, and attribute sex of each record is equal to the atom female.

    The whole list comprehension must be given to the function qlc:q/1.

    List comprehensions with low-level Mnesia functions can be combined in the same transaction. To raise the salary of all female employees, execute the -following:

    raise_females(Amount) ->
    -    F = fun() ->
    -                Q = qlc:q([E || E <- mnesia:table(employee),
    -                                E#employee.sex == female]),
    -                Fs = qlc:e(Q),
    -                over_write(Fs, Amount)
    +following:

    raise_females(Amount) ->
    +    F = fun() ->
    +                Q = qlc:q([E || E <- mnesia:table(employee),
    +                                E#employee.sex == female]),
    +                Fs = qlc:e(Q),
    +                over_write(Fs, Amount)
             end,
    -    mnesia:transaction(F).
    +    mnesia:transaction(F).
     
    -over_write([E|Tail], Amount) ->
    +over_write([E|Tail], Amount) ->
         Salary = E#employee.salary + Amount,
    -    New = E#employee{salary = Salary},
    -    mnesia:write(New),
    -    1 + over_write(Tail, Amount);
    -over_write([], _) ->
    +    New = E#employee{salary = Salary},
    +    mnesia:write(New),
    +    1 + over_write(Tail, Amount);
    +over_write([], _) ->
         0.

    The function raise_females/1 returns the tuple {atomic, Number}, where Number is the number of female employees who received a salary increase. If an error occurs, the value {aborted, Reason} is returned, and Mnesia guarantees -that the salary is not raised for any employee.

    Example:

    33> company:raise_females(33).
    -{atomic,2}
    +that the salary is not raised for any employee.

    Example:

    33> company:raise_females(33).
    +{atomic,2}
    diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap3.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap3.html index b66f6dbd3143d..3754c7a37ea29 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap3.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap3.html @@ -175,18 +175,18 @@

    changes the format on all records in table Tab. It applies argument Fun to all records in the table. Fun must be a function that takes a record of the old type, and returns the record of the new type. The table key must not be -changed.

    Example:

    -record(old, {key, val}).
    --record(new, {key, val, extra}).
    +changed.

    Example:

    -record(old, {key, val}).
    +-record(new, {key, val, extra}).
     
     Transformer =
    -   fun(X) when record(X, old) ->
    -      #new{key = X#old.key,
    +   fun(X) when record(X, old) ->
    +      #new{key = X#old.key,
                val = X#old.val,
    -           extra = 42}
    +           extra = 42}
        end,
    -{atomic, ok} = mnesia:transform_table(foo, Transformer,
    -                                      record_info(fields, new),
    -                                      new),

    Argument Fun can also be the atom ignore, which indicates that only the +{atomic, ok} = mnesia:transform_table(foo, Transformer, + record_info(fields, new), + new),

    Argument Fun can also be the atom ignore, which indicates that only the metadata about the table is updated. Use of ignore is not recommended (as it creates inconsistencies between the metadata and the actual data) but it is included as a possibility for the user do to an own (offline) transform.

  • mnesia:change_table_copy_type(Tab, Node, ToType) @@ -238,29 +238,29 @@

    when starting the Erlang shell or in the application script. Previously, the following example was used to create the directory for the Company database:

    % erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'

  • If no command-line flag is entered, the Mnesia directory becomes the current working directory on the node where the Erlang shell is started.

  • To start the Company database and get it running on the two specified nodes, -enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two -nodes:
    dist_init() ->
    -    mnesia:create_table(employee,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields,
    -                                                   employee)}]),
    -    mnesia:create_table(dept,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, dept)}]),
    -    mnesia:create_table(project,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, project)}]),
    -    mnesia:create_table(manager, [{type, bag},
    -                                  {ram_copies, [a@gin, b@skeppet]},
    -                                  {attributes, record_info(fields,
    -                                                           manager)}]),
    -    mnesia:create_table(at_dep,
    -                         [{ram_copies, [a@gin, b@skeppet]},
    -                          {attributes, record_info(fields, at_dep)}]),
    -    mnesia:create_table(in_proj,
    -                        [{type, bag},
    -                         {ram_copies, [a@gin, b@skeppet]},
    -                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because +enter the following commands:

    1. On the node a@gin:
     gin % erl -sname a  -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On the node b@skeppet:
    skeppet % erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
    1. On one of the two nodes:
    (a@gin)1> mnesia:create_schema([a@gin, b@skeppet]).
    1. The function mnesia:start() is called on both nodes.
    2. To initialize the database, execute the following code on one of the two +nodes:
    dist_init() ->
    +    mnesia:create_table(employee,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields,
    +                                                   employee)}]),
    +    mnesia:create_table(dept,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, dept)}]),
    +    mnesia:create_table(project,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, project)}]),
    +    mnesia:create_table(manager, [{type, bag},
    +                                  {ram_copies, [a@gin, b@skeppet]},
    +                                  {attributes, record_info(fields,
    +                                                           manager)}]),
    +    mnesia:create_table(at_dep,
    +                         [{ram_copies, [a@gin, b@skeppet]},
    +                          {attributes, record_info(fields, at_dep)}]),
    +    mnesia:create_table(in_proj,
    +                        [{type, bag},
    +                         {ram_copies, [a@gin, b@skeppet]},
    +                         {attributes, record_info(fields, in_proj)}]).

    As illustrated, the two directories reside on different nodes, because /ldisc/scratch (the "local" disc) exists on the two different nodes.

    By executing these commands, two Erlang nodes are configured to run the Company database, and therefore, initialize the database. This is required only once when setting up. The next time the system is started, @@ -277,7 +277,7 @@

    Startup Procedure

    -

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. +

    Start Mnesia by calling the following function:

    mnesia:start().

    This function initiates the DBMS locally.

    The choice of configuration alters the location and load order of the tables. The alternatives are as follows:

    1. Tables that are only stored locally are initialized from the local Mnesia directory.
    2. Replicated tables that reside locally as well as somewhere else are either initiated from disc or by copying the entire table from the other node, @@ -300,9 +300,9 @@

      from disc at a faster rate. The function forces tables to be loaded from disc regardless of the network situation.

      Thus, it can be assumed that if an application wants to use tables a and b, the application must perform some action similar to following before it can use -the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      -  {timeout, RemainingTabs} ->
      -    panic(RemainingTabs);
      +the tables:

      case mnesia:wait_for_tables([a, b], 20000) of
      +  {timeout, RemainingTabs} ->
      +    panic(RemainingTabs);
         ok ->
           synced
       end.

      Warning

      When tables are forcefully loaded from the local disc, all operations that @@ -328,13 +328,13 @@

      key, whereas a table of type bag can have an arbitrary number of records per key. The key for each record is always the first attribute of the record.

      The following example illustrates the difference between type set and -bag:

       f() ->
      -    F = fun() ->
      -          mnesia:write({foo, 1, 2}),
      -          mnesia:write({foo, 1, 3}),
      -          mnesia:read({foo, 1})
      +bag:

       f() ->
      +    F = fun() ->
      +          mnesia:write({foo, 1, 2}),
      +          mnesia:write({foo, 1, 3}),
      +          mnesia:read({foo, 1})
               end,
      -    mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type + mnesia:transaction(F).

      This transaction returns the list [{foo,1,3}] if table foo is of type set. However, the list [{foo,1,2}, {foo,1,3}] is returned if the table is of type bag.

      Mnesia tables can never contain duplicates of the same record in the same table. Duplicate records have attributes with the same contents and key.

    3. {disc_copies, NodeList}, where NodeList is a list of the nodes where @@ -378,11 +378,11 @@

      table. All records stored in the table must have this name as their first element. record_name defaults to the name of the table. For more information, see -Record Names versus Table Names.

    4. As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an -extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      -                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a +Record Names versus Table Names.

      As an example, consider the following record definition:

      -record(funky, {x, y}).

      The following call would create a table that is replicated on two nodes, has an +extra index on attribute y, and is of type bag.

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]},
      +                            {type, bag}, {attributes, record_info(fields, funky)}]).

      Whereas a call to the following default code values would return a table with a RAM copy on the local node, no extra indexes, and the attributes defaulted to -the list [key,val].

      mnesia:create_table(stuff, [])
      +the list [key,val].

      mnesia:create_table(stuff, [])
    diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap4.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap4.html index 99294133c370d..26d0a73bf9dce 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap4.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap4.html @@ -145,14 +145,14 @@

    and delete Mnesia records. The Fun is evaluated as a transaction that either commits or terminates. If a transaction succeeds in executing the Fun, it replicates the action on all nodes involved, or terminates if an error occurs.

    The following example shows a transaction that raises the salary of certain -employee numbers:

    raise(Eno, Raise) ->
    -    F = fun() ->
    -                [E] = mnesia:read(employee, Eno, write),
    +employee numbers:

    raise(Eno, Raise) ->
    +    F = fun() ->
    +                [E] = mnesia:read(employee, Eno, write),
                     Salary = E#employee.salary + Raise,
    -                New = E#employee{salary = Salary},
    -                mnesia:write(New)
    +                New = E#employee{salary = Salary},
    +                mnesia:write(New)
             end,
    -    mnesia:transaction(F).

    The function raise/2 contains a Fun made up of four code lines. This Fun is + mnesia:transaction(F).

    The function raise/2 contains a Fun made up of four code lines. This Fun is called by the statement mnesia:transaction(F) and returns a value.

    The Mnesia transaction system facilitates the construction of reliable, distributed systems by providing the following important properties:

    • The transaction handler ensures that a Fun, which is placed inside a transaction, does not interfere with operations embedded in other transactions @@ -246,15 +246,15 @@

      The Fun in the transaction is evaluated once more.

      It is therefore important that the code inside the Fun given to mnesia:transaction/1 is pure. Some strange results can occur if, for example, messages are sent by the transaction Fun. The following example illustrates this -situation:

      bad_raise(Eno, Raise) ->
      -    F = fun() ->
      -                [E] = mnesia:read({employee, Eno}),
      +situation:

      bad_raise(Eno, Raise) ->
      +    F = fun() ->
      +                [E] = mnesia:read({employee, Eno}),
                       Salary = E#employee.salary + Raise,
      -                New = E#employee{salary = Salary},
      -                io:format("Trying to write ... ~n", []),
      -                mnesia:write(New)
      +                New = E#employee{salary = Salary},
      +                io:format("Trying to write ... ~n", []),
      +                mnesia:write(New)
               end,
      -    mnesia:transaction(F).

      This transaction can write the text "Trying to write ... " 1000 times to the + mnesia:transaction(F).

      This transaction can write the text "Trying to write ... " 1000 times to the terminal. However, Mnesia guarantees that each transaction will eventually run. As a result, Mnesia is not only deadlock free, but also livelock free.

      The Mnesia programmer cannot prioritize one particular transaction to execute before other transactions that are waiting to execute. As a result, the Mnesia @@ -301,13 +301,13 @@

      fails. Such applications can benefit from using sticky locks instead of the normal locking scheme.

      A sticky lock is a lock that stays in place at a node, after the transaction that first acquired the lock has terminated. To illustrate this, assume that the -following transaction is executed:

      F = fun() ->
      -      mnesia:write(#foo{a = kalle})
      +following transaction is executed:

      F = fun() ->
      +      mnesia:write(#foo{a = kalle})
           end,
      -mnesia:transaction(F).

      The foo table is replicated on the two nodes N1 and N2.

      Normal locking requires the following:

      • One network RPC (two messages) to acquire the write lock
      • Three network messages to execute the two-phase commit protocol

      If sticky locks are used, the code must first be changed as follows:

      F = fun() ->
      -      mnesia:s_write(#foo{a = kalle})
      +mnesia:transaction(F).

      The foo table is replicated on the two nodes N1 and N2.

      Normal locking requires the following:

      • One network RPC (two messages) to acquire the write lock
      • Three network messages to execute the two-phase commit protocol

      If sticky locks are used, the code must first be changed as follows:

      F = fun() ->
      +      mnesia:s_write(#foo{a = kalle})
           end,
      -mnesia:transaction(F).

      This code uses the function s_write/1 instead of the +mnesia:transaction(F).

      This code uses the function s_write/1 instead of the function write/1 The function s_write/1 sets a sticky lock instead of a normal lock. If the table is not replicated, sticky locks have no special effect. If the table is replicated, and a sticky lock is set on node @@ -333,8 +333,8 @@

      following two functions are used to set explicit table locks for read and write operations:

      Alternative syntax for acquisition of table locks is as follows:

      mnesia:lock({table, Tab}, read)
      -mnesia:lock({table, Tab}, write)

      The matching operations in Mnesia can either lock the entire table or only a +on table Tab.

    Alternative syntax for acquisition of table locks is as follows:

    mnesia:lock({table, Tab}, read)
    +mnesia:lock({table, Tab}, write)

    The matching operations in Mnesia can either lock the entire table or only a single record (when the key is bound in the pattern).

    @@ -425,78 +425,78 @@

    necessarily have to be the same as the table name, although this is the case in most of the examples in this User's Guide. If a table is created without property record_name, the following code ensures that all records in the -tables have the same name as the table:

    mnesia:create_table(subscriber, [])

    However, if the table is created with an explicit record name as argument, as +tables have the same name as the table:

    mnesia:create_table(subscriber, [])

    However, if the table is created with an explicit record name as argument, as shown in the following example, subscriber records can be stored in both of the -tables regardless of the table names:

    TabDef = [{record_name, subscriber}],
    -mnesia:create_table(my_subscriber, TabDef),
    -mnesia:create_table(your_subscriber, TabDef).

    To access such tables, simplified access functions (as described earlier) cannot +tables regardless of the table names:

    TabDef = [{record_name, subscriber}],
    +mnesia:create_table(my_subscriber, TabDef),
    +mnesia:create_table(your_subscriber, TabDef).

    To access such tables, simplified access functions (as described earlier) cannot be used. For example, writing a subscriber record into a table requires the function mnesia:write/3 instead of the simplified functions mnesia:write/1 -and mnesia:s_write/1:

    mnesia:write(subscriber, #subscriber{}, write)
    -mnesia:write(my_subscriber, #subscriber{}, sticky_write)
    -mnesia:write(your_subscriber, #subscriber{}, write)

    The following simple code illustrates the relationship between the simplified +and mnesia:s_write/1:

    mnesia:write(subscriber, #subscriber{}, write)
    +mnesia:write(my_subscriber, #subscriber{}, sticky_write)
    +mnesia:write(your_subscriber, #subscriber{}, write)

    The following simple code illustrates the relationship between the simplified access functions used in most of the examples and their more flexible -counterparts:

    mnesia:dirty_write(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:dirty_write(Tab, Record).
    +counterparts:

    mnesia:dirty_write(Record) ->
    +  Tab = element(1, Record),
    +  mnesia:dirty_write(Tab, Record).
     
    -mnesia:dirty_delete({Tab, Key}) ->
    -  mnesia:dirty_delete(Tab, Key).
    +mnesia:dirty_delete({Tab, Key}) ->
    +  mnesia:dirty_delete(Tab, Key).
     
    -mnesia:dirty_delete_object(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:dirty_delete_object(Tab, Record)
    +mnesia:dirty_delete_object(Record) ->
    +  Tab = element(1, Record),
    +  mnesia:dirty_delete_object(Tab, Record)
     
    -mnesia:dirty_update_counter({Tab, Key}, Incr) ->
    -  mnesia:dirty_update_counter(Tab, Key, Incr).
    +mnesia:dirty_update_counter({Tab, Key}, Incr) ->
    +  mnesia:dirty_update_counter(Tab, Key, Incr).
     
    -mnesia:dirty_read({Tab, Key}) ->
    -  Tab = element(1, Record),
    -  mnesia:dirty_read(Tab, Key).
    +mnesia:dirty_read({Tab, Key}) ->
    +  Tab = element(1, Record),
    +  mnesia:dirty_read(Tab, Key).
     
    -mnesia:dirty_match_object(Pattern) ->
    -  Tab = element(1, Pattern),
    -  mnesia:dirty_match_object(Tab, Pattern).
    +mnesia:dirty_match_object(Pattern) ->
    +  Tab = element(1, Pattern),
    +  mnesia:dirty_match_object(Tab, Pattern).
     
    -mnesia:dirty_index_match_object(Pattern, Attr)
    -  Tab = element(1, Pattern),
    -  mnesia:dirty_index_match_object(Tab, Pattern, Attr).
    +mnesia:dirty_index_match_object(Pattern, Attr)
    +  Tab = element(1, Pattern),
    +  mnesia:dirty_index_match_object(Tab, Pattern, Attr).
     
    -mnesia:write(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:write(Tab, Record, write).
    +mnesia:write(Record) ->
    +  Tab = element(1, Record),
    +  mnesia:write(Tab, Record, write).
     
    -mnesia:s_write(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:write(Tab, Record, sticky_write).
    +mnesia:s_write(Record) ->
    +  Tab = element(1, Record),
    +  mnesia:write(Tab, Record, sticky_write).
     
    -mnesia:delete({Tab, Key}) ->
    -  mnesia:delete(Tab, Key, write).
    +mnesia:delete({Tab, Key}) ->
    +  mnesia:delete(Tab, Key, write).
     
    -mnesia:s_delete({Tab, Key}) ->
    -  mnesia:delete(Tab, Key, sticky_write).
    +mnesia:s_delete({Tab, Key}) ->
    +  mnesia:delete(Tab, Key, sticky_write).
     
    -mnesia:delete_object(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:delete_object(Tab, Record, write).
    +mnesia:delete_object(Record) ->
    +  Tab = element(1, Record),
    +  mnesia:delete_object(Tab, Record, write).
     
    -mnesia:s_delete_object(Record) ->
    -  Tab = element(1, Record),
    -  mnesia:delete_object(Tab, Record, sticky_write).
    +mnesia:s_delete_object(Record) ->
    +  Tab = element(1, Record),
    +  mnesia:delete_object(Tab, Record, sticky_write).
     
    -mnesia:read({Tab, Key}) ->
    -  mnesia:read(Tab, Key, read).
    +mnesia:read({Tab, Key}) ->
    +  mnesia:read(Tab, Key, read).
     
    -mnesia:wread({Tab, Key}) ->
    -  mnesia:read(Tab, Key, write).
    +mnesia:wread({Tab, Key}) ->
    +  mnesia:read(Tab, Key, write).
     
    -mnesia:match_object(Pattern) ->
    -  Tab = element(1, Pattern),
    -  mnesia:match_object(Tab, Pattern, read).
    +mnesia:match_object(Pattern) ->
    +  Tab = element(1, Pattern),
    +  mnesia:match_object(Tab, Pattern, read).
     
    -mnesia:index_match_object(Pattern, Attr) ->
    -  Tab = element(1, Pattern),
    -  mnesia:index_match_object(Tab, Pattern, Attr, read).

    +mnesia:index_match_object(Pattern, Attr) -> + Tab = element(1, Pattern), + mnesia:index_match_object(Tab, Pattern, Attr, read).

    @@ -577,28 +577,28 @@

    terminates. So, although a nested transaction returns {atomic, Val}, if the enclosing parent transaction terminates, the entire nested operation terminates.

    The ability to have nested transaction with identical semantics as top-level transaction makes it easier to write library functions that manipulate Mnesia -tables.

    Consider a function that adds a subscriber to a telephony system:

    add_subscriber(S) ->
    -    mnesia:transaction(fun() ->
    -        case mnesia:read( ..........

    This function needs to be called as a transaction. Assume that you wish to write +tables.

    Consider a function that adds a subscriber to a telephony system:

    add_subscriber(S) ->
    +    mnesia:transaction(fun() ->
    +        case mnesia:read( ..........

    This function needs to be called as a transaction. Assume that you wish to write a function that both calls the function add_subscriber/1 and is in itself protected by the context of a transaction. By calling add_subscriber/1 from within another transaction, a nested transaction is created.

    Also, different activity access contexts can be mixed while nesting. However, the dirty ones (async_dirty, sync_dirty, and ets) inherit the transaction semantics if they are called inside a transaction and thus grab locks and use -two or three phase commit.

    Example:

    add_subscriber(S) ->
    -    mnesia:transaction(fun() ->
    +two or three phase commit.

    Example:

    add_subscriber(S) ->
    +    mnesia:transaction(fun() ->
            %% Transaction context
    -       mnesia:read({some_tab, some_data}),
    -       mnesia:sync_dirty(fun() ->
    +       mnesia:read({some_tab, some_data}),
    +       mnesia:sync_dirty(fun() ->
                %% Still in a transaction context.
    -           case mnesia:read( ..) ..end), end).
    -add_subscriber2(S) ->
    -    mnesia:sync_dirty(fun() ->
    +           case mnesia:read( ..) ..end), end).
    +add_subscriber2(S) ->
    +    mnesia:sync_dirty(fun() ->
            %% In dirty context
    -       mnesia:read({some_tab, some_data}),
    -       mnesia:transaction(fun() ->
    +       mnesia:read({some_tab, some_data}),
    +       mnesia:transaction(fun() ->
                %% In a transaction context.
    -           case mnesia:read( ..) ..end), end).

    + case mnesia:read( ..) ..end), end).

    @@ -606,13 +606,13 @@

    When the function mnesia:read/3 cannot be used, Mnesia provides the programmer with several functions for matching records against a pattern. The -most useful ones are the following:

    mnesia:select(Tab, MatchSpecification, LockKind) ->
    -    transaction abort | [ObjectList]
    -mnesia:select(Tab, MatchSpecification, NObjects, Lock) ->
    -    transaction abort | {[Object],Continuation} | '$end_of_table'
    -mnesia:select(Cont) ->
    -    transaction abort | {[Object],Continuation} | '$end_of_table'
    -mnesia:match_object(Tab, Pattern, LockKind) ->
    +most useful ones are the following:

    mnesia:select(Tab, MatchSpecification, LockKind) ->
    +    transaction abort | [ObjectList]
    +mnesia:select(Tab, MatchSpecification, NObjects, Lock) ->
    +    transaction abort | {[Object],Continuation} | '$end_of_table'
    +mnesia:select(Cont) ->
    +    transaction abort | {[Object],Continuation} | '$end_of_table'
    +mnesia:match_object(Tab, Pattern, LockKind) ->
         transaction abort | RecordList

    These functions match a Pattern against all records in table Tab. In a mnesia:select call, Pattern is a part of MatchSpecification described in the following. It is not necessarily performed @@ -627,22 +627,22 @@

    occurrences of that variable against the bound value.

    Use function mnesia:table_info(Tab, wild_pattern) to obtain a basic pattern, which matches all records in a table, or use the default value in record creation. Do not make the pattern hard-coded, as this makes the -code more vulnerable to future changes of the record definition.

    Example:

    Wildpattern = mnesia:table_info(employee, wild_pattern),
    +code more vulnerable to future changes of the record definition.

    Example:

    Wildpattern = mnesia:table_info(employee, wild_pattern),
     %% Or use
    -Wildpattern = #employee{_ = '_'},

    For the employee table, the wild pattern looks as follows:

    {employee, '_', '_', '_', '_', '_',' _'}.

    To constrain the match, it is needed to replace some of the '_' elements. The -code for matching out all female employees looks as follows:

    Pat = #employee{sex = female, _ = '_'},
    -F = fun() -> mnesia:match_object(Pat) end,
    -Females = mnesia:transaction(F).

    The match function can also be used to check the equality of different +Wildpattern = #employee{_ = '_'},

    For the employee table, the wild pattern looks as follows:

    {employee, '_', '_', '_', '_', '_',' _'}.

    To constrain the match, it is needed to replace some of the '_' elements. The +code for matching out all female employees looks as follows:

    Pat = #employee{sex = female, _ = '_'},
    +F = fun() -> mnesia:match_object(Pat) end,
    +Females = mnesia:transaction(F).

    The match function can also be used to check the equality of different attributes. For example, to find all employees with an employee number equal to -their room number:

    Pat = #employee{emp_no = '$1', room_no = '$1', _ = '_'},
    -F = fun() -> mnesia:match_object(Pat) end,
    -Odd = mnesia:transaction(F).

    The function mnesia:match_object/3 lacks some important features that +their room number:

    Pat = #employee{emp_no = '$1', room_no = '$1', _ = '_'},
    +F = fun() -> mnesia:match_object(Pat) end,
    +Odd = mnesia:transaction(F).

    The function mnesia:match_object/3 lacks some important features that mnesia:select/3 have. For example, mnesia:match_object/3 can only return the matching records, and it cannot express constraints other -than equality. To find the names of the male employees on the second floor:

    MatchHead = #employee{name='$1', sex=male, room_no={'$2', '_'}, _='_'},
    -Guard = [{'>=', '$2', 220},{'<', '$2', 230}],
    +than equality. To find the names of the male employees on the second floor:

    MatchHead = #employee{name='$1', sex=male, room_no={'$2', '_'}, _='_'},
    +Guard = [{'>=', '$2', 220},{'<', '$2', 230}],
     Result = '$1',
    -mnesia:select(employee,[{MatchHead, Guard, [Result]}])

    The function select can be used to add more constraints and create output that +mnesia:select(employee,[{MatchHead, Guard, [Result]}])

    The function select can be used to add more constraints and create output that cannot be done with mnesia:match_object/3.

    The second argument to select is a MatchSpecification. A MatchSpecification is a list of MatchFunctions, where each MatchFunction consists of a tuple containing {MatchHead, MatchCondition, MatchBody}:

    • MatchHead is the same pattern as used in mnesia:match_object/3 described @@ -672,8 +672,8 @@

      {traverse, {select, MatchSpecification}} as an option to mnesia:table/2 the user can specify its own view of the table.

    If no options are specified, a read lock is acquired, 100 results are returned -in each chunk, and select is used to traverse the table, that is:

    mnesia:table(Tab) ->
    -    mnesia:table(Tab, [{n_objects, 100},{lock, read}, {traverse, select}]).

    The function mnesia:all_keys(Tab) returns all keys in a +in each chunk, and select is used to traverse the table, that is:

    mnesia:table(Tab) ->
    +    mnesia:table(Tab, [{n_objects, 100},{lock, read}, {traverse, select}]).

    The function mnesia:all_keys(Tab) returns all keys in a table.

    @@ -681,10 +681,10 @@

    Iteration

    Mnesia provides the following functions that iterate over all the records in a -table:

    mnesia:foldl(Fun, Acc0, Tab) -> NewAcc | transaction abort
    -mnesia:foldr(Fun, Acc0, Tab) -> NewAcc | transaction abort
    -mnesia:foldl(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort
    -mnesia:foldr(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort

    These functions iterate over the Mnesia table Tab and apply the function +table:

    mnesia:foldl(Fun, Acc0, Tab) -> NewAcc | transaction abort
    +mnesia:foldr(Fun, Acc0, Tab) -> NewAcc | transaction abort
    +mnesia:foldl(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort
    +mnesia:foldr(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort

    These functions iterate over the Mnesia table Tab and apply the function Fun to each record. Fun takes two arguments, the first is a record from the table, and the second is the accumulator. Fun returns a new accumulator.

    The first time Fun is applied, Acc0 is the second argument. The next time Fun is called, the return value from the previous call is used as the second @@ -695,35 +695,35 @@

    write lock is to be acquired.

    These functions can be used to find records in a table when it is impossible to write constraints for the function mnesia:match_object/3, or when you want to perform some action on certain records.

    For example, finding all the employees who have a salary less than 10 can look -as follows:

    find_low_salaries() ->
    +as follows:

    find_low_salaries() ->
       Constraint =
    -       fun(Emp, Acc) when Emp#employee.salary < 10 ->
    -              [Emp | Acc];
    -          (_, Acc) ->
    +       fun(Emp, Acc) when Emp#employee.salary < 10 ->
    +              [Emp | Acc];
    +          (_, Acc) ->
                   Acc
            end,
    -  Find = fun() -> mnesia:foldl(Constraint, [], employee) end,
    -  mnesia:transaction(Find).

    To raise the salary to 10 for everyone with a salary less than 10 and return the -sum of all raises:

    increase_low_salaries() ->
    +  Find = fun() -> mnesia:foldl(Constraint, [], employee) end,
    +  mnesia:transaction(Find).

    To raise the salary to 10 for everyone with a salary less than 10 and return the +sum of all raises:

    increase_low_salaries() ->
        Increase =
    -       fun(Emp, Acc) when Emp#employee.salary < 10 ->
    +       fun(Emp, Acc) when Emp#employee.salary < 10 ->
                   OldS = Emp#employee.salary,
    -              ok = mnesia:write(Emp#employee{salary = 10}),
    +              ok = mnesia:write(Emp#employee{salary = 10}),
                   Acc + 10 - OldS;
    -          (_, Acc) ->
    +          (_, Acc) ->
                   Acc
            end,
    -  IncLow = fun() -> mnesia:foldl(Increase, 0, employee, write) end,
    -  mnesia:transaction(IncLow).

    Many nice things can be done with the iterator functions but take some caution + IncLow = fun() -> mnesia:foldl(Increase, 0, employee, write) end, + mnesia:transaction(IncLow).

    Many nice things can be done with the iterator functions but take some caution about performance and memory use for large tables.

    Call these iteration functions on nodes that contain a replica of the table. Each call to the function Fun access the table and if the table resides on another node it generates much unnecessary network traffic.

    Mnesia also provides some functions that make it possible for the user to iterate over the table. The order of the iteration is unspecified if the table -is not of type ordered_set:

    mnesia:first(Tab) ->  Key | transaction abort
    -mnesia:last(Tab)  ->  Key | transaction abort
    -mnesia:next(Tab,Key)  ->  Key | transaction abort
    -mnesia:prev(Tab,Key)  ->  Key | transaction abort
    -mnesia:snmp_get_next_index(Tab,Index) -> {ok, NextIndex} | endOfTable

    The order of first/last and next/prev is only valid for ordered_set +is not of type ordered_set:

    mnesia:first(Tab) ->  Key | transaction abort
    +mnesia:last(Tab)  ->  Key | transaction abort
    +mnesia:next(Tab,Key)  ->  Key | transaction abort
    +mnesia:prev(Tab,Key)  ->  Key | transaction abort
    +mnesia:snmp_get_next_index(Tab,Index) -> {ok, NextIndex} | endOfTable

    The order of first/last and next/prev is only valid for ordered_set tables, they are synonyms for other tables. When the end of the table is reached, the special key '$end_of_table' is returned.

    If records are written and deleted during the traversal, use the function mnesia:foldl/3 or mnesia:foldr/3 with a write lock. Or the function diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap5.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap5.html index 788bbf46bb800..43925f26f7a4f 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap5.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap5.html @@ -167,9 +167,9 @@

    whether the data resides on the local node or on a remote node.

    Notice that the program runs slower if the data is located on a remote node.

  • The database can be reconfigured, and tables can be moved between nodes. These operations do not affect the user programs.

  • It has previously been shown that each table has a number of system attributes, such as index and type.

    Table attributes are specified when the table is created. For example, the -following function creates a table with two RAM replicas:

    mnesia:create_table(foo,
    -                    [{ram_copies, [N1, N2]},
    -                     {attributes, record_info(fields, foo)}]).

    Tables can also have the following properties, where each attribute has a list +following function creates a table with two RAM replicas:

    mnesia:create_table(foo,
    +                    [{ram_copies, [N1, N2]},
    +                     {attributes, record_info(fields, foo)}]).

    Tables can also have the following properties, where each attribute has a list of Erlang nodes as its value:

    • ram_copies. The value of the node list is a list of Erlang nodes, and a RAM replica of the table resides on each node in the list.

      Notice that no disc operations are performed when a program executes write operations to these replicas. However, if permanent RAM replicas are required, @@ -222,52 +222,52 @@

      searched for matching records.

      Notice that in ordered_set tables, the records are ordered per fragment, and the order is undefined in results returned by select and match_object, as well as first, next, prev and last.

      The following code illustrates how a Mnesia table is converted to be a -fragmented table and how more fragments are added later:

      Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      -(a@sam)1> mnesia:start().
      +fragmented table and how more fragments are added later:

      Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      +(a@sam)1> mnesia:start().
       ok
      -(a@sam)2> mnesia:system_info(running_db_nodes).
      -[b@sam,c@sam,a@sam]
      +(a@sam)2> mnesia:system_info(running_db_nodes).
      +[b@sam,c@sam,a@sam]
       (a@sam)3> Tab = dictionary.
       dictionary
      -(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]).
      -{atomic,ok}
      -(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end.
      +(a@sam)4> mnesia:create_table(Tab, [{ram_copies, [a@sam, b@sam]}]).
      +{atomic,ok}
      +(a@sam)5> Write = fun(Keys) -> [mnesia:write({Tab,K,-K}) || K <- Keys], ok end.
       #Fun<erl_eval>
      -(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).
      +(a@sam)6> mnesia:activity(sync_dirty, Write, [lists:seq(1, 256)], mnesia_frag).
       ok
      -(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}).
      -{atomic,ok}
      -(a@sam)8> mnesia:table_info(Tab, frag_properties).
      -[{base_table,dictionary},
      - {foreign_key,undefined},
      - {hash_module,mnesia_frag_hash},
      - {hash_state,{hash_state,1,1,0,phash2}},
      - {n_fragments,1},
      - {node_pool,[a@sam,b@sam,c@sam]}]
      -(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end.
      +(a@sam)7> mnesia:change_table_frag(Tab, {activate, []}).
      +{atomic,ok}
      +(a@sam)8> mnesia:table_info(Tab, frag_properties).
      +[{base_table,dictionary},
      + {foreign_key,undefined},
      + {hash_module,mnesia_frag_hash},
      + {hash_state,{hash_state,1,1,0,phash2}},
      + {n_fragments,1},
      + {node_pool,[a@sam,b@sam,c@sam]}]
      +(a@sam)9> Info = fun(Item) -> mnesia:table_info(Tab, Item) end.
       #Fun<erl_eval>
      -(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
      -[{c@sam,0},{a@sam,1},{b@sam,1}]
      -(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}).
      -{atomic,ok}
      -(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
      -[{b@sam,1},{c@sam,1},{a@sam,2}]
      -(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}).
      -{atomic,ok}
      -(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
      -[{a@sam,2},{b@sam,2},{c@sam,2}]
      -(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}).
      -{atomic,ok}
      -(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end.
      +(a@sam)10> Dist = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
      +[{c@sam,0},{a@sam,1},{b@sam,1}]
      +(a@sam)11> mnesia:change_table_frag(Tab, {add_frag, Dist}).
      +{atomic,ok}
      +(a@sam)12> Dist2 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
      +[{b@sam,1},{c@sam,1},{a@sam,2}]
      +(a@sam)13> mnesia:change_table_frag(Tab, {add_frag, Dist2}).
      +{atomic,ok}
      +(a@sam)14> Dist3 = mnesia:activity(sync_dirty, Info, [frag_dist], mnesia_frag).
      +[{a@sam,2},{b@sam,2},{c@sam,2}]
      +(a@sam)15> mnesia:change_table_frag(Tab, {add_frag, Dist3}).
      +{atomic,ok}
      +(a@sam)16> Read = fun(Key) -> mnesia:read({Tab, Key}) end.
       #Fun<erl_eval>
      -(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag).
      -[{dictionary,12,-12}]
      -(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag).
      -[{dictionary,57},
      - {dictionary_frag2,63},
      - {dictionary_frag3,62},
      - {dictionary_frag4,74}]
      -(a@sam)19>

      +(a@sam)17> mnesia:activity(transaction, Read, [12], mnesia_frag). +[{dictionary,12,-12}] +(a@sam)18> mnesia:activity(sync_dirty, Info, [frag_size], mnesia_frag). +[{dictionary,57}, + {dictionary_frag2,63}, + {dictionary_frag3,62}, + {dictionary_frag4,74}] +(a@sam)19>

      @@ -309,64 +309,64 @@

      This property can explicitly be set at table creation. Default is mnesia_frag_hash.

    • {hash_state, Term} - Enables a table-specific parameterization of a generic hash module. This property can explicitly be set at table creation. -Default is undefined.

      Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      -(a@sam)1> mnesia:start().
      +Default is undefined.

      Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
      +(a@sam)1> mnesia:start().
       ok
      -(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}].
      -[{n_fragments,7},{node_pool,[a@sam]}]
      -(a@sam)3> mnesia:create_table(prim_dict,
      -                              [{frag_properties, PrimProps},
      -                               {attributes, [prim_key, prim_val]}]).
      -{atomic,ok}
      -(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}].
      -[{foreign_key,{prim_dict,sec_val}}]
      -(a@sam)5> mnesia:create_table(sec_dict,
      -                              [{frag_properties, SecProps},
      -                               {attributes, [sec_key, sec_val]}]).
      -{atomic,ok}
      -(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
      +(a@sam)2> PrimProps = [{n_fragments, 7}, {node_pool, [node()]}].
      +[{n_fragments,7},{node_pool,[a@sam]}]
      +(a@sam)3> mnesia:create_table(prim_dict,
      +                              [{frag_properties, PrimProps},
      +                               {attributes, [prim_key, prim_val]}]).
      +{atomic,ok}
      +(a@sam)4> SecProps = [{foreign_key, {prim_dict, sec_val}}].
      +[{foreign_key,{prim_dict,sec_val}}]
      +(a@sam)5> mnesia:create_table(sec_dict,
      +                              [{frag_properties, SecProps},
      +                               {attributes, [sec_key, sec_val]}]).
      +{atomic,ok}
      +(a@sam)6> Write = fun(Rec) -> mnesia:write(Rec) end.
       #Fun<erl_eval>
       (a@sam)7> PrimKey = 11.
       11
       (a@sam)8> SecKey = 42.
       42
      -(a@sam)9> mnesia:activity(sync_dirty, Write,
      -                          [{prim_dict, PrimKey, -11}], mnesia_frag).
      +(a@sam)9> mnesia:activity(sync_dirty, Write,
      +                          [{prim_dict, PrimKey, -11}], mnesia_frag).
       ok
      -(a@sam)10> mnesia:activity(sync_dirty, Write,
      -                           [{sec_dict, SecKey, PrimKey}], mnesia_frag).
      +(a@sam)10> mnesia:activity(sync_dirty, Write,
      +                           [{sec_dict, SecKey, PrimKey}], mnesia_frag).
       ok
      -(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}).
      -{atomic,ok}
      -(a@sam)12> SecRead = fun(PrimKey, SecKey) ->
      -               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
      +(a@sam)11> mnesia:change_table_frag(prim_dict, {add_frag, [node()]}).
      +{atomic,ok}
      +(a@sam)12> SecRead = fun(PrimKey, SecKey) ->
      +               mnesia:read({sec_dict, PrimKey}, SecKey, read) end.
       #Fun<erl_eval>
      -(a@sam)13> mnesia:activity(transaction, SecRead,
      -                           [PrimKey, SecKey], mnesia_frag).
      -[{sec_dict,42,11}]
      -(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
      +(a@sam)13> mnesia:activity(transaction, SecRead,
      +                           [PrimKey, SecKey], mnesia_frag).
      +[{sec_dict,42,11}]
      +(a@sam)14> Info = fun(Tab, Item) -> mnesia:table_info(Tab, Item) end.
       #Fun<erl_eval>
      -(a@sam)15> mnesia:activity(sync_dirty, Info,
      -                           [prim_dict, frag_size], mnesia_frag).
      -[{prim_dict,0},
      - {prim_dict_frag2,0},
      - {prim_dict_frag3,1},
      - {prim_dict_frag4,0},
      - {prim_dict_frag5,0},
      - {prim_dict_frag6,0},
      - {prim_dict_frag7,0},
      - {prim_dict_frag8,0}]
      -(a@sam)16> mnesia:activity(sync_dirty, Info,
      -                           [sec_dict, frag_size], mnesia_frag).
      -[{sec_dict,0},
      - {sec_dict_frag2,0},
      - {sec_dict_frag3,1},
      - {sec_dict_frag4,0},
      - {sec_dict_frag5,0},
      - {sec_dict_frag6,0},
      - {sec_dict_frag7,0},
      - {sec_dict_frag8,0}]
      -(a@sam)17>

    +(a@sam)15> mnesia:activity(sync_dirty, Info, + [prim_dict, frag_size], mnesia_frag). +[{prim_dict,0}, + {prim_dict_frag2,0}, + {prim_dict_frag3,1}, + {prim_dict_frag4,0}, + {prim_dict_frag5,0}, + {prim_dict_frag6,0}, + {prim_dict_frag7,0}, + {prim_dict_frag8,0}] +(a@sam)16> mnesia:activity(sync_dirty, Info, + [sec_dict, frag_size], mnesia_frag). +[{sec_dict,0}, + {sec_dict_frag2,0}, + {sec_dict_frag3,1}, + {sec_dict_frag4,0}, + {sec_dict_frag5,0}, + {sec_dict_frag6,0}, + {sec_dict_frag7,0}, + {sec_dict_frag8,0}] +(a@sam)17>

    @@ -496,10 +496,10 @@

    table is ram_copies). The default for the application parameter is opt_disc.

    When schema_location is set to opt_disc, the function mnesia:change_table_copy_type/3 can be used to change the storage type of the -schema. This is illustrated as follows:

    1> mnesia:start().
    +schema. This is illustrated as follows:

    1> mnesia:start().
     ok
    -2> mnesia:change_table_copy_type(schema, node(), disc_copies).
    -{atomic, ok}

    Assuming that the call to mnesia:start/0 does not find any schema to read on +2> mnesia:change_table_copy_type(schema, node(), disc_copies). +{atomic, ok}

    Assuming that the call to mnesia:start/0 does not find any schema to read on the disc, Mnesia starts as a disc-less node, and then change it to a node that use the disc to store the schema locally.

    @@ -723,30 +723,30 @@

    a normal text editor) and later reloaded.

    These functions are much slower than the ordinary store and load functions of Mnesia. However, this is mainly intended for minor experiments and initial prototyping. The major advantage of these functions is that they are easy to -use.

    The format of the text file is as follows:

    {tables, [{Typename, [Options]},
    -{Typename2 ......}]}.
    +use.

    The format of the text file is as follows:

    {tables, [{Typename, [Options]},
    +{Typename2 ......}]}.
     
    -{Typename, Attribute1, Attribute2 ....}.
    -{Typename, Attribute1, Attribute2 ....}.

    Options is a list of {Key,Value} tuples conforming to the options that you +{Typename, Attribute1, Attribute2 ....}. +{Typename, Attribute1, Attribute2 ....}.

    Options is a list of {Key,Value} tuples conforming to the options that you can give to mnesia:create_table/2.

    For example, to start playing with a small database for healthy foods, enter the -following data into file FRUITS:

    {tables,
    - [{fruit, [{attributes, [name, color, taste]}]},
    -  {vegetable, [{attributes, [name, color, taste, price]}]}]}.
    +following data into file FRUITS:

    {tables,
    + [{fruit, [{attributes, [name, color, taste]}]},
    +  {vegetable, [{attributes, [name, color, taste, price]}]}]}.
     
     
    -{fruit, orange, orange, sweet}.
    -{fruit, apple, green, sweet}.
    -{vegetable, carrot, orange, carrotish, 2.55}.
    -{vegetable, potato, yellow, none, 0.45}.

    The following session with the Erlang shell shows how to load the FRUITS +{fruit, orange, orange, sweet}. +{fruit, apple, green, sweet}. +{vegetable, carrot, orange, carrotish, 2.55}. +{vegetable, potato, yellow, none, 0.45}.

    The following session with the Erlang shell shows how to load the FRUITS database:

    % erl
    -Erlang/OTP 27 [erts-15.1.2]
    +Erlang/OTP 27 [erts-15.1.2]
     
    -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    -1> mnesia:load_textfile("fruits.txt").
    +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    +1> mnesia:load_textfile("fruits.txt").
     New table fruit
     New table vegetable
    -{atomic,ok}
    -2> mnesia:info().
    +{atomic,ok}
    +2> mnesia:info().
     ---> Processes holding locks <--- 
     ---> Processes waiting for locks <--- 
     ---> Participant transactions <--- 
    @@ -759,18 +759,18 @@ 

    ===> System info in version "4.23.2", debug level = none <=== opt_disc. Directory "/var/tmp/Mnesia.nonode@nohost" is used. use fallback at restart = false -running db nodes = [nonode@nohost] -stopped db nodes = [] -master node tables = [] -remote = [] -ram_copies = [fruit,vegetable] -disc_copies = [schema] -disc_only_copies = [] -[{nonode@nohost,disc_copies}] = [schema] -[{nonode@nohost,ram_copies}] = [fruit,vegetable] +running db nodes = [nonode@nohost] +stopped db nodes = [] +master node tables = [] +remote = [] +ram_copies = [fruit,vegetable] +disc_copies = [schema] +disc_only_copies = [] +[{nonode@nohost,disc_copies}] = [schema] +[{nonode@nohost,ram_copies}] = [fruit,vegetable] 5 transactions committed, 0 aborted, 0 restarted, 4 logged to disc 0 held locks, 0 in queue; 0 local transactions, 0 remote -0 transactions waits for other nodes: [] +0 transactions waits for other nodes: [] ok 3>

    It can be seen that the DBMS was initiated from a regular text file.

    @@ -784,20 +784,20 @@

    relationships (manager, at_dep, in_proj). This is a normalized data model, which has some advantages over a non-normalized data model.

    It is more efficient to do a generalized search in a normalized database. Some operations are also easier to perform on a normalized data model. For example, -one project can easily be removed, as the following example illustrates:

    remove_proj(ProjName) ->
    -    F = fun() ->
    -                Ip = qlc:e(qlc:q([X || X <- mnesia:table(in_proj),
    -                                       X#in_proj.proj_name == ProjName]
    -                                )),
    -                mnesia:delete({project, ProjName}),
    -                del_in_projs(Ip)
    +one project can easily be removed, as the following example illustrates:

    remove_proj(ProjName) ->
    +    F = fun() ->
    +                Ip = qlc:e(qlc:q([X || X <- mnesia:table(in_proj),
    +                                       X#in_proj.proj_name == ProjName]
    +                                )),
    +                mnesia:delete({project, ProjName}),
    +                del_in_projs(Ip)
             end,
    -    mnesia:transaction(F).
    +    mnesia:transaction(F).
     
    -del_in_projs([Ip|Tail]) ->
    -    mnesia:delete_object(Ip),
    -    del_in_projs(Tail);
    -del_in_projs([]) ->
    +del_in_projs([Ip|Tail]) ->
    +    mnesia:delete_object(Ip),
    +    del_in_projs(Tail);
    +del_in_projs([]) ->
         done.

    In reality, data models are seldom fully normalized. A realistic alternative to a normalized database model would be a data model that is not even in first normal form. Mnesia is suitable for applications such as telecommunications, @@ -812,7 +812,7 @@

    this is the case, a drastically different data model without direct relationships can be chosen. You would then have only the records themselves, and different records could contain either direct references to other records, -or contain other records that are not part of the Mnesia schema.

    The following record definitions can be created:

    -record(employee, {emp_no,
    +or contain other records that are not part of the Mnesia schema.

    The following record definitions can be created:

    -record(employee, {emp_no,
                        name,
                        salary,
                        sex,
    @@ -820,23 +820,23 @@ 

    room_no, dept, projects, - manager}). + manager}). --record(dept, {id, - name}). +-record(dept, {id, + name}). --record(project, {name, +-record(project, {name, number, - location}).

    A record that describes an employee can look as follows:

    Me = #employee{emp_no = 104732,
    +                  location}).

    A record that describes an employee can look as follows:

    Me = #employee{emp_no = 104732,
                    name = klacke,
                    salary = 7,
                    sex = male,
                    phone = 99586,
    -               room_no = {221, 015},
    +               room_no = {221, 015},
                    dept = 'B/SFR',
    -               projects = [erlang, mnesia, otp],
    -               manager = 114872},

    This model has only three different tables, and the employee records contain + projects = [erlang, mnesia, otp], + manager = 114872},

    This model has only three different tables, and the employee records contain references to other records. The record has the following references:

    • 'B/SFR' refers to a dept record.
    • [erlang, mnesia, otp] is a list of three direct references to three different projects records.
    • 114872 refers to another employee record.

    The Mnesia record identifiers ({Tab, Key}) can also be used as references. In this case, attribute dept would be set to value {dept, 'B/SFR'} instead @@ -846,14 +846,14 @@

    difficult to ensure that records do not contain dangling pointers to other non-existent, or deleted, records.

    The following code exemplifies a search with a non-normalized data model. To find all employees at department Dep with a salary higher than Salary, use -the following code:

    get_emps(Salary, Dep) ->
    -    Q = qlc:q(
    -          [E || E <- mnesia:table(employee),
    +the following code:

    get_emps(Salary, Dep) ->
    +    Q = qlc:q(
    +          [E || E <- mnesia:table(employee),
                     E#employee.salary > Salary,
    -                E#employee.dept == Dep]
    -         ),
    -    F = fun() -> qlc:e(Q) end,
    -    transaction(F).

    This code is easier to write and to understand, and it also executes much + E#employee.dept == Dep] + ), + F = fun() -> qlc:e(Q) end, + transaction(F).

    This code is easier to write and to understand, and it also executes much faster.

    It is easy to show examples of code that executes faster if a non-normalized data model is used, instead of a normalized model. The main reason is that fewer tables are required. Therefore, data from different tables can more easily be diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap7.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap7.html index 5fff3871ffb55..3312f2cca07f4 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap7.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_chap7.html @@ -233,26 +233,26 @@

    for starting Mnesia:

    The following example shows how these tasks are performed:

    Step 1: Start an Erlang session and specify a Mnesia directory for the -database:

    % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
    Erlang/OTP 27 [erts-15.1.2]
    +database:

    % erl -sname klacke -mnesia dir '"/ldisc/scratch/klacke"'
    Erlang/OTP 27 [erts-15.1.2]
     
    -Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    -(klacke@gin)1> mnesia:create_schema([node()]).
    +Eshell V15.1.2 (press Ctrl+G to abort, type help(). for help)
    +(klacke@gin)1> mnesia:create_schema([node()]).
     ok
    -(klacke@gin)2>
    +(klacke@gin)2>
     Ctrl+Z
    -[1]+  Stopped                 erl

    Step 2: You can inspect the Mnesia directory to see what files have been +[1]+ Stopped erl

    Step 2: You can inspect the Mnesia directory to see what files have been created:

    % ls -l /ldisc/scratch/klacke
     -rw-rw-r--   1 klacke   staff       247 Aug 12 15:06 FALLBACK.BUP

    The response shows that the file FALLBACK.BUP has been created. This is called a backup file, and it contains an initial schema. If more than one node in the function mnesia:create_schema/1 had been specified, identical backup files -would have been created on all nodes.

    Step 3: Start Mnesia:

    (klacke@gin)3> mnesia:start().
    +would have been created on all nodes.

    Step 3: Start Mnesia:

    (klacke@gin)3> mnesia:start().
     ok

    Step 4: You can see the following listing in the Mnesia directory:

    -rw-rw-r--   1 klacke   staff         86 May 26 19:03 LATEST.LOG
     -rw-rw-r--   1 klacke   staff      34507 May 26 19:03 schema.DAT

    The schema in the backup file FALLBACK.BUP has been used to generate the file schema.DAT. Since there are no other disc resident tables than the schema, no other data files were created. The file FALLBACK.BUP was removed after the successful "restoration". You also see some files that are for internal use by -Mnesia.

    Step 5: Create a table:

    (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
    -{atomic,ok}

    Step 6: You can see the following listing in the Mnesia directory:

    % ls -l /ldisc/scratch/klacke
    +Mnesia.

    Step 5: Create a table:

    (klacke@gin)4> mnesia:create_table(foo,[{disc_copies, [node()]}]).
    +{atomic,ok}

    Step 6: You can see the following listing in the Mnesia directory:

    % ls -l /ldisc/scratch/klacke
     -rw-rw-r-- 1 klacke staff    86 May 26 19:07 LATEST.LOG
     -rw-rw-r-- 1 klacke staff    94 May 26 19:07 foo.DCD
     -rw-rw-r-- 1 klacke staff  6679 May 26 19:07 schema.DAT

    The file foo.DCD has been created. This file will eventually store all data @@ -296,11 +296,11 @@

    the Mnesia data files. For example, dets contains the function dets:traverse/2, which can be used to view the contents of a Mnesia DAT file. However, this can only be done when Mnesia is not running. So, to view -the schema file, do as follows;

    {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
    -{keypos, 2}]),
    -F = fun(X) -> io:format("~p~n", [X]), continue end,
    -dets:traverse(N, F),
    -dets:close(N).

    Warning

    The DAT files must always be opened with option {repair, false}. This +the schema file, do as follows;

    {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false},
    +{keypos, 2}]),
    +F = fun(X) -> io:format("~p~n", [X]), continue end,
    +dets:traverse(N, F),
    +dets:close(N).

    Warning

    The DAT files must always be opened with option {repair, false}. This ensures that these files are not automatically repaired. Without this option, the database can become inconsistent, because Mnesia can believe that the files were properly closed. For information about configuration parameter @@ -534,38 +534,38 @@

    located first in the backup.

    The schema itself is a table and is possibly included in the backup. Each node where the schema table resides is regarded as a db_node.

    The following example shows how mnesia:traverse_backup can be used to rename a -db_node in a backup file:

    change_node_name(Mod, From, To, Source, Target) ->
    +db_node in a backup file:

    change_node_name(Mod, From, To, Source, Target) ->
         Switch =
    -        fun(Node) when Node == From -> To;
    -           (Node) when Node == To -> throw({error, already_exists});
    -           (Node) -> Node
    +        fun(Node) when Node == From -> To;
    +           (Node) when Node == To -> throw({error, already_exists});
    +           (Node) -> Node
             end,
         Convert =
    -        fun({schema, version, Version}, Acc) ->
    -                {[{schema, version, Version}], Acc};
    -           ({schema, cookie, Cookie}, Acc) ->
    -                {[{schema, cookie, Cookie}], Acc};
    -           ({schema, Tab, CreateList}, Acc) ->
    -                Keys = [ram_copies, disc_copies, disc_only_copies],
    +        fun({schema, version, Version}, Acc) ->
    +                {[{schema, version, Version}], Acc};
    +           ({schema, cookie, Cookie}, Acc) ->
    +                {[{schema, cookie, Cookie}], Acc};
    +           ({schema, Tab, CreateList}, Acc) ->
    +                Keys = [ram_copies, disc_copies, disc_only_copies],
                     OptSwitch =
    -                    fun({Key, Val}) ->
    -                            case lists:member(Key, Keys) of
    -                                true -> {Key, lists:map(Switch, Val)};
    -                                false-> {Key, Val}
    +                    fun({Key, Val}) ->
    +                            case lists:member(Key, Keys) of
    +                                true -> {Key, lists:map(Switch, Val)};
    +                                false-> {Key, Val}
                                 end
                         end,
    -                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
    -           (Other, Acc) ->
    -                {[Other], Acc}
    +                {[{schema, Tab, lists:map(OptSwitch, CreateList)}], Acc};
    +           (Other, Acc) ->
    +                {[Other], Acc}
             end,
    -    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
    +    mnesia:traverse_backup(Source, Mod, Target, Mod, Convert, switched).
     
    -view(Source, Mod) ->
    -    View = fun(Item, Acc) ->
    -                   io:format("~p.~n",[Item]),
    -                   {[Item], Acc + 1}
    +view(Source, Mod) ->
    +    View = fun(Item, Acc) ->
    +                   io:format("~p.~n",[Item]),
    +                   {[Item], Acc + 1}
                end,
    -    mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

    + mnesia:traverse_backup(Source, Mod, dummy, read_only, View, 0).

    diff --git a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_registry.html b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_registry.html index 180cdb5ee8206..0d54126e165b1 100644 --- a/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_registry.html +++ b/prs/9277/lib/mnesia-4.23.3/doc/html/mnesia_registry.html @@ -258,8 +258,8 @@

    create_table(Tab, Opt)

    Warning

    This function is deprecated. Do not use it.

    A wrapper function for mnesia:create_table/2, which creates a table (if there is no existing table) with an appropriate set of attributes. The attributes and TabDef are forwarded to mnesia:create_table/2. For example, if the table -is to reside as disc_only_copies on all nodes, a call looks as follows:

              TabDef = [{{disc_only_copies, node()|nodes()]}],
    -          mnesia_registry:create_table(my_reg, TabDef)
    +is to reside as disc_only_copies on all nodes, a call looks as follows:

              TabDef = [{{disc_only_copies, node()|nodes()]}],
    +          mnesia_registry:create_table(my_reg, TabDef)
    diff --git a/prs/9277/lib/observer-2.17/doc/html/observer.epub b/prs/9277/lib/observer-2.17/doc/html/observer.epub index afd0a4edd74a6..a7faf14b75d74 100644 Binary files a/prs/9277/lib/observer-2.17/doc/html/observer.epub and b/prs/9277/lib/observer-2.17/doc/html/observer.epub differ diff --git a/prs/9277/lib/observer-2.17/doc/html/ttb.html b/prs/9277/lib/observer-2.17/doc/html/ttb.html index c47d33c009ea4..42591f45f0a62 100644 --- a/prs/9277/lib/observer-2.17/doc/html/ttb.html +++ b/prs/9277/lib/observer-2.17/doc/html/ttb.html @@ -1930,13 +1930,13 @@

    seq_trigger_ms(Flags)

    is "contaminated" with token seq_trace.

    If Flags = all, all possible flags are set.

    The possible values for SeqTraceFlag are available in seq_trace.

    For a description of the match_spec() syntax, see section Match Specifications in Erlang in ERTS, which explains the general match specification "language".

    Note

    The system tracer for sequential tracing is automatically initiated by ttb -when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)6> ttb:p(all,call).
    -{ok,{[all],[call]}}
    -(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    -{ok,[{matched,1},{saved,1}]}
    -(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the +when a trace port is started with ttb:tracer/0,1,2.

    An example of how to use function seq_trigger_ms/0,1 follows:

    (tiger@durin)5> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)6> ttb:p(all,call).
    +{ok,{[all],[call]}}
    +(tiger@durin)7> ttb:tp(mod,func,ttb:seq_trigger_ms()).
    +{ok,[{matched,1},{saved,1}]}
    +(tiger@durin)8>

    Whenever mod:func(...) is called after this, token seq_trace is set on the executing process.

    @@ -1975,14 +1975,14 @@

    start_trace(Nodes, Patterns, FlagSpec, Trac

    This function is a shortcut allowing to start a trace with one command. Each tuple in Patterns is converted to a list, which in turn is passed to -ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    -                  [{mod, foo, []}, {mod, bar, 2}],
    -                  {all, call},
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    -                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    -ttb:tpl(mod, foo, []),
    -ttb:tpl(mod, bar, 2, []),
    -ttb:p(all, call).
    +ttb:tpl/2,3,4.

    The call:

    > ttb:start_trace([Node, OtherNode],
    +                  [{mod, foo, []}, {mod, bar, 2}],
    +                  {all, call},
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]).

    is equivalent to:

    > ttb:start_trace([Node, OtherNode],
    +                  [{file, File}, {handler,{fun myhandler/4, S}}]),
    +ttb:tpl(mod, foo, []),
    +ttb:tpl(mod, bar, 2, []),
    +ttb:p(all, call).
    diff --git a/prs/9277/lib/observer-2.17/doc/html/ttb_ug.html b/prs/9277/lib/observer-2.17/doc/html/ttb_ug.html index e4cfe4da36630..f866cf19e5bf6 100644 --- a/prs/9277/lib/observer-2.17/doc/html/ttb_ug.html +++ b/prs/9277/lib/observer-2.17/doc/html/ttb_ug.html @@ -172,56 +172,56 @@

    Tracing Local Node from Erlang Shell

    -

    The following small module is used in the subsequent example:

    -module(m).
    --export([f/0]).
    -f() ->
    +

    The following small module is used in the subsequent example:

    -module(m).
    +-export([f/0]).
    +f() ->
        receive
    -      From when is_pid(From) ->
    -         Now = erlang:now(),
    -         From ! {self(),Now}
    +      From when is_pid(From) ->
    +         Now = erlang:now(),
    +         From ! {self(),Now}
        end.

    The following example shows the basic use of ttb from the Erlang shell. Default options are used both for starting the tracer and for formatting (the custom fetch directory is however provided). This gives a trace log named Node-ttb in the newly created directory, where Node is the node name. The default handler prints the formatted trace messages in the shell:

    (tiger@durin)47> %% First I spawn a process running my test function
    -(tiger@durin)47> Pid = spawn(m,f,[]).
    +(tiger@durin)47> Pid = spawn(m,f,[]).
     <0.125.0>
    -(tiger@durin)48>
    +(tiger@durin)48>
     (tiger@durin)48> %% Then I start a tracer...
    -(tiger@durin)48> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)49>
    +(tiger@durin)48> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)49>
     (tiger@durin)49> %% and activate the new process for tracing
     (tiger@durin)49> %% function calls and sent messages.
    -(tiger@durin)49> ttb:p(Pid,[call,send]).
    -{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    -(tiger@durin)50>
    +(tiger@durin)49> ttb:p(Pid,[call,send]).
    +{ok,[{<0.125.0>,[{matched,tiger@durin,1}]}]}
    +(tiger@durin)50>
     (tiger@durin)50> %% Here I set a trace pattern on erlang:now/0
     (tiger@durin)50> %% The trace pattern is a simple match spec
     (tiger@durin)50> %% indicating that the return value should be
     (tiger@durin)50> %% traced. Refer to the reference_manual for
     (tiger@durin)50> %% the full list of match spec shortcuts
     (tiger@durin)50> %% available.
    -(tiger@durin)51> ttb:tp(erlang,now,return).
    -{ok,[{matched,tiger@durin,1},{saved,1}]}
    -(tiger@durin)52>
    +(tiger@durin)51> ttb:tp(erlang,now,return).
    +{ok,[{matched,tiger@durin,1},{saved,1}]}
    +(tiger@durin)52>
     (tiger@durin)52> %% I run my test (i.e. send a message to
     (tiger@durin)52> %% my new process)
    -(tiger@durin)52> Pid ! self().
    +(tiger@durin)52> Pid ! self().
     <0.72.0>
    -(tiger@durin)53>
    +(tiger@durin)53>
     (tiger@durin)53> %% And then I have to stop ttb in order to flush
     (tiger@durin)53> %% the trace port buffer
    -(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    -{stopped, "fetch"}
    -(tiger@durin)54>
    +(tiger@durin)53> ttb:stop([return, {fetch_dir, "fetch"}]).
    +{stopped, "fetch"}
    +(tiger@durin)54>
     (tiger@durin)54> %% Finally I format my trace log
    -(tiger@durin)54> ttb:format("fetch").
    -({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    -({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    -{1031,133451,667611}
    -({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    -{<0.125.0>,{1031,133451,667611}}
    +(tiger@durin)54> ttb:format("fetch").
    +({<0.125.0>,{m,f,0},tiger@durin}) call erlang:now()
    +({<0.125.0>,{m,f,0},tiger@durin}) returned from erlang:now/0 ->
    +{1031,133451,667611}
    +({<0.125.0>,{m,f,0},tiger@durin}) <0.72.0> !
    +{<0.125.0>,{1031,133451,667611}}
     ok

    @@ -229,65 +229,65 @@

    Build Your Own Tool

    The following example shows a simple tool for "debug tracing", that is, tracing -of function calls with return values:

    -module(mydebug).
    --export([start/0,trc/1,stop/0,format/1]).
    --export([print/4]).
    +of function calls with return values:

    -module(mydebug).
    +-export([start/0,trc/1,stop/0,format/1]).
    +-export([print/4]).
     %% Include ms_transform.hrl so that I can use dbg:fun2ms/2 to
     %% generate match specifications.
    --include_lib("stdlib/include/ms_transform.hrl").
    +-include_lib("stdlib/include/ms_transform.hrl").
     %%% -------------Tool API-------------
     %%% ----------------------------------
     %%% Star the "mydebug" tool
    -start() ->
    +start() ->
         %% The options specify that the binary log shall be named
         %% <Node>-debug_log and that the print/4 function in this
         %% module shall be used as format handler
    -    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
    +    ttb:tracer(all,[{file,"debug_log"},{handler,{{?MODULE,print},0}}]),
         %% All processes (existing and new) shall trace function calls
         %% We want trace messages to be sorted upon format, which requires
         %% timestamp flag. The flag is however enabled by default in ttb.
    -    ttb:p(all,call).
    +    ttb:p(all,call).
     
     %%% Set trace pattern on function(s)
    -trc(M) when is_atom(M) ->
    -    trc({M,'_','_'});
    -trc({M,F}) when is_atom(M), is_atom(F) ->
    -    trc({M,F,'_'});
    -trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
    +trc(M) when is_atom(M) ->
    +    trc({M,'_','_'});
    +trc({M,F}) when is_atom(M), is_atom(F) ->
    +    trc({M,F,'_'});
    +trc({M,F,_A}=MFA) when is_atom(M), is_atom(F) ->
         %% This match spec shortcut specifies that return values shall
         %% be traced.
    -    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    -    ttb:tpl(MFA,MatchSpec).
    +    MatchSpec = dbg:fun2ms(fun(_) -> return_trace() end),
    +    ttb:tpl(MFA,MatchSpec).
     
     %%% Format a binary trace log
    -format(Dir) ->
    -    ttb:format(Dir).
    +format(Dir) ->
    +    ttb:format(Dir).
     
     %%% Stop the "mydebug" tool
    -stop() ->
    -    ttb:stop(return).
    +stop() ->
    +    ttb:stop(return).
     
     %%% --------Internal functions--------
     %%% ----------------------------------
     %%% Format handler
    -print(_Out,end_of_trace,_TI,N) ->
    +print(_Out,end_of_trace,_TI,N) ->
         N;
    -print(Out,Trace,_TI,N) ->
    -    do_print(Out,Trace,N),
    +print(Out,Trace,_TI,N) ->
    +    do_print(Out,Trace,N),
         N+1.
     
    -do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    -    io:format(Out,
    +do_print(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
    +    io:format(Out,
                   "~w: ~w, ~w:~n"
                   "Call      : ~w:~w/~w~n"
                   "Arguments :~p~n~n",
    -              [N,Ts,P,M,F,length(A),A]);
    -do_print(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) ->
    -    io:format(Out,
    +              [N,Ts,P,M,F,length(A),A]);
    +do_print(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) ->
    +    io:format(Out,
                   "~w: ~w, ~w:~n"
                   "Return from  : ~w:~w/~w~n"
                   "Return value :~p~n~n",
    -              [N,Ts,P,M,F,A,R]).

    To distinguish trace logs produced with this tool from other logs, option file + [N,Ts,P,M,F,A,R]).

    To distinguish trace logs produced with this tool from other logs, option file is used in tracer/2. The logs are therefore fetched to a directory named ttb_upload_debug_log-YYYYMMDD-HHMMSS

    By using option handler when starting the tracer, the information about how to format the file is stored in the trace information file (.ti). This is not @@ -319,9 +319,9 @@

    If the traced node is diskless, ttb must be started from a trace control node with disk access, and option file must be specified to function tracer/2 -with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    -                                   {file,{local,{wrap,"mytrace"}}}).
    -{ok,[mynode@diskless]}

    +with value {local, File}, for example:

    (trace_control@durin)1> ttb:tracer(mynode@diskless,
    +                                   {file,{local,{wrap,"mytrace"}}}).
    +{ok,[mynode@diskless]}

    @@ -341,10 +341,10 @@

    Opts as argument.

    The timer is started with ttb:p/2, so any trace patterns must be set up in advance. ttb:start_trace/4 always sets up all patterns before invoking ttb:p/2.

    The following example shows how to set up a trace that is automatically stopped -and formatted after 5 seconds:

    (tiger@durin)1> ttb:start_trace([node()],
    -                                [{erlang, now,[]}],
    -                                {all, call},
    -                                [{timer, {5000, format}}]).

    Note

    Because of network and processing delays, the period of tracing is +and formatted after 5 seconds:

    (tiger@durin)1> ttb:start_trace([node()],
    +                                [{erlang, now,[]}],
    +                                {all, call},
    +                                [{timer, {5000, format}}]).

    Note

    Because of network and processing delays, the period of tracing is approximate.

    @@ -361,22 +361,22 @@

    once overload protection is activated in one of the traced nodes. This is to avoid trace setup being inconsistent between nodes.

    Module:Function provided with option overload must handle three calls: init, check, and stop. init and stop allow some setup and teardown -required by the check. An overload check module can look as follows:

    -module(overload).
    --export([check/1]).
    -
    -check(init) ->
    -    Pid = sophisticated_module:start(),
    -    put(pid, Pid);
    -check(check) ->
    -    get(pid) ! is_overloaded,
    +required by the check. An overload check module can look as follows:

    -module(overload).
    +-export([check/1]).
    +
    +check(init) ->
    +    Pid = sophisticated_module:start(),
    +    put(pid, Pid);
    +check(check) ->
    +    get(pid) ! is_overloaded,
         receive
             Reply ->
                 Reply
         after 5000 ->
                 true
         end;
    -check(stop) ->
    -    get(pid) ! stop.

    Note

    check is always called by the same process, so put and get are possible.

    +check(stop) -> + get(pid) ! stop.

    Note

    check is always called by the same process, so put and get are possible.

    @@ -397,24 +397,24 @@

    behaviour (that is, on diskless nodes) by specifying their own module to handle autostart data storage and retrieval (ttb_autostart_module environment variable of runtime_tools). For information about the API, see module ttb. -The following example shows the default handler:

    -module(ttb_autostart).
    --export([read_config/0,
    +The following example shows the default handler:

    -module(ttb_autostart).
    +-export([read_config/0,
              write_config/1,
    -         delete_config/0]).
    +         delete_config/0]).
     
    --define(AUTOSTART_FILENAME, "ttb_autostart.bin").
    +-define(AUTOSTART_FILENAME, "ttb_autostart.bin").
     
    -delete_config() ->
    -    file:delete(?AUTOSTART_FILENAME).
    +delete_config() ->
    +    file:delete(?AUTOSTART_FILENAME).
     
    -read_config() ->
    -    case file:read_file(?AUTOSTART_FILENAME) of
    -        {ok, Data} -> {ok, binary_to_term(Data)};
    +read_config() ->
    +    case file:read_file(?AUTOSTART_FILENAME) of
    +        {ok, Data} -> {ok, binary_to_term(Data)};
             Error      -> Error
         end.
     
    -write_config(Data) ->
    -    file:write_file(?AUTOSTART_FILENAME, term_to_binary(Data)).

    Note

    Remember that file trace ports buffer the data by default. If the node +write_config(Data) -> + file:write_file(?AUTOSTART_FILENAME, term_to_binary(Data)).

    Note

    Remember that file trace ports buffer the data by default. If the node crashes, trace messages are not flushed to the binary log. If the risk of failure is high, it can be a good idea to flush the buffers every now and then automatically. Passing {flush, MSec} as an option of ttb:tracer/2 flushes @@ -483,22 +483,22 @@

    default handler is used, which prints each trace message as a text line.

  • disable_sort - Indicates that the logs are not to be merged according to time-stamp, but processed one file after another (this can be a bit faster).

  • A format handler is a fun taking four arguments. This fun is called for each trace message in the binary log(s). A simple example that only prints each trace -message can be as follows:

    fun(Fd, Trace, _TraceInfo, State) ->
    -   io:format(Fd, "Trace: ~p~n", [Trace]),
    +message can be as follows:

    fun(Fd, Trace, _TraceInfo, State) ->
    +   io:format(Fd, "Trace: ~p~n", [Trace]),
        State
     end.

    Here, Fd is the file descriptor for the destination file, or the atom standard_io. _TraceInfo contains information from the trace information file (see section Trace Information and File .ti). State is a state variable for the format handler fun. The initial value of variable -State is specified with the handler option, for example:

    ttb:format("tiger@durin-ttb", [{handler, {{Mod,Fun}, initial_state}}])
    +State is specified with the handler option, for example:

    ttb:format("tiger@durin-ttb", [{handler, {{Mod,Fun}, initial_state}}])
                                                          ^^^^^^^^^^^^^

    Another format handler can be used to calculate the time spent by the garbage -collector:

    fun(_Fd,{trace_ts,P,gc_start,_Info,StartTs},_TraceInfo,State) ->
    -      [{P,StartTs}|State];
    -   (Fd,{trace_ts,P,gc_end,_Info,EndTs},_TraceInfo,State) ->
    -      {value,{P,StartTs}} = lists:keysearch(P,1,State),
    -      Time = diff(StartTs,EndTs),
    -      io:format("GC in process ~w: ~w milliseconds~n", [P,Time]),
    -      State -- [{P,StartTs}]
    +collector:

    fun(_Fd,{trace_ts,P,gc_start,_Info,StartTs},_TraceInfo,State) ->
    +      [{P,StartTs}|State];
    +   (Fd,{trace_ts,P,gc_end,_Info,EndTs},_TraceInfo,State) ->
    +      {value,{P,StartTs}} = lists:keysearch(P,1,State),
    +      Time = diff(StartTs,EndTs),
    +      io:format("GC in process ~w: ~w milliseconds~n", [P,Time]),
    +      State -- [{P,StartTs}]
     end

    A more refined version of this format handler is function handle_gc/4 in module multitrace.erl included in directory src of the Observer application.

    The trace message is passed as the second argument (Trace). The possible values of Trace are the following:

    • All trace messages described in erlang:trace/3
    • {drop, N} if IP tracer is used (see dbg:trace_port/2)
    • end_of_trace received once when all trace messages are processed

    By giving the format handler ttb:get_et_handler(), @@ -508,19 +508,19 @@

    directory, but analyze single files instead. To do so, a single file (or list of files) must be passed as the first argument to format/1,2.

    Wrap logs can be formatted one by one or all at once. To format one of the wrap logs in a set, specify the exact file name. To format the whole set of wrap -logs, specify the name with * instead of the wrap count.

    Example:

    Start tracing:

    (tiger@durin)1> ttb:tracer(node(),{file,{wrap,"trace"}}).
    -{ok,[tiger@durin]}
    -(tiger@durin)2> ttb:p(...)
    +logs, specify the name with * instead of the wrap count.

    Example:

    Start tracing:

    (tiger@durin)1> ttb:tracer(node(),{file,{wrap,"trace"}}).
    +{ok,[tiger@durin]}
    +(tiger@durin)2> ttb:p(...)
     ...

    This gives a set of binary logs, for example:

    tiger@durin-trace.0.wrp
     tiger@durin-trace.1.wrp
     tiger@durin-trace.2.wrp
    -...

    Format the whole set of logs:

    1> ttb:format("tiger@durin-trace.*.wrp").
    +...

    Format the whole set of logs:

    1> ttb:format("tiger@durin-trace.*.wrp").
     ....
     ok
    -2>

    Format only the first log:

    1> ttb:format("tiger@durin-trace.0.wrp").
    +2>

    Format only the first log:

    1> ttb:format("tiger@durin-trace.0.wrp").
     ....
     ok
    -2>

    To merge all wrap logs from two nodes:

    1> ttb:format(["tiger@durin-trace.*.wrp","lion@durin-trace.*.wrp"]).
    +2>

    To merge all wrap logs from two nodes:

    1> ttb:format(["tiger@durin-trace.*.wrp","lion@durin-trace.*.wrp"]).
     ....
     ok
     2>

    @@ -547,8 +547,8 @@

    obtained using both the call and return_to flags when tracing. Notice that flag return_to only works with local call trace, that is, when trace patterns are set with ttb:tpl.

    The same result can be obtained by using the flag call only and setting a -match specification on local or global function calls as follows:

    1> dbg:fun2ms(fun(_) -> return_trace(),message(caller()) end).
    -[{'_',[],[{return_trace},{message,{caller}}]}]

    This must however be done with care, as function {return_trace} in the match +match specification on local or global function calls as follows:

    1> dbg:fun2ms(fun(_) -> return_trace(),message(caller()) end).
    +[{'_',[],[{return_trace},{message,{caller}}]}]

    This must however be done with care, as function {return_trace} in the match specification destroys tail recursiveness.

    The modules filter shows each module as a vertical line in the sequence diagram. External function calls/returns are shown as interactions between modules, and internal function calls/returns are shown as activities within a @@ -556,42 +556,42 @@

    diagram. A function calling itself is shown as an activity within a function, and all other function calls are shown as interactions between functions.

    The mods_and_procs and funcs_and_procs filters are equivalent to the modules and functions filters respectively, except that each module or -function can have many vertical lines, one for each process it resides on.

    In the following example, modules foo and bar are used:

    -module(foo).
    --export([start/0,go/0]).
    +function can have many vertical lines, one for each process it resides on.

    In the following example, modules foo and bar are used:

    -module(foo).
    +-export([start/0,go/0]).
     
    -start() ->
    -    spawn(?MODULE, go, []).
    +start() ->
    +    spawn(?MODULE, go, []).
     
    -go() ->
    +go() ->
         receive
             stop ->
                 ok;
             go ->
    -            bar:f1(),
    -            go()
    -    end.
    -module(bar).
    --export([f1/0,f3/0]).
    -f1() ->
    -    f2(),
    +            bar:f1(),
    +            go()
    +    end.
    -module(bar).
    +-export([f1/0,f3/0]).
    +f1() ->
    +    f2(),
         ok.
    -f2() ->
    -    spawn(?MODULE,f3,[]).
    -f3() ->
    +f2() ->
    +    spawn(?MODULE,f3,[]).
    +f3() ->
         ok.

    Setting up the trace:

    (tiger@durin)1> %%First we retrieve the Pid to limit traced processes set
    -(tiger@durin)1> Pid = foo:start().
    +(tiger@durin)1> Pid = foo:start().
     (tiger@durin)2> %%Now we set up tracing
    -(tiger@durin)2> ttb:tracer().
    -(tiger@durin)3> ttb:p(Pid, [call, return_to, procs, set_on_spawn]).
    -(tiger@durin)4> ttb:tpl(bar, []).
    +(tiger@durin)2> ttb:tracer().
    +(tiger@durin)3> ttb:p(Pid, [call, return_to, procs, set_on_spawn]).
    +(tiger@durin)4> ttb:tpl(bar, []).
     (tiger@durin)5> %%Invoke our test function and see output with et viewer
     (tiger@durin)5> Pid ! go.
    -(tiger@durin)6> ttb:stop({format, {handler, ttb:get_et_handler()}}).

    This renders a result similar to the following:

    Filter: "processes"

    Filter: "mods_and_procs"

    Notice that function ttb:start_trace/4 can be used as help as follows:

    (tiger@durin)1> Pid = foo:start().
    -(tiger@durin)2> ttb:start_trace([node()],
    -                                [{bar,[]}],
    -                                {Pid, [call, return_to, procs, set_on_spawn]}
    -                                {handler, ttb:get_et_handler()}).
    +(tiger@durin)6> ttb:stop({format, {handler, ttb:get_et_handler()}}).

    This renders a result similar to the following:

    Filter: "processes"

    Filter: "mods_and_procs"

    Notice that function ttb:start_trace/4 can be used as help as follows:

    (tiger@durin)1> Pid = foo:start().
    +(tiger@durin)2> ttb:start_trace([node()],
    +                                [{bar,[]}],
    +                                {Pid, [call, return_to, procs, set_on_spawn]}
    +                                {handler, ttb:get_et_handler()}).
     (tiger@durin)3> Pid ! go.
    -(tiger@durin)4> ttb:stop(format).

    +(tiger@durin)4> ttb:stop(format).

    @@ -632,76 +632,76 @@

    of {Module,Function,Args}.

    Any existing file ConfigFile is deleted and a new file is created when write_config/2 is called. Option append can be used to add something at the end of an existing configuration file, for example, -ttb:write_config(ConfigFile,What,[append]).

    Example:

    See the content of the history buffer:

    (tiger@durin)191> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)192> ttb:p(self(),[garbage_collection,call]).
    -{ok,{[<0.1244.0>],[garbage_collection,call]}}
    -(tiger@durin)193> ttb:tp(ets,new,2,[]).
    -{ok,[{matched,1}]}
    -(tiger@durin)194> ttb:list_history().
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}}]

    Execute an entry from the history buffer:

    (tiger@durin)195> ttb:ctp(ets,new,2).
    -{ok,[{matched,1}]}
    -(tiger@durin)196> ttb:list_history().
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}}]
    -(tiger@durin)197> ttb:run_history(3).
    -ttb:tp(ets,new,2,[]) ->
    -{ok,[{matched,1}]}

    Write the content of the history buffer to a configuration file:

    (tiger@durin)198> ttb:write_config("myconfig",all).
    +ttb:write_config(ConfigFile,What,[append]).

    Example:

    See the content of the history buffer:

    (tiger@durin)191> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)192> ttb:p(self(),[garbage_collection,call]).
    +{ok,{[<0.1244.0>],[garbage_collection,call]}}
    +(tiger@durin)193> ttb:tp(ets,new,2,[]).
    +{ok,[{matched,1}]}
    +(tiger@durin)194> ttb:list_history().
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}}]

    Execute an entry from the history buffer:

    (tiger@durin)195> ttb:ctp(ets,new,2).
    +{ok,[{matched,1}]}
    +(tiger@durin)196> ttb:list_history().
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}}]
    +(tiger@durin)197> ttb:run_history(3).
    +ttb:tp(ets,new,2,[]) ->
    +{ok,[{matched,1}]}

    Write the content of the history buffer to a configuration file:

    (tiger@durin)198> ttb:write_config("myconfig",all).
     ok
    -(tiger@durin)199> ttb:list_config("myconfig").
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}},
    - {5,{ttb,tp,[ets,new,2,[]]}}]

    Extend an existing configuration:

    (tiger@durin)200> ttb:write_config("myconfig",[{ttb,tp,[ets,delete,1,[]]}],
    -[append]).
    +(tiger@durin)199> ttb:list_config("myconfig").
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}},
    + {5,{ttb,tp,[ets,new,2,[]]}}]

    Extend an existing configuration:

    (tiger@durin)200> ttb:write_config("myconfig",[{ttb,tp,[ets,delete,1,[]]}],
    +[append]).
     ok
    -(tiger@durin)201> ttb:list_config("myconfig").
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}},
    - {5,{ttb,tp,[ets,new,2,[]]}},
    - {6,{ttb,tp,[ets,delete,1,[]]}}]

    Go back to a previous configuration after stopping Trace Tool Builder:

    (tiger@durin)202> ttb:stop().
    +(tiger@durin)201> ttb:list_config("myconfig").
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}},
    + {5,{ttb,tp,[ets,new,2,[]]}},
    + {6,{ttb,tp,[ets,delete,1,[]]}}]

    Go back to a previous configuration after stopping Trace Tool Builder:

    (tiger@durin)202> ttb:stop().
     ok
    -(tiger@durin)203> ttb:run_config("myconfig").
    -ttb:tracer(tiger@durin,[]) ->
    -{ok,[tiger@durin]}
    +(tiger@durin)203> ttb:run_config("myconfig").
    +ttb:tracer(tiger@durin,[]) ->
    +{ok,[tiger@durin]}
     
    -ttb:p(<0.1244.0>,[garbage_collection,call]) ->
    -{ok,{[<0.1244.0>],[garbage_collection,call]}}
    +ttb:p(<0.1244.0>,[garbage_collection,call]) ->
    +{ok,{[<0.1244.0>],[garbage_collection,call]}}
     
    -ttb:tp(ets,new,2,[]) ->
    -{ok,[{matched,1}]}
    +ttb:tp(ets,new,2,[]) ->
    +{ok,[{matched,1}]}
     
    -ttb:ctp(ets,new,2) ->
    -{ok,[{matched,1}]}
    +ttb:ctp(ets,new,2) ->
    +{ok,[{matched,1}]}
     
    -ttb:tp(ets,new,2,[]) ->
    -{ok,[{matched,1}]}
    +ttb:tp(ets,new,2,[]) ->
    +{ok,[{matched,1}]}
     
    -ttb:tp(ets,delete,1,[]) ->
    -{ok,[{matched,1}]}
    +ttb:tp(ets,delete,1,[]) ->
    +{ok,[{matched,1}]}
     
    -ok

    Write selected entries from the history buffer to a configuration file:

    (tiger@durin)204> ttb:list_history().
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,ctp,[ets,new,2]}},
    - {5,{ttb,tp,[ets,new,2,[]]}},
    - {6,{ttb,tp,[ets,delete,1,[]]}}]
    -(tiger@durin)205> ttb:write_config("myconfig",[1,2,3,6]).
    +ok

    Write selected entries from the history buffer to a configuration file:

    (tiger@durin)204> ttb:list_history().
    +[{1,{ttb,tracer,[tiger@durin,[]]}},
    + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    + {3,{ttb,tp,[ets,new,2,[]]}},
    + {4,{ttb,ctp,[ets,new,2]}},
    + {5,{ttb,tp,[ets,new,2,[]]}},
    + {6,{ttb,tp,[ets,delete,1,[]]}}]
    +(tiger@durin)205> ttb:write_config("myconfig",[1,2,3,6]).
     ok
    -(tiger@durin)206> ttb:list_config("myconfig").
    -[{1,{ttb,tracer,[tiger@durin,[]]}},
    - {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}},
    - {3,{ttb,tp,[ets,new,2,[]]}},
    - {4,{ttb,tp,[ets,delete,1,[]]}}]
    -(tiger@durin)207>

    +(tiger@durin)206> ttb:list_config("myconfig"). +[{1,{ttb,tracer,[tiger@durin,[]]}}, + {2,{ttb,p,[<0.1244.0>,[garbage_collection,call]]}}, + {3,{ttb,tp,[ets,new,2,[]]}}, + {4,{ttb,tp,[ets,delete,1,[]]}}] +(tiger@durin)207>

    @@ -714,40 +714,40 @@

    ttb:tracer/0,1,2. Sequential tracing can then be started in either of the following ways:

    Example 1:

    In the following example, function dbg:get_tracer/0 is used as trigger for -sequential tracing:

    (tiger@durin)110> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)111> ttb:p(self(),call).
    -{ok,{[<0.158.0>],[call]}}
    -(tiger@durin)112> ttb:tp(dbg,get_tracer,0,ttb:seq_trigger_ms(send)).
    -{ok,[{matched,1},{saved,1}]}
    -(tiger@durin)113> dbg:get_tracer(), seq_trace:reset_trace().
    +sequential tracing:

    (tiger@durin)110> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)111> ttb:p(self(),call).
    +{ok,{[<0.158.0>],[call]}}
    +(tiger@durin)112> ttb:tp(dbg,get_tracer,0,ttb:seq_trigger_ms(send)).
    +{ok,[{matched,1},{saved,1}]}
    +(tiger@durin)113> dbg:get_tracer(), seq_trace:reset_trace().
     true
    -(tiger@durin)114> ttb:stop(format).
    -({<0.158.0>,{shell,evaluator,3},tiger@durin}) call dbg:get_tracer()
    -SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    -{<0.237.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    -[Serial: {0,1}]
    -SeqTrace [0]: ({<0.237.0>,dbg,tiger@durin})
    -{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.222>}}
    -[Serial: {1,2}]
    +(tiger@durin)114> ttb:stop(format).
    +({<0.158.0>,{shell,evaluator,3},tiger@durin}) call dbg:get_tracer()
    +SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    +{<0.237.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    +[Serial: {0,1}]
    +SeqTrace [0]: ({<0.237.0>,dbg,tiger@durin})
    +{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.222>}}
    +[Serial: {1,2}]
     ok
    -(tiger@durin)116>

    Example 2:

    Starting sequential tracing with a trigger is more useful if the trigger +(tiger@durin)116>

    Example 2:

    Starting sequential tracing with a trigger is more useful if the trigger function is not called directly from the shell, but rather implicitly within a larger system. When calling a function from the shell, it is simpler to start -sequential tracing directly, for example, as follows:

    (tiger@durin)116> ttb:tracer().
    -{ok,[tiger@durin]}
    -(tiger@durin)117> seq_trace:set_token(send,true), dbg:get_tracer(),
    -seq_trace:reset_trace().
    +sequential tracing directly, for example, as follows:

    (tiger@durin)116> ttb:tracer().
    +{ok,[tiger@durin]}
    +(tiger@durin)117> seq_trace:set_token(send,true), dbg:get_tracer(),
    +seq_trace:reset_trace().
     true
    -(tiger@durin)118> ttb:stop(format).
    -SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    -{<0.246.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    -[Serial: {0,1}]
    -SeqTrace [0]: ({<0.246.0>,dbg,tiger@durin})
    -{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.229>}}
    -[Serial: {1,2}]
    +(tiger@durin)118> ttb:stop(format).
    +SeqTrace [0]: ({<0.158.0>,{shell,evaluator,3},tiger@durin})
    +{<0.246.0>,dbg,tiger@durin} ! {<0.158.0>,{get_tracer,tiger@durin}}
    +[Serial: {0,1}]
    +SeqTrace [0]: ({<0.246.0>,dbg,tiger@durin})
    +{<0.158.0>,{shell,evaluator,3},tiger@durin} ! {dbg,{ok,#Port<0.229>}}
    +[Serial: {1,2}]
     ok
    -(tiger@durin)120>

    In both previous examples, seq_trace:reset_trace/0 resets the trace token +(tiger@durin)120>

    In both previous examples, seq_trace:reset_trace/0 resets the trace token immediately after the traced function to avoid many trace messages because of the printouts in the Erlang shell.

    All functions in module seq_trace, except set_system_tracer/1, can be used after the trace port is started with ttb:tracer/0,1,2.

    diff --git a/prs/9277/lib/odbc-2.15/doc/html/getting_started.html b/prs/9277/lib/odbc-2.15/doc/html/getting_started.html index d67065fd305ff..23ea876f46853 100644 --- a/prs/9277/lib/odbc-2.15/doc/html/getting_started.html +++ b/prs/9277/lib/odbc-2.15/doc/html/getting_started.html @@ -157,77 +157,77 @@

    relevance to anything that exist in reality, it is just a simple example. The example was created using sqlserver 7.0 with servicepack 1 as database and the ODBC driver for sqlserver with version 2000.80.194.00.

     1 > odbc:start().
    -      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    -      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
    +      ok

    Connect to the database

     2 > {ok, Ref} = odbc:connect("DSN=sql-server;UID=aladdin;PWD=sesame", []).
    +      {ok,<0.342.0>}

    Create a table

     3 > odbc:sql_query(Ref, "CREATE TABLE EMPLOYEE (NR integer,
           FIRSTNAME  char varying(20), LASTNAME  char varying(20), GENDER char(1),
           PRIMARY KEY(NR))").
           {updated,undefined}

    Insert some data

     4 > odbc:sql_query(Ref, "INSERT INTO EMPLOYEE VALUES(1, 'Jane', 'Doe', 'F')").
           {updated,1}

    Check what data types the database assigned for the columns. Hopefully this is not a surprise, some times it can be! These are the data types that you should -use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    -      {ok, [{"NR", sql_integer},
    -            {"FIRSTNAME", {sql_varchar, 20}},
    -            {"LASTNAME", {sql_varchar, 20}}
    -            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
    +use if you want to do a parameterized query.

     5 > odbc:describe_table(Ref, "EMPLOYEE").
    +      {ok, [{"NR", sql_integer},
    +            {"FIRSTNAME", {sql_varchar, 20}},
    +            {"LASTNAME", {sql_varchar, 20}}
    +            {"GENDER", {sql_char, 1}}]}

    Use a parameterized query to insert many rows in one go.

     6 > odbc:param_query(Ref,"INSERT INTO EMPLOYEE (NR, FIRSTNAME, "
                       "LASTNAME, GENDER) VALUES(?, ?, ?, ?)",
    -                   [{sql_integer,[2,3,4,5,6,7,8]},
    -                    {{sql_varchar, 20},
    -                             ["John", "Monica", "Ross", "Rachel",
    -                             "Piper", "Prue", "Louise"]},
    -                   {{sql_varchar, 20},
    -                             ["Doe","Geller","Geller", "Green",
    -                              "Halliwell", "Halliwell", "Lane"]},
    -                   {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]).
    -      {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    -    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -          [{1,"Jane","Doe","F"},
    -           {2,"John","Doe","M"},
    -           {3,"Monica","Geller","F"},
    -           {4,"Ross","Geller","M"},
    -           {5,"Rachel","Green","F"},
    -           {6,"Piper","Halliwell","F"},
    -           {7,"Prue","Halliwell","F"},
    -           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. -The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    -      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and -can do things like this.

     11 > odbc:last(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    -     {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Monica",3},
    -           {"Rachel",5},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on -the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    -      ORDER BY FIRSTNAME").
    -    {selected,["FIRSTNAME","NR"],
    -          [{"Jane",1},
    -           {"Louise",8},
    -           {"Monica",3},
    -           {"Piper",6},
    -           {"Prue",7},
    -           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all + [{sql_integer,[2,3,4,5,6,7,8]}, + {{sql_varchar, 20}, + ["John", "Monica", "Ross", "Rachel", + "Piper", "Prue", "Louise"]}, + {{sql_varchar, 20}, + ["Doe","Geller","Geller", "Green", + "Halliwell", "Halliwell", "Lane"]}, + {{sql_char, 1}, ["M","F","M","F","F","F","F"]}]). + {updated, 7}

    Fetch all data in the table employee

     7> odbc:sql_query(Ref, "SELECT * FROM EMPLOYEE").
    +    {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +          [{1,"Jane","Doe","F"},
    +           {2,"John","Doe","M"},
    +           {3,"Monica","Geller","F"},
    +           {4,"Ross","Geller","M"},
    +           {5,"Rachel","Green","F"},
    +           {6,"Piper","Halliwell","F"},
    +           {7,"Prue","Halliwell","F"},
    +           {8,"Louise","Lane","F"}]]}

    Associate a result set containing the whole table EMPLOYEE to the connection. +The number of rows in the result set is returned.

     8 > odbc:select_count(Ref, "SELECT * FROM EMPLOYEE").
    +      {ok,8}

    You can always traverse the result set sequential by using next

     9 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     10 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    If your driver supports scrollable cursors you have a little more freedom, and +can do things like this.

     11 > odbc:last(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{8,"Louise","Lane","F"}]}
     12 > odbc:prev(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{7,"Prue","Halliwell","F"}]}
     13 > odbc:first(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{1,"Jane","Doe","F"}]}
     14 > odbc:next(Ref).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],[{2,"John","Doe","M"}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees

     15 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    +     {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Monica",3},
    +           {"Rachel",5},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Louise",8}]}

    Fetch the fields FIRSTNAMEand NRfor all female employees and sort them on +the field FIRSTNAME.

     16 > odbc:sql_query(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'
    +      ORDER BY FIRSTNAME").
    +    {selected,["FIRSTNAME","NR"],
    +          [{"Jane",1},
    +           {"Louise",8},
    +           {"Monica",3},
    +           {"Piper",6},
    +           {"Prue",7},
    +           {"Rachel",5}]}

    Associate a result set that contains the fields FIRSTNAME and NRfor all female employees to the connection. The number of rows in the result set is -returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    -      {ok,6}

    A few more ways of retrieving parts of the result set when the driver supports +returned.

     17 > odbc:select_count(Ref, "SELECT FIRSTNAME, NR FROM EMPLOYEE WHERE GENDER = 'F'").
    +      {ok,6}

    A few more ways of retrieving parts of the result set when the driver supports scrollable cursors. Note that next will work even without support for scrollable -cursors.

     18 > odbc:select(Ref, {relative, 2}, 3).
    -    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    -      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    -    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    -      {selected,["FIRSTNAME","NR"],
    -                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    -      [{{sql_char, 1}, ["M"]}]).
    -      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    -                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    -      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
    +cursors.

     18 > odbc:select(Ref, {relative, 2}, 3).
    +    {selected,["FIRSTNAME","NR"],[{"Monica",3},{"Rachel",5},{"Piper",6}]}
     19 > odbc:select(Ref, next, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Prue",7},{"Louise",8}]}
     20 > odbc:select(Ref, {absolute, 1}, 2).
    +      {selected,["FIRSTNAME","NR"],[{"Jane",1},{"Monica",3}]}
     21 > odbc:select(Ref, next, 2).
    +    {selected,["FIRSTNAME","NR"],[{"Rachel",5},{"Piper",6}]}
     22 > odbc:select(Ref, {absolute, 1}, 4).
    +      {selected,["FIRSTNAME","NR"],
    +                [{"Jane",1},{"Monica",3},{"Rachel",5},{"Piper",6}]}

    Select, using a parameterized query.

     23 > odbc:param_query(Ref, "SELECT * FROM EMPLOYEE WHERE GENDER=?",
    +      [{{sql_char, 1}, ["M"]}]).
    +      {selected,["NR","FIRSTNAME","LASTNAME","GENDER"],
    +                [{2,"John", "Doe", "M"},{4,"Ross","Geller","M"}]}

    Delete the table EMPLOYEE.

     24 > odbc:sql_query(Ref, "DROP TABLE EMPLOYEE").
    +      {updated,undefined}

    Shut down the connection.

     25 > odbc:disconnect(Ref).
           ok

    Shut down the application.

     26 > odbc:stop().
         =INFO REPORT==== 7-Jan-2004::17:00:59 ===
         application: odbc
    diff --git a/prs/9277/lib/odbc-2.15/doc/html/odbc.epub b/prs/9277/lib/odbc-2.15/doc/html/odbc.epub
    index 95b78e3cdf90a..9e78a775e1e5d 100644
    Binary files a/prs/9277/lib/odbc-2.15/doc/html/odbc.epub and b/prs/9277/lib/odbc-2.15/doc/html/odbc.epub differ
    diff --git a/prs/9277/lib/os_mon-2.10.1/doc/html/os_mon.epub b/prs/9277/lib/os_mon-2.10.1/doc/html/os_mon.epub
    index 6387e8fdbc895..495ec5e8a2ed0 100644
    Binary files a/prs/9277/lib/os_mon-2.10.1/doc/html/os_mon.epub and b/prs/9277/lib/os_mon-2.10.1/doc/html/os_mon.epub differ
    diff --git a/prs/9277/lib/parsetools-2.6/doc/html/leex.html b/prs/9277/lib/parsetools-2.6/doc/html/leex.html
    index 7e0b13ddc8b60..72850fc2f1958 100644
    --- a/prs/9277/lib/parsetools-2.6/doc/html/leex.html
    +++ b/prs/9277/lib/parsetools-2.6/doc/html/leex.html
    @@ -173,13 +173,13 @@ 

    next token. Note that pushing back a newline will mean the line numbering will no longer be correct.

    Note

    Pushing back characters gives you unexpected possibilities to cause the scanner to loop!

    The following example would match a simple Erlang integer or float and return a -token which could be sent to the Erlang parser:

    D = [0-9]
    +token which could be sent to the Erlang parser:

    D = [0-9]
     
    -{D}+ :
    -  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
    +{D}+ :
    +  {token,{integer,TokenLine,list_to_integer(TokenChars)}}.
     
    -{D}+\.{D}+((E|e)(\+|\-)?{D}+)? :
    -  {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file +{D}+\.{D}+((E|e)(\+|\-)?{D}+)? : + {token,{float,TokenLine,list_to_float(TokenChars)}}.

    The Erlang code in the Erlang code. section is written into the output file directly after the module declaration and predefined exports declaration, making it possible to add extra exports, define imports, and other attributes, which are visible in the whole file.

    @@ -731,7 +731,7 @@

    token(Cont, Chars, StartLoc)

    the token. This is continued until a token has been scanned. Cont is initially [].

    It is not designed to be called directly by an application, but is used through the I/O system where it can typically be called in an -application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
    +application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,token,[Loc]})
       -> TokenRet

    @@ -820,7 +820,7 @@

    tokens(Cont, Chars, StartLoc)

    like Erlang where there is an explicit end token, '.'. If no end token is found then the whole file will be scanned and returned. If an error occurs then all tokens up to and including the next end token will be skipped.

    It is not designed to be called directly by an application, but used through the -I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
    +I/O system where it can typically be called in an application by:

    io:request(InFile, {get_until,unicode,Prompt,Module,tokens,[Loc]})
       -> TokensRet
    diff --git a/prs/9277/lib/parsetools-2.6/doc/html/parsetools.epub b/prs/9277/lib/parsetools-2.6/doc/html/parsetools.epub index da39a65d4b20c..5e5693883bf56 100644 Binary files a/prs/9277/lib/parsetools-2.6/doc/html/parsetools.epub and b/prs/9277/lib/parsetools-2.6/doc/html/parsetools.epub differ diff --git a/prs/9277/lib/parsetools-2.6/doc/html/yecc.html b/prs/9277/lib/parsetools-2.6/doc/html/yecc.html index 40bb83fab83e3..f9bd533eb3aeb 100644 --- a/prs/9277/lib/parsetools-2.6/doc/html/yecc.html +++ b/prs/9277/lib/parsetools-2.6/doc/html/yecc.html @@ -162,8 +162,8 @@

    distinguished from all the terminal and non-terminal categories of the syntax rules. The Endsymbol can be declared in the grammar file.

    The simplest case is to segment the input string into a list of identifiers (atoms) and use those atoms both as categories and values of the tokens. For -example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    - {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is +example, the input string aaa bbb 777, X may be scanned (tokenized) as:

    [{aaa, 1}, {bbb, 1}, {777, 1}, {',' , 1}, {'X', 1},
    + {'$end', 1}].

    This assumes that this is the first line of the input text, and that '$end' is the distinguished end_of_input symbol.

    The Erlang scanner in the io module can be used as a starting point when writing a new scanner. Study yeccscan.erl in order to see how a filter can be added on top of io:scan_erl_form/3 to provide a scanner for Yecc that @@ -233,8 +233,8 @@

    element -> atom. element -> list.

    This grammar can be used to generate a parser which parses list expressions, such as (), (a), (peter charles), (a (b c) d (())), ... provided that your -scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    - {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as +scanner tokenizes, for example, the input (peter charles) as follows:

    [{'(', 1} , {atom, 1, peter}, {atom, 1, charles}, {')', 1},
    + {'$end', 1}]

    When a grammar rule is used by the parser to parse (part of) the input string as a grammatical phrase, the associated code is evaluated, and the value of the last expression becomes the value of the parsed phrase. This value may be used by the parser later to build structures that are values of higher phrases of @@ -246,8 +246,8 @@

    element -> atom : '$1'. element -> list : '$1'.

    With this code added to the grammar rules, the parser produces the following value (structure) when parsing the input string (a b c).. This still assumes -that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    -                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', +that this was the first input line that the scanner tokenized:

    {cons, {atom, 1, a}, {cons, {atom, 1, b},
    +                            {cons, {atom, 1, c}, nil}}}

    The associated code contains pseudo variables '$1', '$2', '$3', and so on. which refer to (are bound to) the values associated previously by the parser with the symbols of the right-hand side of the rule. When these symbols are terminal categories, the @@ -270,12 +270,12 @@

    Generating a Parser

    -

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type +

    To call the parser generator, use the following command:

    yecc:file(Grammarfile).

    An error message from Yecc will be shown if the grammar is not of the LALR type (for example too ambiguous). Shift/reduce conflicts are resolved in favor of shifting if there are no operator precedence declarations. Refer to the yacc documentation on the use of operator precedence.

    The output file contains Erlang source code for a parser module with module name equal to the Parserfile parameter. After compilation, the parser can be called -as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included +as follows (the module name is assumed to be myparser):

    myparser:parse(myscanner:scan(Inport))

    The call format can be different if a customized prologue file has been included when generating the parser instead of the default file lib/parsetools/include/yeccpre.hrl.

    With the standard prologue, this call will return either {ok, Result}, where Result is a structure that the Erlang code of the grammar file has built, or @@ -284,15 +284,15 @@

    the screen. The user will have to do this either by printing the returned error messages, or by inserting tests and print instructions in the Erlang code associated with the syntax rules of the grammar file.

    It is also possible to make the parser ask for more input tokens when needed if -the following call format is used:

    myparser:parse_and_scan({Function, Args})
    -myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call +the following call format is used:

    myparser:parse_and_scan({Function, Args})
    +myparser:parse_and_scan({Mod, Tokenizer, Args})

    The tokenizer Function is either a fun or a tuple {Mod, Tokenizer}. The call apply(Function, Args) or apply({Mod, Tokenizer}, Args) is executed whenever a new token is needed. This, for example, makes it possible to parse from a file, token by token.

    The tokenizer used above has to be implemented so as to return one of the -following:

    {ok, Tokens, EndPosition}
    -{eof, EndPosition}
    -{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library +following:

    {ok, Tokens, EndPosition}
    +{eof, EndPosition}
    +{error, Error_description, EndPosition}

    This conforms to the format used by the scanner in the Erlang io library module.

    If {eof, EndPosition} is returned immediately, the call to parse_and_scan/1 returns {ok, eof}. If {eof, EndPosition} is returned before the parser expects end of input, parse_and_scan/1 will, of course, return an error @@ -342,36 +342,36 @@

    Endsymbol '$end'. grammar -> declaration : '$1'. grammar -> rule : '$1'. -declaration -> symbol symbols dot: {'$1', '$2'}. -rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], - '$4'}. +declaration -> symbol symbols dot: {'$1', '$2'}. +rule -> head '->' symbols attached_code dot: {rule, ['$1' | '$3'], + '$4'}. head -> symbol : '$1'. -symbols -> symbol : ['$1']. -symbols -> symbol symbols : ['$1' | '$2']. -attached_code -> ':' tokens : {erlang_code, '$2'}. -attached_code -> '$empty' : {erlang_code, - [{atom, 0, '$undefined'}]}. -tokens -> token : ['$1']. -tokens -> token tokens : ['$1' | '$2']. -symbol -> var : value_of('$1'). -symbol -> atom : value_of('$1'). -symbol -> integer : value_of('$1'). -symbol -> reserved_word : value_of('$1'). +symbols -> symbol : ['$1']. +symbols -> symbol symbols : ['$1' | '$2']. +attached_code -> ':' tokens : {erlang_code, '$2'}. +attached_code -> '$empty' : {erlang_code, + [{atom, 0, '$undefined'}]}. +tokens -> token : ['$1']. +tokens -> token tokens : ['$1' | '$2']. +symbol -> var : value_of('$1'). +symbol -> atom : value_of('$1'). +symbol -> integer : value_of('$1'). +symbol -> reserved_word : value_of('$1'). token -> var : '$1'. token -> atom : '$1'. token -> float : '$1'. token -> integer : '$1'. token -> string : '$1'. token -> char : '$1'. -token -> reserved_symbol : {value_of('$1'), line_of('$1')}. -token -> reserved_word : {value_of('$1'), line_of('$1')}. -token -> '->' : {'->', line_of('$1')}. -token -> ':' : {':', line_of('$1')}. +token -> reserved_symbol : {value_of('$1'), line_of('$1')}. +token -> reserved_word : {value_of('$1'), line_of('$1')}. +token -> '->' : {'->', line_of('$1')}. +token -> ':' : {':', line_of('$1')}. Erlang code. -value_of(Token) -> - element(3, Token). -line_of(Token) -> - element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are +value_of(Token) -> + element(3, Token). +line_of(Token) -> + element(2, Token).

    Note

    The symbols '->', and ':' have to be treated in a special way, as they are meta symbols of the grammar notation, as well as terminal symbols of the Yecc grammar.

    5. The file erl_parse.yrl in the lib/stdlib/src directory contains the grammar for Erlang.

    Note

    Syntactic tests are used in the code associated with some rules, and an error diff --git a/prs/9277/lib/public_key-1.17/doc/html/public_key.epub b/prs/9277/lib/public_key-1.17/doc/html/public_key.epub index 284b055e2ed0b..ac9a9549391ff 100644 Binary files a/prs/9277/lib/public_key-1.17/doc/html/public_key.epub and b/prs/9277/lib/public_key-1.17/doc/html/public_key.epub differ diff --git a/prs/9277/lib/public_key-1.17/doc/html/public_key.html b/prs/9277/lib/public_key-1.17/doc/html/public_key.html index c94ceb1e2bef9..a3af69d33ab24 100644 --- a/prs/9277/lib/public_key-1.17/doc/html/public_key.html +++ b/prs/9277/lib/public_key-1.17/doc/html/public_key.html @@ -3313,22 +3313,22 @@

    pkix_path_validation(Cert, CertChain, Optio or also by the user when the option policy_set is provided to this function. The qualifiers convey information about the valid policy and is intended as information to end users.

    Available options:

    • {verify_fun, {fun(), UserState::term()} - The fun must be -defined as:

      fun(OtpCert :: #'OTPCertificate'{},
      -    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      -             {extension, #'Extension'{}},
      -    UserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {valid_peer, UserState :: term()} |
      -  {fail, Reason :: term()} |
      -  {unknown, UserState :: term()}.

      or as:

      fun(OtpCert :: #'OTPCertificate'{},
      -    DerCert :: der_encoded(),
      -    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      -             {extension, #'Extension'{}},
      -    UserState :: term()) ->
      -  {valid, UserState :: term()} |
      -  {valid_peer, UserState :: term()} |
      -  {fail, Reason :: term()} |
      -  {unknown, UserState :: term()}.

      The verify callback can have 3 or 4 arguments in case the DER encoded +defined as:

      fun(OtpCert :: #'OTPCertificate'{},
      +    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      +             {extension, #'Extension'{}},
      +    UserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {valid_peer, UserState :: term()} |
      +  {fail, Reason :: term()} |
      +  {unknown, UserState :: term()}.

      or as:

      fun(OtpCert :: #'OTPCertificate'{},
      +    DerCert :: der_encoded(),
      +    Event :: {bad_cert, Reason :: bad_cert_reason() | {revoked, atom()}} |
      +             {extension, #'Extension'{}},
      +    UserState :: term()) ->
      +  {valid, UserState :: term()} |
      +  {valid_peer, UserState :: term()} |
      +  {fail, Reason :: term()} |
      +  {unknown, UserState :: term()}.

      The verify callback can have 3 or 4 arguments in case the DER encoded version is needed by the callback.

      If the verify callback fun returns {fail, Reason}, the verification process is immediately stopped. If the verify callback fun returns {valid, UserState}, the verification process is continued. This can be used @@ -3500,9 +3500,9 @@

      pkix_verify_hostname(Cert, ReferenceIDs, Op about hostname verification. The User's Guide and code examples describes this -function more detailed.

      The option funs are described here:

      • match_fun

        fun(ReferenceId::ReferenceId() | FQDN::string(),
        -    PresentedId::{dNSName,string()} | {uniformResourceIdentifier,string() |
        -                 {iPAddress,list(byte())} | {OtherId::atom()|oid(),term()}})

        This function replaces the default host name matching rules. The fun should +function more detailed.

        The option funs are described here:

        • match_fun

          fun(ReferenceId::ReferenceId() | FQDN::string(),
          +    PresentedId::{dNSName,string()} | {uniformResourceIdentifier,string() |
          +                 {iPAddress,list(byte())} | {OtherId::atom()|oid(),term()}})

          This function replaces the default host name matching rules. The fun should return a boolean to tell if the Reference ID and Presented ID matches or not. The match fun can also return a third value, value, the atom default, if the default matching rules shall apply. This makes it possible to augment the @@ -3702,14 +3702,14 @@

          pkix_crls_validate(OTPcertificate, DPandCRL

    Performs CRL validation. It is intended to be called from the verify fun of -pkix_path_validation/3 .

    Available options:

    • {update_crl, fun()} - The fun has the following type specification:

       fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
      -        #'CertificateList'{}

      The fun uses the information in the distribution point to access the latest +pkix_path_validation/3 .

      Available options:

      • {update_crl, fun()} - The fun has the following type specification:

         fun(#'DistributionPoint'{}, #'CertificateList'{}) ->
        +        #'CertificateList'{}

        The fun uses the information in the distribution point to access the latest possible version of the CRL. If this fun is not specified, Public Key uses the default implementation:

         fun(_DP, CRL) -> CRL end
      • {issuer_fun, {fun(), UserState::term()}} - The fun has the following type -specification:

        fun(#'DistributionPoint'{}, #'CertificateList'{},
        -    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
        -  {ok, #'OTPCertificate'{}, [der_encoded]}

        The fun returns the root certificate and certificate chain that has signed the -CRL.

         fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
      • {undetermined_details, boolean()} - Defaults to false. When revocation +specification:

        fun(#'DistributionPoint'{}, #'CertificateList'{},
        +    {rdnSequence,[#'AttributeTypeAndValue'{}]}, UserState::term()) ->
        +  {ok, #'OTPCertificate'{}, [der_encoded]}

        The fun returns the root certificate and certificate chain that has signed the +CRL.

         fun(DP, CRL, Issuer, UserState) -> {ok, RootCert, CertChain}
      • {undetermined_details, boolean()} - Defaults to false. When revocation status cannot be determined, and this option is set to true, details of why no CRLs where accepted are included in the return value.

      @@ -4057,18 +4057,18 @@

      pkix_test_data(ChainConf)

      generating an ECDSA key. Note this could fail if Erlang/OTP is compiled with a very old cryptolib.

    • {validity, {From::erlang:timestamp(), To::erlang:timestamp()}} - The validity period of the certificate.

    • {extensions, [#'Extension'{}]} - Extensions to include in the -certificate.

      Default extensions included in CA certificates if not otherwise specified are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      -              extnValue = [keyCertSign, cRLSign],
      -              critical = false},
      -#'Extension'{extnID = ?'id-ce-basicConstraints',
      -             extnValue = #'BasicConstraints'{cA = true},
      -             critical = true}]

      Default extensions included in the server peer cert if not otherwise specified -are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      -              extnValue = [digitalSignature, keyAgreement],
      -              critical = false},
      -#'Extension'{extnID = ?'id-ce-subjectAltName',
      -             extnValue = [{dNSName, Hostname}],
      -             critical = false}]

      Hostname is the result of calling net_adm:localhost() in the Erlang node where +certificate.

      Default extensions included in CA certificates if not otherwise specified are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      +              extnValue = [keyCertSign, cRLSign],
      +              critical = false},
      +#'Extension'{extnID = ?'id-ce-basicConstraints',
      +             extnValue = #'BasicConstraints'{cA = true},
      +             critical = true}]

      Default extensions included in the server peer cert if not otherwise specified +are:

      [#'Extension'{extnID = ?'id-ce-keyUsage',
      +              extnValue = [digitalSignature, keyAgreement],
      +              critical = false},
      +#'Extension'{extnID = ?'id-ce-subjectAltName',
      +             extnValue = [{dNSName, Hostname}],
      +             critical = false}]

      Hostname is the result of calling net_adm:localhost() in the Erlang node where this function is called.

    Note

    Note that the generated certificates and keys does not provide a formally correct PKIX-trust-chain and they cannot be used to achieve real security. This function is provided for testing purposes only.

    diff --git a/prs/9277/lib/public_key-1.17/doc/html/public_key_records.html b/prs/9277/lib/public_key-1.17/doc/html/public_key_records.html index 86a6b8392b0c4..7db625fdaab16 100644 --- a/prs/9277/lib/public_key-1.17/doc/html/public_key_records.html +++ b/prs/9277/lib/public_key-1.17/doc/html/public_key_records.html @@ -129,7 +129,7 @@

    used to handle public key infrastructure. The scope is to describe the data types of each component, not the semantics. For information on the semantics, refer to the relevant standards and RFCs linked in the sections below.

    Use the following include directive to get access to the records and constant -macros described in the following sections:

     -include_lib("public_key/include/public_key.hrl").

    +macros described in the following sections:

     -include_lib("public_key/include/public_key.hrl").

    @@ -137,48 +137,48 @@

    Common non-standard Erlang data types used to describe the record fields in the following sections and which are not defined in the Public Key -Reference Manual follows here:

    time() = utc_time() | general_time()
    +Reference Manual follows here:

    time() = utc_time() | general_time()
     
    -utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
    +utc_time()  = {utcTime, "YYMMDDHHMMSSZ"}
     
    -general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
    +general_time() = {generalTime, "YYYYMMDDHHMMSSZ"}
     
    -general_name() = {rfc822Name, string()} |
    +general_name() = {rfc822Name, string()} |
     
    -                 {dNSName, string()} |
    +                 {dNSName, string()} |
     
    -                 {x400Address, string() |
    +                 {x400Address, string() |
     
    -                 {directoryName, {rdnSequence, [#'AttributeTypeAndValue'{}]}} |
    +                 {directoryName, {rdnSequence, [#'AttributeTypeAndValue'{}]}} |
     
    -                 {ediPartyName, special_string()} |
    +                 {ediPartyName, special_string()} |
     
    -                 {ediPartyName, special_string(), special_string()} |
    +                 {ediPartyName, special_string(), special_string()} |
     
    -                 {uniformResourceIdentifier, string()} |
    +                 {uniformResourceIdentifier, string()} |
     
    -                 {iPAddress, string()} |
    +                 {iPAddress, string()} |
     
    -                 {registeredId, oid()} |
    +                 {registeredId, oid()} |
     
    -                 {otherName, term()}
    +                 {otherName, term()}
     
    -special_string() = {teletexString, string()} |
    +special_string() = {teletexString, string()} |
      
    -                   {printableString, string()} |
    +                   {printableString, string()} |
     
    -                   {universalString, string()} |
    +                   {universalString, string()} |
     
    -                   {utf8String, binary()} |
    +                   {utf8String, binary()} |
     
    -                   {bmpString, string()}
    +                   {bmpString, string()}
     
    -dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
    +dist_reason() = unused | keyCompromise | cACompromise | affiliationChanged |
                     cessationOfOperation | certificateHold | privilegeWithdrawn | aACompromise
     
    -OID_macro() = ?OID_name()
    +OID_macro() = ?OID_name()
     
    -OID_name() = atom()

    +OID_name() = atom()

    @@ -186,12 +186,12 @@

    Erlang representation of Rivest-Shamir-Adleman cryptosystem (RSA) -keys follows:

    #'RSAPublicKey'{
    +keys follows:

    #'RSAPublicKey'{
        modulus,       % pos_integer()
        publicExponent % pos_integer()
    -  }.
    +  }.
     
    -#'RSAPrivateKey'{
    +#'RSAPrivateKey'{
        version,         % two-prime | multi
        modulus,         % pos_integer()
        publicExponent,  % pos_integer()
    @@ -202,50 +202,50 @@ 

    exponent2, % pos_integer() coefficient, % pos_integer() otherPrimeInfos % [#OtherPrimeInfo{}] | asn1_NOVALUE - }. + }. -#'OtherPrimeInfo'{ +#'OtherPrimeInfo'{ prime, % pos_integer() exponent, % pos_integer() coefficient % pos_integer() - }. + }. -#'RSASSA-PSS-params'{ +#'RSASSA-PSS-params'{ hashAlgorithm, % #'HashAlgorithm'{}}, maskGenAlgorithm, % #'MaskGenAlgorithm'{}}, saltLength, % pos_integer(), trailerField, % pos_integer() - }. + }. -#'HashAlgorithm'{ +#'HashAlgorithm'{ algorithm, % oid() parameters % defaults to asn1_NOVALUE - }. + }. -#'MaskGenAlgorithm'{ +#'MaskGenAlgorithm'{ algorithm, % oid() parameters, % defaults to asn1_NOVALUE - }.

    + }.

    DSA

    Erlang representation of -Digital Signature Algorithm (DSA) keys

    #'DSAPrivateKey'{
    +Digital Signature Algorithm (DSA) keys

    #'DSAPrivateKey'{
        version,      % pos_integer()
        p,            % pos_integer()
        q,            % pos_integer()
        g,            % pos_integer()
        y,            % pos_integer()
        x             % pos_integer()
    -  }.
    +  }.
     
    -#'Dss-Parms'{
    +#'Dss-Parms'{
        p,         % pos_integer()
        q,         % pos_integer()
        g          % pos_integer()
    -  }.

    + }.

    @@ -256,38 +256,38 @@

    and Edwards-Curve Digital Signature Algorithm (EDDSA) where parameters in the private key will be -{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

    #'ECPrivateKey'{
    +{namedCurve, ?'id-Ed25519' | ?'id-Ed448'}.

    #'ECPrivateKey'{
        version,       % pos_integer()
        privateKey,    % binary()
        parameters,    % {ecParameters, #'ECParameters'{}} |
                       % {namedCurve, Oid::tuple()} |
                       % {implicitlyCA, 'NULL'}
        publicKey      % bitstring()
    -  }.
    +  }.
     
    -#'ECParameters'{
    +#'ECParameters'{
        version,    % pos_integer()
        fieldID,    % #'FieldID'{}
        curve,      % #'Curve'{}
        base,       % binary()
        order,      % pos_integer()
        cofactor    % pos_integer()
    -  }.
    +  }.
     
    -#'Curve'{
    +#'Curve'{
        a,        % binary()
        b,        % binary()
        seed      % bitstring() - optional
    -  }.
    +  }.
     
    -#'FieldID'{
    +#'FieldID'{
        fieldType,    % oid()
        parameters    % Depending on fieldType
    -  }.
    +  }.
     
    -#'ECPoint'{
    +#'ECPoint'{
        point %  binary() - the public key
    -  }.

    + }.

    @@ -295,13 +295,13 @@

    Erlang representation of PKIX certificates derived from ASN.1 specifications see also X509 certificates (RFC 5280), also -referred to as plain type, are as follows:

    #'Certificate'{
    +referred to as plain type, are as follows:

    #'Certificate'{
        tbsCertificate,        % #'TBSCertificate'{}
        signatureAlgorithm,    % #'AlgorithmIdentifier'{}
        signature              % bitstring()
    -  }.
    +  }.
     
    -#'TBSCertificate'{
    +#'TBSCertificate'{
        version,              % v1 | v2 | v3
        serialNumber,         % pos_integer()
        signature,            % #'AlgorithmIdentifier'{}
    @@ -312,19 +312,19 @@ 

    issuerUniqueID, % binary() | asn1_novalue subjectUniqueID, % binary() | asn1_novalue extensions % [#'Extension'{}] - }. + }. -#'AlgorithmIdentifier'{ +#'AlgorithmIdentifier'{ algorithm, % oid() parameters % der_encoded() - }.

    Erlang alternate representation of PKIX certificate, also referred to as otp -type

    #'OTPCertificate'{
    +  }.

    Erlang alternate representation of PKIX certificate, also referred to as otp +type

    #'OTPCertificate'{
        tbsCertificate,        % #'OTPTBSCertificate'{}
        signatureAlgorithm,    % #'SignatureAlgorithm'
        signature              % bitstring()
    -  }.
    +  }.
     
    -#'OTPTBSCertificate'{
    +#'OTPTBSCertificate'{
        version,              % v1 | v2 | v3
        serialNumber,         % pos_integer()
        signature,            % #'SignatureAlgorithm'
    @@ -335,35 +335,35 @@ 

    issuerUniqueID, % binary() | asn1_novalue subjectUniqueID, % binary() | asn1_novalue extensions % [#'Extension'{}] - }. + }. -#'SignatureAlgorithm'{ +#'SignatureAlgorithm'{ algorithm, % id_signature_algorithm() parameters % asn1_novalue | #'Dss-Parms'{} - }.

    id_signature_algorithm() = OID_macro()

    The available OID names are as follows:

    OID Name
    id-dsa-with-sha1
    id-dsaWithSHA1 (ISO or OID to above)
    md2WithRSAEncryption
    md5WithRSAEncryption
    sha1WithRSAEncryption
    sha-1WithRSAEncryption (ISO or OID to above)
    sha224WithRSAEncryption
    sha256WithRSAEncryption
    sha512WithRSAEncryption
    ecdsa-with-SHA1

    Table: Signature Algorithm OIDs

    The data type 'AttributeTypeAndValue', is represented as the following erlang -record:

    #'AttributeTypeAndValue'{
    +  }.

    id_signature_algorithm() = OID_macro()

    The available OID names are as follows:

    OID Name
    id-dsa-with-sha1
    id-dsaWithSHA1 (ISO or OID to above)
    md2WithRSAEncryption
    md5WithRSAEncryption
    sha1WithRSAEncryption
    sha-1WithRSAEncryption (ISO or OID to above)
    sha224WithRSAEncryption
    sha256WithRSAEncryption
    sha512WithRSAEncryption
    ecdsa-with-SHA1

    Table: Signature Algorithm OIDs

    The data type 'AttributeTypeAndValue', is represented as the following erlang +record:

    #'AttributeTypeAndValue'{
        type,   % id_attributes()
        value   % term()
    -  }.

    The attribute OID name atoms and their corresponding value types are as follows:

    OID NameValue Type
    id-at-namespecial_string()
    id-at-surnamespecial_string()
    id-at-givenNamespecial_string()
    id-at-initialsspecial_string()
    id-at-generationQualifierspecial_string()
    id-at-commonNamespecial_string()
    id-at-localityNamespecial_string()
    id-at-stateOrProvinceNamespecial_string()
    id-at-organizationNamespecial_string()
    id-at-titlespecial_string()
    id-at-dnQualifier{printableString, string()}
    id-at-countryName{printableString, string()}
    id-at-serialNumber{printableString, string()}
    id-at-pseudonymspecial_string()

    Table: Attribute OIDs

    The data types 'Validity', 'SubjectPublicKeyInfo', and + }.

    The attribute OID name atoms and their corresponding value types are as follows:

    OID NameValue Type
    id-at-namespecial_string()
    id-at-surnamespecial_string()
    id-at-givenNamespecial_string()
    id-at-initialsspecial_string()
    id-at-generationQualifierspecial_string()
    id-at-commonNamespecial_string()
    id-at-localityNamespecial_string()
    id-at-stateOrProvinceNamespecial_string()
    id-at-organizationNamespecial_string()
    id-at-titlespecial_string()
    id-at-dnQualifier{printableString, string()}
    id-at-countryName{printableString, string()}
    id-at-serialNumber{printableString, string()}
    id-at-pseudonymspecial_string()

    Table: Attribute OIDs

    The data types 'Validity', 'SubjectPublicKeyInfo', and 'SubjectPublicKeyInfoAlgorithm' are represented as the following Erlang -records:

    #'Validity'{
    +records:

    #'Validity'{
        notBefore, % time()
        notAfter   % time()
    -  }.
    +  }.
     
    -#'SubjectPublicKeyInfo'{
    +#'SubjectPublicKeyInfo'{
        algorithm,       % #AlgorithmIdentifier{}
        subjectPublicKey % binary()
    -  }.
    +  }.
     
    -#'SubjectPublicKeyInfoAlgorithm'{
    +#'SubjectPublicKeyInfoAlgorithm'{
        algorithm,  % id_public_key_algorithm()
        parameters  % public_key_params()
    -  }.

    The public-key algorithm OID name atoms are as follows:

    OID Name
    rsaEncryption
    id-dsa
    dhpublicnumber
    id-keyExchangeAlgorithm
    id-ecPublicKey

    Table: Public-Key Algorithm OIDs

    #'Extension'{
    +  }.

    The public-key algorithm OID name atoms are as follows:

    OID Name
    rsaEncryption
    id-dsa
    dhpublicnumber
    id-keyExchangeAlgorithm
    id-ecPublicKey

    Table: Public-Key Algorithm OIDs

    #'Extension'{
        extnID,    % id_extensions() | oid()
        critical,  % boolean()
        extnValue  % der_encoded()
    -  }.

    id_extensions() + }.

    id_extensions() Standard Certificate Extensions, Private Internet Extensions, CRL Extensions and @@ -374,98 +374,98 @@

    Standard Certificate Extensions

    The standard certificate extensions OID name atoms and their corresponding value -types are as follows:

    OID NameValue Type
    id-ce-authorityKeyIdentifier#'AuthorityKeyIdentifier'{}
    id-ce-subjectKeyIdentifieroid()
    id-ce-keyUsage[key_usage()]
    id-ce-privateKeyUsagePeriod#'PrivateKeyUsagePeriod'{}
    id-ce-certificatePolicies#'PolicyInformation'{}
    id-ce-policyMappings#'PolicyMappings_SEQOF'{}
    id-ce-subjectAltNamegeneral_name()
    id-ce-issuerAltNamegeneral_name()
    id-ce-subjectDirectoryAttributes[#'Attribute'{}]
    id-ce-basicConstraints#'BasicConstraints'{}
    id-ce-nameConstraints#'NameConstraints'{}
    id-ce-policyConstraints#'PolicyConstraints'{}
    id-ce-extKeyUsage[id_key_purpose()]
    id-ce-cRLDistributionPoints[#'DistributionPoint'{}]
    id-ce-inhibitAnyPolicypos_integer()
    id-ce-freshestCRL[#'DistributionPoint'{}]

    Table: Standard Certificate Extensions

    Here:

    key_usage() = digitalSignature | nonRepudiation | keyEncipherment
    +types are as follows:

    OID NameValue Type
    id-ce-authorityKeyIdentifier#'AuthorityKeyIdentifier'{}
    id-ce-subjectKeyIdentifieroid()
    id-ce-keyUsage[key_usage()]
    id-ce-privateKeyUsagePeriod#'PrivateKeyUsagePeriod'{}
    id-ce-certificatePolicies#'PolicyInformation'{}
    id-ce-policyMappings#'PolicyMappings_SEQOF'{}
    id-ce-subjectAltNamegeneral_name()
    id-ce-issuerAltNamegeneral_name()
    id-ce-subjectDirectoryAttributes[#'Attribute'{}]
    id-ce-basicConstraints#'BasicConstraints'{}
    id-ce-nameConstraints#'NameConstraints'{}
    id-ce-policyConstraints#'PolicyConstraints'{}
    id-ce-extKeyUsage[id_key_purpose()]
    id-ce-cRLDistributionPoints[#'DistributionPoint'{}]
    id-ce-inhibitAnyPolicypos_integer()
    id-ce-freshestCRL[#'DistributionPoint'{}]

    Table: Standard Certificate Extensions

    Here:

    key_usage() = digitalSignature | nonRepudiation | keyEncipherment
                 | dataEncipherment | keyAgreement | keyCertSign
    -            | cRLSign | encipherOnly | decipherOnly

    And for id_key_purpose():

    OID Name
    id-kp-serverAuth
    id-kp-clientAuth
    id-kp-codeSigning
    id-kp-emailProtection
    id-kp-timeStamping
    id-kp-OCSPSigning

    Table: Key Purpose OIDs

    #'AuthorityKeyIdentifier'{
    +            | cRLSign | encipherOnly | decipherOnly

    And for id_key_purpose():

    OID Name
    id-kp-serverAuth
    id-kp-clientAuth
    id-kp-codeSigning
    id-kp-emailProtection
    id-kp-timeStamping
    id-kp-OCSPSigning

    Table: Key Purpose OIDs

    #'AuthorityKeyIdentifier'{
        keyIdentifier,            % oid()
        authorityCertIssuer,      % general_name()
        authorityCertSerialNumber % pos_integer()
    -  }.
    +  }.
     
    -#'PrivateKeyUsagePeriod'{
    +#'PrivateKeyUsagePeriod'{
        notBefore,   % general_time()
        notAfter     % general_time()
    -  }.
    +  }.
     
    -#'PolicyInformation'{
    +#'PolicyInformation'{
        policyIdentifier,  % oid()
        policyQualifiers   % [#PolicyQualifierInfo{}]
    -  }.
    +  }.
     
    -#'PolicyQualifierInfo'{
    +#'PolicyQualifierInfo'{
        policyQualifierId,   % oid()
        qualifier            % string() | #'UserNotice'{}
    -  }.
    +  }.
     
    -#'UserNotice'{
    +#'UserNotice'{
        noticeRef,   % #'NoticeReference'{}
        explicitText % string()
    -  }.
    +  }.
     
    -#'NoticeReference'{
    +#'NoticeReference'{
        organization,    % string()
        noticeNumbers    % [pos_integer()]
    -  }.
    +  }.
     
    -#'PolicyMappings_SEQOF'{
    +#'PolicyMappings_SEQOF'{
        issuerDomainPolicy,  % oid()
        subjectDomainPolicy  % oid()
    -  }.
    +  }.
     
    -#'Attribute'{
    +#'Attribute'{
        type,  % oid()
        values % [der_encoded()]
    -  }).
    +  }).
     
    -#'BasicConstraints'{
    +#'BasicConstraints'{
        cA,               % boolean()
        pathLenConstraint % pos_integer()
    -  }).
    +  }).
     
    -#'NameConstraints'{
    +#'NameConstraints'{
        permittedSubtrees, % [#'GeneralSubtree'{}]
        excludedSubtrees   % [#'GeneralSubtree'{}]
    -  }).
    +  }).
     
    -#'GeneralSubtree'{
    +#'GeneralSubtree'{
        base,    % general_name()
        minimum, % pos_integer()
        maximum  % pos_integer()
    -  }).
    +  }).
     
    -#'PolicyConstraints'{
    +#'PolicyConstraints'{
        requireExplicitPolicy, % pos_integer()
        inhibitPolicyMapping   % pos_integer()
    -  }).
    +  }).
     
    -#'DistributionPoint'{
    +#'DistributionPoint'{
        distributionPoint, % {fullName, [general_name()]} | {nameRelativeToCRLIssuer,[#AttributeTypeAndValue{}]}
        reasons,           % [dist_reason()]
        cRLIssuer          % [general_name()]
    -  }).

    + }).

    Private Internet Extensions

    The private internet extensions OID name atoms and their corresponding value -types are as follows:

    OID NameValue Type
    id-pe-authorityInfoAccess[#'AccessDescription'{}]
    id-pe-subjectInfoAccess[#'AccessDescription'{}]

    Table: Private Internet Extensions

    #'AccessDescription'{
    +types are as follows:

    OID NameValue Type
    id-pe-authorityInfoAccess[#'AccessDescription'{}]
    id-pe-subjectInfoAccess[#'AccessDescription'{}]

    Table: Private Internet Extensions

    #'AccessDescription'{
        accessMethod,    % oid()
        accessLocation   % general_name()
    -  }).

    + }).

    CRL and CRL Extensions Profile

    Erlang representation of CRL and CRL extensions profile derived from ASN.1 -specifications and RFC 5280 are as follows:

    #'CertificateList'{
    +specifications and RFC 5280 are as follows:

    #'CertificateList'{
        tbsCertList,        % #'TBSCertList{}
        signatureAlgorithm, % #'AlgorithmIdentifier'{}
        signature           % bitstring()
    -  }).
    +  }).
     
    -#'TBSCertList'{
    +#'TBSCertList'{
        version,             % v2 (if defined)
        signature,           % #AlgorithmIdentifier{}
        issuer,              % {rdnSequence, [#AttributeTypeAndValue'{}]}
    @@ -473,13 +473,13 @@ 

    nextUpdate, % time() revokedCertificates, % [#'TBSCertList_revokedCertificates_SEQOF'{}] crlExtensions % [#'Extension'{}] - }). + }). -#'TBSCertList_revokedCertificates_SEQOF'{ +#'TBSCertList_revokedCertificates_SEQOF'{ userCertificate, % pos_integer() revocationDate, % timer() crlEntryExtensions % [#'Extension'{}] - }).

    + }).

    @@ -487,21 +487,21 @@

    The CRL extensions OID name atoms and their corresponding value types are as follows:

    OID NameValue Type
    id-ce-authorityKeyIdentifier#'AuthorityKeyIdentifier{}
    id-ce-issuerAltName{rdnSequence, [#AttributeTypeAndValue'{}]}
    id-ce-cRLNumberpos_integer()
    id-ce-deltaCRLIndicatorpos_integer()
    id-ce-issuingDistributionPoint#'IssuingDistributionPoint'{}
    id-ce-freshestCRL[#'Distributionpoint'{}]

    Table: CRL Extensions

    Here, the data type 'IssuingDistributionPoint' is represented as the following -Erlang record:

    #'IssuingDistributionPoint'{
    +Erlang record:

    #'IssuingDistributionPoint'{
        distributionPoint,         % {fullName, [general_name()]} | {nameRelativeToCRLIssuer, [#'AttributeTypeAndValue'{}]}
        onlyContainsUserCerts,     % boolean()
        onlyContainsCACerts,       % boolean()
        onlySomeReasons,           % [dist_reason()]
        indirectCRL,               % boolean()
        onlyContainsAttributeCerts % boolean()
    -  }).

    + }).

    CRL Entry Extensions

    The CRL entry extensions OID name atoms and their corresponding value types are -as follows:

    OID NameValue Type
    id-ce-cRLReasoncrl_reason()
    id-ce-holdInstructionCodeoid()
    id-ce-invalidityDategeneral_time()
    id-ce-certificateIssuergeneral_name()

    Table: CRL Entry Extensions

    Here:

        crl_reason() = unspecified | keyCompromise | cACompromise
    +as follows:

    OID NameValue Type
    id-ce-cRLReasoncrl_reason()
    id-ce-holdInstructionCodeoid()
    id-ce-invalidityDategeneral_time()
    id-ce-certificateIssuergeneral_name()

    Table: CRL Entry Extensions

    Here:

        crl_reason() = unspecified | keyCompromise | cACompromise
                      | affiliationChanged | superseded | cessationOfOperation
                      | certificateHold | removeFromCRL
                      | privilegeWithdrawn | aACompromise

    @@ -511,38 +511,38 @@

    PKCS#10 Certification Request

    Erlang representation of a PKCS#10 certification request derived from ASN.1 -specifications and RFC 5280 are as follows:

    #'CertificationRequest'{
    +specifications and RFC 5280 are as follows:

    #'CertificationRequest'{
        certificationRequestInfo, % #'CertificationRequestInfo'{},
        signatureAlgorithm,       % #'CertificationRequest_signatureAlgorithm'{}}.
        signature                 % bitstring()
    -  }.
    +  }.
     
    -#'CertificationRequestInfo'{
    +#'CertificationRequestInfo'{
        version,       % atom(),
        subject,       % {rdnSequence, [#AttributeTypeAndValue'{}]} ,
        subjectPKInfo, % #'CertificationRequestInfo_subjectPKInfo'{},
        attributes     % [#'AttributePKCS-10' {}]
    -  }.
    +  }.
     
    -#'CertificationRequestInfo_subjectPKInfo'{
    +#'CertificationRequestInfo_subjectPKInfo'{
        algorithm,        % #'CertificationRequestInfo_subjectPKInfo_algorithm'{}
        subjectPublicKey  %  bitstring()
    -  }.
    +  }.
     
    -#'CertificationRequestInfo_subjectPKInfo_algorithm'{
    +#'CertificationRequestInfo_subjectPKInfo_algorithm'{
        algorithm,  % oid(),
        parameters  % der_encoded()
    -  }.
    +  }.
     
    -#'CertificationRequest_signatureAlgorithm'{
    +#'CertificationRequest_signatureAlgorithm'{
        algorithm,  % oid(),
        parameters  % der_encoded()
    -  }.
    +  }.
     
    -#'AttributePKCS-10'{
    +#'AttributePKCS-10'{
        type,   % oid(),
        values  % [der_encoded()]
    -  }.

    +
    }.

    diff --git a/prs/9277/lib/public_key-1.17/doc/html/using_public_key.html b/prs/9277/lib/public_key-1.17/doc/html/using_public_key.html index cc1b39f5c9402..44e2fd6433893 100644 --- a/prs/9277/lib/public_key-1.17/doc/html/using_public_key.html +++ b/prs/9277/lib/public_key-1.17/doc/html/using_public_key.html @@ -148,30 +148,30 @@

    DSA Private Key

    -

    A DSA private key can look as follows:

    Note

    File handling is not done by the Public Key application.

    1> {ok, PemBin} = file:read_file("dsa.pem").
    -{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

    The following PEM file has only one entry, a private DSA key:

    2>[DSAEntry] =  public_key:pem_decode(PemBin).
    -[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
    +

    A DSA private key can look as follows:

    Note

    File handling is not done by the Public Key application.

    1> {ok, PemBin} = file:read_file("dsa.pem").
    +{ok,<<"-----BEGIN DSA PRIVATE KEY-----\nMIIBuw"...>>}

    The following PEM file has only one entry, a private DSA key:

    2>[DSAEntry] =  public_key:pem_decode(PemBin).
    +[{'DSAPrivateKey',<<48,130,1,187,2,1,0,2,129,129,0,183,
                         179,230,217,37,99,144,157,21,228,204,
                         162,207,61,246,...>>,
    -                    not_encrypted}]
    3> Key = public_key:pem_entry_decode(DSAEntry).
    -#'DSAPrivateKey'{version = 0,
    +                    not_encrypted}]
    3> Key = public_key:pem_entry_decode(DSAEntry).
    +#'DSAPrivateKey'{version = 0,
                      p = 12900045185019966618...6593,
                      q = 1216700114794736143432235288305776850295620488937,
                      g = 10442040227452349332...47213,
                      y = 87256807980030509074...403143,
    -                 x = 510968529856012146351317363807366575075645839654}

    + x = 510968529856012146351317363807366575075645839654}

    RSA Private Key with Password

    -

    An RSA private key encrypted with a password can look as follows:

    1> {ok, PemBin} = file:read_file("rsa.pem").
    -{ok,<<"Bag Attribute"...>>}

    The following PEM file has only one entry, a private RSA key:

    2>[RSAEntry] = public_key:pem_decode(PemBin).
    -[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
    +

    An RSA private key encrypted with a password can look as follows:

    1> {ok, PemBin} = file:read_file("rsa.pem").
    +{ok,<<"Bag Attribute"...>>}

    The following PEM file has only one entry, a private RSA key:

    2>[RSAEntry] = public_key:pem_decode(PemBin).
    +[{'RSAPrivateKey',<<224,108,117,203,152,40,15,77,128,126,
                         221,195,154,249,85,208,202,251,109,
                         119,120,57,29,89,19,9,...>>,
    -                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

    In this following example, the password is "abcd1234":

    3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
    -#'RSAPrivateKey'{version = 'two-prime',
    +                  {"DES-EDE3-CBC",<<"kÙeø¼pµL">>}}]

    In this following example, the password is "abcd1234":

    3> Key = public_key:pem_entry_decode(RSAEntry, "abcd1234").
    +#'RSAPrivateKey'{version = 'two-prime',
                      modulus = 1112355156729921663373...2737107,
                      publicExponent = 65537,
                      privateExponent = 58064406231183...2239766033,
    @@ -180,201 +180,201 @@ 

    exponent1 = 77928819327425934607...22152984217, exponent2 = 36287623121853605733...20588523793, coefficient = 924840412626098444...41820968343, - otherPrimeInfos = asn1_NOVALUE}

    + otherPrimeInfos = asn1_NOVALUE}

    X509 Certificates

    -

    The following is an example of X509 certificates:

    1> {ok, PemBin} = file:read_file("cacerts.pem").
    -{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

    The following file includes two certificates:

    2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
    -[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
    +

    The following is an example of X509 certificates:

    1> {ok, PemBin} = file:read_file("cacerts.pem").
    +{ok,<<"-----BEGIN CERTIFICATE-----\nMIIC7jCCAl"...>>}

    The following file includes two certificates:

    2> [CertEntry1, CertEntry2] = public_key:pem_decode(PemBin).
    +[{'Certificate',<<48,130,2,238,48,130,2,87,160,3,2,1,2,2,
                       9,0,230,145,97,214,191,2,120,150,48,13,
                       ...>>,
    -                not_encrypted},
    - {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
    +                not_encrypted},
    + {'Certificate',<<48,130,3,200,48,130,3,49,160,3,2,1,2,2,1,
                       1,48,13,6,9,42,134,72,134,247,...>>,
    -                not_encrypted}]

    Certificates can be decoded as usual:

    2> Cert = public_key:pem_entry_decode(CertEntry1).
    -#'Certificate'{
    +                not_encrypted}]

    Certificates can be decoded as usual:

    2> Cert = public_key:pem_entry_decode(CertEntry1).
    +#'Certificate'{
         tbsCertificate =
    -        #'TBSCertificate'{
    +        #'TBSCertificate'{
                 version = v3,serialNumber = 16614168075301976214,
                 signature =
    -                #'AlgorithmIdentifier'{
    -                    algorithm = {1,2,840,113549,1,1,5},
    -                    parameters = <<5,0>>},
    +                #'AlgorithmIdentifier'{
    +                    algorithm = {1,2,840,113549,1,1,5},
    +                    parameters = <<5,0>>},
                 issuer =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,6},
    -                          value = <<19,2,83,69>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = <<19,11,69,114,105,99,115,115,111,110,32,65,66>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = <<19,9,83,116,111,99,107,104,111,108,109>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,6},
    +                          value = <<19,2,83,69>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = <<22,22,112,101,116,101,114,64,101,114,...>>}]]},
                 validity =
    -                #'Validity'{
    -                    notBefore = {utcTime,"080109082929Z"},
    -                    notAfter = {utcTime,"080208082929Z"}},
    +                #'Validity'{
    +                    notBefore = {utcTime,"080109082929Z"},
    +                    notAfter = {utcTime,"080208082929Z"}},
                 subject =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,6},
    -                          value = <<19,2,83,69>>}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = <<19,8,101,114,108,97,110,103,67,65>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = <<19,10,69,114,108,97,110,103,32,79,84,80>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = <<19,11,69,114,105,99,115,115,111,110,32,...>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = <<19,9,83,116,111,99,107,104,111,108,...>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,6},
    +                          value = <<19,2,83,69>>}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = <<22,22,112,101,116,101,114,64,...>>}]]},
                 subjectPublicKeyInfo =
    -                #'SubjectPublicKeyInfo'{
    +                #'SubjectPublicKeyInfo'{
                         algorithm =
    -                        #'AlgorithmIdentifier'{
    -                            algorithm = {1,2,840,113549,1,1,1},
    -                            parameters = <<5,0>>},
    +                        #'AlgorithmIdentifier'{
    +                            algorithm = {1,2,840,113549,1,1,1},
    +                            parameters = <<5,0>>},
                         subjectPublicKey =
    -                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
    +                        {0,<<48,129,137,2,129,129,0,203,209,187,77,73,231,90,...>>}},
                 issuerUniqueID = asn1_NOVALUE,
                 subjectUniqueID = asn1_NOVALUE,
                 extensions =
    -                [#'Extension'{
    -                     extnID = {2,5,29,19},
    +                [#'Extension'{
    +                     extnID = {2,5,29,19},
                          critical = true,
    -                     extnValue = [48,3,1,1,255]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,15},
    +                     extnValue = [48,3,1,1,255]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,15},
                          critical = false,
    -                     extnValue = [3,2,1,6]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,14},
    +                     extnValue = [3,2,1,6]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,14},
                          critical = false,
    -                     extnValue = [4,20,27,217,65,152,6,30,142|...]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,17},
    +                     extnValue = [4,20,27,217,65,152,6,30,142|...]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,17},
                          critical = false,
    -                     extnValue = [48,24,129,22,112,101,116,101|...]}]},
    +                     extnValue = [48,24,129,22,112,101,116,101|...]}]},
         signatureAlgorithm =
    -        #'AlgorithmIdentifier'{
    -            algorithm = {1,2,840,113549,1,1,5},
    -            parameters = <<5,0>>},
    +        #'AlgorithmIdentifier'{
    +            algorithm = {1,2,840,113549,1,1,5},
    +            parameters = <<5,0>>},
         signature =
         <<163,186,7,163,216,152,63,47,154,234,139,73,154,96,120,
    -    165,2,52,196,195,109,167,192,...>>}

    Parts of certificates can be decoded with public_key:der_decode/2, using the + 165,2,52,196,195,109,167,192,...>>}

    Parts of certificates can be decoded with public_key:der_decode/2, using the ASN.1 type of that part. However, an application-specific certificate extension requires application-specific ASN.1 decode/encode-functions. In the recent example, the first value of rdnSequence is of ASN.1 type -'X520CommonName'. ({2,5,4,3} = ?id-at-commonName):

    public_key:der_decode('X520CommonName', <<19,8,101,114,108,97,110,103,67,65>>).
    -{printableString,"erlangCA"}

    However, certificates can also be decoded using pkix_decode_cert/2, which can -customize and recursively decode standard parts of a certificate:

    3> {_, DerCert, _} = CertEntry1.
    4> public_key:pkix_decode_cert(DerCert, otp).
    -#'OTPCertificate'{
    +'X520CommonName'. ({2,5,4,3} = ?id-at-commonName):

    public_key:der_decode('X520CommonName', <<19,8,101,114,108,97,110,103,67,65>>).
    +{printableString,"erlangCA"}

    However, certificates can also be decoded using pkix_decode_cert/2, which can +customize and recursively decode standard parts of a certificate:

    3> {_, DerCert, _} = CertEntry1.
    4> public_key:pkix_decode_cert(DerCert, otp).
    +#'OTPCertificate'{
         tbsCertificate =
    -        #'OTPTBSCertificate'{
    +        #'OTPTBSCertificate'{
                 version = v3,serialNumber = 16614168075301976214,
                 signature =
    -                #'SignatureAlgorithm'{
    -                    algorithm = {1,2,840,113549,1,1,5},
    -                    parameters = 'NULL'},
    +                #'SignatureAlgorithm'{
    +                    algorithm = {1,2,840,113549,1,1,5},
    +                    parameters = 'NULL'},
                 issuer =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = {printableString,"erlangCA"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = {printableString,"Erlang OTP"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = {printableString,"Ericsson AB"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = {printableString,"Stockholm"}}],
    -                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = "peter@erix.ericsson.se"}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = {printableString,"erlangCA"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = {printableString,"Erlang OTP"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = {printableString,"Ericsson AB"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = {printableString,"Stockholm"}}],
    +                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = "peter@erix.ericsson.se"}]]},
                 validity =
    -                #'Validity'{
    -                    notBefore = {utcTime,"080109082929Z"},
    -                    notAfter = {utcTime,"080208082929Z"}},
    +                #'Validity'{
    +                    notBefore = {utcTime,"080109082929Z"},
    +                    notAfter = {utcTime,"080208082929Z"}},
                 subject =
    -                {rdnSequence,
    -                    [[#'AttributeTypeAndValue'{
    -                          type = {2,5,4,3},
    -                          value = {printableString,"erlangCA"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,11},
    -                          value = {printableString,"Erlang OTP"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,10},
    -                          value = {printableString,"Ericsson AB"}}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {2,5,4,7},
    -                          value = {printableString,"Stockholm"}}],
    -                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    -                     [#'AttributeTypeAndValue'{
    -                          type = {1,2,840,113549,1,9,1},
    -                          value = "peter@erix.ericsson.se"}]]},
    +                {rdnSequence,
    +                    [[#'AttributeTypeAndValue'{
    +                          type = {2,5,4,3},
    +                          value = {printableString,"erlangCA"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,11},
    +                          value = {printableString,"Erlang OTP"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,10},
    +                          value = {printableString,"Ericsson AB"}}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {2,5,4,7},
    +                          value = {printableString,"Stockholm"}}],
    +                     [#'AttributeTypeAndValue'{type = {2,5,4,6},value = "SE"}],
    +                     [#'AttributeTypeAndValue'{
    +                          type = {1,2,840,113549,1,9,1},
    +                          value = "peter@erix.ericsson.se"}]]},
                 subjectPublicKeyInfo =
    -                #'OTPSubjectPublicKeyInfo'{
    +                #'OTPSubjectPublicKeyInfo'{
                         algorithm =
    -                        #'PublicKeyAlgorithm'{
    -                            algorithm = {1,2,840,113549,1,1,1},
    -                            parameters = 'NULL'},
    +                        #'PublicKeyAlgorithm'{
    +                            algorithm = {1,2,840,113549,1,1,1},
    +                            parameters = 'NULL'},
                         subjectPublicKey =
    -                        #'RSAPublicKey'{
    +                        #'RSAPublicKey'{
                                 modulus =
                                     1431267547247997...37419,
    -                            publicExponent = 65537}},
    +                            publicExponent = 65537}},
                 issuerUniqueID = asn1_NOVALUE,
                 subjectUniqueID = asn1_NOVALUE,
                 extensions =
    -                [#'Extension'{
    -                     extnID = {2,5,29,19},
    +                [#'Extension'{
    +                     extnID = {2,5,29,19},
                          critical = true,
                          extnValue =
    -                         #'BasicConstraints'{
    -                             cA = true,pathLenConstraint = asn1_NOVALUE}},
    -                 #'Extension'{
    -                     extnID = {2,5,29,15},
    +                         #'BasicConstraints'{
    +                             cA = true,pathLenConstraint = asn1_NOVALUE}},
    +                 #'Extension'{
    +                     extnID = {2,5,29,15},
                          critical = false,
    -                     extnValue = [keyCertSign,cRLSign]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,14},
    +                     extnValue = [keyCertSign,cRLSign]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,14},
                          critical = false,
    -                     extnValue = [27,217,65,152,6,30,142,132,245|...]},
    -                 #'Extension'{
    -                     extnID = {2,5,29,17},
    +                     extnValue = [27,217,65,152,6,30,142,132,245|...]},
    +                 #'Extension'{
    +                     extnID = {2,5,29,17},
                          critical = false,
    -                     extnValue = [{rfc822Name,"peter@erix.ericsson.se"}]}]},
    +                     extnValue = [{rfc822Name,"peter@erix.ericsson.se"}]}]},
         signatureAlgorithm =
    -        #'SignatureAlgorithm'{
    -            algorithm = {1,2,840,113549,1,1,5},
    -            parameters = 'NULL'},
    +        #'SignatureAlgorithm'{
    +            algorithm = {1,2,840,113549,1,1,5},
    +            parameters = 'NULL'},
         signature =
              <<163,186,7,163,216,152,63,47,154,234,139,73,154,96,120,
    -           165,2,52,196,195,109,167,192,...>>}

    This call is equivalent to public_key:pem_entry_decode(CertEntry1):

    5> public_key:pkix_decode_cert(DerCert, plain).
    -#'Certificate'{ ...}

    + 165,2,52,196,195,109,167,192,...>>}

    This call is equivalent to public_key:pem_entry_decode(CertEntry1):

    5> public_key:pkix_decode_cert(DerCert, plain).
    +#'Certificate'{ ...}

    @@ -385,17 +385,17 @@

    the result to a file. For example, assume that you have PubKey = 'RSAPublicKey'{}. Then you can create a PEM-"RSA PUBLIC KEY" file (ASN.1 type 'RSAPublicKey') or a PEM-"PUBLIC KEY" file -('SubjectPublicKeyInfo' ASN.1 type).

    The second element of the PEM-entry is the ASN.1 DER encoded key data:

    1> PemEntry = public_key:pem_entry_encode('RSAPublicKey', RSAPubKey).
    -{'RSAPublicKey', <<48,72,...>>, not_encrypted}
    +('SubjectPublicKeyInfo' ASN.1 type).

    The second element of the PEM-entry is the ASN.1 DER encoded key data:

    1> PemEntry = public_key:pem_entry_encode('RSAPublicKey', RSAPubKey).
    +{'RSAPublicKey', <<48,72,...>>, not_encrypted}
     
    -2> PemBin = public_key:pem_encode([PemEntry]).
    +2> PemBin = public_key:pem_encode([PemEntry]).
     <<"-----BEGIN RSA PUBLIC KEY-----\nMEgC...>>
     
     3> file:write_file("rsa_pub_key.pem", PemBin).
    -ok

    or:

    1> PemEntry = public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPubKey).
    -{'SubjectPublicKeyInfo', <<48,92...>>, not_encrypted}
    +ok

    or:

    1> PemEntry = public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPubKey).
    +{'SubjectPublicKeyInfo', <<48,92...>>, not_encrypted}
     
    -2> PemBin = public_key:pem_encode([PemEntry]).
    +2> PemBin = public_key:pem_encode([PemEntry]).
     <<"-----BEGIN PUBLIC KEY-----\nMFw...>>
     
     3> file:write_file("pub_key.pem", PemBin).
    @@ -405,9 +405,9 @@ 

    RSA Public-Key Cryptography

    -

    Suppose you have the following private key and a corresponding public key:

    • PrivateKey = #'RSAPrivateKey{}' and the plaintext Msg = binary()
    • PublicKey = #'RSAPublicKey'{}

    Then you can proceed as follows:

    Encrypt with the private key:

    RsaEncrypted = public_key:encrypt_private(Msg, PrivateKey),
    -Msg = public_key:decrypt_public(RsaEncrypted, PublicKey),

    Encrypt with the public key:

    RsaEncrypted = public_key:encrypt_public(Msg, PublicKey),
    -Msg = public_key:decrypt_private(RsaEncrypted, PrivateKey),

    Note

    You normally do only one of the encrypt or decrypt operations, and the peer +

    Suppose you have the following private key and a corresponding public key:

    • PrivateKey = #'RSAPrivateKey{}' and the plaintext Msg = binary()
    • PublicKey = #'RSAPublicKey'{}

    Then you can proceed as follows:

    Encrypt with the private key:

    RsaEncrypted = public_key:encrypt_private(Msg, PrivateKey),
    +Msg = public_key:decrypt_public(RsaEncrypted, PublicKey),

    Encrypt with the public key:

    RsaEncrypted = public_key:encrypt_public(Msg, PublicKey),
    +Msg = public_key:decrypt_private(RsaEncrypted, PrivateKey),

    Note

    You normally do only one of the encrypt or decrypt operations, and the peer does the other. This normally used in legacy applications as a primitive digital signature.

    Warning

    This legacy algorithm is broken although there exists a software prevention when using appropriate OpenSSL cryptolib with Erlang/OTP it is hard to @@ -418,12 +418,12 @@

    Digital Signatures

    Suppose you have the following private key and a corresponding public key:

    • PrivateKey = #'RSAPrivateKey{}' or #'DSAPrivateKey'{} and the plaintext -Msg = binary()
    • PublicKey = #'RSAPublicKey'{} or {integer(), #'DssParams'{}}

    Then you can proceed as follows:

    Signature = public_key:sign(Msg, sha, PrivateKey),
    -true = public_key:verify(Msg, sha, Signature, PublicKey),

    Note

    You normally do only one of the sign or verify operations, and the peer does +Msg = binary()

  • PublicKey = #'RSAPublicKey'{} or {integer(), #'DssParams'{}}
  • Then you can proceed as follows:

    Signature = public_key:sign(Msg, sha, PrivateKey),
    +true = public_key:verify(Msg, sha, Signature, PublicKey),

    Note

    You normally do only one of the sign or verify operations, and the peer does the other.

    It can be appropriate to calculate the message digest before calling sign or -verify, and then use none as second argument:

    Digest = crypto:sha(Msg),
    -Signature = public_key:sign(Digest, none, PrivateKey),
    -true = public_key:verify(Digest, none, Signature, PublicKey),

    +verify, and then use none as second argument:

    Digest = crypto:sha(Msg),
    +Signature = public_key:sign(Digest, none, PrivateKey),
    +true = public_key:verify(Digest, none, Signature, PublicKey),

    @@ -514,9 +514,9 @@

    Note

    Other applications like ssl/tls or https might have options that are passed down to the public_key:pkix_verify_hostname. You will probably not have to call it directly

    Suppose our client expects to connect to the web server https://www.example.net. -This URI is therefore the Reference IDs of the client. The call will be:

     public_key:pkix_verify_hostname(CertFromHost,
    -                                 [{uri_id, "https://www.example.net"}
    -                                 ]).

    The call will return true or false depending on the check. The caller do not +This URI is therefore the Reference IDs of the client. The call will be:

     public_key:pkix_verify_hostname(CertFromHost,
    +                                 [{uri_id, "https://www.example.net"}
    +                                 ]).

    The call will return true or false depending on the check. The caller do not need to handle the matching rules in the rfc. The matching will proceed as:

    • If there is a Subject Alternate Name field, the {uri_id,string()} in the function call will be compared to any {uniformResourceIdentifier,string()} in the Certificate field. If the two strings() are equal (case insensitive), @@ -539,25 +539,25 @@

      either a string/0 to be matched to each CN-name or the atom default which will invoke the default fqdn extraction function. The return value undefined removes the current URI from the fqdn extraction.

       ...
      - Extract = fun({uri_id, "myspecial://"++HostName}) -> HostName;
      -              (_Else) -> default
      + Extract = fun({uri_id, "myspecial://"++HostName}) -> HostName;
      +              (_Else) -> default
                  end,
        ...
      - public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      -                                 [{fqdn_fun, Extract}])
      + public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      +                                 [{fqdn_fun, Extract}])
        ...

      Re-defining the match operation

      The default matching handles dns_id and uri_id. In an uri_id the value is tested for equality with a value from the Subject Alternate Name. If some other kind of matching is needed, use the match_fun option.

      The match_fun takes two arguments and returns either true, false or default. The value default will invoke the default match function.

       ...
      - Match = fun({uri_id,"myspecial://"++A},
      -             {uniformResourceIdentifier,"myspecial://"++B}) ->
      -                                                    my_match(A,B);
      -            (_RefID, _PresentedID) ->
      + Match = fun({uri_id,"myspecial://"++A},
      +             {uniformResourceIdentifier,"myspecial://"++B}) ->
      +                                                    my_match(A,B);
      +            (_RefID, _PresentedID) ->
                                       default
                end,
        ...
      - public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      -                                 [{match_fun, Match}]),
      + public_key:pkix_verify_hostname(CertFromHost, RefIDs,
      +                                 [{match_fun, Match}]),
        ...

      In case of a match operation between a ReferenceID and a CN value from the Subject field, the first argument to the fun is the extracted hostname from the ReferenceID, and the second argument is the tuple {cn, string()} taken @@ -578,19 +578,19 @@

      identifier. ..."

    The purpose is to have a mechanism for a human to accept an otherwise faulty Certificate. In for example a web browser, you could get a question like

    Warning: you wanted to visit the site www.example.com, but the certificate is for shop.example.com. Accept anyway (yes/no)?"

    This could be accomplished with the option fail_callback which will be called -if the hostname verification fails:

     -include_lib("public_key/include/public_key.hrl"). % Record def
    +if the hostname verification fails:

     -include_lib("public_key/include/public_key.hrl"). % Record def
      ...
    - Fail = fun(#'OTPCertificate'{}=C) ->
    -              case in_my_cache(C) orelse my_accept(C) of
    + Fail = fun(#'OTPCertificate'{}=C) ->
    +              case in_my_cache(C) orelse my_accept(C) of
                       true ->
    -                       enter_my_cache(C),
    +                       enter_my_cache(C),
                            true;
                       false ->
                            false
              end,
      ...
    - public_key:pkix_verify_hostname(CertFromHost, RefIDs,
    -                                 [{fail_callback, Fail}]),
    + public_key:pkix_verify_hostname(CertFromHost, RefIDs,
    +                                 [{fail_callback, Fail}]),
      ...

    diff --git a/prs/9277/lib/reltool-1.0.1/doc/html/.build b/prs/9277/lib/reltool-1.0.1/doc/html/.build index c4925bdccae71..c7d8423a8b695 100644 --- a/prs/9277/lib/reltool-1.0.1/doc/html/.build +++ b/prs/9277/lib/reltool-1.0.1/doc/html/.build @@ -18,7 +18,7 @@ dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 dist/lato-latin-ext-400-normal-N27NCBWW.woff2 dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-E78672BE.js +dist/search_data-B9331EE0.js dist/sidebar_items-DF937488.js index.html notes.html diff --git a/prs/9277/lib/reltool-1.0.1/doc/html/dist/search_data-B9331EE0.js b/prs/9277/lib/reltool-1.0.1/doc/html/dist/search_data-B9331EE0.js new file mode 100644 index 0000000000000..600a7aa401df8 --- /dev/null +++ b/prs/9277/lib/reltool-1.0.1/doc/html/dist/search_data-B9331EE0.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","doc":"Main API of the Reltool application\n\nThis is an interface module for the Reltool application.\n\n_Reltool_ is a release management tool. It analyses a given Erlang/OTP\ninstallation and determines various dependencies between applications. The\n`graphical` frontend depicts the dependencies and enables interactive\ncustomization of a target system. The backend provides a `batch` interface for\ngeneration of customized target systems.\n\nThe tool uses an installed Erlang/OTP system as input. `root_dir` is the root\ndirectory of the analysed system and it defaults to the system executing\nReltool. Applications may also be located outside `root_dir`. `lib_dirs` defines\nlibrary directories where additional applications may reside and it defaults to\nthe directories listed by the operating system environment variable `ERL_LIBS`.\nSee the module `code` for more info.\n\nAn application directory `AppDir` under a library directory is recognized by the\nexistence of an `AppDir/ebin` directory. If this does not exist, Reltool will\nnot consider `AppDir` at all when looking for applications.\n\nIt is recommended that application directories are named as the application,\npossibly followed by a dash and the version number. For example `myapp` or\n`myapp-1.1`.\n\nFinally single modules and entire applications may be read from Escripts.\n\nSome configuration parameters control the behavior of Reltool on system (`sys`)\nlevel. Others provide control on application (`app`) level and yet others are on\nmodule (`mod`) level. Module level parameters override application level\nparameters and application level parameters override system level parameters.\nEscript `escript` level parameters override system level parameters.\n\nThe following top level `options` are supported:\n\n- **`config`** - This is the main option and it controls the configuration of\n Reltool. It can either be a `sys` tuple or a name of a `file` containing a sys\n tuple.\n\n- **`trap_exit`** - This option controls the error handling behavior of Reltool.\n By default the window processes traps exit, but this behavior can altered by\n setting `trap_exit` to `false`.\n\n- **`wx_debug`** - This option controls the debug level of `wx`. As its name\n indicates it is only useful for debugging. See `wx:debug/1` for more info.\n\nBesides the already mentioned source parameters `root_dir` and `lib_dirs`, the\nfollowing system (`sys`) level options are supported:\n\n- **`erts`** - Erts specific configuration. See application level options below.\n\n- **`escript`** - Escript specific configuration. An escript has a mandatory\n file name and escript level options that are described below.\n\n- **`app`** - Application specific configuration. An application has a mandatory\n name and application level options that are described below.\n\n- **`mod_cond`** - This parameter controls the module inclusion policy. It\n defaults to `all` which means that if an application is included (either\n explicitly or implicitly) all modules in that application will be included.\n This implies that both modules that exist in the `ebin` directory of the\n application, as well as modules that are named in the `app` file will be\n included. If the parameter is set to `ebin`, both modules in the `ebin`\n directory and derived modules are included. If the parameter is set to `app`,\n both modules in the `app` file and derived modules are included. `derived`\n means that only modules that are used by other included modules are included.\n The `mod_cond` setting on system level is used as default for all\n applications.\n\n- **`incl_cond`** - This parameter controls the application and escript\n inclusion policy. It defaults to `derived` which means that the applications\n that do not have any explicit `incl_cond` setting, will only be included if\n any other (explicitly or implicitly included) application uses it. The value\n `include` implies that all applications and escripts that do not have any\n explicit `incl_cond` setting will be included. `exclude` implies that all\n applications and escripts that do not have any explicit `incl_cond` setting\n will be excluded.\n\n- **`boot_rel`** - A target system may have several releases but the one given\n as `boot_rel` will be used as default when the system is booting up.\n\n- **`rel`** - Release specific configuration. Each release maps to a `rel`,\n `script` and `boot` file. See the module `systools` for more info about the\n details. Each release has a name, a version and a set of applications with a\n few release specific parameters such as type and included applications.\n\n- **`relocatable`** - This parameter controls whether the `erl` executable in\n the target system should automatically determine where it is installed or if\n it should use a hardcoded path to the installation. In the latter case the\n target system must be installed with `reltool:install/2` before it can be\n used. If the system is relocatable, the file tree containing the target system\n can be moved to another location without re-installation. The default is\n `true`.\n\n- **`profile`** - The creation of the specification for a target system is\n performed in two steps. In the first step a complete specification is\n generated. It will likely contain much more files than you are interested in\n in your customized target system. In the second step the specification will be\n filtered according to your filters. There you have the ability to specify\n filters per application as well as system wide filters. You can also select a\n `profile` for your system. Depending on the `profile`, different default\n filters will be used. There are three different profiles to choose from:\n `development`, `embedded` and `standalone`. `development` is default. The\n parameters that are affected by the `profile` are: `incl_sys_filters`,\n `excl_sys_filters`, `incl_app_filters` and `excl_app_filters`.\n\n- **`app_file`** - This parameter controls the default handling of the `app`\n files when a target system is generated. It defaults to `keep` which means\n that `app` files are copied to the target system and their contents are kept\n as they are. `strip` means that a new `app` file is generated from the\n contents of the original `app` file where the non included modules are removed\n from the file. `all` does also imply that a new `app` file is generated from\n the contents of the original `app` file, with the difference that all included\n modules are added to the file. If the application does not have any `app` file\n a file will be created for `all` but not for `keep` and `strip`.\n\n- **`debug_info`** - The `debug_info` parameter controls what debug information\n in the beam file should be kept or stripped. `keep` keeps all debug info,\n `strip` strips all debug info, and a list of chunkids keeps only those chunks.\n\n- **`excl_lib`**\n\n > #### Warning {: .warning }\n > This option is experimental.\n\n If the `excl_lib` option is set to `otp_root` then reltool will not copy\n anything from the Erlang/OTP installation ($OTPROOT) into the target\n structure. The goal is to create a \"slim\" release which can be used together\n with an existing Erlang/OTP installation. The target structure will therefore\n only contain a `lib` directory with the applications that were found outside\n of $OTPROOT (typically your own applications), and a `releases` directory with\n the generated `.rel,` `.script` and `.boot` files.\n\n When starting this release, three things must be specified:\n\n - **_Which `releases` directory to use_** - Tell the release handler to use\n the `releases` directory in our target structure instead of\n `$OTPROOT/releases`. This is done by setting the SASL environment variable\n `releases_dir`, either from the command line\n (`-sasl releases_dir /releases`) or in `sys.config`.\n\n - **_Which boot file to use_** - The default boot file is\n `$OTPROOT/bin/start`, but in this case we need to specify a boot file from\n our target structure, typically ` /releases/ / `.\n This is done with the `-boot` command line option to `erl`\n\n - **_The location of our applications_** - The generated .script (and .boot)\n file uses the environment variable `$RELTOOL_EXT_LIB` as prefix for the\n paths to all applications. The `-boot_var` option to `erl` can be used for\n specifying the value of this variable, typically\n `-boot_var RELTOOL_EXT_LIB /lib`.\n\n Example:\n\n ```text\n erl -sasl releases_dir \\\"mytarget/releases\\\" -boot mytarget/releases/1.0/myrel\\\n -boot_var RELTOOL_EXT_LIB mytarget/lib\n ```\n\n- **`incl_sys_filters`** - This parameter normally contains a list of regular\n expressions that controls which files in the system should be included. Each\n file in the target system must match at least one of the listed regular\n expressions in order to be included. Further the files may not match any\n filter in `excl_sys_filters` in order to be included. Which application files\n should be included is controlled with the parameters `incl_app_filters` and\n `excl_app_filters`. This parameter defaults to `[\".*\"]`.\n\n- **`excl_sys_filters`** - This parameter normally contains a list of regular\n expressions that controls which files in the system should not be included in\n the target system. In order to be included, a file must match some filter in\n `incl_sys_filters` but not any filter in `excl_sys_filters`. This parameter\n defaults to `[]`.\n\n- **`incl_app_filters`** - This parameter normally contains a list of regular\n expressions that controls which application specific files that should be\n included. Each file in the application must match at least one of the listed\n regular expressions in order to be included. Further the files may not match\n any filter in `excl_app_filters` in order to be included. This parameter\n defaults to `[\".*\"]`.\n\n- **`excl_app_filters`** - This parameter normally contains a list of regular\n expressions that controls which application specific files should not be\n included in the target system. In order to be included, a file must match some\n filter in `incl_app_filters` but not any filter in `excl_app_filters`. This\n parameter defaults to `[]`.\n\nOn application (`escript`) level, the following options are supported:\n\n- **`incl_cond`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\nOn application (`app`) level, the following options are supported:\n\n- **`vsn`** - The version of the application. In an installed system there may\n exist several versions of an application. The `vsn` parameter controls which\n version of the application will be chosen.\n\n This parameter is mutual exclusive with `lib_dir`. If `vsn` and `lib_dir` are\n both omitted, the latest version will be chosen.\n\n Note that in order for reltool to sort application versions and thereby be\n able to select the latest, it is required that the version id for the\n application consists of integers and dots only, for example `1`, `2.0` or\n `3.17.1`.\n\n- **`lib_dir`** - The directory to read the application from. This parameter can\n be used to point out a specific location to fetch the application from. This\n is useful for instance if the parent directory for some reason is no good as a\n library directory on system level.\n\n This parameter is mutual exclusive with `vsn`. If `vsn` and `lib_dir` are both\n omitted, the latest version will be chosen.\n\n Note that in order for reltool to sort application versions and thereby be\n able to select the latest, it is required that the version id for the\n application consists of integers and dots only, for example `1`, `2.0` or\n `3.17.1`.\n\n- **`mod`** - Module specific configuration. A module has a mandatory name and\n module level options that are described below.\n\n- **`mod_cond`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\n- **`incl_cond`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\n- **`app_file`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\n- **`debug_info`** - The value of this parameter overrides the parameter with\n the same name on system level.\n\n- **`incl_app_filters`** - The value of this parameter overrides the parameter\n with the same name on system level.\n\n- **`excl_app_filters`** - The value of this parameter overrides the parameter\n with the same name on system level.\n\nOn module (`mod`) level, the following options are supported:\n\n- **`incl_cond`** - This parameter controls whether the module is included or\n not. By default the `mod_cond` parameter on application and system level will\n be used to control whether the module is included or not. The value of\n `incl_cond` overrides the module inclusion policy. `include` implies that the\n module is included, while `exclude` implies that the module is not included.\n `derived` implies that the module is included if it is used by any other\n included module.\n\n- **`debug_info`** - The value of this parameter overrides the parameter with\n the same name on application level.","title":"reltool","ref":"reltool.html"},{"type":"function","doc":"Create a target system.\n\nGives the same result as `{ok,TargetSpec}=reltool:get_target_spec(Server)` and\n`reltool:eval_target_spec(TargetSpec,RootDir,TargetDir)`.","title":"reltool.create_target/2","ref":"reltool.html#create_target/2"},{"type":"function","doc":"Create the actual target system from a specification generated by\n`reltool:get_target_spec/1`.\n\nThe creation of the specification for a target system is performed in two steps.\nIn the first step a complete specification will be generated. It will likely contain\nmuch more files than you are interested in your target system. In the second\nstep the specification will be filtered according to your filters. There you have the\nability to specify filters per application as well as system wide filters. You can\nalso select a `profile` for your system. Depending on the `profile`, different\ndefault filters will be used.\n\nThe top directories `bin`, `releases` and `lib` are treated differently from\nother files. All other files are by default copied to the target system. The\n`releases` directory contains generated `rel`, `script`, and `boot` files. The\n`lib` directory contains the applications. Which applications are included and\nif they should be customized (stripped from debug info etc.) is specified with\nvarious configuration parameters. The files in the `bin` directory are copied\nfrom the `erts-vsn/bin` directory, but only those files that were originally\nincluded in the `bin` directory of the source system.\n\nIf the configuration parameter `relocatable` was set to `true` there is no need\nto install the target system with `reltool:install/2` before it can be started.\nIn that case the file tree containing the target system can be moved without\nre-installation.\n\nIn most cases, the `RootDir` parameter should be set to the same as the\n`root_dir` configuration parameter used in the call to\n`reltool:get_target_spec/1` (or `code:root_dir/0` if the configuration parameter\nis not set). In some cases it might be useful to evaluate the same target\nspecification towards different root directories. This should, however, be used\nwith great care as it requires equivalent file structures under all roots.","title":"reltool.eval_target_spec/3","ref":"reltool.html#eval_target_spec/3"},{"type":"function","doc":"","title":"reltool.get_config/1","ref":"reltool.html#get_config/1"},{"type":"function","doc":"Get reltool configuration.\n\nNormally, only the explicit configuration parameters with values that differ from\ntheir defaults are interesting. But the builtin default values can be returned by\nsetting `InclDefaults` to `true`. The derived configuration can be returned by\nsetting `InclDerived` to `true`.","title":"reltool.get_config/3","ref":"reltool.html#get_config/3"},{"type":"function","doc":"Get contents of a release file. See [`rel`](`e:sasl:rel.md`) for more details.","title":"reltool.get_rel/2","ref":"reltool.html#get_rel/2"},{"type":"function","doc":"Get contents of a boot script file. See [`script`](`e:sasl:script.md`) for more details.","title":"reltool.get_script/2","ref":"reltool.html#get_script/2"},{"type":"function","doc":"Return the process identifier of the server process.","title":"reltool.get_server/1","ref":"reltool.html#get_server/1"},{"type":"function","doc":"Get status about the configuration","title":"reltool.get_status/1","ref":"reltool.html#get_status/1"},{"type":"function","doc":"Return a specification of the target system. The actual target system can be\ncreated with `reltool:eval_target_spec/3`.","title":"reltool.get_target_spec/1","ref":"reltool.html#get_target_spec/1"},{"type":"function","doc":"Install a created target system","title":"reltool.install/2","ref":"reltool.html#install/2"},{"type":"function","doc":"Start a main window process with default options","title":"reltool.start/0","ref":"reltool.html#start/0"},{"type":"function","doc":"Start a main window process with options","title":"reltool.start/1","ref":"reltool.html#start/1"},{"type":"function","doc":"Start a main window process with options. The process is linked.","title":"reltool.start_link/1","ref":"reltool.html#start_link/1"},{"type":"function","doc":"Start a server process with options. The server process identity can be given as\nan argument to several other functions in the API.","title":"reltool.start_server/1","ref":"reltool.html#start_server/1"},{"type":"function","doc":"Stop a server or window process","title":"reltool.stop/1","ref":"reltool.html#stop/1"},{"type":"type","doc":"","title":"reltool.app/0","ref":"reltool.html#t:app/0"},{"type":"type","doc":"","title":"reltool.app_file/0","ref":"reltool.html#t:app_file/0"},{"type":"type","doc":"","title":"reltool.app_name/0","ref":"reltool.html#t:app_name/0"},{"type":"type","doc":"","title":"reltool.app_type/0","ref":"reltool.html#t:app_type/0"},{"type":"type","doc":"","title":"reltool.app_vsn/0","ref":"reltool.html#t:app_vsn/0"},{"type":"type","doc":"","title":"reltool.base_dir/0","ref":"reltool.html#t:base_dir/0"},{"type":"type","doc":"","title":"reltool.base_file/0","ref":"reltool.html#t:base_file/0"},{"type":"type","doc":"","title":"reltool.boot_rel/0","ref":"reltool.html#t:boot_rel/0"},{"type":"type","doc":"","title":"reltool.config/0","ref":"reltool.html#t:config/0"},{"type":"type","doc":"","title":"reltool.debug_info/0","ref":"reltool.html#t:debug_info/0"},{"type":"type","doc":"","title":"reltool.dir/0","ref":"reltool.html#t:dir/0"},{"type":"type","doc":"","title":"reltool.escript/0","ref":"reltool.html#t:escript/0"},{"type":"type","doc":"","title":"reltool.escript_file/0","ref":"reltool.html#t:escript_file/0"},{"type":"type","doc":"","title":"reltool.excl_app_filters/0","ref":"reltool.html#t:excl_app_filters/0"},{"type":"type","doc":"","title":"reltool.excl_lib/0","ref":"reltool.html#t:excl_lib/0"},{"type":"type","doc":"","title":"reltool.excl_sys_filters/0","ref":"reltool.html#t:excl_sys_filters/0"},{"type":"type","doc":"","title":"reltool.file/0","ref":"reltool.html#t:file/0"},{"type":"type","doc":"","title":"reltool.incl_app/0","ref":"reltool.html#t:incl_app/0"},{"type":"type","doc":"","title":"reltool.incl_app_filters/0","ref":"reltool.html#t:incl_app_filters/0"},{"type":"type","doc":"","title":"reltool.incl_cond/0","ref":"reltool.html#t:incl_cond/0"},{"type":"type","doc":"","title":"reltool.incl_defaults/0","ref":"reltool.html#t:incl_defaults/0"},{"type":"type","doc":"","title":"reltool.incl_derived/0","ref":"reltool.html#t:incl_derived/0"},{"type":"type","doc":"","title":"reltool.incl_sys_filters/0","ref":"reltool.html#t:incl_sys_filters/0"},{"type":"type","doc":"","title":"reltool.lib_dir/0","ref":"reltool.html#t:lib_dir/0"},{"type":"type","doc":"","title":"reltool.mod/0","ref":"reltool.html#t:mod/0"},{"type":"type","doc":"","title":"reltool.mod_cond/0","ref":"reltool.html#t:mod_cond/0"},{"type":"type","doc":"","title":"reltool.mod_name/0","ref":"reltool.html#t:mod_name/0"},{"type":"type","doc":"","title":"reltool.option/0","ref":"reltool.html#t:option/0"},{"type":"type","doc":"","title":"reltool.options/0","ref":"reltool.html#t:options/0"},{"type":"type","doc":"","title":"reltool.profile/0","ref":"reltool.html#t:profile/0"},{"type":"type","doc":"","title":"reltool.re_regexp/0","ref":"reltool.html#t:re_regexp/0"},{"type":"type","doc":"","title":"reltool.reason/0","ref":"reltool.html#t:reason/0"},{"type":"type","doc":"","title":"reltool.regexps/0","ref":"reltool.html#t:regexps/0"},{"type":"type","doc":"","title":"reltool.rel_app/0","ref":"reltool.html#t:rel_app/0"},{"type":"type","doc":"","title":"reltool.rel_file/0","ref":"reltool.html#t:rel_file/0"},{"type":"type","doc":"","title":"reltool.rel_name/0","ref":"reltool.html#t:rel_name/0"},{"type":"type","doc":"","title":"reltool.rel_opt/0","ref":"reltool.html#t:rel_opt/0"},{"type":"type","doc":"","title":"reltool.rel_vsn/0","ref":"reltool.html#t:rel_vsn/0"},{"type":"type","doc":"","title":"reltool.relocatable/0","ref":"reltool.html#t:relocatable/0"},{"type":"type","doc":"","title":"reltool.root_dir/0","ref":"reltool.html#t:root_dir/0"},{"type":"type","doc":"","title":"reltool.script_file/0","ref":"reltool.html#t:script_file/0"},{"type":"type","doc":"","title":"reltool.server/0","ref":"reltool.html#t:server/0"},{"type":"type","doc":"","title":"reltool.server_pid/0","ref":"reltool.html#t:server_pid/0"},{"type":"type","doc":"","title":"reltool.sys/0","ref":"reltool.html#t:sys/0"},{"type":"type","doc":"","title":"reltool.target_dir/0","ref":"reltool.html#t:target_dir/0"},{"type":"type","doc":"","title":"reltool.target_spec/0","ref":"reltool.html#t:target_spec/0"},{"type":"type","doc":"","title":"reltool.top_dir/0","ref":"reltool.html#t:top_dir/0"},{"type":"type","doc":"","title":"reltool.top_file/0","ref":"reltool.html#t:top_file/0"},{"type":"type","doc":"","title":"reltool.warning/0","ref":"reltool.html#t:warning/0"},{"type":"type","doc":"","title":"reltool.window_pid/0","ref":"reltool.html#t:window_pid/0"},{"type":"extras","doc":"\n# Reltool Release Notes\n\nThis document describes the changes made to the Reltool system from version to\nversion. The intention of this document is to list all incompatibilities as well\nas all enhancements and bugfixes for every release of Reltool. Each release of\nReltool thus constitutes one section in this document. The title of each section\nis the version number of Reltool.","title":"Reltool Release Notes","ref":"notes.html"},{"type":"extras","doc":"","title":"Reltool 1.0.1 - Reltool Release Notes","ref":"notes.html#reltool-1-0-1"},{"type":"extras","doc":"- The dependencies for this application are now listed in the app file.\n\n Own Id: OTP-18831 Aux Id: [PR-7441]\n\n[PR-7441]: https://github.com/erlang/otp/pull/7441","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-8026]: https://github.com/erlang/otp/pull/8026","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 1.0 - Reltool Release Notes","ref":"notes.html#reltool-1-0"},{"type":"extras","doc":"- Add possibility to strip specific chunks from beam files included in a\n release. Before this change it was only possible to strip all chunks from the\n beam files.\n\n Own Id: OTP-18230 Aux Id: PR-5936\n\n- Runtime dependencies have been updated.\n\n Own Id: OTP-18350\n\n- Support for the experimental code archives feature has been removed from\n `reltool`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18488 Aux Id: PR-6836\n\n- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n appropriate, instead of `proc_lib:init_ack/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.9.1.1 - Reltool Release Notes","ref":"notes.html#reltool-0-9-1-1"},{"type":"extras","doc":"* Fixed runtime dependencies.\n\n Own Id: OTP-19064","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.9.1 - Reltool Release Notes","ref":"notes.html#reltool-0-9-1"},{"type":"extras","doc":"- Fixed a bug that would cause analysis to crash.\n\n Own Id: OTP-18372 Aux Id: GH-6580","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.9 - Reltool Release Notes","ref":"notes.html#reltool-0-9"},{"type":"extras","doc":"- Recognize new key 'optional_applications' in application resource files.\n\n Own Id: OTP-17189 Aux Id: PR-2675\n\n- Removed timestamps from files generated by `sasl` and `reltool` to enable\n deterministic builds.\n\n Own Id: OTP-17292 Aux Id: PR-4685, PR-4684","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.8 - Reltool Release Notes","ref":"notes.html#reltool-0-8"},{"type":"extras","doc":"- A new element, `Opts`, can now be included in a `rel` tuple in the reltool\n release specific configuration format: \\{rel, Name, Vsn, RelApps, Opts\\}.\n\n This supports the use of\n `{rel, Name, Vsn, RelApps, [{load_dot_erlang, false}]}` to prevent the boot\n script from running the `.erlang` file.\n\n The incompatibilities are as follows:\n\n \\* The return from `reltool:get_config/1` and `reltool:get_config/3` includes\n the new `rel` tuple for all releases where the `load_dot_erlang` option is set\n to `false`. \n \\* The return from `reltool:get_config/3` includes the new `rel` tuple for ALL\n releases if the `InclDefs` parameter is set to `true`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15571","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.7.8 - Reltool Release Notes","ref":"notes.html#reltool-0-7-8"},{"type":"extras","doc":"- Reltool would earlier erroneously split paths like `\"c:\\foo\"` into\n `[\"c\",\"\\foo\"]` when reading the `$ERL_LIBS` variable on windows. This is now\n corrected.\n\n Own Id: OTP-15454","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.7.7 - Reltool Release Notes","ref":"notes.html#reltool-0-7-7"},{"type":"extras","doc":"- Improved documentation.\n\n Own Id: OTP-15190","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.7.6 - Reltool Release Notes","ref":"notes.html#reltool-0-7-6"},{"type":"extras","doc":"- Calls to `erlang:get_stacktrace()` are removed.\n\n Own Id: OTP-14861","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.7.5 - Reltool Release Notes","ref":"notes.html#reltool-0-7-5"},{"type":"extras","doc":"- Files generated by `release_handler` and `reltool`, which might contain\n Unicode characters, are now encoded as UTF-8 and written with format \"~tp\" or\n \"~ts\". If the file is to be read by `file:consult/1`, an encoding comment is\n added.\n\n Own Id: OTP-14463","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.7.4 - Reltool Release Notes","ref":"notes.html#reltool-0-7-4"},{"type":"extras","doc":"- The User's Guide examples are updated after removal of support for Dets files\n created with Erlang/OTP R7 and earlier.\n\n Own Id: OTP-14422 Aux Id: OTP-13830","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.7.3 - Reltool Release Notes","ref":"notes.html#reltool-0-7-3"},{"type":"extras","doc":"- Fixed xml issues in old release notes\n\n Own Id: OTP-14269","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.7.2 - Reltool Release Notes","ref":"notes.html#reltool-0-7-2"},{"type":"extras","doc":"- Dependencies specified in .app files would earlier only be followed for\n applications that are included in a 'rel' spec in the reltool config. For\n other applications, only xref would decide the dependencies.\n\n Some dependency chains would even be missed for applications that are included\n in a 'rel' spec in the reltool config. E.g.\n\n - Application x has y as included application, and y in turn has z as included\n application. Then z is not included.\n - Application x has y in its 'applications' tag in the .app file, and y in\n turn has z as included application. Then z is not included.\n\n These bugs are now corrected.\n\n Own Id: OTP-11993","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.7.1 - Reltool Release Notes","ref":"notes.html#reltool-0-7-1"},{"type":"extras","doc":"- Modify the code as motivated by a change of the Erlang Parser (`undefined` is\n no longer automatically inserted to the type of record fields without an\n initializer).\n\n Own Id: OTP-13033 Aux Id: OTP-12719","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.7 - Reltool Release Notes","ref":"notes.html#reltool-0-7"},{"type":"extras","doc":"- Change license text from Erlang Public License to Apache Public License v2\n\n Own Id: OTP-12845","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.6.6 - Reltool Release Notes","ref":"notes.html#reltool-0-6-6"},{"type":"extras","doc":"- Fixed a minor typo in an error message from reltool_server.\n\n Own Id: OTP-11977","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.6.5 - Reltool Release Notes","ref":"notes.html#reltool-0-6-5"},{"type":"extras","doc":"- When adding a regexp to a filter in reltool using \\{add,Regexp\\}, and the\n existing regexp was undefined, reltool would crash since it got an improper\n list. This has been corrected. (Thanks to Håkan Mattsson)\n\n Own Id: OTP-11591\n\n- Adapted reltool test server to common test usage of tc_status. (Note that this\n code is not used by OTP daily test runs.) (Thanks to Håkan Mattsson)\n\n Own Id: OTP-11592\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.6.4.1 - Reltool Release Notes","ref":"notes.html#reltool-0-6-4-1"},{"type":"extras","doc":"- The encoding of the `notes.xml` file has been changed from latin1 to utf-8 to\n avoid future merge problems.\n\n Own Id: OTP-11310","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.6.4 - Reltool Release Notes","ref":"notes.html#reltool-0-6-4"},{"type":"extras","doc":"- Fix receive support in erl_eval with a BEAM module. Thanks to Anthony Ramine.\n\n Own Id: OTP-11137","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Reltool used to fail if an application was mentioned in the config file which\n was not found in the file system, even if the application was explicitly\n excluded in the config. This has been changed and will only produce a warning.\n If the application is not explicitly excluded it will still cause reltool to\n fail. Thanks to Håkan Mattsson\\!\n\n Own Id: OTP-10988\n\n- Fix possibly \"not owner\" error while file copy with reltool. Thanks to Alexey\n Saltanov.\n\n Own Id: OTP-11099","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.6.3 - Reltool Release Notes","ref":"notes.html#reltool-0-6-3"},{"type":"extras","doc":"- Some updates are made to reltool for handling unicode.\n\n Own Id: OTP-10781","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.6.2 - Reltool Release Notes","ref":"notes.html#reltool-0-6-2"},{"type":"extras","doc":"- - If `incl_cond` was set to `derived` on module level, then reltool_server\n would crash with a `case_clause`. This has been corrected. `incl_cond` on\n module level now overwrites `mod_cond` on app or sys level as described in\n the documentation.\n - If a `rel` spec in the reltool config does not contain all applications that\n are listed as `{applications,Applications}` in a `.app` file, then these\n applications are automatically added when creating the `.rel` file. For\n 'included_applications', the behaviour was not the same. I.e. if a `rel`\n spec in the reltool config did not contain all applications that are listed\n as `{included_applications,InclApplications}` in a `.app` file, then reltool\n would fail with reason \"Undefined applications\" when creating the `.rel`\n file. This has been corrected, so both `applications` and\n `included_applications` are now automatically added if not already in the\n `rel` spec.\n - The `rel` specification now dictates the order in which included and used\n applications (specified in the `.app` file as `included_applications` and\n `applications` respectively) are loaded/started by the boot file. If the\n applications are not specified in the `rel` spec, then the order from the\n `.app` file is used. This was a bug earlier reported on systools, and is now\n also implemented in reltool.\n - Instead of only looking at the directory name, reltool now first looks for a\n `.app` file in order to figure out the name of an application.\n\n Own Id: OTP-10012 Aux Id: kunagi-171 \\[82]","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- Some examples overflowing the width of PDF pages have been corrected.\n\n Own Id: OTP-10665","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.6.1 - Reltool Release Notes","ref":"notes.html#reltool-0-6-1"},{"type":"extras","doc":"- A new sys level configuration parameter `{excl_lib,otp_root}` is added. When\n this is set, the target system will not contain anything from `$OTPROOT`. It\n will only contain a releases directory with rel, script and boot files, and a\n lib directory with applications found outside of `$OTPROOT` (i.e. \"your own\"\n applications).\n\n Own Id: OTP-9743","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.6 - Reltool Release Notes","ref":"notes.html#reltool-0-6"},{"type":"extras","doc":"- Miscellaneous corrections:\n\n - Start of reltool GUI would sometimes crash with a badmatch in\n reltool_sys_win:do_init. This has been corrected.\n - Minor corrections of documentation and type specifications of app() and\n mod() are done.\n - If a module name is duplicated in an app file reltool would return an error.\n This is now changed to a warning.\n - Reltool would earlier not necessarily keep the order of applications as\n listed in the rel specification in the configuration. This has been\n corrected.\n - Reltool would earlier set the default for included applications to an empty\n list if it was not set in the rel specification in the configuration. This\n was correct according to sasl/systools documentation, but not according to\n sasl/systools implementation. We decided to change the documentation and\n reltool to use the value of included_applications from the .app file as\n default instead of the empty list, since this seems more intuitive and since\n systools always has done the same.\n - The value of included applications in the rel specification in the\n configuration did not overwrite included_applications in the .app file if it\n was set to an empty list. This has been corrected.\n - Reltool would earlier add load instructions in the script/boot files for ALL\n modules in the ebin directory of an application even if mod_cond was set to\n app (include only modules listed in the .app file). This has been corrected.\n - Reltool would earlier add start instructions in the script/boot file for\n included applications. This has been corrected - included applications shall\n only be loaded since the including application is responsible for starting\n them.\n - Status bar now indicates that reltool is working (Processing libraries...)\n for all configuration changes, and when generating target system.\n - Title of dependencies column in app and mod window is changed from \"Modules\n used by others\" to \"Modules using this\".\n\n Own Id: OTP-9792\n\n- Configuration changes via the GUI had a few bugs related to error handling,\n rollback and undo. A major re-write of the reltool_server has been done in\n order to align the way reltool_server updates and uses its state and tables\n for all different kinds of configuration change.\n\n All configuration changes (except undo) now cause a re-read of the file\n system, meaning that if something has changed in the file system it will be\n reflected in the result of the configuration change.\n\n When loading a new configuration file via the GUI, the old configuration is\n now completely scratched, and only the new is valid.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9794\n\n- Some bug fixes related to the handling of escripts:\n\n - Reltool could not handle escripts with inlined applications. This has been\n corrected. Inlined applications will be visible in the GUI, but not possible\n to include/exclude separately.\n - Loading a config which contains an escript via the GUI menu did not produce\n the same result as when using the same configuration at reltool start.\n Paths, version and label could differ. This has been corrected.\n - Loading config with same escript (source) twice caused reltool to add same\n module twice. This has been corrected.\n - Loading config with same escript (inlined beam) twice caused reltool to fail\n saying module is included by two different applications. This has been\n corrected.\n - Loading config which in addition to an existing escript also adds another\n escript, for which the name sorts before the existing one, would cause\n reltool to fail saying \"Application name clash\". This has been corrected.\n\n Own Id: OTP-9968\n\n- Reltool would sometimes generate a .app file containing\n `{start_phases,undefined}`, which would cause an exception in systools at\n parse time. This has been corrected so reltool now omits the `start_phases`\n entry if the value is `undefined`. (Thanks to Juan Jose Comellas)\n\n In order to align with reltool, sasl will also omit `start_phases` entries\n with value `undefined` in .script files.\n\n Own Id: OTP-10003","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"- A warning list is added to the sys window of the reltool GUI. This list will\n continuously show all warnings produced by the current configuration.\n\n Own Id: OTP-9967\n\n- As a way of specifying one specific version of an application, the following\n configuration parameter is added on application level:\n\n \\{lib_dir,Dir\\}, Dir = string()\n\n This can be useful if the parent directory of the application directory is not\n suitable to use as a lib dir on system level.\n\n Own Id: OTP-9977","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.5.7.1 - Reltool Release Notes","ref":"notes.html#reltool-0-5-7-1"},{"type":"extras","doc":"- Added recommendation about `RootDir` parameter to\n `reltool:eval_target_spec/3`.\n\n Own Id: OTP-9742","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.5.7 - Reltool Release Notes","ref":"notes.html#reltool-0-5-7"},{"type":"extras","doc":"- If a module was duplicated in the library directories visible to reltool, and\n the configuration did not point out which file to use, then reltool:start\n would always fail. A pop-up is added which asks if you want to continue with a\n safe and minimal configuration.\n\n Own Id: OTP-9383\n\n- wx would sometimes crash due to an empty radiobox on the 'releases' tab of the\n system window. This radiobox is removed, and replaced by a listbox which will\n always contain at least kernel and stdlib applications.\n\n Own Id: OTP-9384","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.5.6 - Reltool Release Notes","ref":"notes.html#reltool-0-5-6"},{"type":"extras","doc":"- The system level option `app_files` is documented to allow the values\n `keep | strip | all`, but it only allowed `keep`. This is corrected.\n\n Own Id: OTP-9135\n\n- Allow the same module name in multiple applications visible to reltool, as\n long as all but one of the applications/modules are explicitly excluded.\n (Thanks to Andrew Gopienko and Jay Nelson)\n\n Own Id: OTP-9229","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.5.5 - Reltool Release Notes","ref":"notes.html#reltool-0-5-5"},{"type":"extras","doc":"- The reltool module contained two seriously erroneous specs which caused bogus\n warnings when dialyzing reltool and some correct code of users. These were\n fixed (specs for start_link/1 and eval_server/3)\n\n \\- Code cleanups and simplifications - Fix a bug in the calculation of\n circular dependencies - Eliminate two dialyzer warnings - Put files\n alphabetically\n\n Own Id: OTP-9120","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.5.4 - Reltool Release Notes","ref":"notes.html#reltool-0-5-4"},{"type":"extras","doc":"- Added function `zip:foldl/3` to iterate over zip archives.\n\n Added functions to create and extract escripts. See `escript:create/2` and\n `escript:extract/2`.\n\n The undocumented function `escript:foldl/3` has been removed. The same\n functionality can be achieved with the more flexible functions\n `escript:extract/2` and `zip:foldl/3`.\n\n Record fields has been annotated with type info. Source files as been adapted\n to fit within 80 chars and trailing whitespace has been removed.\n\n Own Id: OTP-8521\n\n- A new escript, called `reltool`, has been introduced in order to simplify the\n usage of the reltool application from makefiles.\n\n The handling of applications included in releases has been improved.\n Applications that are required to be started before other applications in a\n release are now automatically included in the release. The Kernel and STDLIB\n applications are always included as they are mandatory.\n\n Applications that are (explicitly or implicitly) included in a release are now\n automatically included as if they were explicitly included with the incl_cond\n flag.\n\n A new `embedded_app_type` option has been introduced. It is intended to be\n used for embedded systems where all included applications must be loaded from\n the boot script, as these systems does not utilize dynamic code loading. If\n `embedded_app_type `is set to something else than `undefined`, all included\n applications will be included in both the release as well as in the boot\n script. If the `profile` is `embedded` the `embedded_app_type` option defaults\n to `load`.\n\n A new function called `reltool:get_status/1` has been introduced. It returns\n status about the configuration in the server.\n\n The API functions that may take `PidOrOptions` as input and actually gets\n `Options` does now print out warnings.\n\n The internal error handling has been improved. For example `{error,Reason}` is\n always returned in case of errors even when the server dies.\n\n `app` and `appup` files has been added as well as a corresponding test suite.\n\n Various cleanups has been made in the code and in the documentation.\n\n Own Id: OTP-8590","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.5.3 - Reltool Release Notes","ref":"notes.html#reltool-0-5-3"},{"type":"extras","doc":"- Removed spurious documentation files.\n\n Own Id: OTP-8057","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.5.2 - Reltool Release Notes","ref":"notes.html#reltool-0-5-2"},{"type":"extras","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the HTML frames are\n removed.\n\n Own Id: OTP-8254","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.5.1 - Reltool Release Notes","ref":"notes.html#reltool-0-5-1"},{"type":"extras","doc":"- In the new release of Reltool (0.5) there is a severe bug that may cause your\n source files to be deleted. The bug is triggered when you generate a target\n system WITH archive files AND your library directories are given with absolute\n paths. (Library directories are given with the ERL_LIBS environment variable\n or with the lib_dirs configuration parameter.)\n\n Own Id: OTP-8199","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.5 - Reltool Release Notes","ref":"notes.html#reltool-0-5"},{"type":"extras","doc":"- The tool is still experimental. Feedback is appreciated.\n\n Major improvements of the target system generation has been performed. Now it\n is possible to generate a relocatable target system that does not need to be\n re-installed if it is moved to a new location. Archive files are automatically\n generated. A detailed specification of the target system can be generated\n without actually creating the target system. Relocatable escripts are put in\n the bin directory of the target system. etc. etc.\n\n Some new functions has been introduced in the `reltool` module:\n `start/1, start_link/1, get_config/3, get_target_spec/1 and eval_target_spec/3`.\n\n Some new configuration parameters has been introduced:\n `profile, incl_sys_filters, excl_sys_filters, incl_app_filters, excl_app_filters, incl_archive_filters, excl_archive_filters, archive_opts, escript and relocatable`.\n\n Some parameters have been obsoleted and given new semantics:\n `incl_erts_dirs (incl_sys_filters), excl_erts_dirs (excl_sys_filters), incl_app_dirs (incl_app_filters), excl_app_dirs (excl_app_filters) and escripts (escript).`\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7949","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- The application is experimental. Feedback is appreciated.","title":"Known Bugs and Problems - Reltool Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"","title":"Reltool 0.2.2 - Reltool Release Notes","ref":"notes.html#reltool-0-2-2"},{"type":"extras","doc":"- The tool crashed when rel, script and boot files were generated via the GUI.\n This has been fixed.\n\n Own Id: OTP-7999","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","doc":"","title":"Reltool 0.2.1 - Reltool Release Notes","ref":"notes.html#reltool-0-2-1"},{"type":"extras","doc":"- Minor GUI fixes\n\n Own Id: OTP-7840","title":"Improvements and New Features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"","title":"Reltool 0.2 - Reltool Release Notes","ref":"notes.html#reltool-0-2"},{"type":"extras","doc":"This is the first (experimental) release of Reltool.","title":"Improvements and new features - Reltool Release Notes","ref":"notes.html#improvements-and-new-features"},{"type":"extras","doc":"- The application is experimental.","title":"Known Bugs and Problems - Reltool Release Notes","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","doc":"\n# Introduction\n\nReltool is a release management tool. It analyses a given Erlang/OTP\ninstallation and determines various dependencies between applications. The\n`graphical` frontend depicts the dependencies and enables interactive\ncustomization of a target system. The backend provides a `batch` interface for\ngeneration of customized target systems.","title":"Introduction","ref":"reltool_intro.html"},{"type":"extras","doc":"This manual describes the Reltool application, as a component of the Erlang/Open\nTelecom Platform development environment. It is assumed that the reader is\nfamiliar with the Erlang Development Environment, which is described in a\nseparate User's Guide.","title":"Scope and Purpose - Introduction","ref":"reltool_intro.html#scope-and-purpose"},{"type":"extras","doc":"The following prerequisites are required for understanding the material in the\nReltool User's Guide:\n\n- familiarity with Erlang/OTP system principles and Erlang/OTP design principles\n\nThe application requires Erlang/OTP release R13B02 or later.","title":"Prerequisites - Introduction","ref":"reltool_intro.html#prerequisites"},{"type":"extras","doc":"In addition to this introductory chapter, the Reltool User's Guide contains the\nfollowing chapters:\n\n- Chapter 2: [\"Usage\"](reltool_usage.md) describes the architecture and typical usage of the\n application.\n- Chapter 3: [\"Examples\"](reltool_examples.md) gives some usage examples","title":"About This Manual - Introduction","ref":"reltool_intro.html#about-this-manual"},{"type":"extras","doc":"Refer to the following documentation for more information about Reltool and\nabout the Erlang/OTP development system:\n\n- the [Reference Manual of Reltool](`m:reltool`)\n- the Erlang/OTP [`System Principles`](`e:system:system_principles.md`)\n- the Erlang/OTP [`Design Principles`](`e:system:design_principles.md`)\n- Programming Erlang: Software for a Concurrent World (2007), Pragmatic\n Bookshelf, ISBN13: 9781934356005.","title":"Where to Find More Information - Introduction","ref":"reltool_intro.html#where-to-find-more-information"},{"type":"extras","doc":"\n# Usage","title":"Usage","ref":"reltool_usage.html"},{"type":"extras","doc":"This document focuses on the graphical parts of the tool. The concepts are\nexplained in the reference manual for the module `reltool`.","title":"Overview - Usage","ref":"reltool_usage.html#overview"},{"type":"extras","doc":"The system window is started with the function `reltool:start/1`. At startup the\ntool will process all `beam` files and `app` files in order to find out\ndependencies between applications and their modules. Once all this information\nhas been derived, it will be possible to explore the tool.\n\nThe system window consists of four main pages (tabs):\n\n- Libraries\n- System settings\n- Applications\n- Releases\n\nClick on a name tag to display its page.","title":"System window - Usage","ref":"reltool_usage.html#system-window"},{"type":"extras","doc":"On the library page it is possible to control which sources the tool will use.\nThe page is organized as a tree which can be expanded and collapsed by clicking\non the little symbol in the beginning of the expandable/collapsible lines.\n\nThe `Root directory` can be edited by selecting the line where the path of the\nroot directory is displayed and clicking the right mouse button. Choose edit in\nthe menu that pops up.\n\nLibrary directories can be added, edited or deleted. This is done by selecting\nthe line where the path to a library directory is displayed and clicking the\nright mouse button. Choose add, edit or delete in the menu that pops up. New\nlibrary directories can also be added by selecting the line\n`Library directories` and clicking the right mouse button. Choose add in the\nmenu that pops up.\n\nEscript files can be added, edited or deleted. This is done by selecting the\nline where the path to an escript file is displayed and clicking the right mouse\nbutton. Choose add, edit or delete in the menu that pops up. New escripts can\nalso be added by selecting the line `Escript files` and clicking the right mouse\nbutton. Choose add in the menu that pops up.\n\nWhen libraries and escripts are expanded, the names of their contained\napplications will be displayed. Double click on an application name to launch an\napplication window.","title":"Libraries - Usage","ref":"reltool_usage.html#libraries"},{"type":"extras","doc":"On the system settings page it is possible to control some global settings that\nare used as defaults for all applications. Set the\n`Application inclusion policy` to `include` to include all applications that are\nnot explicitly excluded. See `incl_cond` (application inclusion) and `mod_cond`\n(module inclusion) in the reference manual for the module `reltool` for more\ninfo.\n\nThe system settings page is rather incomplete.","title":"System settings - Usage","ref":"reltool_usage.html#system-settings"},{"type":"extras","doc":"There are four categories of applications on the applications page. `Included`\ncontains applications that are explicitly included. `Excluded` contains\napplications that are explicitly excluded. `Derived` contains applications that\neither are used directly by explicitly included applications or by other derived\napplications. `Available` contains the remaining applications.\n\nSelect one or more applications and click on a button directly below the\napplication column to change application category. For example, select an\navailable application and click on its tick button to move the application to\nthe included category. Clicking on the tick symbol for included applications\nwill move the application back to the available category. The tick is undone.\n\nThe symbols in front of the application names are intended to describe the\nstatus of the application. There are error and warning symbols to signalize that\nthere is something which needs attention. The tick symbol means that the\napplication is included or derived and no problem has been detected. The cross\nsymbol means that the application is excluded or available and no problem has\nbeen detected. Applications with error symbols are listed first in each category\nand are followed by the warnings and the normal ones (ticks and crosses) at the\nend.\n\nDouble click on an application to launch its application window.","title":"Applications - Usage","ref":"reltool_usage.html#applications"},{"type":"extras","doc":"The releases page is incomplete and very experimental.","title":"Releases - Usage","ref":"reltool_usage.html#releases"},{"type":"extras","doc":"- `Display application dependency graph` \\- Launches an application force graph\n window. All included and derived applications and their dependencies will be\n shown in a graph.\n- `Display module dependency graph` \\- Launch a module force graph window. All\n included and derived modules and their dependencies will be shown in a graph.\n- `Reset configuration to default`\n- `Undo configuration (toggle)`\n- `Load configuration` \\- Loads a new configuration from file.\n- `Save configuration` \\- Saves the current configuration to file. Normally,\n only the explicit configuration parameters with values that differ from their\n defaults are saved. But the configuration with or without default values and\n with or without derived values may also be saved.\n- `Generate rel, script and boot files`\n- `Generate target system`\n- `Close` \\- Close the system window and all its subwindows.","title":"File menu - Usage","ref":"reltool_usage.html#file-menu"},{"type":"extras","doc":"The dependency graph windows are launched from the file menu in the system\nwindow. The graph depicts all included and derived applications/modules and\ntheir dependencies.\n\nIt is possible to perform some limited manipulations of the graph. Nodes can be\nmoved, selected, locked or deleted. Move a single node or the entire graph by\nmoving the mouse while the left mouse button is pressed. A node can be locked\ninto a fix position by holding down the shift button when the left mouse button\nis released. Select several nodes by moving the mouse while the control key and\nthe left mouse button are pressed. Selected nodes can be locked, unlocked or\ndeleted by clicking on a suitable button.\n\nThe algorithm that is used to draw a graph with as few crossed links as possible\nis called force graph. A force graph consists of nodes and directed links\nbetween nodes. Each node is associated with a repulsive force that pushes nodes\naway from each other. This force can be adjusted with the left slider or with\nthe mouse wheel. Each link is associated with an attractive force that pulls the\nnodes nearer to each other. This force can be adjusted with the right slider. If\nthis force becomes too strong, the graph will be unstable. The third parameter\nthat can be adjusted is the length of the links. It is adjusted with the middle\nslider.\n\nThe `Freeze` button starts/stops the redrawing of the graph. `Reset` moves the\ngraph to the middle of the window and resets all graph settings to default, with\nthe exception of deleted nodes.","title":"Dependencies between applications or modules displayed as a graph - Usage","ref":"reltool_usage.html#dependencies-between-applications-or-modules-displayed-as-a-graph"},{"type":"extras","doc":"The application window is started by double clicking on an application name. The\napplication window consists of four pages (tabs):\n\n- Application settings\n- Modules\n- Application dependencies\n- Module dependencies\n\nClick on a name tag to display its page.","title":"Application window - Usage","ref":"reltool_usage.html#application-window"},{"type":"extras","doc":"Select version of the application in the `Source selection policy` part of the\npage. By default the latest version of the application is selected, but it is\npossible to override this by explicitly selecting another version.\n\nNote that in order for reltool to sort application versions and thereby be able\nto select the latest, it is required that the version id for the application\nconsists of integers and dots only, for example `1`, `2.0` or `3.17.1`.\n\nBy default the `Application inclusion policy` on system level is used for all\napplications. Set the value to `include` if you want to explicitly include one\nparticular application. Set it to `exclude` if you want to exclude the\napplication despite that it is used by another (explicitly or implicitly)\nincluded application. `derived` means that the application automatically will be\nincluded if some other (explicitly or implicitly) included application uses it.\n\nBy default the `Module inclusion policy` on system level is used for all\napplications. Set it to `derived` if you only want actually used modules to be\nincluded. Set it to `app` if you, besides derived modules, also want the modules\nlisted in the app file to be included. Set it to `ebin` if you, besides derived\nmodules, also want the modules that exist as beam files in the ebin directory to\nbe included. Set it to `all` if you want all modules to be included, that is the\nunion of modules found in the ebin directory and listed in the app file.\n\nThe application settings page is rather incomplete.","title":"Application settings - Usage","ref":"reltool_usage.html#application-settings"},{"type":"extras","doc":"There are four categories of modules on the modules page. `Included` contains\nmodules that are explicitly included. `Excluded` contains modules that are\nexplicitly excluded. `Derived` contains modules that either are used directly by\nexplicitly included modules or by other derived modules. `Available` contains\nthe remaining modules.\n\nSelect one or more modules and click on a button directly below the module\ncolumn to change module category. For example, select an available module and\nclick on its tick button to move the module to the included category. Clicking\non the tick symbol for included modules will move the module back to the\navailable category. The tick is undone.\n\nThe symbols in front of the module names are intended to describe the status of\nthe module. There are error and and warning symbols to signalize that there is\nsomething that needs attention. The tick symbol means that the module is\nincluded or derived and no problem has been detected. The cross symbol means\nthat the module is excluded or available and no problem has been detected.\nModules with error symbols are listed first in each category and are followed by\nwarnings and the normal ones (ticks and crosses) at the end.\n\nDouble click on a module to launch its module window.","title":"Modules - Usage","ref":"reltool_usage.html#modules"},{"type":"extras","doc":"There are four categories of applications on the `Application dependencies`\npage. If the application is used by other applications, these are listed under\n`Used by`. If the application requires other applications be started before it\ncan be started, these are listed under `Required`. These applications are listed\nin the `applications` part of the `app` file. If the application includes other\napplications, these are listed under `Included`. These applications are listed\nin the `included_applications` part of the `app` file. If the application uses\nother applications, these are listed under `Uses`.\n\nDouble click on an application name to launch an application window.","title":"Application dependencies - Usage","ref":"reltool_usage.html#application-dependencies"},{"type":"extras","doc":"There are two categories of modules on the `Module dependencies` page. If the\nmodule is used by other modules, these are listed under `Modules using this`. If\nthe module uses other modules, these are listed under `Used modules`.\n\nDouble click on an module name to launch a module window.","title":"Module dependencies - Usage","ref":"reltool_usage.html#module-dependencies"},{"type":"extras","doc":"The module window is started by double clicking on an module name. The module\nwindow consists initially of two pages (tabs):\n\n- Dependencies\n- Code\n\nClick on a name tag to display its page.","title":"Module window - Usage","ref":"reltool_usage.html#module-window"},{"type":"extras","doc":"There are two categories of modules on the `Dependencies` page. If the module is\nused by other modules, these are listed under `Modules using this`. If the\nmodule uses other modules, these are listed under `Used modules`.\n\nDouble click on an module name to launch a module window.","title":"Dependencies - Usage","ref":"reltool_usage.html#dependencies"},{"type":"extras","doc":"On the `Code` page the Erlang source code is displayed. It is possible to search\nforwards and backwards for text in the module. Enter a regular expression in the\n`Find` field and press enter. It is also possible to go to a certain line in the\nmodule. The `Back` button can be used to go back to the previous position.\n\nPut the marker on a function name and double click to go to the definition of\nthe function. If the function is defined in another module, that module will be\nloaded and added to the page list.","title":"Code - Usage","ref":"reltool_usage.html#code"},{"type":"extras","doc":"\n# Examples","title":"Examples","ref":"reltool_examples.html"},{"type":"extras","doc":"The main process in Reltool is the server. It can be used as it is or be used\nvia the GUI frontend process. When the GUI is started, a server process will\nautomatically be started. The GUI process is started with `reltool:start/0`,\n`reltool:start/1` or `reltool:start_link/1`. The pid of its server can be\nobtained with [`reltool:get_server/1`](`reltool:start_link/1`)\n\n```erlang\nErlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V9.0 (abort with ^G)\n1>\n1> {ok, Win} = reltool:start([]).\n{ok,<0.36.01>}\n2> {ok, Server} = reltool:get_server(Win).\n{ok,<0.37.01>}\n3> reltool:get_config(Server).\n{ok,{sys,[]}}\n4>\n4> {ok, Server2} = reltool:start_server([]).\n{ok,<0.6535.01>}\n5> reltool:get_config(Server2).\n{ok,{sys,[]}}\n6> reltool:stop(Server2).\nok\n```","title":"Start and stop windows and servers - Examples","ref":"reltool_examples.html#start-and-stop-windows-and-servers"},{"type":"extras","doc":"```erlang\nErlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V9.0 (abort with ^G)\n1>\n1> Config = {sys, [{escript, \"examples/display_args\", [{incl_cond, include}]},\n\t\t {app, inets, [{incl_cond, include}]},\n\t\t {app, mnesia, [{incl_cond, exclude}]},\n\t\t {app, ssl, [{incl_cond, exclude}]},\n\t\t {app, runtime_tools, [{incl_cond, exclude}]},\n\t\t {app, syntax_tools, [{incl_cond, exclude}]}]}.\n{sys,[{escript,\"examples/display_args\",[{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}\n2>\n2> {ok, Server} = reltool:start_server([Config]).\n{ok,<0.66.0>}\n3>\n3> reltool:get_config(Server).\n{ok,{sys,[{escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}}\n4>\n4> reltool:get_config(Server, false, false).\n{ok,{sys,[{escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}}\n5>\n5> reltool:get_config(Server, true, false).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {mod_cond,all},\n {incl_cond,derived},\n {app,inets,\n [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[sasl]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,development},\n {incl_sys_filters,[\".*\"]},\n {excl_sys_filters,[]},\n {incl_app_filters,[\".*\"]},\n {excl_app_filters,[]},\n {rel_app_type,...},\n {...}|...]}}\n6>\n6> reltool:get_config(Server, true, true).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {mod_cond,all},\n {incl_cond,derived},\n {erts,[{app,erts,\n [{vsn,\"10.0\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/erts-10.0\"},\n {mod,erl_prim_loader,[]},\n {mod,erl_tracer,[]},\n {mod,erlang,[]},\n {mod,erts_code_purger,[]},\n {mod,erts_dirty_process_signal_handler,[]},\n {mod,erts_internal,[]},\n {mod,erts_literal_area_collector,[]},\n {mod,init,[]},\n {mod,erl_init,...},\n {mod,...},\n {...}|...]}]},\n {app,compiler,\n [{vsn,\"7.0.4\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/compiler-7.0.4\"},\n {mod,beam_a,[]},\n {mod,beam_asm,[]},\n {mod,beam_block,[]},\n {mod,beam_bs,[]},\n {mod,beam_bsm,[]},\n {mod,beam_clean,[]},\n {mod,beam_dead,[]},\n {mod,beam_dict,[]},\n {mod,beam_disasm,[]},\n {mod,beam_except,[]},\n {mod,beam_flatten,...},\n {mod,...},\n {...}|...]},\n {app,crypto,\n [{vsn,\"3.7.4\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/crypto-3.7.4\"},\n {mod,crypto,[]},\n {mod,crypto_ec_curves,[]}]},\n {app,hipe,\n [{vsn,\"3.15.4\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/hipe-3.15.4\"},\n {mod,cerl_cconv,[]},\n {mod,cerl_closurean,[]},\n {mod,cerl_hipeify,[]},\n {mod,cerl_lib,[]},\n {mod,cerl_messagean,[]},\n {mod,cerl_pmatch,[]},\n {mod,cerl_prettypr,[]},\n {mod,cerl_to_icode,[]},\n {mod,cerl_typean,...},\n {mod,...},\n {...}|...]},\n {app,inets,\n [{incl_cond,include},\n {vsn,\"6.3.9\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/inets-6.3.9\"},\n {mod,ftp,[]},\n {mod,ftp_progress,[]},\n {mod,ftp_response,[]},\n {mod,ftp_sup,[]},\n {mod,http_chunk,[]},\n {mod,http_request,[]},\n {mod,http_response,...},\n {mod,...},\n {...}|...]},\n {app,kernel,\n [{vsn,\"5.2\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/kernel-5.2\"},\n {mod,application,[]},\n {mod,application_controller,[]},\n {mod,application_master,[]},\n {mod,application_starter,[]},\n {mod,auth,[]},\n {mod,code,[]},\n {mod,code_server,...},\n {mod,...},\n {...}|...]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,sasl,\n [{vsn,\"3.0.3\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/sasl-3.0.3\"},\n {mod,alarm_handler,[]},\n {mod,erlsrv,[]},\n {mod,format_lib_supp,[]},\n {mod,misc_supp,...},\n {mod,...},\n {...}|...]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,stdlib,\n [{vsn,\"3.3\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/stdlib-3.3\"},\n {mod,array,[]},\n {mod,base64,...},\n {mod,...},\n {...}|...]},\n {app,syntax_tools,[{incl_cond,exclude}]},\n {app,tools,\n [{vsn,\"2.9.1\"},{lib_dir,[...]},{mod,...},{...}|...]},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[...]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,...},\n {...}|...]}}\n7>\n7> reltool:get_config([{sys, [{profile, embedded}]}], true, false).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {mod_cond,all},\n {incl_cond,derived},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[sasl]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,embedded},\n {incl_sys_filters,[\"^bin\",\"^erts\",\"^lib\",\"^releases\"]},\n {excl_sys_filters,[\"^bin/(erlc|dialyzer|typer)(|\\\\.exe)$\",\n \"^erts.*/bin/(erlc|dialyzer|typer)(|\\\\.exe)$\",\n \"^erts.*/bin/.*(debug|pdb)\"]},\n {incl_app_filters,[\"^ebin\",\"^include\",\"^priv\"]},\n {excl_app_filters,[]},\n {rel_app_type,permanent},\n {embedded_app_type,load},\n {app_file,keep},\n {debug_info,keep}]}}\n8>\n8> reltool:get_config([{sys, [{profile, standalone}]}], true, false).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {mod_cond,all},\n {incl_cond,derived},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[sasl]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,standalone},\n {incl_sys_filters,[\"^bin/(erl|epmd)(|\\\\.exe|\\\\.ini)$\",\n \"^bin/start(|_clean).boot$\",\"^erts.*/bin\",\"^lib$\"]},\n {excl_sys_filters,[\"^erts.*/bin/(erlc|dialyzer|typer)(|\\\\.exe)$\",\n \"^erts.*/bin/(start|escript|to_erl|run_erl)(|\\\\.exe)$\",\n \"^erts.*/bin/.*(debug|pdb)\"]},\n {incl_app_filters,[\"^ebin\",\"^priv\"]},\n {excl_app_filters,[\"^ebin/.*\\\\.appup$\"]},\n {rel_app_type,permanent},\n {app_file,keep},\n {debug_info,keep}]}}\n```","title":"Inspecting the configuration - Examples","ref":"reltool_examples.html#inspecting-the-configuration"},{"type":"extras","doc":"```erlang\nErlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V10.0 (abort with ^G)\n1>\n1> {ok, Server} = reltool:start_server([{config,\n {sys,\n [{boot_rel, \"NAME\"},\n {rel, \"NAME\", \"VSN\",\n [sasl],\n [{load_dot_erlang, false}]}]}}]).\n{ok,<0.1288.0>}\n2>\n2> reltool:get_config(Server).\n{ok,{sys,[{boot_rel,\"NAME\"},\n {rel,\"NAME\",\"VSN\",[sasl]}]}}\n3>\n3> reltool:get_rel(Server, \"NAME\").\n{ok,{release,{\"NAME\",\"VSN\"},\n {erts,\"10.0\"},\n [{kernel,\"5.2\"},{stdlib,\"3.3\"},{sasl,\"3.0.3\"}]}}\n4>\n4> reltool:get_script(Server, \"NAME\").\n{ok,{script,{\"NAME\",\"VSN\"},\n [{preLoaded,[erl_prim_loader,erl_tracer,erlang,\n erts_code_purger,erts_dirty_process_signal_handler,\n erts_internal,erts_literal_area_collector,init,erl_init,\n prim_eval,prim_file,prim_inet,prim_zip,zlib]},\n {progress,preloaded},\n {path,[\"$ROOT/lib/kernel-5.2/ebin\",\n \"$ROOT/lib/stdlib-3.3/ebin\"]},\n {primLoad,[error_handler]},\n {kernel_load_completed},\n {progress,kernel_load_completed},\n {path,[\"$ROOT/lib/kernel-5.2/ebin\"]},\n {primLoad,[application,application_controller,\n application_master,application_starter,auth,code,\n code_server,disk_log,disk_log_1,disk_log_server,\n disk_log_sup,dist_ac,dist_util,erl_boot_server|...]},\n {path,[\"$ROOT/lib/stdlib-3.3/ebin\"]},\n {primLoad,[array,base64,beam_lib,binary,c,calendar,dets,\n dets_server,dets_sup,dets_utils,dets_v9,dict|...]},\n {path,[\"$ROOT/lib/sasl-3.0.3/ebin\"]},\n {primLoad,[alarm_handler,erlsrv,format_lib_supp,misc_supp,\n rb,rb_format_supp,release_handler,release_handler_1,sasl,\n sasl_report|...]},\n {progress,modules_loaded},\n {path,[\"$ROOT/lib/kernel-5.2/ebin\",\n \"$ROOT/lib/stdlib-3.3/ebin\",\"$ROOT/lib/sasl-3.0.3/ebin\"]},\n {kernelProcess,heart,{heart,start,[]}},\n {kernelProcess,error_logger,{error_logger,start_link,[]}},\n {kernelProcess,application_controller,\n {application_controller,start,[{...}]}},\n {progress,init_kernel_started},\n {apply,{application,load,[...]}},\n {apply,{application,load,...}},\n {progress,applications_loaded},\n {apply,{...}},\n {apply,...},\n {...}|...]}}\n5>\n5> reltool:stop(Server).\nok\n```","title":"Generate release and script files - Examples","ref":"reltool_examples.html#generate-release-and-script-files"},{"type":"extras","doc":"```erlang\nErlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V10.0 (abort with ^G)\n1>\n1> Config = {sys, [{escript, \"examples/display_args\", [{incl_cond, include}]},\n\t\t {app, inets, [{incl_cond, include}]},\n\t\t {app, mnesia, [{incl_cond, exclude}]},\n\t\t {app, ssl, [{incl_cond, exclude}]},\n\t\t {app, runtime_tools, [{incl_cond, exclude}]},\n\t\t {app, syntax_tools, [{incl_cond, exclude}]}]}.\n{sys,[{escript,\"examples/display_args\",[{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}\n2>\n2> {ok, Spec} = reltool:get_target_spec([Config]).\n{ok,[{create_dir,\"releases\",\n [{write_file,\"start_erl.data\",\"10.0 1.0\\n\"},\n {create_dir,\"1.0\",\n [{write_file,\"start_clean.rel\",\n [37,37,32,114,101,108,32,103,101,110,101,114,97,116|...]},\n {write_file,\"start_clean.script\",\n [37,37,32,115,99,114,105,112,116,32,103,101,110|...]},\n {write_file,\"start_clean.boot\",\n <<131,104,3,119,6,115,99,114,105,112,116,104,...>>},\n {write_file,\"start_sasl.rel\",\n [37,37,32,114,101,108,32,103,101,110,101|...]},\n {write_file,\"start_sasl.script\",\n [37,37,32,115,99,114,105,112,116,32|...]},\n {write_file,\"start_sasl.boot\",\n <<131,104,3,119,6,115,99,114,105,...>>}]}]},\n {create_dir,\"bin\",\n [{copy_file,\"display_args.escript\",\n \"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\"},\n {copy_file,\"display_args\",\"erts-10.0/bin/escript\"},\n {copy_file,\"start\",\"erts-10.0/bin/start\"},\n {copy_file,\"ct_run\",\"erts-10.0/bin/ct_run\"},\n {copy_file,\"dialyzer\",\"erts-10.0/bin/dialyzer\"},\n {copy_file,\"run_erl\",\"erts-10.0/bin/run_erl\"},\n {copy_file,\"erl\",\"erts-10.0/bin/dyn_erl\"},\n {copy_file,\"to_erl\",\"erts-10.0/bin/to_erl\"},\n {copy_file,\"epmd\",\"erts-10.0/bin/epmd\"},\n {copy_file,\"erlc\",\"erts-10.0/bin/erlc\"},\n {copy_file,\"typer\",\"erts-10.0/bin/typer\"},\n {copy_file,\"escript\",\"erts-10.0/bin/escript\"},\n {write_file,\"start_clean.boot\",<<131,104,3,119,6,115,...>>},\n {write_file,\"start_sasl.boot\",<<131,104,3,119,6,...>>},\n {write_file,\"start.boot\",<<131,104,3,119,...>>}]},\n {copy_file,\"Install\"},\n {create_dir,\"misc\",\n [{copy_file,\"format_man_pages\"}]},\n {create_dir,\"usr\",\n [{create_dir,\"lib\",\n [{copy_file,\"liberl_interface_st.a\"},\n {copy_file,\"libic.a\"},\n {copy_file,\"liberl_interface.a\"},\n {copy_file,\"libei_st.a\"},\n {copy_file,\"libei.a\"}]},\n {create_dir,\"include\",\n [{copy_file,\"driver_int.h\"},\n {copy_file,\"ei_connect.h\"},\n {copy_file,\"ei.h\"},\n {copy_file,\"erl_nif_api_funcs.h\"},\n {copy_file,\"erl_fixed_size_int_types.h\"},\n {copy_file,\"erl_int_sizes_config.h\"},\n {copy_file,\"erl_interface.h\"},\n {copy_file,\"eicode.h\"},\n {copy_file,\"erl_driver.h\"},\n {copy_file,\"erlang.idl\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}]}]},\n {create_dir,\"erts-10.0\",\n [{create_dir,\"bin\",\n [{copy_file,\"start\"},\n {copy_file,\"ct_run\"},\n {copy_file,\"erlexec\"},\n {copy_file,\"dialyzer\"},\n {copy_file,\"beam.smp\"},\n {copy_file,\"run_erl\"},\n {copy_file,\"erl\",\"erts-10.0/bin/dyn_erl\"},\n {copy_file,\"to_erl\"},\n {copy_file,\"epmd\"},\n {copy_file,\"erl_child_setup\"},\n {copy_file,\"heart\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}|...]},\n {create_dir,\"lib\",\n [{create_dir,\"internal\",\n [{copy_file,\"liberts_internal.a\"},\n {copy_file,\"liberts_internal_r.a\"},\n {copy_file,\"libethread.a\"},\n {copy_file,\"README\"}]},\n ]},\n {create_dir,\"src\",[{copy_file,\"setuid_socket_wrap.c\"}]},\n {create_dir,\"doc\",[]},\n {create_dir,\"man\",[]},\n {create_dir,\"include\",\n [{create_dir,\"internal\",\n [{create_dir,\"i386\",[{...}|...]},\n {copy_file,\"erl_errno.h\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}|...]},\n {copy_file,\"driver_int.h\"},\n {copy_file,\"erl_nif_api_funcs.h\"},\n {copy_file,\"erl_fixed_size_int_types.h\"},\n {copy_file,\"erl_int_sizes_config.h\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}]}]},\n {create_dir,\"lib\",\n [{create_dir,\"compiler-7.0.4\",\n [{create_dir,\"src\",\n [{copy_file,\"beam_flatten.erl\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}|...]},\n {create_dir,\"ebin\",\n [{copy_file,[...]},{copy_file,...},{...}|...]}]},\n {create_dir,\"crypto-3.7.4\",\n [{create_dir,\"src\",[{copy_file,[...]},{copy_file,...}]},\n {create_dir,\"ebin\",[{copy_file,...},{...}|...]}]},\n {create_dir,\"crypto-3.7.4\",\n [{create_dir,\"priv\",\n [{create_dir,\"lib\",[{copy_file,[...]},{copy_file,...}]},\n {create_dir,\"obj\",[{copy_file,...},{...}|...]}]}]},\n {create_dir,\"erts-10.0\",\n [{create_dir,\"src\",[{...}|...]},\n {create_dir,\"ebin\",[...]}]},\n {create_dir,\"hipe-3.15.4\",\n [{create_dir,\"flow\",[...]},\n {copy_file,[...]},\n {create_dir,...},\n {...}|...]},\n {create_dir,\"inets-6.3.9\",\n [{create_dir,[...],...},{create_dir,...},{...}]},\n {create_dir,\"inets-6.3.9\",\n [{create_dir,\"priv\",[{create_dir,[...],...}]},\n {create_dir,\"include\",[{copy_file,...},{...}]}]},\n {create_dir,\"kernel-5.2\",[{...}|...]},\n {create_dir,\"kernel-5.2\",\n [{create_dir,\"include\",[{...}|...]}]},\n {create_dir,[...],...},\n {create_dir,...},\n {create_dir,\"stdlib-3.3\",[{create_dir,...}]},\n ...]}]}\n3>\n3> TargetDir = \"/tmp/my_target_dir\".\n\"/tmp/my_target_dir\"\n4>\n4> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).\n{error,\"/tmp/my_target_dir: no such file or directory\"}\n5>\n5> file:make_dir(TargetDir).\nok\n6>\n6> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).\nok\n7>\n7> file:list_dir(TargetDir).\n{ok,[\"bin\",\"Install\",\"lib\",\"misc\",\"usr\",\"erts-10.0\",\n \"releases\"]}\n8>\n8> file:list_dir(filename:join([TargetDir,\"lib\"])).\n{ok,[\"tools-2.9.1\",\"inets-6.3.9\",\n \"kernel-5.2\",\"sasl-3.0.3\",\n \"crypto-3.7.4\",\"erts-10.0\",\n \"stdlib-3.3\",\"compiler-7.0.4\"]}\n9>\n9> file:make_dir(\"/tmp/yet_another_target_dir\").\nok\n10>\n10> reltool:create_target([Config], \"/tmp/yet_another_target_dir\").\nok\n11>\n11> file:list_dir(\"/tmp/yet_another_target_dir\").\n{ok,[\"bin\",\"Install\",\"lib\",\"misc\",\"usr\",\"erts-10.0\",\n \"releases\"]}\n```","title":"Create a target system - Examples","ref":"reltool_examples.html#create-a-target-system"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/reltool-1.0.1/doc/html/dist/search_data-E78672BE.js b/prs/9277/lib/reltool-1.0.1/doc/html/dist/search_data-E78672BE.js deleted file mode 100644 index de8647098e939..0000000000000 --- a/prs/9277/lib/reltool-1.0.1/doc/html/dist/search_data-E78672BE.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","title":"reltool","doc":"Main API of the Reltool application\n\nThis is an interface module for the Reltool application.\n\n_Reltool_ is a release management tool. It analyses a given Erlang/OTP\ninstallation and determines various dependencies between applications. The\n`graphical` frontend depicts the dependencies and enables interactive\ncustomization of a target system. The backend provides a `batch` interface for\ngeneration of customized target systems.\n\nThe tool uses an installed Erlang/OTP system as input. `root_dir` is the root\ndirectory of the analysed system and it defaults to the system executing\nReltool. Applications may also be located outside `root_dir`. `lib_dirs` defines\nlibrary directories where additional applications may reside and it defaults to\nthe directories listed by the operating system environment variable `ERL_LIBS`.\nSee the module `code` for more info.\n\nAn application directory `AppDir` under a library directory is recognized by the\nexistence of an `AppDir/ebin` directory. If this does not exist, Reltool will\nnot consider `AppDir` at all when looking for applications.\n\nIt is recommended that application directories are named as the application,\npossibly followed by a dash and the version number. For example `myapp` or\n`myapp-1.1`.\n\nFinally single modules and entire applications may be read from Escripts.\n\nSome configuration parameters control the behavior of Reltool on system (`sys`)\nlevel. Others provide control on application (`app`) level and yet others are on\nmodule (`mod`) level. Module level parameters override application level\nparameters and application level parameters override system level parameters.\nEscript `escript` level parameters override system level parameters.\n\nThe following top level `options` are supported:\n\n- **`config`** - This is the main option and it controls the configuration of\n Reltool. It can either be a `sys` tuple or a name of a `file` containing a sys\n tuple.\n\n- **`trap_exit`** - This option controls the error handling behavior of Reltool.\n By default the window processes traps exit, but this behavior can altered by\n setting `trap_exit` to `false`.\n\n- **`wx_debug`** - This option controls the debug level of `wx`. As its name\n indicates it is only useful for debugging. See `wx:debug/1` for more info.\n\nBesides the already mentioned source parameters `root_dir` and `lib_dirs`, the\nfollowing system (`sys`) level options are supported:\n\n- **`erts`** - Erts specific configuration. See application level options below.\n\n- **`escript`** - Escript specific configuration. An escript has a mandatory\n file name and escript level options that are described below.\n\n- **`app`** - Application specific configuration. An application has a mandatory\n name and application level options that are described below.\n\n- **`mod_cond`** - This parameter controls the module inclusion policy. It\n defaults to `all` which means that if an application is included (either\n explicitly or implicitly) all modules in that application will be included.\n This implies that both modules that exist in the `ebin` directory of the\n application, as well as modules that are named in the `app` file will be\n included. If the parameter is set to `ebin`, both modules in the `ebin`\n directory and derived modules are included. If the parameter is set to `app`,\n both modules in the `app` file and derived modules are included. `derived`\n means that only modules that are used by other included modules are included.\n The `mod_cond` setting on system level is used as default for all\n applications.\n\n- **`incl_cond`** - This parameter controls the application and escript\n inclusion policy. It defaults to `derived` which means that the applications\n that do not have any explicit `incl_cond` setting, will only be included if\n any other (explicitly or implicitly included) application uses it. The value\n `include` implies that all applications and escripts that do not have any\n explicit `incl_cond` setting will be included. `exclude` implies that all\n applications and escripts that do not have any explicit `incl_cond` setting\n will be excluded.\n\n- **`boot_rel`** - A target system may have several releases but the one given\n as `boot_rel` will be used as default when the system is booting up.\n\n- **`rel`** - Release specific configuration. Each release maps to a `rel`,\n `script` and `boot` file. See the module `systools` for more info about the\n details. Each release has a name, a version and a set of applications with a\n few release specific parameters such as type and included applications.\n\n- **`relocatable`** - This parameter controls whether the `erl` executable in\n the target system should automatically determine where it is installed or if\n it should use a hardcoded path to the installation. In the latter case the\n target system must be installed with `reltool:install/2` before it can be\n used. If the system is relocatable, the file tree containing the target system\n can be moved to another location without re-installation. The default is\n `true`.\n\n- **`profile`** - The creation of the specification for a target system is\n performed in two steps. In the first step a complete specification is\n generated. It will likely contain much more files than you are interested in\n in your customized target system. In the second step the specification will be\n filtered according to your filters. There you have the ability to specify\n filters per application as well as system wide filters. You can also select a\n `profile` for your system. Depending on the `profile`, different default\n filters will be used. There are three different profiles to choose from:\n `development`, `embedded` and `standalone`. `development` is default. The\n parameters that are affected by the `profile` are: `incl_sys_filters`,\n `excl_sys_filters`, `incl_app_filters` and `excl_app_filters`.\n\n- **`app_file`** - This parameter controls the default handling of the `app`\n files when a target system is generated. It defaults to `keep` which means\n that `app` files are copied to the target system and their contents are kept\n as they are. `strip` means that a new `app` file is generated from the\n contents of the original `app` file where the non included modules are removed\n from the file. `all` does also imply that a new `app` file is generated from\n the contents of the original `app` file, with the difference that all included\n modules are added to the file. If the application does not have any `app` file\n a file will be created for `all` but not for `keep` and `strip`.\n\n- **`debug_info`** - The `debug_info` parameter controls what debug information\n in the beam file should be kept or stripped. `keep` keeps all debug info,\n `strip` strips all debug info, and a list of chunkids keeps only those chunks.\n\n- **`excl_lib`**\n\n > #### Warning {: .warning }\n > This option is experimental.\n\n If the `excl_lib` option is set to `otp_root` then reltool will not copy\n anything from the Erlang/OTP installation ($OTPROOT) into the target\n structure. The goal is to create a \"slim\" release which can be used together\n with an existing Erlang/OTP installation. The target structure will therefore\n only contain a `lib` directory with the applications that were found outside\n of $OTPROOT (typically your own applications), and a `releases` directory with\n the generated `.rel,` `.script` and `.boot` files.\n\n When starting this release, three things must be specified:\n\n - **_Which `releases` directory to use_** - Tell the release handler to use\n the `releases` directory in our target structure instead of\n `$OTPROOT/releases`. This is done by setting the SASL environment variable\n `releases_dir`, either from the command line\n (`-sasl releases_dir /releases`) or in `sys.config`.\n\n - **_Which boot file to use_** - The default boot file is\n `$OTPROOT/bin/start`, but in this case we need to specify a boot file from\n our target structure, typically ` /releases/ / `.\n This is done with the `-boot` command line option to `erl`\n\n - **_The location of our applications_** - The generated .script (and .boot)\n file uses the environment variable `$RELTOOL_EXT_LIB` as prefix for the\n paths to all applications. The `-boot_var` option to `erl` can be used for\n specifying the value of this variable, typically\n `-boot_var RELTOOL_EXT_LIB /lib`.\n\n Example:\n\n ```text\n erl -sasl releases_dir \\\"mytarget/releases\\\" -boot mytarget/releases/1.0/myrel\\\n -boot_var RELTOOL_EXT_LIB mytarget/lib\n ```\n\n- **`incl_sys_filters`** - This parameter normally contains a list of regular\n expressions that controls which files in the system should be included. Each\n file in the target system must match at least one of the listed regular\n expressions in order to be included. Further the files may not match any\n filter in `excl_sys_filters` in order to be included. Which application files\n should be included is controlled with the parameters `incl_app_filters` and\n `excl_app_filters`. This parameter defaults to `[\".*\"]`.\n\n- **`excl_sys_filters`** - This parameter normally contains a list of regular\n expressions that controls which files in the system should not be included in\n the target system. In order to be included, a file must match some filter in\n `incl_sys_filters` but not any filter in `excl_sys_filters`. This parameter\n defaults to `[]`.\n\n- **`incl_app_filters`** - This parameter normally contains a list of regular\n expressions that controls which application specific files that should be\n included. Each file in the application must match at least one of the listed\n regular expressions in order to be included. Further the files may not match\n any filter in `excl_app_filters` in order to be included. This parameter\n defaults to `[\".*\"]`.\n\n- **`excl_app_filters`** - This parameter normally contains a list of regular\n expressions that controls which application specific files should not be\n included in the target system. In order to be included, a file must match some\n filter in `incl_app_filters` but not any filter in `excl_app_filters`. This\n parameter defaults to `[]`.\n\nOn application (`escript`) level, the following options are supported:\n\n- **`incl_cond`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\nOn application (`app`) level, the following options are supported:\n\n- **`vsn`** - The version of the application. In an installed system there may\n exist several versions of an application. The `vsn` parameter controls which\n version of the application will be chosen.\n\n This parameter is mutual exclusive with `lib_dir`. If `vsn` and `lib_dir` are\n both omitted, the latest version will be chosen.\n\n Note that in order for reltool to sort application versions and thereby be\n able to select the latest, it is required that the version id for the\n application consists of integers and dots only, for example `1`, `2.0` or\n `3.17.1`.\n\n- **`lib_dir`** - The directory to read the application from. This parameter can\n be used to point out a specific location to fetch the application from. This\n is useful for instance if the parent directory for some reason is no good as a\n library directory on system level.\n\n This parameter is mutual exclusive with `vsn`. If `vsn` and `lib_dir` are both\n omitted, the latest version will be chosen.\n\n Note that in order for reltool to sort application versions and thereby be\n able to select the latest, it is required that the version id for the\n application consists of integers and dots only, for example `1`, `2.0` or\n `3.17.1`.\n\n- **`mod`** - Module specific configuration. A module has a mandatory name and\n module level options that are described below.\n\n- **`mod_cond`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\n- **`incl_cond`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\n- **`app_file`** - The value of this parameter overrides the parameter with the\n same name on system level.\n\n- **`debug_info`** - The value of this parameter overrides the parameter with\n the same name on system level.\n\n- **`incl_app_filters`** - The value of this parameter overrides the parameter\n with the same name on system level.\n\n- **`excl_app_filters`** - The value of this parameter overrides the parameter\n with the same name on system level.\n\nOn module (`mod`) level, the following options are supported:\n\n- **`incl_cond`** - This parameter controls whether the module is included or\n not. By default the `mod_cond` parameter on application and system level will\n be used to control whether the module is included or not. The value of\n `incl_cond` overrides the module inclusion policy. `include` implies that the\n module is included, while `exclude` implies that the module is not included.\n `derived` implies that the module is included if it is used by any other\n included module.\n\n- **`debug_info`** - The value of this parameter overrides the parameter with\n the same name on application level.","ref":"reltool.html"},{"type":"function","title":"reltool.create_target/2","doc":"Create a target system.\n\nGives the same result as `{ok,TargetSpec}=reltool:get_target_spec(Server)` and\n`reltool:eval_target_spec(TargetSpec,RootDir,TargetDir)`.","ref":"reltool.html#create_target/2"},{"type":"function","title":"reltool.eval_target_spec/3","doc":"Create the actual target system from a specification generated by\n`reltool:get_target_spec/1`.\n\nThe creation of the specification for a target system is performed in two steps.\nIn the first step a complete specification will be generated. It will likely contain\nmuch more files than you are interested in your target system. In the second\nstep the specification will be filtered according to your filters. There you have the\nability to specify filters per application as well as system wide filters. You can\nalso select a `profile` for your system. Depending on the `profile`, different\ndefault filters will be used.\n\nThe top directories `bin`, `releases` and `lib` are treated differently from\nother files. All other files are by default copied to the target system. The\n`releases` directory contains generated `rel`, `script`, and `boot` files. The\n`lib` directory contains the applications. Which applications are included and\nif they should be customized (stripped from debug info etc.) is specified with\nvarious configuration parameters. The files in the `bin` directory are copied\nfrom the `erts-vsn/bin` directory, but only those files that were originally\nincluded in the `bin` directory of the source system.\n\nIf the configuration parameter `relocatable` was set to `true` there is no need\nto install the target system with `reltool:install/2` before it can be started.\nIn that case the file tree containing the target system can be moved without\nre-installation.\n\nIn most cases, the `RootDir` parameter should be set to the same as the\n`root_dir` configuration parameter used in the call to\n`reltool:get_target_spec/1` (or `code:root_dir/0` if the configuration parameter\nis not set). In some cases it might be useful to evaluate the same target\nspecification towards different root directories. This should, however, be used\nwith great care as it requires equivalent file structures under all roots.","ref":"reltool.html#eval_target_spec/3"},{"type":"function","title":"reltool.get_config/1","doc":"","ref":"reltool.html#get_config/1"},{"type":"function","title":"reltool.get_config/3","doc":"Get reltool configuration.\n\nNormally, only the explicit configuration parameters with values that differ from\ntheir defaults are interesting. But the builtin default values can be returned by\nsetting `InclDefaults` to `true`. The derived configuration can be returned by\nsetting `InclDerived` to `true`.","ref":"reltool.html#get_config/3"},{"type":"function","title":"reltool.get_rel/2","doc":"Get contents of a release file. See [`rel`](`e:sasl:rel.md`) for more details.","ref":"reltool.html#get_rel/2"},{"type":"function","title":"reltool.get_script/2","doc":"Get contents of a boot script file. See [`script`](`e:sasl:script.md`) for more details.","ref":"reltool.html#get_script/2"},{"type":"function","title":"reltool.get_server/1","doc":"Return the process identifier of the server process.","ref":"reltool.html#get_server/1"},{"type":"function","title":"reltool.get_status/1","doc":"Get status about the configuration","ref":"reltool.html#get_status/1"},{"type":"function","title":"reltool.get_target_spec/1","doc":"Return a specification of the target system. The actual target system can be\ncreated with `reltool:eval_target_spec/3`.","ref":"reltool.html#get_target_spec/1"},{"type":"function","title":"reltool.install/2","doc":"Install a created target system","ref":"reltool.html#install/2"},{"type":"function","title":"reltool.start/0","doc":"Start a main window process with default options","ref":"reltool.html#start/0"},{"type":"function","title":"reltool.start/1","doc":"Start a main window process with options","ref":"reltool.html#start/1"},{"type":"function","title":"reltool.start_link/1","doc":"Start a main window process with options. The process is linked.","ref":"reltool.html#start_link/1"},{"type":"function","title":"reltool.start_server/1","doc":"Start a server process with options. The server process identity can be given as\nan argument to several other functions in the API.","ref":"reltool.html#start_server/1"},{"type":"function","title":"reltool.stop/1","doc":"Stop a server or window process","ref":"reltool.html#stop/1"},{"type":"type","title":"reltool.app/0","doc":"","ref":"reltool.html#t:app/0"},{"type":"type","title":"reltool.app_file/0","doc":"","ref":"reltool.html#t:app_file/0"},{"type":"type","title":"reltool.app_name/0","doc":"","ref":"reltool.html#t:app_name/0"},{"type":"type","title":"reltool.app_type/0","doc":"","ref":"reltool.html#t:app_type/0"},{"type":"type","title":"reltool.app_vsn/0","doc":"","ref":"reltool.html#t:app_vsn/0"},{"type":"type","title":"reltool.base_dir/0","doc":"","ref":"reltool.html#t:base_dir/0"},{"type":"type","title":"reltool.base_file/0","doc":"","ref":"reltool.html#t:base_file/0"},{"type":"type","title":"reltool.boot_rel/0","doc":"","ref":"reltool.html#t:boot_rel/0"},{"type":"type","title":"reltool.config/0","doc":"","ref":"reltool.html#t:config/0"},{"type":"type","title":"reltool.debug_info/0","doc":"","ref":"reltool.html#t:debug_info/0"},{"type":"type","title":"reltool.dir/0","doc":"","ref":"reltool.html#t:dir/0"},{"type":"type","title":"reltool.escript/0","doc":"","ref":"reltool.html#t:escript/0"},{"type":"type","title":"reltool.escript_file/0","doc":"","ref":"reltool.html#t:escript_file/0"},{"type":"type","title":"reltool.excl_app_filters/0","doc":"","ref":"reltool.html#t:excl_app_filters/0"},{"type":"type","title":"reltool.excl_lib/0","doc":"","ref":"reltool.html#t:excl_lib/0"},{"type":"type","title":"reltool.excl_sys_filters/0","doc":"","ref":"reltool.html#t:excl_sys_filters/0"},{"type":"type","title":"reltool.file/0","doc":"","ref":"reltool.html#t:file/0"},{"type":"type","title":"reltool.incl_app/0","doc":"","ref":"reltool.html#t:incl_app/0"},{"type":"type","title":"reltool.incl_app_filters/0","doc":"","ref":"reltool.html#t:incl_app_filters/0"},{"type":"type","title":"reltool.incl_cond/0","doc":"","ref":"reltool.html#t:incl_cond/0"},{"type":"type","title":"reltool.incl_defaults/0","doc":"","ref":"reltool.html#t:incl_defaults/0"},{"type":"type","title":"reltool.incl_derived/0","doc":"","ref":"reltool.html#t:incl_derived/0"},{"type":"type","title":"reltool.incl_sys_filters/0","doc":"","ref":"reltool.html#t:incl_sys_filters/0"},{"type":"type","title":"reltool.lib_dir/0","doc":"","ref":"reltool.html#t:lib_dir/0"},{"type":"type","title":"reltool.mod/0","doc":"","ref":"reltool.html#t:mod/0"},{"type":"type","title":"reltool.mod_cond/0","doc":"","ref":"reltool.html#t:mod_cond/0"},{"type":"type","title":"reltool.mod_name/0","doc":"","ref":"reltool.html#t:mod_name/0"},{"type":"type","title":"reltool.option/0","doc":"","ref":"reltool.html#t:option/0"},{"type":"type","title":"reltool.options/0","doc":"","ref":"reltool.html#t:options/0"},{"type":"type","title":"reltool.profile/0","doc":"","ref":"reltool.html#t:profile/0"},{"type":"type","title":"reltool.re_regexp/0","doc":"","ref":"reltool.html#t:re_regexp/0"},{"type":"type","title":"reltool.reason/0","doc":"","ref":"reltool.html#t:reason/0"},{"type":"type","title":"reltool.regexps/0","doc":"","ref":"reltool.html#t:regexps/0"},{"type":"type","title":"reltool.rel_app/0","doc":"","ref":"reltool.html#t:rel_app/0"},{"type":"type","title":"reltool.rel_file/0","doc":"","ref":"reltool.html#t:rel_file/0"},{"type":"type","title":"reltool.rel_name/0","doc":"","ref":"reltool.html#t:rel_name/0"},{"type":"type","title":"reltool.rel_opt/0","doc":"","ref":"reltool.html#t:rel_opt/0"},{"type":"type","title":"reltool.rel_vsn/0","doc":"","ref":"reltool.html#t:rel_vsn/0"},{"type":"type","title":"reltool.relocatable/0","doc":"","ref":"reltool.html#t:relocatable/0"},{"type":"type","title":"reltool.root_dir/0","doc":"","ref":"reltool.html#t:root_dir/0"},{"type":"type","title":"reltool.script_file/0","doc":"","ref":"reltool.html#t:script_file/0"},{"type":"type","title":"reltool.server/0","doc":"","ref":"reltool.html#t:server/0"},{"type":"type","title":"reltool.server_pid/0","doc":"","ref":"reltool.html#t:server_pid/0"},{"type":"type","title":"reltool.sys/0","doc":"","ref":"reltool.html#t:sys/0"},{"type":"type","title":"reltool.target_dir/0","doc":"","ref":"reltool.html#t:target_dir/0"},{"type":"type","title":"reltool.target_spec/0","doc":"","ref":"reltool.html#t:target_spec/0"},{"type":"type","title":"reltool.top_dir/0","doc":"","ref":"reltool.html#t:top_dir/0"},{"type":"type","title":"reltool.top_file/0","doc":"","ref":"reltool.html#t:top_file/0"},{"type":"type","title":"reltool.warning/0","doc":"","ref":"reltool.html#t:warning/0"},{"type":"type","title":"reltool.window_pid/0","doc":"","ref":"reltool.html#t:window_pid/0"},{"type":"extras","title":"Reltool Release Notes","doc":"\n# Reltool Release Notes\n\nThis document describes the changes made to the Reltool system from version to\nversion. The intention of this document is to list all incompatibilities as well\nas all enhancements and bugfixes for every release of Reltool. Each release of\nReltool thus constitutes one section in this document. The title of each section\nis the version number of Reltool.","ref":"notes.html"},{"type":"extras","title":"Reltool 1.0.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-1-0-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- The dependencies for this application are now listed in the app file.\n\n Own Id: OTP-18831 Aux Id: [PR-7441]\n\n[PR-7441]: https://github.com/erlang/otp/pull/7441","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- The documentation has been migrated to use Markdown and ExDoc.\n\n Own Id: OTP-18955 Aux Id: [PR-8026]\n\n[PR-8026]: https://github.com/erlang/otp/pull/8026","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 1.0 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-1-0"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Add possibility to strip specific chunks from beam files included in a\n release. Before this change it was only possible to strip all chunks from the\n beam files.\n\n Own Id: OTP-18230 Aux Id: PR-5936\n\n- Runtime dependencies have been updated.\n\n Own Id: OTP-18350\n\n- Support for the experimental code archives feature has been removed from\n `reltool`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18488 Aux Id: PR-6836\n\n- The implementation has been fixed to use `proc_lib:init_fail/2,3` where\n appropriate, instead of `proc_lib:init_ack/1,2`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-18490 Aux Id: OTP-18471, GH-6339, PR-6843","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.9.1.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-9-1-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"* Fixed runtime dependencies.\n\n Own Id: OTP-19064","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.9.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-9-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Fixed a bug that would cause analysis to crash.\n\n Own Id: OTP-18372 Aux Id: GH-6580","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.9 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-9"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Recognize new key 'optional_applications' in application resource files.\n\n Own Id: OTP-17189 Aux Id: PR-2675\n\n- Removed timestamps from files generated by `sasl` and `reltool` to enable\n deterministic builds.\n\n Own Id: OTP-17292 Aux Id: PR-4685, PR-4684","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.8 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-8"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- A new element, `Opts`, can now be included in a `rel` tuple in the reltool\n release specific configuration format: \\{rel, Name, Vsn, RelApps, Opts\\}.\n\n This supports the use of\n `{rel, Name, Vsn, RelApps, [{load_dot_erlang, false}]}` to prevent the boot\n script from running the `.erlang` file.\n\n The incompatibilities are as follows:\n\n \\* The return from `reltool:get_config/1` and `reltool:get_config/3` includes\n the new `rel` tuple for all releases where the `load_dot_erlang` option is set\n to `false`. \n \\* The return from `reltool:get_config/3` includes the new `rel` tuple for ALL\n releases if the `InclDefs` parameter is set to `true`.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-15571","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.7.8 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-8"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Reltool would earlier erroneously split paths like `\"c:\\foo\"` into\n `[\"c\",\"\\foo\"]` when reading the `$ERL_LIBS` variable on windows. This is now\n corrected.\n\n Own Id: OTP-15454","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.7.7 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Improved documentation.\n\n Own Id: OTP-15190","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.7.6 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-6"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Calls to `erlang:get_stacktrace()` are removed.\n\n Own Id: OTP-14861","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.7.5 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-5"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Files generated by `release_handler` and `reltool`, which might contain\n Unicode characters, are now encoded as UTF-8 and written with format \"~tp\" or\n \"~ts\". If the file is to be read by `file:consult/1`, an encoding comment is\n added.\n\n Own Id: OTP-14463","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.7.4 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-4"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- The User's Guide examples are updated after removal of support for Dets files\n created with Erlang/OTP R7 and earlier.\n\n Own Id: OTP-14422 Aux Id: OTP-13830","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.7.3 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-3"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Fixed xml issues in old release notes\n\n Own Id: OTP-14269","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.7.2 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Dependencies specified in .app files would earlier only be followed for\n applications that are included in a 'rel' spec in the reltool config. For\n other applications, only xref would decide the dependencies.\n\n Some dependency chains would even be missed for applications that are included\n in a 'rel' spec in the reltool config. E.g.\n\n - Application x has y as included application, and y in turn has z as included\n application. Then z is not included.\n - Application x has y in its 'applications' tag in the .app file, and y in\n turn has z as included application. Then z is not included.\n\n These bugs are now corrected.\n\n Own Id: OTP-11993","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.7.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7-1"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Modify the code as motivated by a change of the Erlang Parser (`undefined` is\n no longer automatically inserted to the type of record fields without an\n initializer).\n\n Own Id: OTP-13033 Aux Id: OTP-12719","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.7 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-7"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Change license text from Erlang Public License to Apache Public License v2\n\n Own Id: OTP-12845","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.6.6 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Fixed a minor typo in an error message from reltool_server.\n\n Own Id: OTP-11977","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.6.5 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- When adding a regexp to a filter in reltool using \\{add,Regexp\\}, and the\n existing regexp was undefined, reltool would crash since it got an improper\n list. This has been corrected. (Thanks to Håkan Mattsson)\n\n Own Id: OTP-11591\n\n- Adapted reltool test server to common test usage of tc_status. (Note that this\n code is not used by OTP daily test runs.) (Thanks to Håkan Mattsson)\n\n Own Id: OTP-11592\n\n- Application upgrade (appup) files are corrected for the following\n applications:\n\n `asn1, common_test, compiler, crypto, debugger, dialyzer, edoc, eldap, erl_docgen, et, eunit, gs, hipe, inets, observer, odbc, os_mon, otp_mibs, parsetools, percept, public_key, reltool, runtime_tools, ssh, syntax_tools, test_server, tools, typer, webtool, wx, xmerl`\n\n A new test utility for testing appup files is added to test_server. This is\n now used by most applications in OTP.\n\n (Thanks to Tobias Schlager)\n\n Own Id: OTP-11744","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.6.4.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6-4-1"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- The encoding of the `notes.xml` file has been changed from latin1 to utf-8 to\n avoid future merge problems.\n\n Own Id: OTP-11310","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.6.4 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6-4"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Fix receive support in erl_eval with a BEAM module. Thanks to Anthony Ramine.\n\n Own Id: OTP-11137","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Reltool used to fail if an application was mentioned in the config file which\n was not found in the file system, even if the application was explicitly\n excluded in the config. This has been changed and will only produce a warning.\n If the application is not explicitly excluded it will still cause reltool to\n fail. Thanks to Håkan Mattsson\\!\n\n Own Id: OTP-10988\n\n- Fix possibly \"not owner\" error while file copy with reltool. Thanks to Alexey\n Saltanov.\n\n Own Id: OTP-11099","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.6.3 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6-3"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Some updates are made to reltool for handling unicode.\n\n Own Id: OTP-10781","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.6.2 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- - If `incl_cond` was set to `derived` on module level, then reltool_server\n would crash with a `case_clause`. This has been corrected. `incl_cond` on\n module level now overwrites `mod_cond` on app or sys level as described in\n the documentation.\n - If a `rel` spec in the reltool config does not contain all applications that\n are listed as `{applications,Applications}` in a `.app` file, then these\n applications are automatically added when creating the `.rel` file. For\n 'included_applications', the behaviour was not the same. I.e. if a `rel`\n spec in the reltool config did not contain all applications that are listed\n as `{included_applications,InclApplications}` in a `.app` file, then reltool\n would fail with reason \"Undefined applications\" when creating the `.rel`\n file. This has been corrected, so both `applications` and\n `included_applications` are now automatically added if not already in the\n `rel` spec.\n - The `rel` specification now dictates the order in which included and used\n applications (specified in the `.app` file as `included_applications` and\n `applications` respectively) are loaded/started by the boot file. If the\n applications are not specified in the `rel` spec, then the order from the\n `.app` file is used. This was a bug earlier reported on systools, and is now\n also implemented in reltool.\n - Instead of only looking at the directory name, reltool now first looks for a\n `.app` file in order to figure out the name of an application.\n\n Own Id: OTP-10012 Aux Id: kunagi-171 \\[82]","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Some examples overflowing the width of PDF pages have been corrected.\n\n Own Id: OTP-10665","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.6.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6-1"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- A new sys level configuration parameter `{excl_lib,otp_root}` is added. When\n this is set, the target system will not contain anything from `$OTPROOT`. It\n will only contain a releases directory with rel, script and boot files, and a\n lib directory with applications found outside of `$OTPROOT` (i.e. \"your own\"\n applications).\n\n Own Id: OTP-9743","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.6 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- Miscellaneous corrections:\n\n - Start of reltool GUI would sometimes crash with a badmatch in\n reltool_sys_win:do_init. This has been corrected.\n - Minor corrections of documentation and type specifications of app() and\n mod() are done.\n - If a module name is duplicated in an app file reltool would return an error.\n This is now changed to a warning.\n - Reltool would earlier not necessarily keep the order of applications as\n listed in the rel specification in the configuration. This has been\n corrected.\n - Reltool would earlier set the default for included applications to an empty\n list if it was not set in the rel specification in the configuration. This\n was correct according to sasl/systools documentation, but not according to\n sasl/systools implementation. We decided to change the documentation and\n reltool to use the value of included_applications from the .app file as\n default instead of the empty list, since this seems more intuitive and since\n systools always has done the same.\n - The value of included applications in the rel specification in the\n configuration did not overwrite included_applications in the .app file if it\n was set to an empty list. This has been corrected.\n - Reltool would earlier add load instructions in the script/boot files for ALL\n modules in the ebin directory of an application even if mod_cond was set to\n app (include only modules listed in the .app file). This has been corrected.\n - Reltool would earlier add start instructions in the script/boot file for\n included applications. This has been corrected - included applications shall\n only be loaded since the including application is responsible for starting\n them.\n - Status bar now indicates that reltool is working (Processing libraries...)\n for all configuration changes, and when generating target system.\n - Title of dependencies column in app and mod window is changed from \"Modules\n used by others\" to \"Modules using this\".\n\n Own Id: OTP-9792\n\n- Configuration changes via the GUI had a few bugs related to error handling,\n rollback and undo. A major re-write of the reltool_server has been done in\n order to align the way reltool_server updates and uses its state and tables\n for all different kinds of configuration change.\n\n All configuration changes (except undo) now cause a re-read of the file\n system, meaning that if something has changed in the file system it will be\n reflected in the result of the configuration change.\n\n When loading a new configuration file via the GUI, the old configuration is\n now completely scratched, and only the new is valid.\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-9794\n\n- Some bug fixes related to the handling of escripts:\n\n - Reltool could not handle escripts with inlined applications. This has been\n corrected. Inlined applications will be visible in the GUI, but not possible\n to include/exclude separately.\n - Loading a config which contains an escript via the GUI menu did not produce\n the same result as when using the same configuration at reltool start.\n Paths, version and label could differ. This has been corrected.\n - Loading config with same escript (source) twice caused reltool to add same\n module twice. This has been corrected.\n - Loading config with same escript (inlined beam) twice caused reltool to fail\n saying module is included by two different applications. This has been\n corrected.\n - Loading config which in addition to an existing escript also adds another\n escript, for which the name sorts before the existing one, would cause\n reltool to fail saying \"Application name clash\". This has been corrected.\n\n Own Id: OTP-9968\n\n- Reltool would sometimes generate a .app file containing\n `{start_phases,undefined}`, which would cause an exception in systools at\n parse time. This has been corrected so reltool now omits the `start_phases`\n entry if the value is `undefined`. (Thanks to Juan Jose Comellas)\n\n In order to align with reltool, sasl will also omit `start_phases` entries\n with value `undefined` in .script files.\n\n Own Id: OTP-10003","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- A warning list is added to the sys window of the reltool GUI. This list will\n continuously show all warnings produced by the current configuration.\n\n Own Id: OTP-9967\n\n- As a way of specifying one specific version of an application, the following\n configuration parameter is added on application level:\n\n \\{lib_dir,Dir\\}, Dir = string()\n\n This can be useful if the parent directory of the application directory is not\n suitable to use as a lib dir on system level.\n\n Own Id: OTP-9977","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.5.7.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-7-1"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Added recommendation about `RootDir` parameter to\n `reltool:eval_target_spec/3`.\n\n Own Id: OTP-9742","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.5.7 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-7"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- If a module was duplicated in the library directories visible to reltool, and\n the configuration did not point out which file to use, then reltool:start\n would always fail. A pop-up is added which asks if you want to continue with a\n safe and minimal configuration.\n\n Own Id: OTP-9383\n\n- wx would sometimes crash due to an empty radiobox on the 'releases' tab of the\n system window. This radiobox is removed, and replaced by a listbox which will\n always contain at least kernel and stdlib applications.\n\n Own Id: OTP-9384","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.5.6 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-6"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- The system level option `app_files` is documented to allow the values\n `keep | strip | all`, but it only allowed `keep`. This is corrected.\n\n Own Id: OTP-9135\n\n- Allow the same module name in multiple applications visible to reltool, as\n long as all but one of the applications/modules are explicitly excluded.\n (Thanks to Andrew Gopienko and Jay Nelson)\n\n Own Id: OTP-9229","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.5.5 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-5"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- The reltool module contained two seriously erroneous specs which caused bogus\n warnings when dialyzing reltool and some correct code of users. These were\n fixed (specs for start_link/1 and eval_server/3)\n\n \\- Code cleanups and simplifications - Fix a bug in the calculation of\n circular dependencies - Eliminate two dialyzer warnings - Put files\n alphabetically\n\n Own Id: OTP-9120","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.5.4 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-4"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Added function `zip:foldl/3` to iterate over zip archives.\n\n Added functions to create and extract escripts. See `escript:create/2` and\n `escript:extract/2`.\n\n The undocumented function `escript:foldl/3` has been removed. The same\n functionality can be achieved with the more flexible functions\n `escript:extract/2` and `zip:foldl/3`.\n\n Record fields has been annotated with type info. Source files as been adapted\n to fit within 80 chars and trailing whitespace has been removed.\n\n Own Id: OTP-8521\n\n- A new escript, called `reltool`, has been introduced in order to simplify the\n usage of the reltool application from makefiles.\n\n The handling of applications included in releases has been improved.\n Applications that are required to be started before other applications in a\n release are now automatically included in the release. The Kernel and STDLIB\n applications are always included as they are mandatory.\n\n Applications that are (explicitly or implicitly) included in a release are now\n automatically included as if they were explicitly included with the incl_cond\n flag.\n\n A new `embedded_app_type` option has been introduced. It is intended to be\n used for embedded systems where all included applications must be loaded from\n the boot script, as these systems does not utilize dynamic code loading. If\n `embedded_app_type `is set to something else than `undefined`, all included\n applications will be included in both the release as well as in the boot\n script. If the `profile` is `embedded` the `embedded_app_type` option defaults\n to `load`.\n\n A new function called `reltool:get_status/1` has been introduced. It returns\n status about the configuration in the server.\n\n The API functions that may take `PidOrOptions` as input and actually gets\n `Options` does now print out warnings.\n\n The internal error handling has been improved. For example `{error,Reason}` is\n always returned in case of errors even when the server dies.\n\n `app` and `appup` files has been added as well as a corresponding test suite.\n\n Various cleanups has been made in the code and in the documentation.\n\n Own Id: OTP-8590","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.5.3 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-3"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Removed spurious documentation files.\n\n Own Id: OTP-8057","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.5.2 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-2"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- The documentation is now built with open source tools (xsltproc and fop) that\n exists on most platforms. One visible change is that the HTML frames are\n removed.\n\n Own Id: OTP-8254","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.5.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5-1"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- In the new release of Reltool (0.5) there is a severe bug that may cause your\n source files to be deleted. The bug is triggered when you generate a target\n system WITH archive files AND your library directories are given with absolute\n paths. (Library directories are given with the ERL_LIBS environment variable\n or with the lib_dirs configuration parameter.)\n\n Own Id: OTP-8199","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.5 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-5"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- The tool is still experimental. Feedback is appreciated.\n\n Major improvements of the target system generation has been performed. Now it\n is possible to generate a relocatable target system that does not need to be\n re-installed if it is moved to a new location. Archive files are automatically\n generated. A detailed specification of the target system can be generated\n without actually creating the target system. Relocatable escripts are put in\n the bin directory of the target system. etc. etc.\n\n Some new functions has been introduced in the `reltool` module:\n `start/1, start_link/1, get_config/3, get_target_spec/1 and eval_target_spec/3`.\n\n Some new configuration parameters has been introduced:\n `profile, incl_sys_filters, excl_sys_filters, incl_app_filters, excl_app_filters, incl_archive_filters, excl_archive_filters, archive_opts, escript and relocatable`.\n\n Some parameters have been obsoleted and given new semantics:\n `incl_erts_dirs (incl_sys_filters), excl_erts_dirs (excl_sys_filters), incl_app_dirs (incl_app_filters), excl_app_dirs (excl_app_filters) and escripts (escript).`\n\n \\*** POTENTIAL INCOMPATIBILITY \\***\n\n Own Id: OTP-7949","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Known Bugs and Problems - Reltool Release Notes","doc":"- The application is experimental. Feedback is appreciated.","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Reltool 0.2.2 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-2-2"},{"type":"extras","title":"Fixed Bugs and Malfunctions - Reltool Release Notes","doc":"- The tool crashed when rel, script and boot files were generated via the GUI.\n This has been fixed.\n\n Own Id: OTP-7999","ref":"notes.html#fixed-bugs-and-malfunctions"},{"type":"extras","title":"Reltool 0.2.1 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-2-1"},{"type":"extras","title":"Improvements and New Features - Reltool Release Notes","doc":"- Minor GUI fixes\n\n Own Id: OTP-7840","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Reltool 0.2 - Reltool Release Notes","doc":"","ref":"notes.html#reltool-0-2"},{"type":"extras","title":"Improvements and new features - Reltool Release Notes","doc":"This is the first (experimental) release of Reltool.","ref":"notes.html#improvements-and-new-features"},{"type":"extras","title":"Known Bugs and Problems - Reltool Release Notes","doc":"- The application is experimental.","ref":"notes.html#known-bugs-and-problems"},{"type":"extras","title":"Introduction","doc":"\n# Introduction\n\nReltool is a release management tool. It analyses a given Erlang/OTP\ninstallation and determines various dependencies between applications. The\n`graphical` frontend depicts the dependencies and enables interactive\ncustomization of a target system. The backend provides a `batch` interface for\ngeneration of customized target systems.","ref":"reltool_intro.html"},{"type":"extras","title":"Scope and Purpose - Introduction","doc":"This manual describes the Reltool application, as a component of the Erlang/Open\nTelecom Platform development environment. It is assumed that the reader is\nfamiliar with the Erlang Development Environment, which is described in a\nseparate User's Guide.","ref":"reltool_intro.html#scope-and-purpose"},{"type":"extras","title":"Prerequisites - Introduction","doc":"The following prerequisites are required for understanding the material in the\nReltool User's Guide:\n\n- familiarity with Erlang/OTP system principles and Erlang/OTP design principles\n\nThe application requires Erlang/OTP release R13B02 or later.","ref":"reltool_intro.html#prerequisites"},{"type":"extras","title":"About This Manual - Introduction","doc":"In addition to this introductory chapter, the Reltool User's Guide contains the\nfollowing chapters:\n\n- Chapter 2: [\"Usage\"](reltool_usage.md) describes the architecture and typical usage of the\n application.\n- Chapter 3: [\"Examples\"](reltool_examples.md) gives some usage examples","ref":"reltool_intro.html#about-this-manual"},{"type":"extras","title":"Where to Find More Information - Introduction","doc":"Refer to the following documentation for more information about Reltool and\nabout the Erlang/OTP development system:\n\n- the [Reference Manual of Reltool](`m:reltool`)\n- the Erlang/OTP [`System Principles`](`e:system:system_principles.md`)\n- the Erlang/OTP [`Design Principles`](`e:system:design_principles.md`)\n- Programming Erlang: Software for a Concurrent World (2007), Pragmatic\n Bookshelf, ISBN13: 9781934356005.","ref":"reltool_intro.html#where-to-find-more-information"},{"type":"extras","title":"Usage","doc":"\n# Usage","ref":"reltool_usage.html"},{"type":"extras","title":"Overview - Usage","doc":"This document focuses on the graphical parts of the tool. The concepts are\nexplained in the reference manual for the module `reltool`.","ref":"reltool_usage.html#overview"},{"type":"extras","title":"System window - Usage","doc":"The system window is started with the function `reltool:start/1`. At startup the\ntool will process all `beam` files and `app` files in order to find out\ndependencies between applications and their modules. Once all this information\nhas been derived, it will be possible to explore the tool.\n\nThe system window consists of four main pages (tabs):\n\n- Libraries\n- System settings\n- Applications\n- Releases\n\nClick on a name tag to display its page.","ref":"reltool_usage.html#system-window"},{"type":"extras","title":"Libraries - Usage","doc":"On the library page it is possible to control which sources the tool will use.\nThe page is organized as a tree which can be expanded and collapsed by clicking\non the little symbol in the beginning of the expandable/collapsible lines.\n\nThe `Root directory` can be edited by selecting the line where the path of the\nroot directory is displayed and clicking the right mouse button. Choose edit in\nthe menu that pops up.\n\nLibrary directories can be added, edited or deleted. This is done by selecting\nthe line where the path to a library directory is displayed and clicking the\nright mouse button. Choose add, edit or delete in the menu that pops up. New\nlibrary directories can also be added by selecting the line\n`Library directories` and clicking the right mouse button. Choose add in the\nmenu that pops up.\n\nEscript files can be added, edited or deleted. This is done by selecting the\nline where the path to an escript file is displayed and clicking the right mouse\nbutton. Choose add, edit or delete in the menu that pops up. New escripts can\nalso be added by selecting the line `Escript files` and clicking the right mouse\nbutton. Choose add in the menu that pops up.\n\nWhen libraries and escripts are expanded, the names of their contained\napplications will be displayed. Double click on an application name to launch an\napplication window.","ref":"reltool_usage.html#libraries"},{"type":"extras","title":"System settings - Usage","doc":"On the system settings page it is possible to control some global settings that\nare used as defaults for all applications. Set the\n`Application inclusion policy` to `include` to include all applications that are\nnot explicitly excluded. See `incl_cond` (application inclusion) and `mod_cond`\n(module inclusion) in the reference manual for the module `reltool` for more\ninfo.\n\nThe system settings page is rather incomplete.","ref":"reltool_usage.html#system-settings"},{"type":"extras","title":"Applications - Usage","doc":"There are four categories of applications on the applications page. `Included`\ncontains applications that are explicitly included. `Excluded` contains\napplications that are explicitly excluded. `Derived` contains applications that\neither are used directly by explicitly included applications or by other derived\napplications. `Available` contains the remaining applications.\n\nSelect one or more applications and click on a button directly below the\napplication column to change application category. For example, select an\navailable application and click on its tick button to move the application to\nthe included category. Clicking on the tick symbol for included applications\nwill move the application back to the available category. The tick is undone.\n\nThe symbols in front of the application names are intended to describe the\nstatus of the application. There are error and warning symbols to signalize that\nthere is something which needs attention. The tick symbol means that the\napplication is included or derived and no problem has been detected. The cross\nsymbol means that the application is excluded or available and no problem has\nbeen detected. Applications with error symbols are listed first in each category\nand are followed by the warnings and the normal ones (ticks and crosses) at the\nend.\n\nDouble click on an application to launch its application window.","ref":"reltool_usage.html#applications"},{"type":"extras","title":"Releases - Usage","doc":"The releases page is incomplete and very experimental.","ref":"reltool_usage.html#releases"},{"type":"extras","title":"File menu - Usage","doc":"- `Display application dependency graph` \\- Launches an application force graph\n window. All included and derived applications and their dependencies will be\n shown in a graph.\n- `Display module dependency graph` \\- Launch a module force graph window. All\n included and derived modules and their dependencies will be shown in a graph.\n- `Reset configuration to default`\n- `Undo configuration (toggle)`\n- `Load configuration` \\- Loads a new configuration from file.\n- `Save configuration` \\- Saves the current configuration to file. Normally,\n only the explicit configuration parameters with values that differ from their\n defaults are saved. But the configuration with or without default values and\n with or without derived values may also be saved.\n- `Generate rel, script and boot files`\n- `Generate target system`\n- `Close` \\- Close the system window and all its subwindows.","ref":"reltool_usage.html#file-menu"},{"type":"extras","title":"Dependencies between applications or modules displayed as a graph - Usage","doc":"The dependency graph windows are launched from the file menu in the system\nwindow. The graph depicts all included and derived applications/modules and\ntheir dependencies.\n\nIt is possible to perform some limited manipulations of the graph. Nodes can be\nmoved, selected, locked or deleted. Move a single node or the entire graph by\nmoving the mouse while the left mouse button is pressed. A node can be locked\ninto a fix position by holding down the shift button when the left mouse button\nis released. Select several nodes by moving the mouse while the control key and\nthe left mouse button are pressed. Selected nodes can be locked, unlocked or\ndeleted by clicking on a suitable button.\n\nThe algorithm that is used to draw a graph with as few crossed links as possible\nis called force graph. A force graph consists of nodes and directed links\nbetween nodes. Each node is associated with a repulsive force that pushes nodes\naway from each other. This force can be adjusted with the left slider or with\nthe mouse wheel. Each link is associated with an attractive force that pulls the\nnodes nearer to each other. This force can be adjusted with the right slider. If\nthis force becomes too strong, the graph will be unstable. The third parameter\nthat can be adjusted is the length of the links. It is adjusted with the middle\nslider.\n\nThe `Freeze` button starts/stops the redrawing of the graph. `Reset` moves the\ngraph to the middle of the window and resets all graph settings to default, with\nthe exception of deleted nodes.","ref":"reltool_usage.html#dependencies-between-applications-or-modules-displayed-as-a-graph"},{"type":"extras","title":"Application window - Usage","doc":"The application window is started by double clicking on an application name. The\napplication window consists of four pages (tabs):\n\n- Application settings\n- Modules\n- Application dependencies\n- Module dependencies\n\nClick on a name tag to display its page.","ref":"reltool_usage.html#application-window"},{"type":"extras","title":"Application settings - Usage","doc":"Select version of the application in the `Source selection policy` part of the\npage. By default the latest version of the application is selected, but it is\npossible to override this by explicitly selecting another version.\n\nNote that in order for reltool to sort application versions and thereby be able\nto select the latest, it is required that the version id for the application\nconsists of integers and dots only, for example `1`, `2.0` or `3.17.1`.\n\nBy default the `Application inclusion policy` on system level is used for all\napplications. Set the value to `include` if you want to explicitly include one\nparticular application. Set it to `exclude` if you want to exclude the\napplication despite that it is used by another (explicitly or implicitly)\nincluded application. `derived` means that the application automatically will be\nincluded if some other (explicitly or implicitly) included application uses it.\n\nBy default the `Module inclusion policy` on system level is used for all\napplications. Set it to `derived` if you only want actually used modules to be\nincluded. Set it to `app` if you, besides derived modules, also want the modules\nlisted in the app file to be included. Set it to `ebin` if you, besides derived\nmodules, also want the modules that exist as beam files in the ebin directory to\nbe included. Set it to `all` if you want all modules to be included, that is the\nunion of modules found in the ebin directory and listed in the app file.\n\nThe application settings page is rather incomplete.","ref":"reltool_usage.html#application-settings"},{"type":"extras","title":"Modules - Usage","doc":"There are four categories of modules on the modules page. `Included` contains\nmodules that are explicitly included. `Excluded` contains modules that are\nexplicitly excluded. `Derived` contains modules that either are used directly by\nexplicitly included modules or by other derived modules. `Available` contains\nthe remaining modules.\n\nSelect one or more modules and click on a button directly below the module\ncolumn to change module category. For example, select an available module and\nclick on its tick button to move the module to the included category. Clicking\non the tick symbol for included modules will move the module back to the\navailable category. The tick is undone.\n\nThe symbols in front of the module names are intended to describe the status of\nthe module. There are error and and warning symbols to signalize that there is\nsomething that needs attention. The tick symbol means that the module is\nincluded or derived and no problem has been detected. The cross symbol means\nthat the module is excluded or available and no problem has been detected.\nModules with error symbols are listed first in each category and are followed by\nwarnings and the normal ones (ticks and crosses) at the end.\n\nDouble click on a module to launch its module window.","ref":"reltool_usage.html#modules"},{"type":"extras","title":"Application dependencies - Usage","doc":"There are four categories of applications on the `Application dependencies`\npage. If the application is used by other applications, these are listed under\n`Used by`. If the application requires other applications be started before it\ncan be started, these are listed under `Required`. These applications are listed\nin the `applications` part of the `app` file. If the application includes other\napplications, these are listed under `Included`. These applications are listed\nin the `included_applications` part of the `app` file. If the application uses\nother applications, these are listed under `Uses`.\n\nDouble click on an application name to launch an application window.","ref":"reltool_usage.html#application-dependencies"},{"type":"extras","title":"Module dependencies - Usage","doc":"There are two categories of modules on the `Module dependencies` page. If the\nmodule is used by other modules, these are listed under `Modules using this`. If\nthe module uses other modules, these are listed under `Used modules`.\n\nDouble click on an module name to launch a module window.","ref":"reltool_usage.html#module-dependencies"},{"type":"extras","title":"Module window - Usage","doc":"The module window is started by double clicking on an module name. The module\nwindow consists initially of two pages (tabs):\n\n- Dependencies\n- Code\n\nClick on a name tag to display its page.","ref":"reltool_usage.html#module-window"},{"type":"extras","title":"Dependencies - Usage","doc":"There are two categories of modules on the `Dependencies` page. If the module is\nused by other modules, these are listed under `Modules using this`. If the\nmodule uses other modules, these are listed under `Used modules`.\n\nDouble click on an module name to launch a module window.","ref":"reltool_usage.html#dependencies"},{"type":"extras","title":"Code - Usage","doc":"On the `Code` page the Erlang source code is displayed. It is possible to search\nforwards and backwards for text in the module. Enter a regular expression in the\n`Find` field and press enter. It is also possible to go to a certain line in the\nmodule. The `Back` button can be used to go back to the previous position.\n\nPut the marker on a function name and double click to go to the definition of\nthe function. If the function is defined in another module, that module will be\nloaded and added to the page list.","ref":"reltool_usage.html#code"},{"type":"extras","title":"Examples","doc":"\n# Examples","ref":"reltool_examples.html"},{"type":"extras","title":"Start and stop windows and servers - Examples","doc":"The main process in Reltool is the server. It can be used as it is or be used\nvia the GUI frontend process. When the GUI is started, a server process will\nautomatically be started. The GUI process is started with `reltool:start/0`,\n`reltool:start/1` or `reltool:start_link/1`. The pid of its server can be\nobtained with [`reltool:get_server/1`](`reltool:start_link/1`)\n\n```erlang\nErlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V9.0 (abort with ^G)\n1>\n1> {ok, Win} = reltool:start([]).\n{ok,<0.36.01>}\n2> {ok, Server} = reltool:get_server(Win).\n{ok,<0.37.01>}\n3> reltool:get_config(Server).\n{ok,{sys,[]}}\n4>\n4> {ok, Server2} = reltool:start_server([]).\n{ok,<0.6535.01>}\n5> reltool:get_config(Server2).\n{ok,{sys,[]}}\n6> reltool:stop(Server2).\nok\n```","ref":"reltool_examples.html#start-and-stop-windows-and-servers"},{"type":"extras","title":"Inspecting the configuration - Examples","doc":"```erlang\nErlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V9.0 (abort with ^G)\n1>\n1> Config = {sys, [{escript, \"examples/display_args\", [{incl_cond, include}]},\n\t\t {app, inets, [{incl_cond, include}]},\n\t\t {app, mnesia, [{incl_cond, exclude}]},\n\t\t {app, ssl, [{incl_cond, exclude}]},\n\t\t {app, runtime_tools, [{incl_cond, exclude}]},\n\t\t {app, syntax_tools, [{incl_cond, exclude}]}]}.\n{sys,[{escript,\"examples/display_args\",[{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}\n2>\n2> {ok, Server} = reltool:start_server([Config]).\n{ok,<0.66.0>}\n3>\n3> reltool:get_config(Server).\n{ok,{sys,[{escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}}\n4>\n4> reltool:get_config(Server, false, false).\n{ok,{sys,[{escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}}\n5>\n5> reltool:get_config(Server, true, false).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {mod_cond,all},\n {incl_cond,derived},\n {app,inets,\n [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[sasl]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,development},\n {incl_sys_filters,[\".*\"]},\n {excl_sys_filters,[]},\n {incl_app_filters,[\".*\"]},\n {excl_app_filters,[]},\n {rel_app_type,...},\n {...}|...]}}\n6>\n6> reltool:get_config(Server, true, true).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {escript,\"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\",\n [{incl_cond,include}]},\n {mod_cond,all},\n {incl_cond,derived},\n {erts,[{app,erts,\n [{vsn,\"10.0\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/erts-10.0\"},\n {mod,erl_prim_loader,[]},\n {mod,erl_tracer,[]},\n {mod,erlang,[]},\n {mod,erts_code_purger,[]},\n {mod,erts_dirty_process_signal_handler,[]},\n {mod,erts_internal,[]},\n {mod,erts_literal_area_collector,[]},\n {mod,init,[]},\n {mod,erl_init,...},\n {mod,...},\n {...}|...]}]},\n {app,compiler,\n [{vsn,\"7.0.4\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/compiler-7.0.4\"},\n {mod,beam_a,[]},\n {mod,beam_asm,[]},\n {mod,beam_block,[]},\n {mod,beam_bs,[]},\n {mod,beam_bsm,[]},\n {mod,beam_clean,[]},\n {mod,beam_dead,[]},\n {mod,beam_dict,[]},\n {mod,beam_disasm,[]},\n {mod,beam_except,[]},\n {mod,beam_flatten,...},\n {mod,...},\n {...}|...]},\n {app,crypto,\n [{vsn,\"3.7.4\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/crypto-3.7.4\"},\n {mod,crypto,[]},\n {mod,crypto_ec_curves,[]}]},\n {app,hipe,\n [{vsn,\"3.15.4\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/hipe-3.15.4\"},\n {mod,cerl_cconv,[]},\n {mod,cerl_closurean,[]},\n {mod,cerl_hipeify,[]},\n {mod,cerl_lib,[]},\n {mod,cerl_messagean,[]},\n {mod,cerl_pmatch,[]},\n {mod,cerl_prettypr,[]},\n {mod,cerl_to_icode,[]},\n {mod,cerl_typean,...},\n {mod,...},\n {...}|...]},\n {app,inets,\n [{incl_cond,include},\n {vsn,\"6.3.9\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/inets-6.3.9\"},\n {mod,ftp,[]},\n {mod,ftp_progress,[]},\n {mod,ftp_response,[]},\n {mod,ftp_sup,[]},\n {mod,http_chunk,[]},\n {mod,http_request,[]},\n {mod,http_response,...},\n {mod,...},\n {...}|...]},\n {app,kernel,\n [{vsn,\"5.2\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/kernel-5.2\"},\n {mod,application,[]},\n {mod,application_controller,[]},\n {mod,application_master,[]},\n {mod,application_starter,[]},\n {mod,auth,[]},\n {mod,code,[]},\n {mod,code_server,...},\n {mod,...},\n {...}|...]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,sasl,\n [{vsn,\"3.0.3\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/sasl-3.0.3\"},\n {mod,alarm_handler,[]},\n {mod,erlsrv,[]},\n {mod,format_lib_supp,[]},\n {mod,misc_supp,...},\n {mod,...},\n {...}|...]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,stdlib,\n [{vsn,\"3.3\"},\n {lib_dir,\"/usr/local/lib/erlang/lib/stdlib-3.3\"},\n {mod,array,[]},\n {mod,base64,...},\n {mod,...},\n {...}|...]},\n {app,syntax_tools,[{incl_cond,exclude}]},\n {app,tools,\n [{vsn,\"2.9.1\"},{lib_dir,[...]},{mod,...},{...}|...]},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[...]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,...},\n {...}|...]}}\n7>\n7> reltool:get_config([{sys, [{profile, embedded}]}], true, false).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {mod_cond,all},\n {incl_cond,derived},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[sasl]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,embedded},\n {incl_sys_filters,[\"^bin\",\"^erts\",\"^lib\",\"^releases\"]},\n {excl_sys_filters,[\"^bin/(erlc|dialyzer|typer)(|\\\\.exe)$\",\n \"^erts.*/bin/(erlc|dialyzer|typer)(|\\\\.exe)$\",\n \"^erts.*/bin/.*(debug|pdb)\"]},\n {incl_app_filters,[\"^ebin\",\"^include\",\"^priv\"]},\n {excl_app_filters,[]},\n {rel_app_type,permanent},\n {embedded_app_type,load},\n {app_file,keep},\n {debug_info,keep}]}}\n8>\n8> reltool:get_config([{sys, [{profile, standalone}]}], true, false).\n{ok,{sys,[{root_dir,\"/usr/local/lib/erlang\"},\n {lib_dirs,[]},\n {mod_cond,all},\n {incl_cond,derived},\n {boot_rel,\"start_clean\"},\n {rel,\"start_clean\",\"1.0\",[]},\n {rel,\"start_sasl\",\"1.0\",[sasl]},\n {emu_name,\"beam\"},\n {relocatable,true},\n {profile,standalone},\n {incl_sys_filters,[\"^bin/(erl|epmd)(|\\\\.exe|\\\\.ini)$\",\n \"^bin/start(|_clean).boot$\",\"^erts.*/bin\",\"^lib$\"]},\n {excl_sys_filters,[\"^erts.*/bin/(erlc|dialyzer|typer)(|\\\\.exe)$\",\n \"^erts.*/bin/(start|escript|to_erl|run_erl)(|\\\\.exe)$\",\n \"^erts.*/bin/.*(debug|pdb)\"]},\n {incl_app_filters,[\"^ebin\",\"^priv\"]},\n {excl_app_filters,[\"^ebin/.*\\\\.appup$\"]},\n {rel_app_type,permanent},\n {app_file,keep},\n {debug_info,keep}]}}\n```","ref":"reltool_examples.html#inspecting-the-configuration"},{"type":"extras","title":"Generate release and script files - Examples","doc":"```erlang\nErlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V10.0 (abort with ^G)\n1>\n1> {ok, Server} = reltool:start_server([{config,\n {sys,\n [{boot_rel, \"NAME\"},\n {rel, \"NAME\", \"VSN\",\n [sasl],\n [{load_dot_erlang, false}]}]}}]).\n{ok,<0.1288.0>}\n2>\n2> reltool:get_config(Server).\n{ok,{sys,[{boot_rel,\"NAME\"},\n {rel,\"NAME\",\"VSN\",[sasl]}]}}\n3>\n3> reltool:get_rel(Server, \"NAME\").\n{ok,{release,{\"NAME\",\"VSN\"},\n {erts,\"10.0\"},\n [{kernel,\"5.2\"},{stdlib,\"3.3\"},{sasl,\"3.0.3\"}]}}\n4>\n4> reltool:get_script(Server, \"NAME\").\n{ok,{script,{\"NAME\",\"VSN\"},\n [{preLoaded,[erl_prim_loader,erl_tracer,erlang,\n erts_code_purger,erts_dirty_process_signal_handler,\n erts_internal,erts_literal_area_collector,init,erl_init,\n prim_eval,prim_file,prim_inet,prim_zip,zlib]},\n {progress,preloaded},\n {path,[\"$ROOT/lib/kernel-5.2/ebin\",\n \"$ROOT/lib/stdlib-3.3/ebin\"]},\n {primLoad,[error_handler]},\n {kernel_load_completed},\n {progress,kernel_load_completed},\n {path,[\"$ROOT/lib/kernel-5.2/ebin\"]},\n {primLoad,[application,application_controller,\n application_master,application_starter,auth,code,\n code_server,disk_log,disk_log_1,disk_log_server,\n disk_log_sup,dist_ac,dist_util,erl_boot_server|...]},\n {path,[\"$ROOT/lib/stdlib-3.3/ebin\"]},\n {primLoad,[array,base64,beam_lib,binary,c,calendar,dets,\n dets_server,dets_sup,dets_utils,dets_v9,dict|...]},\n {path,[\"$ROOT/lib/sasl-3.0.3/ebin\"]},\n {primLoad,[alarm_handler,erlsrv,format_lib_supp,misc_supp,\n rb,rb_format_supp,release_handler,release_handler_1,sasl,\n sasl_report|...]},\n {progress,modules_loaded},\n {path,[\"$ROOT/lib/kernel-5.2/ebin\",\n \"$ROOT/lib/stdlib-3.3/ebin\",\"$ROOT/lib/sasl-3.0.3/ebin\"]},\n {kernelProcess,heart,{heart,start,[]}},\n {kernelProcess,error_logger,{error_logger,start_link,[]}},\n {kernelProcess,application_controller,\n {application_controller,start,[{...}]}},\n {progress,init_kernel_started},\n {apply,{application,load,[...]}},\n {apply,{application,load,...}},\n {progress,applications_loaded},\n {apply,{...}},\n {apply,...},\n {...}|...]}}\n5>\n5> reltool:stop(Server).\nok\n```","ref":"reltool_examples.html#generate-release-and-script-files"},{"type":"extras","title":"Create a target system - Examples","doc":"```erlang\nErlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]\n[hipe] [kernel-poll:false]\nEshell V10.0 (abort with ^G)\n1>\n1> Config = {sys, [{escript, \"examples/display_args\", [{incl_cond, include}]},\n\t\t {app, inets, [{incl_cond, include}]},\n\t\t {app, mnesia, [{incl_cond, exclude}]},\n\t\t {app, ssl, [{incl_cond, exclude}]},\n\t\t {app, runtime_tools, [{incl_cond, exclude}]},\n\t\t {app, syntax_tools, [{incl_cond, exclude}]}]}.\n{sys,[{escript,\"examples/display_args\",[{incl_cond,include}]},\n {app,inets,[{incl_cond,include}]},\n {app,mnesia,[{incl_cond,exclude}]},\n {app,ssl,[{incl_cond,exclude}]},\n {app,runtime_tools,[{incl_cond,exclude}]},\n {app,syntax_tools,[{incl_cond,exclude}]}]}\n2>\n2> {ok, Spec} = reltool:get_target_spec([Config]).\n{ok,[{create_dir,\"releases\",\n [{write_file,\"start_erl.data\",\"10.0 1.0\\n\"},\n {create_dir,\"1.0\",\n [{write_file,\"start_clean.rel\",\n [37,37,32,114,101,108,32,103,101,110,101,114,97,116|...]},\n {write_file,\"start_clean.script\",\n [37,37,32,115,99,114,105,112,116,32,103,101,110|...]},\n {write_file,\"start_clean.boot\",\n <<131,104,3,119,6,115,99,114,105,112,116,104,...>>},\n {write_file,\"start_sasl.rel\",\n [37,37,32,114,101,108,32,103,101,110,101|...]},\n {write_file,\"start_sasl.script\",\n [37,37,32,115,99,114,105,112,116,32|...]},\n {write_file,\"start_sasl.boot\",\n <<131,104,3,119,6,115,99,114,105,...>>}]}]},\n {create_dir,\"bin\",\n [{copy_file,\"display_args.escript\",\n \"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args\"},\n {copy_file,\"display_args\",\"erts-10.0/bin/escript\"},\n {copy_file,\"start\",\"erts-10.0/bin/start\"},\n {copy_file,\"ct_run\",\"erts-10.0/bin/ct_run\"},\n {copy_file,\"dialyzer\",\"erts-10.0/bin/dialyzer\"},\n {copy_file,\"run_erl\",\"erts-10.0/bin/run_erl\"},\n {copy_file,\"erl\",\"erts-10.0/bin/dyn_erl\"},\n {copy_file,\"to_erl\",\"erts-10.0/bin/to_erl\"},\n {copy_file,\"epmd\",\"erts-10.0/bin/epmd\"},\n {copy_file,\"erlc\",\"erts-10.0/bin/erlc\"},\n {copy_file,\"typer\",\"erts-10.0/bin/typer\"},\n {copy_file,\"escript\",\"erts-10.0/bin/escript\"},\n {write_file,\"start_clean.boot\",<<131,104,3,119,6,115,...>>},\n {write_file,\"start_sasl.boot\",<<131,104,3,119,6,...>>},\n {write_file,\"start.boot\",<<131,104,3,119,...>>}]},\n {copy_file,\"Install\"},\n {create_dir,\"misc\",\n [{copy_file,\"format_man_pages\"}]},\n {create_dir,\"usr\",\n [{create_dir,\"lib\",\n [{copy_file,\"liberl_interface_st.a\"},\n {copy_file,\"libic.a\"},\n {copy_file,\"liberl_interface.a\"},\n {copy_file,\"libei_st.a\"},\n {copy_file,\"libei.a\"}]},\n {create_dir,\"include\",\n [{copy_file,\"driver_int.h\"},\n {copy_file,\"ei_connect.h\"},\n {copy_file,\"ei.h\"},\n {copy_file,\"erl_nif_api_funcs.h\"},\n {copy_file,\"erl_fixed_size_int_types.h\"},\n {copy_file,\"erl_int_sizes_config.h\"},\n {copy_file,\"erl_interface.h\"},\n {copy_file,\"eicode.h\"},\n {copy_file,\"erl_driver.h\"},\n {copy_file,\"erlang.idl\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}]}]},\n {create_dir,\"erts-10.0\",\n [{create_dir,\"bin\",\n [{copy_file,\"start\"},\n {copy_file,\"ct_run\"},\n {copy_file,\"erlexec\"},\n {copy_file,\"dialyzer\"},\n {copy_file,\"beam.smp\"},\n {copy_file,\"run_erl\"},\n {copy_file,\"erl\",\"erts-10.0/bin/dyn_erl\"},\n {copy_file,\"to_erl\"},\n {copy_file,\"epmd\"},\n {copy_file,\"erl_child_setup\"},\n {copy_file,\"heart\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}|...]},\n {create_dir,\"lib\",\n [{create_dir,\"internal\",\n [{copy_file,\"liberts_internal.a\"},\n {copy_file,\"liberts_internal_r.a\"},\n {copy_file,\"libethread.a\"},\n {copy_file,\"README\"}]},\n ]},\n {create_dir,\"src\",[{copy_file,\"setuid_socket_wrap.c\"}]},\n {create_dir,\"doc\",[]},\n {create_dir,\"man\",[]},\n {create_dir,\"include\",\n [{create_dir,\"internal\",\n [{create_dir,\"i386\",[{...}|...]},\n {copy_file,\"erl_errno.h\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}|...]},\n {copy_file,\"driver_int.h\"},\n {copy_file,\"erl_nif_api_funcs.h\"},\n {copy_file,\"erl_fixed_size_int_types.h\"},\n {copy_file,\"erl_int_sizes_config.h\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}]}]},\n {create_dir,\"lib\",\n [{create_dir,\"compiler-7.0.4\",\n [{create_dir,\"src\",\n [{copy_file,\"beam_flatten.erl\"},\n {copy_file,[...]},\n {copy_file,...},\n {...}|...]},\n {create_dir,\"ebin\",\n [{copy_file,[...]},{copy_file,...},{...}|...]}]},\n {create_dir,\"crypto-3.7.4\",\n [{create_dir,\"src\",[{copy_file,[...]},{copy_file,...}]},\n {create_dir,\"ebin\",[{copy_file,...},{...}|...]}]},\n {create_dir,\"crypto-3.7.4\",\n [{create_dir,\"priv\",\n [{create_dir,\"lib\",[{copy_file,[...]},{copy_file,...}]},\n {create_dir,\"obj\",[{copy_file,...},{...}|...]}]}]},\n {create_dir,\"erts-10.0\",\n [{create_dir,\"src\",[{...}|...]},\n {create_dir,\"ebin\",[...]}]},\n {create_dir,\"hipe-3.15.4\",\n [{create_dir,\"flow\",[...]},\n {copy_file,[...]},\n {create_dir,...},\n {...}|...]},\n {create_dir,\"inets-6.3.9\",\n [{create_dir,[...],...},{create_dir,...},{...}]},\n {create_dir,\"inets-6.3.9\",\n [{create_dir,\"priv\",[{create_dir,[...],...}]},\n {create_dir,\"include\",[{copy_file,...},{...}]}]},\n {create_dir,\"kernel-5.2\",[{...}|...]},\n {create_dir,\"kernel-5.2\",\n [{create_dir,\"include\",[{...}|...]}]},\n {create_dir,[...],...},\n {create_dir,...},\n {create_dir,\"stdlib-3.3\",[{create_dir,...}]},\n ...]}]}\n3>\n3> TargetDir = \"/tmp/my_target_dir\".\n\"/tmp/my_target_dir\"\n4>\n4> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).\n{error,\"/tmp/my_target_dir: no such file or directory\"}\n5>\n5> file:make_dir(TargetDir).\nok\n6>\n6> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).\nok\n7>\n7> file:list_dir(TargetDir).\n{ok,[\"bin\",\"Install\",\"lib\",\"misc\",\"usr\",\"erts-10.0\",\n \"releases\"]}\n8>\n8> file:list_dir(filename:join([TargetDir,\"lib\"])).\n{ok,[\"tools-2.9.1\",\"inets-6.3.9\",\n \"kernel-5.2\",\"sasl-3.0.3\",\n \"crypto-3.7.4\",\"erts-10.0\",\n \"stdlib-3.3\",\"compiler-7.0.4\"]}\n9>\n9> file:make_dir(\"/tmp/yet_another_target_dir\").\nok\n10>\n10> reltool:create_target([Config], \"/tmp/yet_another_target_dir\").\nok\n11>\n11> file:list_dir(\"/tmp/yet_another_target_dir\").\n{ok,[\"bin\",\"Install\",\"lib\",\"misc\",\"usr\",\"erts-10.0\",\n \"releases\"]}\n```","ref":"reltool_examples.html#create-a-target-system"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,52,46,49]}} \ No newline at end of file diff --git a/prs/9277/lib/reltool-1.0.1/doc/html/reltool.epub b/prs/9277/lib/reltool-1.0.1/doc/html/reltool.epub index a27e7abcf0f03..85120c35870c7 100644 Binary files a/prs/9277/lib/reltool-1.0.1/doc/html/reltool.epub and b/prs/9277/lib/reltool-1.0.1/doc/html/reltool.epub differ diff --git a/prs/9277/lib/reltool-1.0.1/doc/html/reltool_examples.html b/prs/9277/lib/reltool-1.0.1/doc/html/reltool_examples.html index 4894a1f029d18..4a8b6027cbd75 100644 --- a/prs/9277/lib/reltool-1.0.1/doc/html/reltool_examples.html +++ b/prs/9277/lib/reltool-1.0.1/doc/html/reltool_examples.html @@ -135,500 +135,500 @@

    via the GUI frontend process. When the GUI is started, a server process will automatically be started. The GUI process is started with reltool:start/0, reltool:start/1 or reltool:start_link/1. The pid of its server can be -obtained with reltool:get_server/1

    Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V9.0  (abort with ^G)
    +obtained with reltool:get_server/1

    Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V9.0  (abort with ^G)
     1>
    -1> {ok, Win} = reltool:start([]).
    -{ok,<0.36.01>}
    -2> {ok, Server} = reltool:get_server(Win).
    -{ok,<0.37.01>}
    -3> reltool:get_config(Server).
    -{ok,{sys,[]}}
    +1> {ok, Win} = reltool:start([]).
    +{ok,<0.36.01>}
    +2> {ok, Server} = reltool:get_server(Win).
    +{ok,<0.37.01>}
    +3> reltool:get_config(Server).
    +{ok,{sys,[]}}
     4>
    -4> {ok, Server2} = reltool:start_server([]).
    -{ok,<0.6535.01>}
    -5> reltool:get_config(Server2).
    -{ok,{sys,[]}}
    -6> reltool:stop(Server2).
    +4> {ok, Server2} = reltool:start_server([]).
    +{ok,<0.6535.01>}
    +5> reltool:get_config(Server2).
    +{ok,{sys,[]}}
    +6> reltool:stop(Server2).
     ok

    Inspecting the configuration

    -
    Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V9.0  (abort with ^G)
    +
    Erlang/OTP 20 [erts-9.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V9.0  (abort with ^G)
     1>
    -1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
    -		   {app, inets, [{incl_cond, include}]},
    -		   {app, mnesia, [{incl_cond, exclude}]},
    -		   {app, ssl, [{incl_cond, exclude}]},
    -		   {app, runtime_tools, [{incl_cond, exclude}]},
    -		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
    -{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
    -      {app,inets,[{incl_cond,include}]},
    -      {app,mnesia,[{incl_cond,exclude}]},
    -      {app,ssl,[{incl_cond,exclude}]},
    -      {app,runtime_tools,[{incl_cond,exclude}]},
    -      {app,syntax_tools,[{incl_cond,exclude}]}]}
    +1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
    +		   {app, inets, [{incl_cond, include}]},
    +		   {app, mnesia, [{incl_cond, exclude}]},
    +		   {app, ssl, [{incl_cond, exclude}]},
    +		   {app, runtime_tools, [{incl_cond, exclude}]},
    +		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
    +{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
    +      {app,inets,[{incl_cond,include}]},
    +      {app,mnesia,[{incl_cond,exclude}]},
    +      {app,ssl,[{incl_cond,exclude}]},
    +      {app,runtime_tools,[{incl_cond,exclude}]},
    +      {app,syntax_tools,[{incl_cond,exclude}]}]}
     2>
    -2> {ok, Server} = reltool:start_server([Config]).
    -{ok,<0.66.0>}
    +2> {ok, Server} = reltool:start_server([Config]).
    +{ok,<0.66.0>}
     3>
    -3> reltool:get_config(Server).
    -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {app,inets,[{incl_cond,include}]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
    +3> reltool:get_config(Server).
    +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {app,inets,[{incl_cond,include}]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
     4>
    -4> reltool:get_config(Server, false, false).
    -{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {app,inets,[{incl_cond,include}]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,syntax_tools,[{incl_cond,exclude}]}]}}
    +4> reltool:get_config(Server, false, false).
    +{ok,{sys,[{escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {app,inets,[{incl_cond,include}]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,syntax_tools,[{incl_cond,exclude}]}]}}
     5>
    -5> reltool:get_config(Server, true, false).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {app,inets,
    -               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,syntax_tools,[{incl_cond,exclude}]},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[sasl]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {profile,development},
    -          {incl_sys_filters,[".*"]},
    -          {excl_sys_filters,[]},
    -          {incl_app_filters,[".*"]},
    -          {excl_app_filters,[]},
    -          {rel_app_type,...},
    -          {...}|...]}}
    +5> reltool:get_config(Server, true, false).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {app,inets,
    +               [{incl_cond,include},{vsn,undefined},{lib_dir,undefined}]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,syntax_tools,[{incl_cond,exclude}]},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[sasl]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,development},
    +          {incl_sys_filters,[".*"]},
    +          {excl_sys_filters,[]},
    +          {incl_app_filters,[".*"]},
    +          {excl_app_filters,[]},
    +          {rel_app_type,...},
    +          {...}|...]}}
     6>
    -6> reltool:get_config(Server, true, true).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    -                   [{incl_cond,include}]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {erts,[{app,erts,
    -                      [{vsn,"10.0"},
    -                       {lib_dir,"/usr/local/lib/erlang/lib/erts-10.0"},
    -                       {mod,erl_prim_loader,[]},
    -                       {mod,erl_tracer,[]},
    -                       {mod,erlang,[]},
    -                       {mod,erts_code_purger,[]},
    -                       {mod,erts_dirty_process_signal_handler,[]},
    -                       {mod,erts_internal,[]},
    -                       {mod,erts_literal_area_collector,[]},
    -                       {mod,init,[]},
    -                       {mod,erl_init,...},
    -                       {mod,...},
    -                       {...}|...]}]},
    -          {app,compiler,
    -               [{vsn,"7.0.4"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/compiler-7.0.4"},
    -                {mod,beam_a,[]},
    -                {mod,beam_asm,[]},
    -                {mod,beam_block,[]},
    -                {mod,beam_bs,[]},
    -                {mod,beam_bsm,[]},
    -                {mod,beam_clean,[]},
    -                {mod,beam_dead,[]},
    -                {mod,beam_dict,[]},
    -                {mod,beam_disasm,[]},
    -                {mod,beam_except,[]},
    -                {mod,beam_flatten,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,crypto,
    -               [{vsn,"3.7.4"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/crypto-3.7.4"},
    -                {mod,crypto,[]},
    -                {mod,crypto_ec_curves,[]}]},
    -          {app,hipe,
    -               [{vsn,"3.15.4"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/hipe-3.15.4"},
    -                {mod,cerl_cconv,[]},
    -                {mod,cerl_closurean,[]},
    -                {mod,cerl_hipeify,[]},
    -                {mod,cerl_lib,[]},
    -                {mod,cerl_messagean,[]},
    -                {mod,cerl_pmatch,[]},
    -                {mod,cerl_prettypr,[]},
    -                {mod,cerl_to_icode,[]},
    -                {mod,cerl_typean,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,inets,
    -               [{incl_cond,include},
    -                {vsn,"6.3.9"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/inets-6.3.9"},
    -                {mod,ftp,[]},
    -                {mod,ftp_progress,[]},
    -                {mod,ftp_response,[]},
    -                {mod,ftp_sup,[]},
    -                {mod,http_chunk,[]},
    -                {mod,http_request,[]},
    -                {mod,http_response,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,kernel,
    -               [{vsn,"5.2"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/kernel-5.2"},
    -                {mod,application,[]},
    -                {mod,application_controller,[]},
    -                {mod,application_master,[]},
    -                {mod,application_starter,[]},
    -                {mod,auth,[]},
    -                {mod,code,[]},
    -                {mod,code_server,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,mnesia,[{incl_cond,exclude}]},
    -          {app,runtime_tools,[{incl_cond,exclude}]},
    -          {app,sasl,
    -               [{vsn,"3.0.3"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/sasl-3.0.3"},
    -                {mod,alarm_handler,[]},
    -                {mod,erlsrv,[]},
    -                {mod,format_lib_supp,[]},
    -                {mod,misc_supp,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,ssl,[{incl_cond,exclude}]},
    -          {app,stdlib,
    -               [{vsn,"3.3"},
    -                {lib_dir,"/usr/local/lib/erlang/lib/stdlib-3.3"},
    -                {mod,array,[]},
    -                {mod,base64,...},
    -                {mod,...},
    -                {...}|...]},
    -          {app,syntax_tools,[{incl_cond,exclude}]},
    -          {app,tools,
    -               [{vsn,"2.9.1"},{lib_dir,[...]},{mod,...},{...}|...]},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[...]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {profile,...},
    -          {...}|...]}}
    +6> reltool:get_config(Server, true, true).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {escript,"/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args",
    +                   [{incl_cond,include}]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {erts,[{app,erts,
    +                      [{vsn,"10.0"},
    +                       {lib_dir,"/usr/local/lib/erlang/lib/erts-10.0"},
    +                       {mod,erl_prim_loader,[]},
    +                       {mod,erl_tracer,[]},
    +                       {mod,erlang,[]},
    +                       {mod,erts_code_purger,[]},
    +                       {mod,erts_dirty_process_signal_handler,[]},
    +                       {mod,erts_internal,[]},
    +                       {mod,erts_literal_area_collector,[]},
    +                       {mod,init,[]},
    +                       {mod,erl_init,...},
    +                       {mod,...},
    +                       {...}|...]}]},
    +          {app,compiler,
    +               [{vsn,"7.0.4"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/compiler-7.0.4"},
    +                {mod,beam_a,[]},
    +                {mod,beam_asm,[]},
    +                {mod,beam_block,[]},
    +                {mod,beam_bs,[]},
    +                {mod,beam_bsm,[]},
    +                {mod,beam_clean,[]},
    +                {mod,beam_dead,[]},
    +                {mod,beam_dict,[]},
    +                {mod,beam_disasm,[]},
    +                {mod,beam_except,[]},
    +                {mod,beam_flatten,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,crypto,
    +               [{vsn,"3.7.4"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/crypto-3.7.4"},
    +                {mod,crypto,[]},
    +                {mod,crypto_ec_curves,[]}]},
    +          {app,hipe,
    +               [{vsn,"3.15.4"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/hipe-3.15.4"},
    +                {mod,cerl_cconv,[]},
    +                {mod,cerl_closurean,[]},
    +                {mod,cerl_hipeify,[]},
    +                {mod,cerl_lib,[]},
    +                {mod,cerl_messagean,[]},
    +                {mod,cerl_pmatch,[]},
    +                {mod,cerl_prettypr,[]},
    +                {mod,cerl_to_icode,[]},
    +                {mod,cerl_typean,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,inets,
    +               [{incl_cond,include},
    +                {vsn,"6.3.9"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/inets-6.3.9"},
    +                {mod,ftp,[]},
    +                {mod,ftp_progress,[]},
    +                {mod,ftp_response,[]},
    +                {mod,ftp_sup,[]},
    +                {mod,http_chunk,[]},
    +                {mod,http_request,[]},
    +                {mod,http_response,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,kernel,
    +               [{vsn,"5.2"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/kernel-5.2"},
    +                {mod,application,[]},
    +                {mod,application_controller,[]},
    +                {mod,application_master,[]},
    +                {mod,application_starter,[]},
    +                {mod,auth,[]},
    +                {mod,code,[]},
    +                {mod,code_server,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,mnesia,[{incl_cond,exclude}]},
    +          {app,runtime_tools,[{incl_cond,exclude}]},
    +          {app,sasl,
    +               [{vsn,"3.0.3"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/sasl-3.0.3"},
    +                {mod,alarm_handler,[]},
    +                {mod,erlsrv,[]},
    +                {mod,format_lib_supp,[]},
    +                {mod,misc_supp,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,ssl,[{incl_cond,exclude}]},
    +          {app,stdlib,
    +               [{vsn,"3.3"},
    +                {lib_dir,"/usr/local/lib/erlang/lib/stdlib-3.3"},
    +                {mod,array,[]},
    +                {mod,base64,...},
    +                {mod,...},
    +                {...}|...]},
    +          {app,syntax_tools,[{incl_cond,exclude}]},
    +          {app,tools,
    +               [{vsn,"2.9.1"},{lib_dir,[...]},{mod,...},{...}|...]},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[...]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,...},
    +          {...}|...]}}
     7>
    -7> reltool:get_config([{sys, [{profile, embedded}]}], true, false).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[sasl]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {profile,embedded},
    -          {incl_sys_filters,["^bin","^erts","^lib","^releases"]},
    -          {excl_sys_filters,["^bin/(erlc|dialyzer|typer)(|\\.exe)$",
    +7> reltool:get_config([{sys, [{profile, embedded}]}], true, false).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[sasl]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,embedded},
    +          {incl_sys_filters,["^bin","^erts","^lib","^releases"]},
    +          {excl_sys_filters,["^bin/(erlc|dialyzer|typer)(|\\.exe)$",
                                  "^erts.*/bin/(erlc|dialyzer|typer)(|\\.exe)$",
    -                             "^erts.*/bin/.*(debug|pdb)"]},
    -          {incl_app_filters,["^ebin","^include","^priv"]},
    -          {excl_app_filters,[]},
    -          {rel_app_type,permanent},
    -          {embedded_app_type,load},
    -          {app_file,keep},
    -          {debug_info,keep}]}}
    +                             "^erts.*/bin/.*(debug|pdb)"]},
    +          {incl_app_filters,["^ebin","^include","^priv"]},
    +          {excl_app_filters,[]},
    +          {rel_app_type,permanent},
    +          {embedded_app_type,load},
    +          {app_file,keep},
    +          {debug_info,keep}]}}
     8>
    -8> reltool:get_config([{sys, [{profile, standalone}]}], true, false).
    -{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    -          {lib_dirs,[]},
    -          {mod_cond,all},
    -          {incl_cond,derived},
    -          {boot_rel,"start_clean"},
    -          {rel,"start_clean","1.0",[]},
    -          {rel,"start_sasl","1.0",[sasl]},
    -          {emu_name,"beam"},
    -          {relocatable,true},
    -          {profile,standalone},
    -          {incl_sys_filters,["^bin/(erl|epmd)(|\\.exe|\\.ini)$",
    -                             "^bin/start(|_clean).boot$","^erts.*/bin","^lib$"]},
    -          {excl_sys_filters,["^erts.*/bin/(erlc|dialyzer|typer)(|\\.exe)$",
    +8> reltool:get_config([{sys, [{profile, standalone}]}], true, false).
    +{ok,{sys,[{root_dir,"/usr/local/lib/erlang"},
    +          {lib_dirs,[]},
    +          {mod_cond,all},
    +          {incl_cond,derived},
    +          {boot_rel,"start_clean"},
    +          {rel,"start_clean","1.0",[]},
    +          {rel,"start_sasl","1.0",[sasl]},
    +          {emu_name,"beam"},
    +          {relocatable,true},
    +          {profile,standalone},
    +          {incl_sys_filters,["^bin/(erl|epmd)(|\\.exe|\\.ini)$",
    +                             "^bin/start(|_clean).boot$","^erts.*/bin","^lib$"]},
    +          {excl_sys_filters,["^erts.*/bin/(erlc|dialyzer|typer)(|\\.exe)$",
                                  "^erts.*/bin/(start|escript|to_erl|run_erl)(|\\.exe)$",
    -                             "^erts.*/bin/.*(debug|pdb)"]},
    -          {incl_app_filters,["^ebin","^priv"]},
    -          {excl_app_filters,["^ebin/.*\\.appup$"]},
    -          {rel_app_type,permanent},
    -          {app_file,keep},
    -          {debug_info,keep}]}}

    + "^erts.*/bin/.*(debug|pdb)"]}, + {incl_app_filters,["^ebin","^priv"]}, + {excl_app_filters,["^ebin/.*\\.appup$"]}, + {rel_app_type,permanent}, + {app_file,keep}, + {debug_info,keep}]}}

    Generate release and script files

    -
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V10.0  (abort with ^G)
    +
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V10.0  (abort with ^G)
     1>
    -1> {ok, Server} = reltool:start_server([{config,
    -                                         {sys,
    -                                          [{boot_rel, "NAME"},
    -                                           {rel, "NAME", "VSN",
    -                                            [sasl],
    -                                            [{load_dot_erlang, false}]}]}}]).
    -{ok,<0.1288.0>}
    +1> {ok, Server} = reltool:start_server([{config,
    +                                         {sys,
    +                                          [{boot_rel, "NAME"},
    +                                           {rel, "NAME", "VSN",
    +                                            [sasl],
    +                                            [{load_dot_erlang, false}]}]}}]).
    +{ok,<0.1288.0>}
     2>
    -2> reltool:get_config(Server).
    -{ok,{sys,[{boot_rel,"NAME"},
    -          {rel,"NAME","VSN",[sasl]}]}}
    +2> reltool:get_config(Server).
    +{ok,{sys,[{boot_rel,"NAME"},
    +          {rel,"NAME","VSN",[sasl]}]}}
     3>
    -3> reltool:get_rel(Server, "NAME").
    -{ok,{release,{"NAME","VSN"},
    -             {erts,"10.0"},
    -             [{kernel,"5.2"},{stdlib,"3.3"},{sasl,"3.0.3"}]}}
    +3> reltool:get_rel(Server, "NAME").
    +{ok,{release,{"NAME","VSN"},
    +             {erts,"10.0"},
    +             [{kernel,"5.2"},{stdlib,"3.3"},{sasl,"3.0.3"}]}}
     4>
    -4> reltool:get_script(Server, "NAME").
    -{ok,{script,{"NAME","VSN"},
    -            [{preLoaded,[erl_prim_loader,erl_tracer,erlang,
    +4> reltool:get_script(Server, "NAME").
    +{ok,{script,{"NAME","VSN"},
    +            [{preLoaded,[erl_prim_loader,erl_tracer,erlang,
                              erts_code_purger,erts_dirty_process_signal_handler,
                              erts_internal,erts_literal_area_collector,init,erl_init,
    -                         prim_eval,prim_file,prim_inet,prim_zip,zlib]},
    -             {progress,preloaded},
    -             {path,["$ROOT/lib/kernel-5.2/ebin",
    -                    "$ROOT/lib/stdlib-3.3/ebin"]},
    -             {primLoad,[error_handler]},
    -             {kernel_load_completed},
    -             {progress,kernel_load_completed},
    -             {path,["$ROOT/lib/kernel-5.2/ebin"]},
    -             {primLoad,[application,application_controller,
    +                         prim_eval,prim_file,prim_inet,prim_zip,zlib]},
    +             {progress,preloaded},
    +             {path,["$ROOT/lib/kernel-5.2/ebin",
    +                    "$ROOT/lib/stdlib-3.3/ebin"]},
    +             {primLoad,[error_handler]},
    +             {kernel_load_completed},
    +             {progress,kernel_load_completed},
    +             {path,["$ROOT/lib/kernel-5.2/ebin"]},
    +             {primLoad,[application,application_controller,
                             application_master,application_starter,auth,code,
                             code_server,disk_log,disk_log_1,disk_log_server,
    -                        disk_log_sup,dist_ac,dist_util,erl_boot_server|...]},
    -             {path,["$ROOT/lib/stdlib-3.3/ebin"]},
    -             {primLoad,[array,base64,beam_lib,binary,c,calendar,dets,
    -                        dets_server,dets_sup,dets_utils,dets_v9,dict|...]},
    -             {path,["$ROOT/lib/sasl-3.0.3/ebin"]},
    -             {primLoad,[alarm_handler,erlsrv,format_lib_supp,misc_supp,
    +                        disk_log_sup,dist_ac,dist_util,erl_boot_server|...]},
    +             {path,["$ROOT/lib/stdlib-3.3/ebin"]},
    +             {primLoad,[array,base64,beam_lib,binary,c,calendar,dets,
    +                        dets_server,dets_sup,dets_utils,dets_v9,dict|...]},
    +             {path,["$ROOT/lib/sasl-3.0.3/ebin"]},
    +             {primLoad,[alarm_handler,erlsrv,format_lib_supp,misc_supp,
                             rb,rb_format_supp,release_handler,release_handler_1,sasl,
    -                        sasl_report|...]},
    -             {progress,modules_loaded},
    -             {path,["$ROOT/lib/kernel-5.2/ebin",
    -                    "$ROOT/lib/stdlib-3.3/ebin","$ROOT/lib/sasl-3.0.3/ebin"]},
    -             {kernelProcess,heart,{heart,start,[]}},
    -             {kernelProcess,error_logger,{error_logger,start_link,[]}},
    -             {kernelProcess,application_controller,
    -                            {application_controller,start,[{...}]}},
    -             {progress,init_kernel_started},
    -             {apply,{application,load,[...]}},
    -             {apply,{application,load,...}},
    -             {progress,applications_loaded},
    -             {apply,{...}},
    -             {apply,...},
    -             {...}|...]}}
    +                        sasl_report|...]},
    +             {progress,modules_loaded},
    +             {path,["$ROOT/lib/kernel-5.2/ebin",
    +                    "$ROOT/lib/stdlib-3.3/ebin","$ROOT/lib/sasl-3.0.3/ebin"]},
    +             {kernelProcess,heart,{heart,start,[]}},
    +             {kernelProcess,error_logger,{error_logger,start_link,[]}},
    +             {kernelProcess,application_controller,
    +                            {application_controller,start,[{...}]}},
    +             {progress,init_kernel_started},
    +             {apply,{application,load,[...]}},
    +             {apply,{application,load,...}},
    +             {progress,applications_loaded},
    +             {apply,{...}},
    +             {apply,...},
    +             {...}|...]}}
     5>
    -5> reltool:stop(Server).
    +5> reltool:stop(Server).
     ok

    Create a target system

    -
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    -[hipe] [kernel-poll:false]
    -Eshell V10.0  (abort with ^G)
    +
    Erlang/OTP 20 [erts-10.0] [source-c13b302] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10]
    +[hipe] [kernel-poll:false]
    +Eshell V10.0  (abort with ^G)
     1>
    -1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
    -		   {app, inets, [{incl_cond, include}]},
    -		   {app, mnesia, [{incl_cond, exclude}]},
    -		   {app, ssl, [{incl_cond, exclude}]},
    -		   {app, runtime_tools, [{incl_cond, exclude}]},
    -		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
    -{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
    -      {app,inets,[{incl_cond,include}]},
    -      {app,mnesia,[{incl_cond,exclude}]},
    -      {app,ssl,[{incl_cond,exclude}]},
    -      {app,runtime_tools,[{incl_cond,exclude}]},
    -      {app,syntax_tools,[{incl_cond,exclude}]}]}
    +1> Config = {sys, [{escript, "examples/display_args", [{incl_cond, include}]},
    +		   {app, inets, [{incl_cond, include}]},
    +		   {app, mnesia, [{incl_cond, exclude}]},
    +		   {app, ssl, [{incl_cond, exclude}]},
    +		   {app, runtime_tools, [{incl_cond, exclude}]},
    +		   {app, syntax_tools, [{incl_cond, exclude}]}]}.
    +{sys,[{escript,"examples/display_args",[{incl_cond,include}]},
    +      {app,inets,[{incl_cond,include}]},
    +      {app,mnesia,[{incl_cond,exclude}]},
    +      {app,ssl,[{incl_cond,exclude}]},
    +      {app,runtime_tools,[{incl_cond,exclude}]},
    +      {app,syntax_tools,[{incl_cond,exclude}]}]}
     2>
    -2> {ok, Spec} = reltool:get_target_spec([Config]).
    -{ok,[{create_dir,"releases",
    -         [{write_file,"start_erl.data","10.0 1.0\n"},
    -          {create_dir,"1.0",
    -              [{write_file,"start_clean.rel",
    -                   [37,37,32,114,101,108,32,103,101,110,101,114,97,116|...]},
    -               {write_file,"start_clean.script",
    -                   [37,37,32,115,99,114,105,112,116,32,103,101,110|...]},
    -               {write_file,"start_clean.boot",
    -                   <<131,104,3,119,6,115,99,114,105,112,116,104,...>>},
    -               {write_file,"start_sasl.rel",
    -                   [37,37,32,114,101,108,32,103,101,110,101|...]},
    -               {write_file,"start_sasl.script",
    -                   [37,37,32,115,99,114,105,112,116,32|...]},
    -               {write_file,"start_sasl.boot",
    -                   <<131,104,3,119,6,115,99,114,105,...>>}]}]},
    -     {create_dir,"bin",
    -         [{copy_file,"display_args.escript",
    -              "/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args"},
    -          {copy_file,"display_args","erts-10.0/bin/escript"},
    -          {copy_file,"start","erts-10.0/bin/start"},
    -          {copy_file,"ct_run","erts-10.0/bin/ct_run"},
    -          {copy_file,"dialyzer","erts-10.0/bin/dialyzer"},
    -          {copy_file,"run_erl","erts-10.0/bin/run_erl"},
    -          {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    -          {copy_file,"to_erl","erts-10.0/bin/to_erl"},
    -          {copy_file,"epmd","erts-10.0/bin/epmd"},
    -          {copy_file,"erlc","erts-10.0/bin/erlc"},
    -          {copy_file,"typer","erts-10.0/bin/typer"},
    -          {copy_file,"escript","erts-10.0/bin/escript"},
    -          {write_file,"start_clean.boot",<<131,104,3,119,6,115,...>>},
    -          {write_file,"start_sasl.boot",<<131,104,3,119,6,...>>},
    -          {write_file,"start.boot",<<131,104,3,119,...>>}]},
    -     {copy_file,"Install"},
    -     {create_dir,"misc",
    -         [{copy_file,"format_man_pages"}]},
    -     {create_dir,"usr",
    -         [{create_dir,"lib",
    -              [{copy_file,"liberl_interface_st.a"},
    -               {copy_file,"libic.a"},
    -               {copy_file,"liberl_interface.a"},
    -               {copy_file,"libei_st.a"},
    -               {copy_file,"libei.a"}]},
    -          {create_dir,"include",
    -              [{copy_file,"driver_int.h"},
    -               {copy_file,"ei_connect.h"},
    -               {copy_file,"ei.h"},
    -               {copy_file,"erl_nif_api_funcs.h"},
    -               {copy_file,"erl_fixed_size_int_types.h"},
    -               {copy_file,"erl_int_sizes_config.h"},
    -               {copy_file,"erl_interface.h"},
    -               {copy_file,"eicode.h"},
    -               {copy_file,"erl_driver.h"},
    -               {copy_file,"erlang.idl"},
    -               {copy_file,[...]},
    -               {copy_file,...},
    -               {...}]}]},
    -     {create_dir,"erts-10.0",
    -         [{create_dir,"bin",
    -              [{copy_file,"start"},
    -               {copy_file,"ct_run"},
    -               {copy_file,"erlexec"},
    -               {copy_file,"dialyzer"},
    -               {copy_file,"beam.smp"},
    -               {copy_file,"run_erl"},
    -               {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    -               {copy_file,"to_erl"},
    -               {copy_file,"epmd"},
    -               {copy_file,"erl_child_setup"},
    -               {copy_file,"heart"},
    -               {copy_file,[...]},
    -               {copy_file,...},
    -               {...}|...]},
    -          {create_dir,"lib",
    -              [{create_dir,"internal",
    -                   [{copy_file,"liberts_internal.a"},
    -                    {copy_file,"liberts_internal_r.a"},
    -                    {copy_file,"libethread.a"},
    -                    {copy_file,"README"}]},
    -               ]},
    -          {create_dir,"src",[{copy_file,"setuid_socket_wrap.c"}]},
    -          {create_dir,"doc",[]},
    -          {create_dir,"man",[]},
    -          {create_dir,"include",
    -              [{create_dir,"internal",
    -                   [{create_dir,"i386",[{...}|...]},
    -                    {copy_file,"erl_errno.h"},
    -                    {copy_file,[...]},
    -                    {copy_file,...},
    -                    {...}|...]},
    -               {copy_file,"driver_int.h"},
    -               {copy_file,"erl_nif_api_funcs.h"},
    -               {copy_file,"erl_fixed_size_int_types.h"},
    -               {copy_file,"erl_int_sizes_config.h"},
    -               {copy_file,[...]},
    -               {copy_file,...},
    -               {...}]}]},
    -     {create_dir,"lib",
    -         [{create_dir,"compiler-7.0.4",
    -              [{create_dir,"src",
    -                   [{copy_file,"beam_flatten.erl"},
    -                    {copy_file,[...]},
    -                    {copy_file,...},
    -                    {...}|...]},
    -               {create_dir,"ebin",
    -                   [{copy_file,[...]},{copy_file,...},{...}|...]}]},
    -          {create_dir,"crypto-3.7.4",
    -              [{create_dir,"src",[{copy_file,[...]},{copy_file,...}]},
    -               {create_dir,"ebin",[{copy_file,...},{...}|...]}]},
    -          {create_dir,"crypto-3.7.4",
    -              [{create_dir,"priv",
    -                   [{create_dir,"lib",[{copy_file,[...]},{copy_file,...}]},
    -                    {create_dir,"obj",[{copy_file,...},{...}|...]}]}]},
    -          {create_dir,"erts-10.0",
    -              [{create_dir,"src",[{...}|...]},
    -               {create_dir,"ebin",[...]}]},
    -          {create_dir,"hipe-3.15.4",
    -              [{create_dir,"flow",[...]},
    -               {copy_file,[...]},
    -               {create_dir,...},
    -               {...}|...]},
    -          {create_dir,"inets-6.3.9",
    -              [{create_dir,[...],...},{create_dir,...},{...}]},
    -          {create_dir,"inets-6.3.9",
    -              [{create_dir,"priv",[{create_dir,[...],...}]},
    -               {create_dir,"include",[{copy_file,...},{...}]}]},
    -          {create_dir,"kernel-5.2",[{...}|...]},
    -          {create_dir,"kernel-5.2",
    -              [{create_dir,"include",[{...}|...]}]},
    -          {create_dir,[...],...},
    -          {create_dir,...},
    -          {create_dir,"stdlib-3.3",[{create_dir,...}]},
    -          ...]}]}
    +2> {ok, Spec} = reltool:get_target_spec([Config]).
    +{ok,[{create_dir,"releases",
    +         [{write_file,"start_erl.data","10.0 1.0\n"},
    +          {create_dir,"1.0",
    +              [{write_file,"start_clean.rel",
    +                   [37,37,32,114,101,108,32,103,101,110,101,114,97,116|...]},
    +               {write_file,"start_clean.script",
    +                   [37,37,32,115,99,114,105,112,116,32,103,101,110|...]},
    +               {write_file,"start_clean.boot",
    +                   <<131,104,3,119,6,115,99,114,105,112,116,104,...>>},
    +               {write_file,"start_sasl.rel",
    +                   [37,37,32,114,101,108,32,103,101,110,101|...]},
    +               {write_file,"start_sasl.script",
    +                   [37,37,32,115,99,114,105,112,116,32|...]},
    +               {write_file,"start_sasl.boot",
    +                   <<131,104,3,119,6,115,99,114,105,...>>}]}]},
    +     {create_dir,"bin",
    +         [{copy_file,"display_args.escript",
    +              "/usr/local/lib/erlang/lib/reltool-0.7.3/examples/display_args"},
    +          {copy_file,"display_args","erts-10.0/bin/escript"},
    +          {copy_file,"start","erts-10.0/bin/start"},
    +          {copy_file,"ct_run","erts-10.0/bin/ct_run"},
    +          {copy_file,"dialyzer","erts-10.0/bin/dialyzer"},
    +          {copy_file,"run_erl","erts-10.0/bin/run_erl"},
    +          {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    +          {copy_file,"to_erl","erts-10.0/bin/to_erl"},
    +          {copy_file,"epmd","erts-10.0/bin/epmd"},
    +          {copy_file,"erlc","erts-10.0/bin/erlc"},
    +          {copy_file,"typer","erts-10.0/bin/typer"},
    +          {copy_file,"escript","erts-10.0/bin/escript"},
    +          {write_file,"start_clean.boot",<<131,104,3,119,6,115,...>>},
    +          {write_file,"start_sasl.boot",<<131,104,3,119,6,...>>},
    +          {write_file,"start.boot",<<131,104,3,119,...>>}]},
    +     {copy_file,"Install"},
    +     {create_dir,"misc",
    +         [{copy_file,"format_man_pages"}]},
    +     {create_dir,"usr",
    +         [{create_dir,"lib",
    +              [{copy_file,"liberl_interface_st.a"},
    +               {copy_file,"libic.a"},
    +               {copy_file,"liberl_interface.a"},
    +               {copy_file,"libei_st.a"},
    +               {copy_file,"libei.a"}]},
    +          {create_dir,"include",
    +              [{copy_file,"driver_int.h"},
    +               {copy_file,"ei_connect.h"},
    +               {copy_file,"ei.h"},
    +               {copy_file,"erl_nif_api_funcs.h"},
    +               {copy_file,"erl_fixed_size_int_types.h"},
    +               {copy_file,"erl_int_sizes_config.h"},
    +               {copy_file,"erl_interface.h"},
    +               {copy_file,"eicode.h"},
    +               {copy_file,"erl_driver.h"},
    +               {copy_file,"erlang.idl"},
    +               {copy_file,[...]},
    +               {copy_file,...},
    +               {...}]}]},
    +     {create_dir,"erts-10.0",
    +         [{create_dir,"bin",
    +              [{copy_file,"start"},
    +               {copy_file,"ct_run"},
    +               {copy_file,"erlexec"},
    +               {copy_file,"dialyzer"},
    +               {copy_file,"beam.smp"},
    +               {copy_file,"run_erl"},
    +               {copy_file,"erl","erts-10.0/bin/dyn_erl"},
    +               {copy_file,"to_erl"},
    +               {copy_file,"epmd"},
    +               {copy_file,"erl_child_setup"},
    +               {copy_file,"heart"},
    +               {copy_file,[...]},
    +               {copy_file,...},
    +               {...}|...]},
    +          {create_dir,"lib",
    +              [{create_dir,"internal",
    +                   [{copy_file,"liberts_internal.a"},
    +                    {copy_file,"liberts_internal_r.a"},
    +                    {copy_file,"libethread.a"},
    +                    {copy_file,"README"}]},
    +               ]},
    +          {create_dir,"src",[{copy_file,"setuid_socket_wrap.c"}]},
    +          {create_dir,"doc",[]},
    +          {create_dir,"man",[]},
    +          {create_dir,"include",
    +              [{create_dir,"internal",
    +                   [{create_dir,"i386",[{...}|...]},
    +                    {copy_file,"erl_errno.h"},
    +                    {copy_file,[...]},
    +                    {copy_file,...},
    +                    {...}|...]},
    +               {copy_file,"driver_int.h"},
    +               {copy_file,"erl_nif_api_funcs.h"},
    +               {copy_file,"erl_fixed_size_int_types.h"},
    +               {copy_file,"erl_int_sizes_config.h"},
    +               {copy_file,[...]},
    +               {copy_file,...},
    +               {...}]}]},
    +     {create_dir,"lib",
    +         [{create_dir,"compiler-7.0.4",
    +              [{create_dir,"src",
    +                   [{copy_file,"beam_flatten.erl"},
    +                    {copy_file,[...]},
    +                    {copy_file,...},
    +                    {...}|...]},
    +               {create_dir,"ebin",
    +                   [{copy_file,[...]},{copy_file,...},{...}|...]}]},
    +          {create_dir,"crypto-3.7.4",
    +              [{create_dir,"src",[{copy_file,[...]},{copy_file,...}]},
    +               {create_dir,"ebin",[{copy_file,...},{...}|...]}]},
    +          {create_dir,"crypto-3.7.4",
    +              [{create_dir,"priv",
    +                   [{create_dir,"lib",[{copy_file,[...]},{copy_file,...}]},
    +                    {create_dir,"obj",[{copy_file,...},{...}|...]}]}]},
    +          {create_dir,"erts-10.0",
    +              [{create_dir,"src",[{...}|...]},
    +               {create_dir,"ebin",[...]}]},
    +          {create_dir,"hipe-3.15.4",
    +              [{create_dir,"flow",[...]},
    +               {copy_file,[...]},
    +               {create_dir,...},
    +               {...}|...]},
    +          {create_dir,"inets-6.3.9",
    +              [{create_dir,[...],...},{create_dir,...},{...}]},
    +          {create_dir,"inets-6.3.9",
    +              [{create_dir,"priv",[{create_dir,[...],...}]},
    +               {create_dir,"include",[{copy_file,...},{...}]}]},
    +          {create_dir,"kernel-5.2",[{...}|...]},
    +          {create_dir,"kernel-5.2",
    +              [{create_dir,"include",[{...}|...]}]},
    +          {create_dir,[...],...},
    +          {create_dir,...},
    +          {create_dir,"stdlib-3.3",[{create_dir,...}]},
    +          ...]}]}
     3>
     3> TargetDir = "/tmp/my_target_dir".
     "/tmp/my_target_dir"
     4>
    -4> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    -{error,"/tmp/my_target_dir: no such file or directory"}
    +4> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    +{error,"/tmp/my_target_dir: no such file or directory"}
     5>
    -5> file:make_dir(TargetDir).
    +5> file:make_dir(TargetDir).
     ok
     6>
    -6> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
    +6> reltool:eval_target_spec(Spec, code:root_dir(), TargetDir).
     ok
     7>
    -7> file:list_dir(TargetDir).
    -{ok,["bin","Install","lib","misc","usr","erts-10.0",
    -     "releases"]}
    +7> file:list_dir(TargetDir).
    +{ok,["bin","Install","lib","misc","usr","erts-10.0",
    +     "releases"]}
     8>
    -8> file:list_dir(filename:join([TargetDir,"lib"])).
    -{ok,["tools-2.9.1","inets-6.3.9",
    +8> file:list_dir(filename:join([TargetDir,"lib"])).
    +{ok,["tools-2.9.1","inets-6.3.9",
          "kernel-5.2","sasl-3.0.3",
          "crypto-3.7.4","erts-10.0",
    -     "stdlib-3.3","compiler-7.0.4"]}
    +     "stdlib-3.3","compiler-7.0.4"]}
     9>
    -9> file:make_dir("/tmp/yet_another_target_dir").
    +9> file:make_dir("/tmp/yet_another_target_dir").
     ok
     10>
    -10> reltool:create_target([Config], "/tmp/yet_another_target_dir").
    +10> reltool:create_target([Config], "/tmp/yet_another_target_dir").
     ok
     11>
    -11> file:list_dir("/tmp/yet_another_target_dir").
    -{ok,["bin","Install","lib","misc","usr","erts-10.0",
    -     "releases"]}
    +11>
    file:list_dir("/tmp/yet_another_target_dir"). +{ok,["bin","Install","lib","misc","usr","erts-10.0", + "releases"]}
    diff --git a/prs/9277/lib/reltool-1.0.1/doc/html/search.html b/prs/9277/lib/reltool-1.0.1/doc/html/search.html index f3a7de212aa27..29ec35bad5a08 100644 --- a/prs/9277/lib/reltool-1.0.1/doc/html/search.html +++ b/prs/9277/lib/reltool-1.0.1/doc/html/search.html @@ -122,7 +122,7 @@

    - +